Предлагаю очень маленькое изменение системной функции номер 17 - Получение идентификатора нажатой кнопки.
Новый вариант описания:
Параметры:
* eax = 17 - номер функции
Возвращаемое значение:
* если буфер пуст, возвращается eax=1
* если буфер непуст, то возвращаются: старшие 24 бита eax
содержат идентификатор кнопки (в частности, в ah оказывается
младший байт идентификатора; если все кнопки имеют идентификатор,
меньший 256, то для различения достаточно ah),
al (младьшие 8 битов eax) содержат 0 - в случае если кнопка нажата левой кнопкой мыши
или бит кнопки мыши если нажата другая кнопка мыши
Замечания:
* "Буфер" хранит только одну кнопку, при нажатии новой кнопки
информация о старой теряется.
* При вызове этой функции приложением с неактивным окном
возвращается ответ "буфер пуст".
Данное изменение не отразится на совместимости существующих программ(большинство существующих приложений вообще не проверяют регистр al, а в тех что проверяют будет срабатывать только левая кнопка), но позволит в новых программах по разному обрабатывать нажатие кнопкок интерфейса, в зависимости от использованных кнопок мыши.
Маленькая доработка
-
Заглянул на огонёк
Для реализации потребуется немного изменить функции sys_getbutton в 'kernel.asm' и checkbutton в 'button.inc'
Изменения:
1) В 'button.inc'
строка 565, Фрагмент:
2) В 'kernel.asm' строки 2505 - 2522:
Фрагменты кода:
Изменения:
1) В 'button.inc'
строка 565, Фрагмент:
Code: Select all
..........................
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
..........................
Фрагменты кода:
Code: Select all
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
Заглянул на огонёк
Это изменение очень полезное
Можете выложить модифицированное ядро?
Можете выложить модифицированное ядро?
какой-то неправильный, имхо, подход(как обычно, в духе - ещё один костыль)
если для проверки вызвать функцию 37/2, она не покажет нужные флаги (не знаю, потому и спрашиваю )?
если для проверки вызвать функцию 37/2, она не покажет нужные флаги (не знаю, потому и спрашиваю )?
Я, может, чего-то не понимаю, но зачем вообще позволять нажимать кнопки клавишами, отличными от левой? Как-то не совсем прозрачно с точки зрения пользовательского интерфейса.
in code we trust
Покажет. Правда, лучше сделать так. Я что-то не сообразил.vectoroc wrote:какой-то неправильный, имхо, подход(как обычно, в духе - ещё один костыль)
если для проверки вызвать функцию 37/2, она не покажет нужные флаги (не знаю, потому и спрашиваю )?
Панели задач, например, требуется реагировать на нажатие правой кнопки мыши на кнопках приложений, чтобы отобразить контекстное меню.mike.dld wrote:Я, может, чего-то не понимаю, но зачем вообще позволять нажимать кнопки клавишами, отличными от левой? Как-то не совсем прозрачно с точки зрения пользовательского интерфейса.
vectoroc
Все дело в том что событие нажатия кнопки формируется ядром не при нажатии а при отпускании кнопки мыши (это было сделано чтобы исключить двойные срабатывания).
Естественно при опросе мыши после поступления события нажатия кнопки, кнопки мыши уже отпущены, и опрос не дает никакого эффекта.
В панели для отлова нажатия правой кнопки держится второй процесс, который постоянно опрашивает мышь через малые промежутки времени, и практически дублирует обработчик кнопок, спрашивается нафига этот дубляж нужен?
mike.dld
barsukкакой-то неправильный, имхо, подход(как обычно, в духе - ещё один костыль)
если для проверки вызвать функцию 37/2, она не покажет нужные флаги (не знаю, потому и спрашиваю )?
Нет не покажет, иначе и доработка то не нужна была бы.Покажет. Правда, лучше сделать так. Я что-то не сообразил.
Все дело в том что событие нажатия кнопки формируется ядром не при нажатии а при отпускании кнопки мыши (это было сделано чтобы исключить двойные срабатывания).
Естественно при опросе мыши после поступления события нажатия кнопки, кнопки мыши уже отпущены, и опрос не дает никакого эффекта.
В панели для отлова нажатия правой кнопки держится второй процесс, который постоянно опрашивает мышь через малые промежутки времени, и практически дублирует обработчик кнопок, спрашивается нафига этот дубляж нужен?
mike.dld
Использование кнопок в колибри может быть более обширным чем просто кнопки, например может потребоваться контейнер с отловом нажатия мыши, без плясок с бубном и загрузкой проца на постоянный опрос мыши и пересчета координат. А прозрачность интерфейса и его удобство лежит на совести разработчика приложения. Кроме того вызовы контекстных меню правой кнопкой мыши, помоему стали достаточно стандартны и в ряде случаев могут быть использованы и на кнопках. Например нажатие кнопки левой клавишей - запускает действие, а правой - вызывает его настройку.Я, может, чего-то не понимаю, но зачем вообще позволять нажимать кнопки клавишами, отличными от левой? Как-то не совсем прозрачно с точки зрения пользовательского интерфейса
Заглянул на огонёк
barsuk
Вот откомпиленное с доработкой и упакованное kerpackом ядроМожете выложить модифицированное ядро?
- Attachments
-
-
kernel.7z (80.28 KiB)Downloaded 309 times
-
Заглянул на огонёк
Залил на SVN, заодно немного исправил баг с отрисовкой длинных заголовков на кнопки закрытия. Правда на приложения, выводящие заголовки не через 0 и 71 функцию не действует.
Заглянул на огонёк
Who is online
Users browsing this forum: Google [Bot] and 44 guests