Board.KolibriOS.org

Official KolibriOS board
It is currently Wed Aug 04, 2021 4:25 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 34 posts ]  Go to page Previous 1 2 3 Next
Author Message
PostPosted: Wed May 30, 2012 11:06 pm 
Offline

Joined: Mon Sep 24, 2007 11:11 am
Posts: 2810
Я так понимаю, там общесистемные горячие клавиши не посылаются всем-всем приложениям.


Top
   
PostPosted: Wed May 30, 2012 11:08 pm 
SoUrcerer wrote:
Я так понимаю, там общесистемные горячие клавиши не посылаются всем-всем приложениям.

Если бы все было так просто. В том же Шиндошс я не замечал залипания клавиш в FAR, при использовании Alt+Tab.


Top
   
PostPosted: Wed May 30, 2012 11:12 pm 
Offline

Joined: Mon Sep 24, 2007 11:11 am
Posts: 2810
Ты про следующую ситуацию, да?
1) Нажат Alt
2) Сообщение о нажатии отправлено всем
3) Нажат tab, переключение произошло, нажатие Tab не отправлено никому

Событие отжатия Alt не отправляется никому - залипание. Так почему бы не отправить событие отжатия всех кнопок комбинации всем приложениям, если оно действительно произошло?


Top
   
PostPosted: Wed May 30, 2012 11:15 pm 
Если приложение не зарезервировало для себя какую либо клавишу как "горячую", то после того как активным станет другой поток буфер клавиатуры по умолчанию будет принадлежать ему. Ядро не может знать кому нужно событие отжатия, а кому нет, если приложение заранее не внесло себя в список.


Top
   
PostPosted: Wed May 30, 2012 11:20 pm 
Offline

Joined: Mon Sep 24, 2007 11:11 am
Posts: 2810
Событие нажатия alt (ctrl,shift) приходит всем или только активному окну?


Top
   
PostPosted: Wed May 30, 2012 11:26 pm 
Если все читать через функцию 2, то только активному окну, кроме приложений заранее установивших себе alt (ctrl,shift) как "горячие".
Однако следует учесть, что общее количество горячих комбинаций ограничено и злоупотреблять их использованием не стоит, потому что обработка большого списка займет слишком много времени и система станет еще менее отзывчивой (здравствуй Квейк!).

Использование же функции 66.3 не удачное решение. Это увеличит нагрузку на систему, если периодически опрашивать состояние (прощай ф.10), либо можно "прозевать" изменение состояния, если вызывать ф.66.3 сразу после ф.2.


Last edited by Mario on Wed May 30, 2012 11:30 pm, edited 1 time in total.

Top
   
PostPosted: Wed May 30, 2012 11:30 pm 
Offline

Joined: Mon Sep 24, 2007 11:11 am
Posts: 2810
И после активизации приложения, получающего нажатие "горячей комбинации", прошлое активное приложение не получает событие отжатия. Почему не отправлять отжатие до активизации этого нового приложения?


Top
   
PostPosted: Wed May 30, 2012 11:32 pm 
А ты видел код обработчика клавиатуры? Если ты сможешь это сделать, то будешь охуенным программистом.
А вообще проблема в том, что когда приложение считывает функцией 2 код обычной клавиши, оно очищает буфер клавиатуры и никаких "горячих" комбинаций уже не появится. Потому сначала "горячие" комбинации, а потом уже активное приложение.


Top
   
PostPosted: Wed May 30, 2012 11:38 pm 
Offline

Joined: Mon Sep 24, 2007 11:11 am
Posts: 2810
Что-то я ничего не понял. На трезвую голову посмотрю код обработчика клавиатуры. Здравый смысл подсказывает мне, что можно сделать все правильно и красиво.


Top
   
PostPosted: Wed May 30, 2012 11:41 pm 
SoUrcerer wrote:
Здравый смысл подсказывает мне, что можно сделать все правильно и красиво.

Ага, а еще есть идеальный мир в котором находится эталонный код (который правильный, красивый и не содержит ошибок), а то что у нас это неудачные копии того кода.


Top
   
PostPosted: Fri Jun 01, 2012 12:40 am 
Mario wrote:
Кроме выше описанных проблем обнаружилась еще одна проблема - при пользовании mousemul управляющие клавиши (стрелки и 5) срабатывают на активном приложении. У меня нет идей как побороть эту ситуацию, если никто не предложит метод решения, то придется откатить ревизию 2611 и закопать мамонта обратно. Черт с ним с залипанием Shift, Ctrl, Alt - благими намерениями вымощена дорога сами знаете куда.

Откатить все таки не получится. Если приложению не возвращать код назначенный на горячую клавишу (кстати реализация именно горячих клавиш, а не комбинаций сделана, потому и проблемы возникаю имхается мне), то при назначении горячих комбинаций типа Win (Ctrl, Alt, Shift) + символьная клавиша (в нашем случае R и D) приводит к тому что они становятся недоступными для обычного ввода. Раньше такие комбинации не использовались (назначение символьных клавиш в качестве горячих), потому эта недоработка реализации SVN r.92 не была заметна. С введением же новых горячих комбинаций проблема вылезла во всей красе.


Top
   
PostPosted: Fri Jun 01, 2012 4:18 am 
Поскольку приложение MOUSEMUL имеет уникальный статус, то я ввел новую пару функций 66.6 и 66.7, для решения проблемы. SVN r. 2709, 2710


Top
   
PostPosted: Thu Jun 17, 2021 9:35 pm 
Offline
Designer
User avatar

Joined: Thu Jan 25, 2007 3:33 pm
Posts: 5534
Похоже есть баг: f66.3 не присылает комбинации с альтом.

В аттаче приложение: исходник на православном асме и бинарник.
Логика приложения проста: если f66.3 что-то вернула - выход если пусто, продолжает работу.
Spoiler: Show
Code:
  use32              ; включить 32-битный режим ассемблера
  org    0           ; адресация с нуля

  db     'MENUET01'  ; 8-байтный идентификатор MenuetOS
  dd     1           ; версия заголовка (1 либо 2, см. док-ю)
  dd     START       ; адрес первой команды
  dd     I_END       ; размер программы
  dd     MEM         ; количество памяти
  dd     STACKTOP    ; адрес вершины стэка
  dd     0
  dd     0

include "macros.inc"

START:

red:
   call draw_window

still:
    mcall 10

    cmp  eax,1 
    je   red
    cmp  eax,2
    je   key
    cmp  eax,3
    je   exit

    jmp  still


;---------------------------------------------------------------------


  key:
    mcall 2

    mcall 66, 3
    test eax,0    <------------ мякотка тут
    jne still
  exit:
    mcall -1

    jmp  still          ; вернуться к началу цикла

draw_window:
    mcall 12, 1       ; функция 12: сообщить ОС о начале отрисовки
    mcall 0, <200,500>, <400,150>, 0x33FFFfff, ,title
    mcall 4, <5, 20>, 0x90000000, message
    mcall 12, 2                  ; функция 12.2, закончили рисовать
    ret                          ; выходим из процедуры

message db 'Любая клавиша закроет окно, кроме Альта и комбинаций с ним.',0
title db 'f66.3',0

I_END:                  ; метка конца программы
  rb 4096               ; память для стека
align 16
STACKTOP:
MEM:


Ctrl+1, Ctrl+f, Shift+P, Shift+4 - Выход
Alt+n - продолжает работать

Баг?


Attachments:
EXAMPLE.ASM [1.16 KiB]
Downloaded 16 times
EXAMPLE [240 Bytes]
Downloaded 15 times

_________________
Звиздеть не мешки ворочать
Top
   
PostPosted: Sun Jun 20, 2021 1:32 am 
Offline
Mentor
User avatar

Joined: Mon Oct 19, 2009 10:58 am
Posts: 660
Code:
test eax,0
This always sets zero flag because AND X, 0 is always 0. Therefore the following JNE branch is never taken. Hence mcall -1 is always executed when a key event is received by a program.

The reason why Alt+letter keys are not sent to the program is that
1. Programs expect ASCII codes by default, not scan codes, and
2. /programs/system/taskbar/trunk/KEYMAP.KEY file doesn't mention any ASCII codes for Alt+letter keys. So the kernel doesn't send any event to the program.

In addition, Alt+number keys are global hotkeys to change keyboard layout.

I can think of two solutions:
1. Add ASCII codes to Alt+letter keys to the keymap file. This way Alt+letter will also put characters to editboxes, is it desirable behavior?
2. Switch the program to receive scan codes.


Top
   
PostPosted: Sun Jun 20, 2021 2:21 am 
Offline
Designer
User avatar

Joined: Thu Jan 25, 2007 3:33 pm
Posts: 5534
Hmm... Looks like I have to use scan codes.
Thanks a lot for investigation!

_________________
Звиздеть не мешки ворочать


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 34 posts ]  Go to page Previous 1 2 3 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited