Board.KolibriOS.org

Official KolibriOS board
It is currently Tue Feb 25, 2020 1:59 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 9 posts ] 
Author Message
PostPosted: Thu Jun 19, 2008 11:41 pm 
Offline
User avatar

Joined: Fri May 18, 2007 11:11 pm
Posts: 125
Предлагаю очень маленькое изменение системной функции номер 17 - Получение идентификатора нажатой кнопки.

Новый вариант описания:
Параметры:
* eax = 17 - номер функции
Возвращаемое значение:
* если буфер пуст, возвращается eax=1
* если буфер непуст, то возвращаются: старшие 24 бита eax
содержат идентификатор кнопки (в частности, в ah оказывается
младший байт идентификатора; если все кнопки имеют идентификатор,
меньший 256, то для различения достаточно ah),
al (младьшие 8 битов eax) содержат 0 - в случае если кнопка нажата левой кнопкой мыши
или бит кнопки мыши если нажата другая кнопка мыши
Замечания:
* "Буфер" хранит только одну кнопку, при нажатии новой кнопки
информация о старой теряется.
* При вызове этой функции приложением с неактивным окном
возвращается ответ "буфер пуст".

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

_________________
Заглянул на огонёк


Top
   
PostPosted: Thu Jun 19, 2008 11:44 pm 
Offline
User avatar

Joined: Fri May 18, 2007 11:11 pm
Posts: 125
Для реализации потребуется немного изменить функции sys_getbutton в 'kernel.asm' и checkbutton в 'button.inc'

Изменения:

1) В 'button.inc'

строка 565, Фрагмент:
Code:
..........................
    pushad
; //// Добавить эти строки
    push  eax
    mov  al, byte [BTN_DOWN]
    mov  byte [btn_down_determ], al
    pop  eax
; /// окончание добавления
  cbwaitmouseup:
..........................
..........................
..........................
iglobal
    mx dw 0x0 ; keeps the x mouse's position when it was clicked
    my dw 0x0 ; keeps the y mouse's position when it was clicked
    bPressedMouseXY_B db 0x0
    btn_down_determ     db 0x0        ; <<< Добавить эту строку
endg
..........................


2) В 'kernel.asm' строки 2505 - 2522:

Фрагменты кода:
Code:
sys_getbutton:

   mov   ebx, [CURRENT_TASK]             ; TOP OF WINDOW STACK
   mov   [esp + 32], dword 1
   movzx   ecx, word [WIN_STACK + ebx * 2]
   mov   edx, [TASK_COUNT] ; less than 256 processes
   cmp   ecx, edx
   jne   .exit
   movzx   eax, byte [BTN_COUNT]
   test   eax, eax
   jz   .exit
   mov   eax, [BTN_BUFF]
   shl   eax, 8
        mov      al, byte [btn_down_determ]                       ; <<< Добавить
        and       al,0xFE          ; убираем левую кнопку      ; <<< Добавить
   mov   [BTN_COUNT], byte 0
   mov   [esp + 32], eax
.exit:
   ret

_________________
Заглянул на огонёк


Top
   
PostPosted: Thu Jun 19, 2008 11:52 pm 
Offline

Joined: Wed Jun 04, 2008 10:16 pm
Posts: 174
Это изменение очень полезное :)

Можете выложить модифицированное ядро?


Top
   
PostPosted: Fri Jun 20, 2008 12:09 am 
Offline

Joined: Mon May 01, 2006 10:12 pm
Posts: 349
какой-то неправильный, имхо, подход(как обычно, в духе - ещё один костыль)
если для проверки вызвать функцию 37/2, она не покажет нужные флаги (не знаю, потому и спрашиваю :))?

_________________
Image


Top
   
PostPosted: Fri Jun 20, 2008 12:18 am 
Offline
Site Founder
User avatar

Joined: Sun Aug 08, 2004 8:55 am
Posts: 689
Я, может, чего-то не понимаю, но зачем вообще позволять нажимать кнопки клавишами, отличными от левой? Как-то не совсем прозрачно с точки зрения пользовательского интерфейса.

_________________
in code we trust


Top
   
PostPosted: Fri Jun 20, 2008 1:28 am 
Offline

Joined: Wed Jun 04, 2008 10:16 pm
Posts: 174
vectoroc wrote:
какой-то неправильный, имхо, подход(как обычно, в духе - ещё один костыль)
если для проверки вызвать функцию 37/2, она не покажет нужные флаги (не знаю, потому и спрашиваю :))?


Покажет. Правда, лучше сделать так. Я что-то не сообразил.

mike.dld wrote:
Я, может, чего-то не понимаю, но зачем вообще позволять нажимать кнопки клавишами, отличными от левой? Как-то не совсем прозрачно с точки зрения пользовательского интерфейса.


Панели задач, например, требуется реагировать на нажатие правой кнопки мыши на кнопках приложений, чтобы отобразить контекстное меню.


Top
   
PostPosted: Fri Jun 20, 2008 10:59 pm 
Offline
User avatar

Joined: Fri May 18, 2007 11:11 pm
Posts: 125
vectoroc
Quote:
какой-то неправильный, имхо, подход(как обычно, в духе - ещё один костыль)
если для проверки вызвать функцию 37/2, она не покажет нужные флаги (не знаю, потому и спрашиваю :))?

barsuk
Quote:
Покажет. Правда, лучше сделать так. Я что-то не сообразил.


Нет не покажет, иначе и доработка то не нужна была бы.

Все дело в том что событие нажатия кнопки формируется ядром не при нажатии а при отпускании кнопки мыши (это было сделано чтобы исключить двойные срабатывания).
Естественно при опросе мыши после поступления события нажатия кнопки, кнопки мыши уже отпущены, и опрос не дает никакого эффекта.
В панели для отлова нажатия правой кнопки держится второй процесс, который постоянно опрашивает мышь через малые промежутки времени, и практически дублирует обработчик кнопок, спрашивается нафига этот дубляж нужен?

mike.dld
Quote:
Я, может, чего-то не понимаю, но зачем вообще позволять нажимать кнопки клавишами, отличными от левой? Как-то не совсем прозрачно с точки зрения пользовательского интерфейса


Использование кнопок в колибри может быть более обширным чем просто кнопки, например может потребоваться контейнер с отловом нажатия мыши, без плясок с бубном и загрузкой проца на постоянный опрос мыши и пересчета координат. А прозрачность интерфейса и его удобство лежит на совести разработчика приложения. Кроме того вызовы контекстных меню правой кнопкой мыши, помоему стали достаточно стандартны и в ряде случаев могут быть использованы и на кнопках. Например нажатие кнопки левой клавишей - запускает действие, а правой - вызывает его настройку.

_________________
Заглянул на огонёк


Top
   
PostPosted: Fri Jun 20, 2008 11:09 pm 
Offline
User avatar

Joined: Fri May 18, 2007 11:11 pm
Posts: 125
barsuk
Quote:
Можете выложить модифицированное ядро?

Вот откомпиленное с доработкой и упакованное kerpackом ядро


Attachments:
kernel.7z [80.28 KiB]
Downloaded 158 times

_________________
Заглянул на огонёк
Top
   
PostPosted: Sun Jun 22, 2008 6:49 pm 
Offline
User avatar

Joined: Fri May 18, 2007 11:11 pm
Posts: 125
Залил на SVN, заодно немного исправил баг с отрисовкой длинных заголовков на кнопки закрытия. Правда на приложения, выводящие заголовки не через 0 и 71 функцию не действует.

_________________
Заглянул на огонёк


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 9 posts ] 

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 2 guests


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