fn.40: ebx bit 30 - do not send mouse events if cursor outside window

git-svn-id: svn://kolibrios.org@2414 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Sergey Semyonov (Serge) 2012-02-28 08:36:15 +00:00
parent 823a0a9a8f
commit 0735fd9e1b
5 changed files with 46 additions and 15 deletions

View File

@ -513,6 +513,7 @@ struct display_t
move_cursor dd ? move_cursor dd ?
restore_cursor dd ? restore_cursor dd ?
disable_mouse dd ? disable_mouse dd ?
mask_seqno dd ?
ends ends
struct BOOT_DATA struct BOOT_DATA
@ -647,4 +648,4 @@ struct IRQH
list LHEAD list LHEAD
handler dd ? ;handler roututine handler dd ? ;handler roututine
data dd ? ;user-specific data data dd ? ;user-specific data
ends ends

View File

@ -166,6 +166,7 @@ proc free_page
ret ret
endp endp
align 4
proc map_io_mem stdcall, base:dword, size:dword, flags:dword proc map_io_mem stdcall, base:dword, size:dword, flags:dword
push ebx push ebx

View File

@ -1878,9 +1878,14 @@ Parameters:
* eax = 40 - function number * eax = 40 - function number
* ebx = mask: bit i corresponds to event i+1 (see list of events) * ebx = mask: bit i corresponds to event i+1 (see list of events)
(set bit permits notice on event) (set bit permits notice on event)
bit 31: mouse events filtration bit 31: active/inactive filter
bit 31 = 1 - inactive window do not receive mouse events bit 31 = 0 - inactive window receive mouse events
bit 31 = 0 - windows always recievs mouse events bit 31 = 1 - inactive window does not receive mouse events
bit 30: cursor position filter
bit 30 = 0 = the window receive mouse events if cursor
outside window
bit 30 = 1 - the window does not receive mouse events if cursor
outside window
Returned value: Returned value:
* eax = previous value of mask * eax = previous value of mask
Remarks: Remarks:

View File

@ -463,16 +463,16 @@ get_event_for_app: ;; used from f10,f11,f23
ret ret
.FlagAutoReset: ; retvals: BgrRedraw=5, Mouse=6, IPC=7, Stack=8, Debug=9 .FlagAutoReset: ; retvals: BgrRedraw=5, Mouse=6, IPC=7, Stack=8, Debug=9
cmp eax, 5; Mouse 5+1=6 ; cmp eax, 5; Mouse 5+1=6
jne @f ; jne @f
push eax ; push eax
; If the window is captured and moved by the user, then no mouse events!!! ; If the window is captured and moved by the user, then no mouse events!!!
mov al, [mouse.active_sys_window.action] ; mov al, [mouse.active_sys_window.action]
and al, WINDOW_MOVE_AND_RESIZE_FLAGS ; and al, WINDOW_MOVE_AND_RESIZE_FLAGS
test al, al ; test al, al
pop eax ; pop eax
jnz .loop ; jnz .loop
@@: ;@@:
btr [ebx+APPDATA.event_mask], eax btr [ebx+APPDATA.event_mask], eax
jnc .loop jnc .loop
.result: ; retval = eax+1 .result: ; retval = eax+1

View File

@ -3086,21 +3086,45 @@ nocpustart:
mov ecx, [TASK_COUNT] mov ecx, [TASK_COUNT]
movzx eax, word [WIN_POS + ecx*2] ; active window movzx eax, word [WIN_POS + ecx*2] ; active window
shl eax, 8 shl eax, 8
push eax
movzx eax, word [MOUSE_X]
movzx edx, word [MOUSE_Y]
align 4 align 4
.set_mouse_event: .set_mouse_event:
add edi, 256 add edi, 256
add ebx, 32 add ebx, 32
test [ebx+TASKDATA.event_mask], 0x80000000 test [ebx+TASKDATA.event_mask], 0x80000000
jz .pos_filter
cmp edi, [esp] ; skip if filtration active
jne .skip
.pos_filter:
test [ebx+TASKDATA.event_mask], 0x40000000
jz .set jz .set
cmp eax, edi ; skip if filtration active mov esi, [ebx-twdw+WDATA.box.left]
jne .skip cmp eax, esi
jb .skip
add esi, [ebx-twdw+WDATA.box.width]
cmp eax, esi
ja .skip
mov esi, [ebx-twdw+WDATA.box.top]
cmp edx, esi
jb .skip
add esi, [ebx-twdw+WDATA.box.height]
cmp edx, esi
ja .skip
.set: .set:
or [edi+SLOT_BASE+APPDATA.event_mask], 100000b or [edi+SLOT_BASE+APPDATA.event_mask], 100000b
.skip: .skip:
loop .set_mouse_event loop .set_mouse_event
pop eax
mouse_not_active: mouse_not_active:
cmp byte[BACKGROUND_CHANGED], 0 cmp byte[BACKGROUND_CHANGED], 0
jz no_set_bgr_event jz no_set_bgr_event