forked from KolibriOS/kolibrios
gui/mouse.inc:
+ new file for GUI-related mouse events handling (old mouse.inc renamed) gui/button.inc and gui/window.inc: * refactoring in regards of new mouse.inc: * obsolete code eliminated * old'n'ugly `check_buttons` and `checkwindows` removed * events handlers added gui/window.inc: * moved GUI-related syscalls and auxilary functions from kernel.asm * removed registers cross-ordering from syscall 67 (window move/resize) + more comments added known bugs include: 1. apps using syscall 67 (kfar etc.) may not redraw their old screen area leaving ghost images 2. possibility of mouse cursor artefacts may have increased (this *really* has to be reworked) git-svn-id: svn://kolibrios.org@1391 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
e79fad8794
commit
ddd29cc90f
@ -169,7 +169,7 @@ iglobal
|
|||||||
dd 0
|
dd 0
|
||||||
dd syscall_putimage_palette; 65-PutImagePalette
|
dd syscall_putimage_palette; 65-PutImagePalette
|
||||||
dd sys_process_def ; 66-Process definitions - keyboard
|
dd sys_process_def ; 66-Process definitions - keyboard
|
||||||
dd sys_window_move ; 67-Window move or resize
|
dd 0
|
||||||
dd 0
|
dd 0
|
||||||
dd 0
|
dd 0
|
||||||
dd file_system_lfn ; 70-Common file system interface, version 2
|
dd file_system_lfn ; 70-Common file system interface, version 2
|
||||||
@ -180,7 +180,7 @@ iglobal
|
|||||||
align 4
|
align 4
|
||||||
servetable2:
|
servetable2:
|
||||||
|
|
||||||
dd sys_drawwindow ; 0-DrawWindow
|
dd syscall_draw_window ; 0-DrawWindow
|
||||||
dd syscall_setpixel ; 1-SetPixel
|
dd syscall_setpixel ; 1-SetPixel
|
||||||
dd sys_getkey ; 2-GetKey
|
dd sys_getkey ; 2-GetKey
|
||||||
dd sys_clock ; 3-GetTime
|
dd sys_clock ; 3-GetTime
|
||||||
@ -247,11 +247,11 @@ iglobal
|
|||||||
dd sys_resize_app_memory ; 64-Resize application memory usage
|
dd sys_resize_app_memory ; 64-Resize application memory usage
|
||||||
dd cross_order ; 65-PutImagePalette
|
dd cross_order ; 65-PutImagePalette
|
||||||
dd cross_order ; 66-Process definitions - keyboard
|
dd cross_order ; 66-Process definitions - keyboard
|
||||||
dd cross_order ; 67-Window move or resize
|
dd syscall_move_window ; 67-Window move or resize
|
||||||
dd f68 ; 68-Some internal services
|
dd f68 ; 68-Some internal services
|
||||||
dd sys_debug_services ; 69-Debug
|
dd sys_debug_services ; 69-Debug
|
||||||
dd cross_order ; 70-Common file system interface, version 2
|
dd cross_order ; 70-Common file system interface, version 2
|
||||||
dd syscall_windowsettings ; 71-Window settings
|
dd syscall_window_settings ; 71-Window settings
|
||||||
dd sys_sendwindowmsg ; 72-Send window message
|
dd sys_sendwindowmsg ; 72-Send window message
|
||||||
times 255 - ( ($-servetable2) /4 ) dd undefined_syscall
|
times 255 - ( ($-servetable2) /4 ) dd undefined_syscall
|
||||||
dd sys_end ; -1-end application
|
dd sys_end ; -1-end application
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;;
|
;; Copyright (C) KolibriOS team 2004-2010. All rights reserved. ;;
|
||||||
;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa ;;
|
;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa ;;
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
;; Distributed under terms of the GNU General Public License ;;
|
||||||
;; ;;
|
;; ;;
|
||||||
@ -8,14 +8,12 @@
|
|||||||
|
|
||||||
$Revision$
|
$Revision$
|
||||||
|
|
||||||
|
|
||||||
button._.MAX_BUTTONS = 4095
|
|
||||||
|
|
||||||
|
|
||||||
;==============================================================================
|
;==============================================================================
|
||||||
;///// public functions ///////////////////////////////////////////////////////
|
;///// public functions ///////////////////////////////////////////////////////
|
||||||
;==============================================================================
|
;==============================================================================
|
||||||
|
|
||||||
|
button.MAX_BUTTONS = 4095
|
||||||
|
|
||||||
struc SYS_BUTTON
|
struc SYS_BUTTON
|
||||||
{
|
{
|
||||||
.pslot dw ?
|
.pslot dw ?
|
||||||
@ -25,20 +23,13 @@ struc SYS_BUTTON
|
|||||||
.top dw ?
|
.top dw ?
|
||||||
.height dw ?
|
.height dw ?
|
||||||
.id_hi dw ?
|
.id_hi dw ?
|
||||||
.align dw ?
|
dw ?
|
||||||
.sizeof:
|
.sizeof:
|
||||||
}
|
}
|
||||||
virtual at 0
|
virtual at 0
|
||||||
SYS_BUTTON SYS_BUTTON
|
SYS_BUTTON SYS_BUTTON
|
||||||
end virtual
|
end virtual
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
;------------------------------------------------------------------------------
|
;------------------------------------------------------------------------------
|
||||||
syscall_button: ;///// system function 8 //////////////////////////////////////
|
syscall_button: ;///// system function 8 //////////////////////////////////////
|
||||||
@ -67,7 +58,7 @@ syscall_button: ;///// system function 8 //////////////////////////////////////
|
|||||||
; do we have free button slots available?
|
; do we have free button slots available?
|
||||||
mov edi, [BTN_ADDR]
|
mov edi, [BTN_ADDR]
|
||||||
mov eax, [edi]
|
mov eax, [edi]
|
||||||
cmp eax, button._.MAX_BUTTONS
|
cmp eax, button.MAX_BUTTONS
|
||||||
jge .exit
|
jge .exit
|
||||||
|
|
||||||
; does it have positive size? (otherwise it doesn't have sense)
|
; does it have positive size? (otherwise it doesn't have sense)
|
||||||
@ -228,6 +219,7 @@ syscall_button.remove_button:
|
|||||||
add esi, edi
|
add esi, edi
|
||||||
xor ecx, ecx
|
xor ecx, ecx
|
||||||
add ecx, -SYS_BUTTON.sizeof
|
add ecx, -SYS_BUTTON.sizeof
|
||||||
|
add esi, SYS_BUTTON.sizeof
|
||||||
|
|
||||||
.next_button:
|
.next_button:
|
||||||
dec ebx
|
dec ebx
|
||||||
@ -263,201 +255,123 @@ syscall_button.remove_button:
|
|||||||
|
|
||||||
align 4
|
align 4
|
||||||
;------------------------------------------------------------------------------
|
;------------------------------------------------------------------------------
|
||||||
check_buttons: ;///////////////////////////////////////////////////////////////
|
sys_button_activate_handler: ;/////////////////////////////////////////////////
|
||||||
;------------------------------------------------------------------------------
|
;------------------------------------------------------------------------------
|
||||||
;? <description>
|
;? <description>
|
||||||
;------------------------------------------------------------------------------
|
;------------------------------------------------------------------------------
|
||||||
cmp byte[BTN_DOWN], 0 ; mouse buttons pressed
|
;> eax = pack[8(process slot), 24(button id)]
|
||||||
jnz @f
|
;> ebx = pack[16(button x coord), 16(button y coord)]
|
||||||
mov [bPressedMouseXY_B], 0
|
;> cl = mouse button mask this system button was pressed with
|
||||||
ret
|
;------------------------------------------------------------------------------
|
||||||
|
call button._.find_button
|
||||||
|
or eax, eax
|
||||||
|
jz .exit
|
||||||
|
|
||||||
@@: pushad
|
mov ebx, dword[eax + SYS_BUTTON.id_hi - 2]
|
||||||
xor esi, esi
|
|
||||||
mov edi, [BTN_ADDR]
|
|
||||||
mov edx, [edi]
|
|
||||||
test edx, edx
|
|
||||||
jne @f
|
|
||||||
popad
|
|
||||||
ret
|
|
||||||
|
|
||||||
;here i catch the coordinates when the mouse's button is clicked
|
|
||||||
@@: push ax
|
|
||||||
cmp [bPressedMouseXY_B], 0 ; FALSE
|
|
||||||
jnz @f
|
|
||||||
mov [bPressedMouseXY_B], 1 ; TRUE - it was already clicked
|
|
||||||
mov ax, [MOUSE_X]
|
|
||||||
mov [mx], ax
|
|
||||||
mov ax, [MOUSE_Y]
|
|
||||||
mov [my], ax
|
|
||||||
@@: pop ax
|
|
||||||
;and it is only refreshed after the mouse's button release
|
|
||||||
|
|
||||||
push esi
|
|
||||||
inc edx
|
|
||||||
push edx
|
|
||||||
|
|
||||||
.buttonnewcheck:
|
|
||||||
pop edx
|
|
||||||
pop esi
|
|
||||||
inc esi
|
|
||||||
cmp edx, esi
|
|
||||||
jge .bch
|
|
||||||
|
|
||||||
popad
|
|
||||||
ret
|
|
||||||
|
|
||||||
.bch:
|
|
||||||
push esi
|
|
||||||
push edx
|
|
||||||
mov eax, esi
|
|
||||||
shl eax, 4
|
|
||||||
add eax, edi
|
|
||||||
|
|
||||||
; check that button is at top of windowing stack
|
|
||||||
movzx ebx, [eax + SYS_BUTTON.pslot]
|
|
||||||
movzx ecx, word[WIN_STACK + ebx * 2]
|
|
||||||
cmp ecx, [TASK_COUNT]
|
|
||||||
jne .buttonnewcheck
|
|
||||||
|
|
||||||
; check that button start is inside window x/y end
|
|
||||||
shl ebx, 5
|
|
||||||
|
|
||||||
test [ebx + window_data + WDATA.fl_wstate], WSTATE_MINIMIZED
|
|
||||||
jnz .buttonnewcheck
|
|
||||||
|
|
||||||
movzx edx, [eax + SYS_BUTTON.left]
|
|
||||||
cmp edx, [window_data + ebx + WDATA.box.width] ;ecx
|
|
||||||
jge .buttonnewcheck
|
|
||||||
|
|
||||||
movzx edx, [eax + SYS_BUTTON.top]
|
|
||||||
cmp edx, [window_data + ebx + WDATA.box.height] ;ecx
|
|
||||||
jge .buttonnewcheck
|
|
||||||
|
|
||||||
; check coordinates
|
|
||||||
|
|
||||||
; mouse x >= button x ?
|
|
||||||
add ebx, window_data
|
|
||||||
mov ecx, [ebx + WDATA.box.left]
|
|
||||||
movzx edx, [eax + SYS_BUTTON.left]
|
|
||||||
add edx, ecx
|
|
||||||
mov cx, [mx] ;mov cx,[MOUSE_X]
|
|
||||||
cmp edx, ecx
|
|
||||||
jg .buttonnewcheck
|
|
||||||
|
|
||||||
movzx ebx, [eax + SYS_BUTTON.width]
|
|
||||||
add edx, ebx
|
|
||||||
cmp ecx, edx
|
|
||||||
jg .buttonnewcheck
|
|
||||||
|
|
||||||
; mouse y >= button y ?
|
|
||||||
movzx ebx, [eax + SYS_BUTTON.pslot]
|
|
||||||
shl ebx, 5
|
|
||||||
add ebx, window_data
|
|
||||||
mov ecx, [ebx + WDATA.box.top]
|
|
||||||
movzx edx, [eax + SYS_BUTTON.top]
|
|
||||||
add edx, ecx
|
|
||||||
mov cx, [my] ;mov cx,[MOUSE_Y]
|
|
||||||
cmp edx, ecx
|
|
||||||
jg .buttonnewcheck
|
|
||||||
|
|
||||||
movzx ebx, [eax + SYS_BUTTON.height]
|
|
||||||
add edx, ebx
|
|
||||||
cmp ecx, edx
|
|
||||||
jg .buttonnewcheck
|
|
||||||
|
|
||||||
; mouse on button
|
|
||||||
|
|
||||||
pop edx
|
|
||||||
pop esi
|
|
||||||
|
|
||||||
mov ebx, dword[eax + SYS_BUTTON.id_hi - 2] ; button id : bits 16-31
|
|
||||||
mov bx, [eax + SYS_BUTTON.id_lo] ; button id : bits 00-16
|
|
||||||
push ebx
|
|
||||||
|
|
||||||
mov byte[MOUSE_DOWN], 1 ; no mouse down checks
|
|
||||||
call button._.negative_button
|
call button._.negative_button
|
||||||
|
|
||||||
pushad
|
.exit:
|
||||||
push eax
|
ret
|
||||||
mov al, [BTN_DOWN]
|
|
||||||
mov byte[btn_down_determ], al
|
|
||||||
pop eax
|
|
||||||
|
|
||||||
.cbwaitmouseup:
|
align 4
|
||||||
call checkidle
|
;------------------------------------------------------------------------------
|
||||||
call [draw_pointer]
|
sys_button_deactivate_handler: ;///////////////////////////////////////////////
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
pushad
|
;? <description>
|
||||||
call stack_handler
|
;------------------------------------------------------------------------------
|
||||||
popad
|
;> eax = pack[8(process slot), 24(button id)]
|
||||||
|
;> ebx = pack[16(button x coord), 16(button y coord)]
|
||||||
cmp byte[BTN_DOWN], 0 ; mouse buttons pressed ?
|
;> cl = mouse button mask this system button was pressed with
|
||||||
jnz .cbwaitmouseup
|
;------------------------------------------------------------------------------
|
||||||
popad
|
call button._.find_button
|
||||||
|
or eax, eax
|
||||||
|
jz .exit
|
||||||
|
|
||||||
|
mov ebx, dword[eax + SYS_BUTTON.id_hi - 2]
|
||||||
call button._.negative_button
|
call button._.negative_button
|
||||||
mov byte[MOUSE_BACKGROUND], 0 ; no mouse background
|
|
||||||
mov byte[DONT_DRAW_MOUSE], 0 ; draw mouse
|
|
||||||
|
|
||||||
; check coordinates
|
.exit:
|
||||||
pusha
|
ret
|
||||||
|
|
||||||
; mouse x >= button x ?
|
align 4
|
||||||
movzx ebx, [eax + SYS_BUTTON.pslot]
|
;------------------------------------------------------------------------------
|
||||||
shl ebx, 5
|
sys_button_perform_handler: ;//////////////////////////////////////////////////
|
||||||
add ebx, window_data
|
;------------------------------------------------------------------------------
|
||||||
mov ecx, [ebx + WDATA.box.left]
|
;? <description>
|
||||||
movzx edx, [eax + SYS_BUTTON.left]
|
;------------------------------------------------------------------------------
|
||||||
add edx, ecx
|
;> eax = pack[8(process slot), 24(button id)]
|
||||||
mov cx, [MOUSE_X]
|
;> ebx = pack[16(button x coord), 16(button y coord)]
|
||||||
cmp edx, ecx
|
;> cl = mouse button mask this system button was pressed with
|
||||||
jg .no_on_button ;if we release the pointer out of the button area
|
;------------------------------------------------------------------------------
|
||||||
|
shl eax, 8
|
||||||
movzx ebx, [eax + SYS_BUTTON.width]
|
mov al, cl
|
||||||
add edx, ebx
|
movzx ebx, byte[BTN_COUNT]
|
||||||
cmp ecx, edx
|
mov [BTN_BUFF + ebx * 4], eax
|
||||||
jg .no_on_button
|
inc bl
|
||||||
|
mov [BTN_COUNT], bl
|
||||||
; mouse y >= button y ?
|
|
||||||
movzx ebx, [eax + SYS_BUTTON.pslot]
|
|
||||||
shl ebx, 5
|
|
||||||
add ebx, window_data
|
|
||||||
mov ecx, [ebx + WDATA.box.top]
|
|
||||||
movzx edx, [eax + SYS_BUTTON.top]
|
|
||||||
add edx, ecx
|
|
||||||
mov cx, [MOUSE_Y]
|
|
||||||
cmp edx, ecx
|
|
||||||
jg .no_on_button
|
|
||||||
|
|
||||||
movzx ebx, [eax + SYS_BUTTON.height]
|
|
||||||
add edx, ebx
|
|
||||||
cmp ecx, edx
|
|
||||||
jg .no_on_button
|
|
||||||
|
|
||||||
popa
|
|
||||||
|
|
||||||
mov byte[BTN_COUNT], 1 ; no of buttons in buffer
|
|
||||||
pop ebx
|
|
||||||
mov [BTN_BUFF], ebx ; lets put the button id in buffer
|
|
||||||
push ebx
|
|
||||||
pusha
|
|
||||||
jmp .yes_on_button
|
|
||||||
|
|
||||||
.no_on_button:
|
|
||||||
mov byte[BTN_COUNT], 0 ; no of buttons in buffer
|
|
||||||
|
|
||||||
.yes_on_button:
|
|
||||||
mov byte[MOUSE_DOWN], 0 ; mouse down -> do not draw
|
|
||||||
popa
|
|
||||||
pop ebx
|
|
||||||
popa
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
;==============================================================================
|
;==============================================================================
|
||||||
;///// private functions //////////////////////////////////////////////////////
|
;///// private functions //////////////////////////////////////////////////////
|
||||||
;==============================================================================
|
;==============================================================================
|
||||||
|
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
button._.find_button: ;////////////////////////////////////////////////////////
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
;? Find system button by specified process slot, id and coordinates
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
;> eax = pack[8(process slot), 24(button id)] or 0
|
||||||
|
;> ebx = pack[16(button x coord), 16(button y coord)]
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
;< eax = pointer to SYS_BUTTON struct or 0
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
push ecx edx esi edi
|
||||||
|
|
||||||
|
mov edx, eax
|
||||||
|
shr edx, 24
|
||||||
|
and eax, 0x0ffffff
|
||||||
|
|
||||||
|
mov edi, [BTN_ADDR]
|
||||||
|
mov ecx, [edi]
|
||||||
|
imul esi, ecx, SYS_BUTTON.sizeof
|
||||||
|
add esi, edi
|
||||||
|
inc ecx
|
||||||
|
add esi, SYS_BUTTON.sizeof
|
||||||
|
|
||||||
|
.next_button:
|
||||||
|
dec ecx
|
||||||
|
jz .not_found
|
||||||
|
|
||||||
|
add esi, -SYS_BUTTON.sizeof
|
||||||
|
|
||||||
|
; does it belong to our process?
|
||||||
|
cmp dx, [esi + SYS_BUTTON.pslot]
|
||||||
|
jne .next_button
|
||||||
|
|
||||||
|
; does id match?
|
||||||
|
mov edi, dword[esi + SYS_BUTTON.id_hi - 2]
|
||||||
|
mov di, [esi + SYS_BUTTON.id_lo]
|
||||||
|
and edi, 0x0ffffff
|
||||||
|
cmp eax, edi
|
||||||
|
jne .next_button
|
||||||
|
|
||||||
|
; does coordinates match?
|
||||||
|
mov edi, dword[esi + SYS_BUTTON.left - 2]
|
||||||
|
mov di, [esi + SYS_BUTTON.top]
|
||||||
|
cmp ebx, edi
|
||||||
|
jne .next_button
|
||||||
|
|
||||||
|
; okay, return it
|
||||||
|
mov eax, esi
|
||||||
|
jmp .exit
|
||||||
|
|
||||||
|
.not_found:
|
||||||
|
xor eax, eax
|
||||||
|
|
||||||
|
.exit:
|
||||||
|
pop edi esi edx ecx
|
||||||
|
ret
|
||||||
|
|
||||||
;------------------------------------------------------------------------------
|
;------------------------------------------------------------------------------
|
||||||
button._.dececx: ;/////////////////////////////////////////////////////////////
|
button._.dececx: ;/////////////////////////////////////////////////////////////
|
||||||
;------------------------------------------------------------------------------
|
;------------------------------------------------------------------------------
|
||||||
@ -546,7 +460,7 @@ button._.button_dececx: ;//////////////////////////////////////////////////////
|
|||||||
;------------------------------------------------------------------------------
|
;------------------------------------------------------------------------------
|
||||||
button._.negative_button: ;////////////////////////////////////////////////////
|
button._.negative_button: ;////////////////////////////////////////////////////
|
||||||
;------------------------------------------------------------------------------
|
;------------------------------------------------------------------------------
|
||||||
;? <description>
|
;? Invert system button border
|
||||||
;------------------------------------------------------------------------------
|
;------------------------------------------------------------------------------
|
||||||
; if requested, do not display button border on press.
|
; if requested, do not display button border on press.
|
||||||
test ebx, 0x20000000
|
test ebx, 0x20000000
|
||||||
|
@ -368,11 +368,13 @@ sys_sendwindowmsg: ;; f72
|
|||||||
cli
|
cli
|
||||||
sub ecx,2
|
sub ecx,2
|
||||||
je .sendkey
|
je .sendkey
|
||||||
loop .retf
|
dec ecx
|
||||||
|
jnz .retf
|
||||||
.sendbtn:
|
.sendbtn:
|
||||||
cmp byte[BTN_COUNT],1
|
cmp byte[BTN_COUNT],1
|
||||||
jae .result ;overflow
|
jae .result ;overflow
|
||||||
inc byte[BTN_COUNT]
|
inc byte[BTN_COUNT]
|
||||||
|
shl edx, 8
|
||||||
mov [BTN_BUFF],edx
|
mov [BTN_BUFF],edx
|
||||||
jmp .result
|
jmp .result
|
||||||
.sendkey:
|
.sendkey:
|
||||||
@ -467,7 +469,9 @@ get_event_for_app: ;; used from f10,f11,f23
|
|||||||
je .loop ; empty ???
|
je .loop ; empty ???
|
||||||
cmp edx,[TASK_COUNT]
|
cmp edx,[TASK_COUNT]
|
||||||
jne .loop ; not Top ???
|
jne .loop ; not Top ???
|
||||||
cmp dword[BTN_BUFF],0xFFFF ;-ID for Minimize-Button of Form
|
mov edx, [BTN_BUFF]
|
||||||
|
shr edx, 8
|
||||||
|
cmp edx, 0xFFFF ;-ID for Minimize-Button of Form
|
||||||
jne .result
|
jne .result
|
||||||
mov [window_minimize],1
|
mov [window_minimize],1
|
||||||
dec byte[BTN_COUNT]
|
dec byte[BTN_COUNT]
|
||||||
|
@ -1,250 +1,701 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
|
;; Copyright (C) KolibriOS team 2010. All rights reserved. ;;
|
||||||
;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa ;;
|
;; Distributed under terms of the GNU General Public License ;;
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
;; ;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
$Revision$
|
$Revision: -1 $
|
||||||
|
|
||||||
|
include 'mousepointer.inc'
|
||||||
iglobal
|
|
||||||
|
;==============================================================================
|
||||||
align 4
|
;///// public functions ///////////////////////////////////////////////////////
|
||||||
mousepointer:
|
;==============================================================================
|
||||||
db 0x00,0x00,0x00,0x74,0x74,0x74,0x6e,0x6e,0x6e,0x6f
|
|
||||||
db 0x6f,0x6f,0x71,0x71,0x71,0x75,0x75,0x75,0x79,0x79
|
mouse.LEFT_BUTTON_FLAG = 0001b
|
||||||
db 0x79,0x7c,0x7c,0x7c,0x7e,0x7e,0x7e,0x80,0x80,0x80
|
mouse.RIGHT_BUTTON_FLAG = 0010b
|
||||||
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
mouse.MIDDLE_BUTTON_FLAG = 0100b
|
||||||
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
|
||||||
db 0x80,0x00,0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x63
|
mouse.BUTTONS_MASK = \
|
||||||
db 0x66,0x66,0x66,0x6c,0x6c,0x6c,0x72,0x72,0x72,0x78
|
mouse.LEFT_BUTTON_FLAG or \
|
||||||
db 0x78,0x78,0x7c,0x7c,0x7c,0x7e,0x7e,0x7e,0x80,0x80
|
mouse.RIGHT_BUTTON_FLAG or \
|
||||||
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
mouse.MIDDLE_BUTTON_FLAG
|
||||||
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xc0
|
|
||||||
db 0xc0,0xc0,0x00,0x00,0x00,0x54,0x54,0x54,0x57,0x57
|
mouse.WINDOW_RESIZE_N_FLAG = 000001b
|
||||||
db 0x57,0x5f,0x5f,0x5f,0x68,0x68,0x68,0x71,0x71,0x71
|
mouse.WINDOW_RESIZE_W_FLAG = 000010b
|
||||||
db 0x77,0x77,0x77,0x7c,0x7c,0x7c,0x7e,0x7e,0x7e,0x80
|
mouse.WINDOW_RESIZE_S_FLAG = 000100b
|
||||||
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
mouse.WINDOW_RESIZE_E_FLAG = 001000b
|
||||||
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xc0,0xc0,0xc0
|
mouse.WINDOW_MOVE_FLAG = 010000b
|
||||||
db 0xc0,0xc0,0xc0,0x00,0x00,0x00,0x47,0x47,0x47,0x50
|
|
||||||
db 0x50,0x50,0x5b,0x5b,0x5b,0x67,0x67,0x67,0x70,0x70
|
mouse.WINDOW_RESIZE_SW_FLAG = \
|
||||||
db 0x70,0x77,0x77,0x77,0x7c,0x7c,0x7c,0x7e,0x7e,0x7e
|
mouse.WINDOW_RESIZE_S_FLAG or \
|
||||||
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
mouse.WINDOW_RESIZE_W_FLAG
|
||||||
db 0x80,0x80,0x80,0x80,0x80,0xff,0xff,0xff,0xc0,0xc0
|
mouse.WINDOW_RESIZE_SE_FLAG = \
|
||||||
db 0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x3f,0x3f,0x3f
|
mouse.WINDOW_RESIZE_S_FLAG or \
|
||||||
db 0x4b,0x4b,0x4b,0x59,0x59,0x59,0x66,0x66,0x66,0x70
|
mouse.WINDOW_RESIZE_E_FLAG
|
||||||
db 0x70,0x70,0x77,0x77,0x77,0x7c,0x7c,0x7c,0x7e,0x7e
|
|
||||||
db 0x7e,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
align 4
|
||||||
db 0x80,0x80,0x80,0xff,0xff,0xff,0xc0,0xc0,0xc0,0xc0
|
;------------------------------------------------------------------------------
|
||||||
db 0xc0,0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x3a,0x3a
|
mouse_check_events: ;//////////////////////////////////////////////////////////
|
||||||
db 0x3a,0x49,0x49,0x49,0x59,0x59,0x59,0x66,0x66,0x66
|
;------------------------------------------------------------------------------
|
||||||
db 0x70,0x70,0x70,0x77,0x77,0x77,0x7c,0x7c,0x7c,0x7e
|
;? Check if mouse buttons state or cursor position has changed and call
|
||||||
db 0x7e,0x7e,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
;? appropriate handlers
|
||||||
db 0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0xc0,0xc0
|
;------------------------------------------------------------------------------
|
||||||
db 0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x39
|
push eax ebx
|
||||||
db 0x39,0x39,0x49,0x49,0x49,0x59,0x59,0x59,0x66,0x66
|
|
||||||
db 0x66,0x71,0x71,0x71,0x78,0x78,0x78,0x7c,0x7c,0x7c
|
mov al, [BTN_DOWN]
|
||||||
db 0x7e,0x7e,0x7e,0x80,0x80,0x80,0x80,0x80,0x80,0xff
|
mov bl, [mouse.state.buttons]
|
||||||
db 0xff,0xff,0xff,0xff,0xff,0xc0,0xc0,0xc0,0xc0,0xc0
|
and al, mouse.BUTTONS_MASK
|
||||||
db 0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00
|
mov cl, al
|
||||||
db 0x39,0x39,0x39,0x4a,0x4a,0x4a,0x5a,0x5a,0x5a,0x68
|
xchg cl, [mouse.state.buttons]
|
||||||
db 0x68,0x68,0x72,0x72,0x72,0x79,0x79,0x79,0x7d,0x7d
|
xor bl, al
|
||||||
db 0x7d,0x7f,0x7f,0x7f,0x80,0x80,0x80,0xff,0xff,0xff
|
push eax ebx
|
||||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0xc0,0xc0,0xc0
|
|
||||||
db 0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x00,0x00
|
; did any mouse button changed its state?
|
||||||
db 0x00,0x3c,0x3c,0x3c,0x4e,0x4e,0x4e,0x5e,0x5e,0x5e
|
or bl, bl
|
||||||
db 0x6b,0x6b,0x6b,0x75,0x75,0x75,0x7a,0x7a,0x7a,0x7e
|
jz .check_position
|
||||||
db 0x7e,0x7e,0x80,0x80,0x80,0xff,0xff,0xff,0xff,0xff
|
|
||||||
db 0xff,0xff,0xff,0xff,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0
|
; yes it did, is that the first button of all pressed down?
|
||||||
db 0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x00
|
or cl, cl
|
||||||
db 0x00,0x00,0x43,0x43,0x43,0x55,0x55,0x55,0x64,0x64
|
jnz .check_buttons_released
|
||||||
db 0x64,0x70,0x70,0x70,0x78,0x78,0x78,0x7d,0x7d,0x7d
|
|
||||||
db 0x80,0x80,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xc0
|
; yes it is, activate window user is pointing at, if needed
|
||||||
db 0xc0,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
call mouse._.activate_sys_window_under_cursor
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
|
||||||
db 0x00,0x00,0x00,0x4e,0x4e,0x4e,0x5f,0x5f,0x5f,0x6d
|
; NOTE: this code wouldn't be necessary if we knew window did
|
||||||
db 0x6d,0x6d,0x76,0x76,0x76,0x7c,0x7c,0x7c,0x80,0x80
|
; already redraw itself after call above
|
||||||
db 0x80,0xff,0xff,0xff,0xc0,0xc0,0xc0,0x00,0x00,0x00
|
or eax, eax
|
||||||
db 0xff,0xff,0xff,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x14
|
jz @f
|
||||||
db 0x14,0x14,0x1b,0x1b,0x1b,0x29,0x29,0x29,0x3a,0x3a
|
|
||||||
db 0x3a,0x4c,0x4c,0x4c,0x5d,0x5d,0x5d,0x6c,0x6c,0x6c
|
and [mouse.state.buttons], 0
|
||||||
db 0x75,0x75,0x75,0x7b,0x7b,0x7b,0x80,0x80,0x80,0xc0
|
jmp .exit
|
||||||
db 0xc0,0xc0,0x00,0x00,0x00,0x2f,0x2f,0x2f,0x80,0x80
|
|
||||||
db 0x80,0xff,0xff,0xff,0xc0,0xc0,0xc0,0x00,0x00,0x00
|
; is there any system button under cursor?
|
||||||
db 0x21,0x21,0x21,0x2e,0x2e,0x2e,0x40,0x40,0x40,0x52
|
@@: call mouse._.find_sys_button_under_cursor
|
||||||
db 0x52,0x52,0x62,0x62,0x62,0x6f,0x6f,0x6f,0x77,0x77
|
or eax, eax
|
||||||
db 0x77,0x7c,0x7c,0x7c,0x80,0x80,0x80,0x00,0x00,0x00
|
jz .check_buttons_released
|
||||||
db 0x47,0x47,0x47,0x3b,0x3b,0x3b,0x80,0x80,0x80,0xff
|
|
||||||
db 0xff,0xff,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x25,0x25
|
; yes there is, activate it and exit
|
||||||
db 0x25,0x30,0x30,0x30,0x42,0x42,0x42,0x54,0x54,0x54
|
mov [mouse.active_sys_button.pbid], eax
|
||||||
db 0x64,0x64,0x64,0x70,0x70,0x70,0x78,0x78,0x78,0x7d
|
mov [mouse.active_sys_button.coord], ebx
|
||||||
db 0x7d,0x7d,0x00,0x00,0x00,0x62,0x62,0x62,0x52,0x52
|
mov cl, [mouse.state.buttons]
|
||||||
db 0x52,0x4a,0x4a,0x4a,0x43,0x43,0x43,0x80,0x80,0x80
|
mov [mouse.active_sys_button.buttons], cl
|
||||||
db 0xff,0xff,0xff,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x33
|
call sys_button_activate_handler
|
||||||
db 0x33,0x33,0x42,0x42,0x42,0x54,0x54,0x54,0x64,0x64
|
jmp .exit
|
||||||
db 0x64,0x71,0x71,0x71,0x79,0x79,0x79,0x7d,0x7d,0x7d
|
|
||||||
db 0x72,0x72,0x72,0x6b,0x6b,0x6b,0x5f,0x5f,0x5f,0x5a
|
.check_buttons_released:
|
||||||
db 0x5a,0x5a,0x54,0x54,0x54,0x80,0x80,0x80,0xff,0xff
|
cmp [mouse.state.buttons], 0
|
||||||
db 0xff,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x35,0x35,0x35
|
jnz .buttons_changed
|
||||||
db 0x41,0x41,0x41,0x53,0x53,0x53,0x63,0x63,0x63,0x70
|
|
||||||
db 0x70,0x70,0x78,0x78,0x78,0x7d,0x7d,0x7d,0x77,0x77
|
; did we press some button earlier?
|
||||||
db 0x77,0x73,0x73,0x73,0x6c,0x6c,0x6c,0x68,0x68,0x68
|
cmp [mouse.active_sys_button.pbid], 0
|
||||||
db 0x62,0x62,0x62,0x5a,0x5a,0x5a,0x80,0x80,0x80,0xff
|
je .buttons_changed
|
||||||
db 0xff,0xff,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x41,0x41
|
|
||||||
db 0x41,0x52,0x52,0x52,0x62,0x62,0x62,0x6f,0x6f,0x6f
|
; yes we did, deactivate it
|
||||||
db 0x78,0x78,0x78,0x7d,0x7d,0x7d,0x7b,0x7b,0x7b,0x79
|
xor eax, eax
|
||||||
db 0x79,0x79,0x74,0x74,0x74,0x72,0x72,0x72,0x6e,0x6e
|
xchg eax, [mouse.active_sys_button.pbid]
|
||||||
db 0x6e,0x66,0x66,0x66,0x80,0x80,0x80,0xc0,0xc0,0xc0
|
mov ebx, [mouse.active_sys_button.coord]
|
||||||
db 0xc0,0xc0,0xc0,0x00,0x00,0x00,0x44,0x44,0x44,0x52
|
mov cl, [mouse.active_sys_button.buttons]
|
||||||
db 0x52,0x52,0x62,0x62,0x62,0x6e,0x6e,0x6e,0x77,0x77
|
push eax ebx
|
||||||
db 0x77,0x7c,0x7c,0x7c,0x7e,0x7e,0x7e,0x7c,0x7c,0x7c
|
call sys_button_deactivate_handler
|
||||||
db 0x7a,0x7a,0x7a,0x79,0x79,0x79,0x75,0x75,0x75,0x6f
|
pop edx ecx
|
||||||
db 0x6f,0x6f,0x65,0x65,0x65,0x00,0x00,0x00,0x00,0x00
|
|
||||||
db 0x00,0x48,0x48,0x48,0x4b,0x4b,0x4b,0x56,0x56,0x56
|
; is the button under cursor the one we deactivated?
|
||||||
db 0x65,0x65,0x65,0x70,0x70,0x70,0x78,0x78,0x78,0x7d
|
call mouse._.find_sys_button_under_cursor
|
||||||
db 0x7d,0x7d,0x80,0x80,0x80,0x7f,0x7f,0x7f,0x7e,0x7e
|
cmp eax, ecx
|
||||||
db 0x7e,0x7d,0x7d,0x7d,0x7a,0x7a,0x7a,0x76,0x76,0x76
|
jne .exit
|
||||||
db 0x6f,0x6f,0x6f,0x65,0x65,0x65,0x5c,0x5c,0x5c,0x56
|
cmp ebx, edx
|
||||||
db 0x56,0x56,0x58,0x58,0x58,0x60,0x60,0x60,0x6b,0x6b
|
jne .exit
|
||||||
db 0x6b,0x73,0x73,0x73,0x7a,0x7a,0x7a,0x7d,0x7d,0x7d
|
|
||||||
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x7f
|
; yes it is, perform associated action
|
||||||
db 0x7f,0x7f,0x7d,0x7d,0x7d,0x7a,0x7a,0x7a,0x76,0x76
|
mov cl, [mouse.active_sys_button.buttons]
|
||||||
db 0x76,0x70,0x70,0x70,0x6a,0x6a,0x6a,0x66,0x66,0x66
|
call sys_button_perform_handler
|
||||||
db 0x66,0x66,0x66,0x6c,0x6c,0x6c,0x72,0x72,0x72,0x78
|
jmp .exit
|
||||||
db 0x78,0x78,0x7c,0x7c,0x7c,0x7e,0x7e,0x7e,0x80,0x80
|
|
||||||
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
.buttons_changed:
|
||||||
db 0x7f,0x7f,0x7f,0x7d,0x7d,0x7d,0x7b,0x7b,0x7b,0x77
|
test byte[esp], mouse.LEFT_BUTTON_FLAG
|
||||||
db 0x77,0x77,0x73,0x73,0x73,0x71,0x71,0x71,0x71,0x71
|
jz @f
|
||||||
db 0x71,0x74,0x74,0x74,0x78,0x78,0x78,0x7b,0x7b,0x7b
|
mov eax, [esp + 4]
|
||||||
db 0x7d,0x7d,0x7d,0x7f,0x7f,0x7f,0x80,0x80,0x80,0x80
|
call .call_left_button_handler
|
||||||
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
|
||||||
db 0x80,0x7f,0x7f,0x7f,0x7d,0x7d,0x7d,0x7c,0x7c,0x7c
|
@@: test byte[esp], mouse.RIGHT_BUTTON_FLAG
|
||||||
db 0x7a,0x7a,0x7a,0x78,0x78,0x78,0x78,0x78,0x78,0x7a
|
jz @f
|
||||||
db 0x7a,0x7a,0x7c,0x7c,0x7c,0x7e,0x7e,0x7e,0x7f,0x7f
|
mov eax, [esp + 4]
|
||||||
db 0x7f,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
call .call_right_button_handler
|
||||||
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
|
||||||
db 0x80,0x80,0x7f,0x7f,0x7f,0x7e,0x7e,0x7e,0x7e,0x7e
|
@@: test byte[esp], mouse.MIDDLE_BUTTON_FLAG
|
||||||
db 0x7e,0x7d,0x7d,0x7d,0x7d,0x7d,0x7d,0x7e,0x7e,0x7e
|
jz .check_position
|
||||||
db 0x7e,0x7e,0x7e,0x7f,0x7f,0x7f,0x80,0x80,0x80,0x80
|
mov eax, [esp + 4]
|
||||||
db 0x80,0x80
|
call .call_middle_button_handler
|
||||||
|
|
||||||
mousepointer1:
|
.check_position:
|
||||||
db 0xff,0xff,0xff,0x06,0x06,0x06,0x0a,0x0a
|
movzx eax, word[MOUSE_X]
|
||||||
db 0x0a,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00
|
movzx ebx, word[MOUSE_Y]
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
cmp eax, [mouse.state.pos.x]
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
jne .position_changed
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
cmp ebx, [mouse.state.pos.y]
|
||||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0x19,0x19,0x19,0x16
|
je .exit
|
||||||
db 0x16,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
.position_changed:
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
xchg eax, [mouse.state.pos.x]
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff
|
xchg ebx, [mouse.state.pos.y]
|
||||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2e,0x2e,0x2e
|
|
||||||
db 0x23,0x23,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
call mouse._.move_handler
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
.exit:
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff
|
add esp, 8
|
||||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x3f
|
pop ebx eax
|
||||||
db 0x3f,0x29,0x29,0x29,0x00,0x00,0x00,0x00,0x00,0x00
|
ret
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
.call_left_button_handler:
|
||||||
db 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff
|
test eax, mouse.LEFT_BUTTON_FLAG
|
||||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x47
|
jnz mouse._.left_button_press_handler
|
||||||
db 0x47,0x47,0x2c,0x2c,0x2c,0x00,0x00,0x00,0x00,0x00
|
jmp mouse._.left_button_release_handler
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
.call_right_button_handler:
|
||||||
db 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
test eax, mouse.RIGHT_BUTTON_FLAG
|
||||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
jnz mouse._.right_button_press_handler
|
||||||
db 0x48,0x48,0x48,0x2c,0x2c,0x2c,0x16,0x16,0x16,0x00
|
jmp mouse._.right_button_release_handler
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
.call_middle_button_handler:
|
||||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
test eax, mouse.MIDDLE_BUTTON_FLAG
|
||||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
jnz mouse._.middle_button_press_handler
|
||||||
db 0xff,0x48,0x48,0x48,0x2c,0x2c,0x2c,0x16,0x16,0x16
|
jmp mouse._.middle_button_release_handler
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff
|
;==============================================================================
|
||||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
;///// private functions //////////////////////////////////////////////////////
|
||||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
;==============================================================================
|
||||||
db 0xff,0xff,0x48,0x48,0x48,0x2c,0x2c,0x2c,0x00,0x00
|
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
uglobal
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff
|
mouse.state:
|
||||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
.pos POINT
|
||||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
.buttons db ?
|
||||||
db 0xff,0xff,0xff,0x48,0x48,0x48,0x2c,0x2c,0x2c,0x00
|
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
; NOTE: since there's no unique and lifetime-constant button identifiers,
|
||||||
db 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff
|
; we're using two dwords to identify each of them:
|
||||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
; * pbid - process slot (high 8 bits) and button id (low 24 bits) pack
|
||||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
; * coord - left (high 16 bits) and top (low 16 bits) coordinates pack
|
||||||
db 0xff,0xff,0xff,0xff,0x47,0x47,0x47,0x29,0x29,0x29
|
align 4
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
mouse.active_sys_button:
|
||||||
db 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
.pbid dd ?
|
||||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
.coord dd ?
|
||||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
.buttons db ?
|
||||||
db 0xff,0xff,0xff,0xff,0xff,0x40,0x40,0x40,0x23,0x23
|
|
||||||
db 0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
align 4
|
||||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
mouse.active_sys_window:
|
||||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
.pslot dd ?
|
||||||
db 0xff,0xaa,0xaa,0xaa,0x9f,0x9f,0x9f,0x8c,0x8c,0x8c
|
.old_box BOX
|
||||||
db 0x70,0x70,0x70,0x4f,0x4f,0x4f,0x30,0x30,0x30,0x00
|
.new_box BOX
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff
|
.delta POINT
|
||||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x8f,0x8f,0x8f
|
.last_ticks dd ?
|
||||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
.action db ?
|
||||||
db 0xff,0xff,0x9c,0x9c,0x9c,0x87,0x87,0x87,0x6c,0x6c
|
endg
|
||||||
db 0x6c,0x4f,0x4f,0x4f,0x32,0x32,0x32,0x19,0x19,0x19
|
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff
|
align 4
|
||||||
db 0xff,0xff,0x69,0x69,0x69,0x84,0x84,0x84,0xff,0xff
|
;------------------------------------------------------------------------------
|
||||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
mouse._.left_button_press_handler: ;///////////////////////////////////////////
|
||||||
db 0x92,0x92,0x92,0x79,0x79,0x79,0x59,0x59,0x59,0x3c
|
;------------------------------------------------------------------------------
|
||||||
db 0x3c,0x3c,0x24,0x24,0x24,0x11,0x11,0x11,0x00,0x00
|
;? Called when left mouse button has been pressed down
|
||||||
db 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x37,0x37,0x37
|
;------------------------------------------------------------------------------
|
||||||
db 0x5d,0x5d,0x5d,0x70,0x70,0x70,0x76,0x76,0x76,0xff
|
test [mouse.state.buttons], not mouse.LEFT_BUTTON_FLAG
|
||||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
jnz .exit
|
||||||
db 0xff,0x75,0x75,0x75,0x51,0x51,0x51,0x31,0x31,0x31
|
|
||||||
db 0x19,0x19,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
call mouse._.find_sys_window_under_cursor
|
||||||
db 0x00,0x00,0x16,0x16,0x16,0x2d,0x2d,0x2d,0x49,0x49
|
call mouse._.check_sys_window_actions
|
||||||
db 0x49,0x53,0x53,0x53,0x54,0x54,0x54,0xff,0xff,0xff
|
mov [mouse.active_sys_window.action], al
|
||||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x78
|
or eax, eax
|
||||||
db 0x78,0x78,0x54,0x54,0x54,0x30,0x30,0x30,0x16,0x16
|
jz .exit
|
||||||
db 0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
|
||||||
db 0x0f,0x0f,0x0f,0x1f,0x1f,0x1f,0x30,0x30,0x30,0x33
|
xchg eax, edx
|
||||||
db 0x33,0x33,0x33,0x33,0x33,0x3b,0x3b,0x3b,0xff,0xff
|
test dl, mouse.WINDOW_MOVE_FLAG
|
||||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
jz @f
|
||||||
db 0x62,0x62,0x62,0x3b,0x3b,0x3b,0x1c,0x1c,0x1c,0x00
|
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08
|
mov eax, [timer_ticks]
|
||||||
db 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
mov ebx, eax
|
||||||
db 0x00,0x00,0x00,0x24,0x24,0x24,0xff,0xff,0xff,0xff
|
xchg ebx, [mouse.active_sys_window.last_ticks]
|
||||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x6e,0x6e
|
sub eax, ebx
|
||||||
db 0x6e,0x48,0x48,0x48,0x25,0x25,0x25,0x0e,0x0e,0x0e
|
cmp eax, 50
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0x00
|
jg @f
|
||||||
db 0x00,0x00,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x00,0x00
|
|
||||||
db 0x00,0x00,0x00,0x00,0x29,0x29,0x29,0xff,0xff,0xff
|
mov [mouse.active_sys_window.last_ticks], 0
|
||||||
db 0xff,0xff,0xff,0x7c,0x7c,0x7c,0x71,0x71,0x71,0x50
|
call sys_window_maximize_handler
|
||||||
db 0x50,0x50,0x2b,0x2b,0x2b,0x00,0x00,0x00,0x00,0x00
|
jmp .exit
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
|
||||||
db 0x00,0x00,0x00,0x02,0x02,0x02,0x04,0x04,0x04,0x00
|
@@: test [edi + WDATA.fl_wstate], WSTATE_MAXIMIZED
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x36,0x36,0x36,0x56,0x56
|
jnz .exit
|
||||||
db 0x56,0x69,0x69,0x69,0x64,0x64,0x64,0x4a,0x4a,0x4a
|
mov [mouse.active_sys_window.pslot], esi
|
||||||
db 0x28,0x28,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
lea eax, [edi + WDATA.box]
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
mov ebx, mouse.active_sys_window.old_box
|
||||||
db 0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x05,0x05,0x05
|
mov ecx, BOX.sizeof
|
||||||
db 0x00,0x00,0x00,0x21,0x21,0x21,0x39,0x39,0x39,0x49
|
call memmove
|
||||||
db 0x49,0x49,0x48,0x48,0x48,0x35,0x35,0x35,0x1d,0x1d
|
mov ebx, mouse.active_sys_window.new_box
|
||||||
db 0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
call memmove
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
test edx, mouse.WINDOW_MOVE_FLAG
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x00
|
jz @f
|
||||||
db 0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x27,0x27,0x27
|
|
||||||
db 0x27,0x27,0x27,0x1d,0x1d,0x1d,0x0f,0x0f,0x0f,0x06
|
call .calculate_n_delta
|
||||||
db 0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
call .calculate_w_delta
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
jmp .call_window_handler
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
@@: test dl, mouse.WINDOW_RESIZE_W_FLAG
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
jz @f
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
call .calculate_w_delta
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
@@: test dl, mouse.WINDOW_RESIZE_S_FLAG
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
jz @f
|
||||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
call .calculate_s_delta
|
||||||
db 0x00,0x00,0x00,0x00
|
|
||||||
|
@@: test dl, mouse.WINDOW_RESIZE_E_FLAG
|
||||||
endg
|
jz .call_window_handler
|
||||||
|
call .calculate_e_delta
|
||||||
|
|
||||||
|
.call_window_handler:
|
||||||
|
mov eax, mouse.active_sys_window.old_box
|
||||||
|
call sys_window_start_moving_handler
|
||||||
|
|
||||||
|
.exit:
|
||||||
|
ret
|
||||||
|
|
||||||
|
.calculate_n_delta:
|
||||||
|
mov eax, [mouse.state.pos.y]
|
||||||
|
sub eax, [mouse.active_sys_window.old_box.top]
|
||||||
|
mov [mouse.active_sys_window.delta.y], eax
|
||||||
|
ret
|
||||||
|
|
||||||
|
.calculate_w_delta:
|
||||||
|
mov eax, [mouse.state.pos.x]
|
||||||
|
sub eax, [mouse.active_sys_window.old_box.left]
|
||||||
|
mov [mouse.active_sys_window.delta.x], eax
|
||||||
|
ret
|
||||||
|
|
||||||
|
.calculate_s_delta:
|
||||||
|
mov eax, [mouse.active_sys_window.old_box.top]
|
||||||
|
add eax, [mouse.active_sys_window.old_box.height]
|
||||||
|
sub eax, [mouse.state.pos.y]
|
||||||
|
mov [mouse.active_sys_window.delta.y], eax
|
||||||
|
ret
|
||||||
|
|
||||||
|
.calculate_e_delta:
|
||||||
|
mov eax, [mouse.active_sys_window.old_box.left]
|
||||||
|
add eax, [mouse.active_sys_window.old_box.width]
|
||||||
|
sub eax, [mouse.state.pos.x]
|
||||||
|
mov [mouse.active_sys_window.delta.x], eax
|
||||||
|
ret
|
||||||
|
|
||||||
|
align 4
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
mouse._.left_button_release_handler: ;/////////////////////////////////////////
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
;? Called when left mouse button has been released
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
xor esi, esi
|
||||||
|
xchg esi, [mouse.active_sys_window.pslot]
|
||||||
|
or esi, esi
|
||||||
|
jz .exit
|
||||||
|
|
||||||
|
mov eax, esi
|
||||||
|
shl eax, 5
|
||||||
|
add eax, window_data + WDATA.box
|
||||||
|
mov ebx, mouse.active_sys_window.old_box
|
||||||
|
mov ecx, BOX.sizeof
|
||||||
|
call memmove
|
||||||
|
|
||||||
|
mov eax, mouse.active_sys_window.old_box
|
||||||
|
mov ebx, mouse.active_sys_window.new_box
|
||||||
|
call sys_window_end_moving_handler
|
||||||
|
|
||||||
|
.exit:
|
||||||
|
ret
|
||||||
|
|
||||||
|
align 4
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
mouse._.right_button_press_handler: ;//////////////////////////////////////////
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
;? Called when right mouse button has been pressed down
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
test [mouse.state.buttons], not mouse.RIGHT_BUTTON_FLAG
|
||||||
|
jnz .exit
|
||||||
|
|
||||||
|
call mouse._.find_sys_window_under_cursor
|
||||||
|
call mouse._.check_sys_window_actions
|
||||||
|
test al, mouse.WINDOW_MOVE_FLAG
|
||||||
|
jz .exit
|
||||||
|
|
||||||
|
call sys_window_rollup_handler
|
||||||
|
|
||||||
|
.exit:
|
||||||
|
ret
|
||||||
|
|
||||||
|
align 4
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
mouse._.right_button_release_handler: ;////////////////////////////////////////
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
;? Called when right mouse button has been released
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
ret
|
||||||
|
|
||||||
|
align 4
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
mouse._.middle_button_press_handler: ;/////////////////////////////////////////
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
;? Called when middle mouse button has been pressed down
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
ret
|
||||||
|
|
||||||
|
align 4
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
mouse._.middle_button_release_handler: ;///////////////////////////////////////
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
;? Called when middle mouse button has been released
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
ret
|
||||||
|
|
||||||
|
align 4
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
mouse._.move_handler: ;////////////////////////////////////////////////////////
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
;? Called when cursor has been moved
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
;> eax = old x coord
|
||||||
|
;> ebx = old y coord
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
cmp [mouse.active_sys_button.pbid], 0
|
||||||
|
jnz .exit
|
||||||
|
|
||||||
|
mov esi, [mouse.active_sys_window.pslot]
|
||||||
|
or esi, esi
|
||||||
|
jz .exit
|
||||||
|
|
||||||
|
mov eax, mouse.active_sys_window.new_box
|
||||||
|
mov ebx, mouse.active_sys_window.old_box
|
||||||
|
mov ecx, BOX.sizeof
|
||||||
|
call memmove
|
||||||
|
|
||||||
|
mov dl, [mouse.active_sys_window.action]
|
||||||
|
test dl, mouse.WINDOW_MOVE_FLAG
|
||||||
|
jz .check_resize_w
|
||||||
|
|
||||||
|
mov eax, [mouse.state.pos.x]
|
||||||
|
sub eax, [mouse.active_sys_window.delta.x]
|
||||||
|
mov [mouse.active_sys_window.new_box.left], eax
|
||||||
|
mov eax, [mouse.state.pos.y]
|
||||||
|
sub eax, [mouse.active_sys_window.delta.y]
|
||||||
|
mov [mouse.active_sys_window.new_box.top], eax
|
||||||
|
|
||||||
|
mov eax, [mouse.active_sys_window.new_box.left]
|
||||||
|
or eax, eax
|
||||||
|
jge @f
|
||||||
|
xor eax, eax
|
||||||
|
mov [mouse.active_sys_window.new_box.left], eax
|
||||||
|
@@: add eax, [mouse.active_sys_window.new_box.width]
|
||||||
|
cmp eax, [Screen_Max_X]
|
||||||
|
jl @f
|
||||||
|
sub eax, [Screen_Max_X]
|
||||||
|
sub [mouse.active_sys_window.new_box.left], eax
|
||||||
|
@@: mov eax, [mouse.active_sys_window.new_box.top]
|
||||||
|
or eax, eax
|
||||||
|
jge @f
|
||||||
|
xor eax, eax
|
||||||
|
mov [mouse.active_sys_window.new_box.top], eax
|
||||||
|
@@: add eax, [mouse.active_sys_window.new_box.height]
|
||||||
|
cmp eax, [Screen_Max_Y]
|
||||||
|
jle .call_window_handler
|
||||||
|
sub eax, [Screen_Max_Y]
|
||||||
|
sub [mouse.active_sys_window.new_box.top], eax
|
||||||
|
jmp .call_window_handler
|
||||||
|
|
||||||
|
.check_resize_w:
|
||||||
|
test dl, mouse.WINDOW_RESIZE_W_FLAG
|
||||||
|
jz .check_resize_s
|
||||||
|
|
||||||
|
mov eax, [mouse.state.pos.x]
|
||||||
|
sub eax, [mouse.active_sys_window.delta.x]
|
||||||
|
mov [mouse.active_sys_window.new_box.left], eax
|
||||||
|
sub eax, [mouse.active_sys_window.old_box.left]
|
||||||
|
sub [mouse.active_sys_window.new_box.width], eax
|
||||||
|
|
||||||
|
mov eax, [mouse.active_sys_window.new_box.width]
|
||||||
|
sub eax, 127
|
||||||
|
jge @f
|
||||||
|
add [mouse.active_sys_window.new_box.left], eax
|
||||||
|
mov [mouse.active_sys_window.new_box.width], 127
|
||||||
|
@@: mov eax, [mouse.active_sys_window.new_box.left]
|
||||||
|
or eax, eax
|
||||||
|
jge .check_resize_s
|
||||||
|
add [mouse.active_sys_window.new_box.width], eax
|
||||||
|
xor eax, eax
|
||||||
|
mov [mouse.active_sys_window.new_box.left], eax
|
||||||
|
|
||||||
|
.check_resize_s:
|
||||||
|
test dl, mouse.WINDOW_RESIZE_S_FLAG
|
||||||
|
jz .check_resize_e
|
||||||
|
|
||||||
|
mov eax, [mouse.state.pos.y]
|
||||||
|
add eax, [mouse.active_sys_window.delta.y]
|
||||||
|
sub eax, [mouse.active_sys_window.old_box.top]
|
||||||
|
mov [mouse.active_sys_window.new_box.height], eax
|
||||||
|
|
||||||
|
push eax
|
||||||
|
mov edi, esi
|
||||||
|
shl edi, 5
|
||||||
|
add edi, window_data
|
||||||
|
call window._.get_rolledup_height
|
||||||
|
mov ecx, eax
|
||||||
|
pop eax
|
||||||
|
mov eax, [mouse.active_sys_window.new_box.height]
|
||||||
|
cmp eax, ecx
|
||||||
|
jge @f
|
||||||
|
mov eax, ecx
|
||||||
|
mov [mouse.active_sys_window.new_box.height], eax
|
||||||
|
@@: add eax, [mouse.active_sys_window.new_box.top]
|
||||||
|
cmp eax, [Screen_Max_Y]
|
||||||
|
jle .check_resize_e
|
||||||
|
sub eax, [Screen_Max_Y]
|
||||||
|
neg eax
|
||||||
|
add [mouse.active_sys_window.new_box.height], eax
|
||||||
|
mov ecx, [Screen_Max_Y]
|
||||||
|
cmp ecx, eax
|
||||||
|
jge .check_resize_e
|
||||||
|
mov [mouse.active_sys_window.new_box.height], ecx
|
||||||
|
|
||||||
|
.check_resize_e:
|
||||||
|
test dl, mouse.WINDOW_RESIZE_E_FLAG
|
||||||
|
jz .call_window_handler
|
||||||
|
|
||||||
|
mov eax, [mouse.state.pos.x]
|
||||||
|
add eax, [mouse.active_sys_window.delta.x]
|
||||||
|
sub eax, [mouse.active_sys_window.old_box.left]
|
||||||
|
mov [mouse.active_sys_window.new_box.width], eax
|
||||||
|
|
||||||
|
mov eax, [mouse.active_sys_window.new_box.width]
|
||||||
|
cmp eax, 127
|
||||||
|
jge @f
|
||||||
|
mov eax, 127
|
||||||
|
mov [mouse.active_sys_window.new_box.width], eax
|
||||||
|
@@: add eax, [mouse.active_sys_window.new_box.left]
|
||||||
|
cmp eax, [Screen_Max_X]
|
||||||
|
jle .call_window_handler
|
||||||
|
sub eax, [Screen_Max_X]
|
||||||
|
neg eax
|
||||||
|
add [mouse.active_sys_window.new_box.width], eax
|
||||||
|
mov ecx, [Screen_Max_X]
|
||||||
|
cmp ecx, eax
|
||||||
|
jge .call_window_handler
|
||||||
|
mov [mouse.active_sys_window.new_box.width], ecx
|
||||||
|
|
||||||
|
.call_window_handler:
|
||||||
|
mov eax, mouse.active_sys_window.old_box
|
||||||
|
mov ebx, mouse.active_sys_window.new_box
|
||||||
|
|
||||||
|
push esi
|
||||||
|
mov esi, mouse.active_sys_window.old_box
|
||||||
|
mov edi, mouse.active_sys_window.new_box
|
||||||
|
mov ecx, BOX.sizeof / 4
|
||||||
|
repe
|
||||||
|
cmpsd
|
||||||
|
pop esi
|
||||||
|
je .exit
|
||||||
|
|
||||||
|
mov [mouse.active_sys_window.last_ticks], 0
|
||||||
|
call sys_window_moving_handler
|
||||||
|
|
||||||
|
.exit:
|
||||||
|
ret
|
||||||
|
|
||||||
|
align 4
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
mouse._.find_sys_window_under_cursor: ;////////////////////////////////////////
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
;? Find system window object which is currently visible on screen and has
|
||||||
|
;? mouse cursor within its bounds
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
;< esi = process slot
|
||||||
|
;< edi = pointer to WDATA struct
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
mov esi, [Screen_Max_X]
|
||||||
|
inc esi
|
||||||
|
imul esi, [mouse.state.pos.y]
|
||||||
|
add esi, [_WinMapAddress]
|
||||||
|
add esi, [mouse.state.pos.x]
|
||||||
|
movzx esi, byte[esi]
|
||||||
|
mov edi, esi
|
||||||
|
shl edi, 5
|
||||||
|
add edi, window_data
|
||||||
|
ret
|
||||||
|
|
||||||
|
align 4
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
mouse._.activate_sys_window_under_cursor: ;////////////////////////////////////
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
;? <description>
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
; activate and redraw window under cursor (if necessary)
|
||||||
|
call mouse._.find_sys_window_under_cursor
|
||||||
|
movzx esi, word[WIN_STACK + esi * 2]
|
||||||
|
lea esi, [WIN_POS + esi * 2]
|
||||||
|
jmp waredraw
|
||||||
|
|
||||||
|
align 4
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
mouse._.find_sys_button_under_cursor: ;////////////////////////////////////////
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
;? Find system button object which is currently visible on screen and has
|
||||||
|
;? mouse cursor within its bounds
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
;< eax = pack[8(process slot), 24(button id)] or 0
|
||||||
|
;< ebx = pack[16(button x coord), 16(button y coord)]
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
push ecx edx esi edi
|
||||||
|
|
||||||
|
call mouse._.find_sys_window_under_cursor
|
||||||
|
mov edx, esi
|
||||||
|
|
||||||
|
; check if any process button contains cursor
|
||||||
|
mov eax, [BTN_ADDR]
|
||||||
|
mov ecx, [eax]
|
||||||
|
imul esi, ecx, SYS_BUTTON.sizeof
|
||||||
|
add esi, eax
|
||||||
|
inc ecx
|
||||||
|
add esi, SYS_BUTTON.sizeof
|
||||||
|
|
||||||
|
.next_button:
|
||||||
|
dec ecx
|
||||||
|
jz .not_found
|
||||||
|
|
||||||
|
add esi, -SYS_BUTTON.sizeof
|
||||||
|
|
||||||
|
; does it belong to our process?
|
||||||
|
cmp dx, [esi + SYS_BUTTON.pslot]
|
||||||
|
jne .next_button
|
||||||
|
|
||||||
|
; does it contain cursor coordinates?
|
||||||
|
mov eax, [mouse.state.pos.x]
|
||||||
|
sub eax, [edi + WDATA.box.left]
|
||||||
|
sub ax, [esi + SYS_BUTTON.left]
|
||||||
|
jl .next_button
|
||||||
|
sub ax, [esi + SYS_BUTTON.width]
|
||||||
|
jge .next_button
|
||||||
|
mov eax, [mouse.state.pos.y]
|
||||||
|
sub eax, [edi + WDATA.box.top]
|
||||||
|
sub ax, [esi + SYS_BUTTON.top]
|
||||||
|
jl .next_button
|
||||||
|
sub ax, [esi + SYS_BUTTON.height]
|
||||||
|
jge .next_button
|
||||||
|
|
||||||
|
; okay, return it
|
||||||
|
shl edx, 24
|
||||||
|
mov eax, dword[esi + SYS_BUTTON.id_hi - 2]
|
||||||
|
mov ax, [esi + SYS_BUTTON.id_lo]
|
||||||
|
and eax, 0x0ffffff
|
||||||
|
or eax, edx
|
||||||
|
mov ebx, dword[esi + SYS_BUTTON.left - 2]
|
||||||
|
mov bx, [esi + SYS_BUTTON.top]
|
||||||
|
jmp .exit
|
||||||
|
|
||||||
|
.not_found:
|
||||||
|
xor eax, eax
|
||||||
|
xor ebx, ebx
|
||||||
|
|
||||||
|
.exit:
|
||||||
|
pop edi esi edx ecx
|
||||||
|
ret
|
||||||
|
|
||||||
|
align 4
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
mouse._.check_sys_window_actions: ;////////////////////////////////////////////
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
;? <description>
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
;< eax = action flags or 0
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
; is window movable?
|
||||||
|
test byte[edi + WDATA.cl_titlebar + 3], 0x01
|
||||||
|
jnz .no_action
|
||||||
|
|
||||||
|
mov eax, [mouse.state.pos.x]
|
||||||
|
mov ebx, [mouse.state.pos.y]
|
||||||
|
sub eax, [edi + WDATA.box.left]
|
||||||
|
sub ebx, [edi + WDATA.box.top]
|
||||||
|
|
||||||
|
; is there a window titlebar under cursor?
|
||||||
|
push eax
|
||||||
|
call window._.get_titlebar_height
|
||||||
|
cmp ebx, eax
|
||||||
|
pop eax
|
||||||
|
jl .move_action
|
||||||
|
|
||||||
|
; no there isn't, can it be resized then?
|
||||||
|
mov dl, [edi + WDATA.fl_wstyle]
|
||||||
|
and dl, 0x0f
|
||||||
|
; NOTE: dangerous optimization, revise if window types changed;
|
||||||
|
; this currently implies only types 2 and 3 could be resized
|
||||||
|
test dl, 2
|
||||||
|
jz .no_action
|
||||||
|
|
||||||
|
mov ecx, [edi + WDATA.box.width]
|
||||||
|
add ecx, -window.BORDER_SIZE
|
||||||
|
mov edx, [edi + WDATA.box.height]
|
||||||
|
add edx, -window.BORDER_SIZE
|
||||||
|
|
||||||
|
; is it rolled up?
|
||||||
|
test [edi + WDATA.fl_wstate], WSTATE_ROLLEDUP
|
||||||
|
jnz .resize_w_or_e_action
|
||||||
|
|
||||||
|
cmp eax, window.BORDER_SIZE
|
||||||
|
jl .resize_w_action
|
||||||
|
cmp eax, ecx
|
||||||
|
jg .resize_e_action
|
||||||
|
cmp ebx, edx
|
||||||
|
jle .no_action
|
||||||
|
|
||||||
|
.resize_s_action:
|
||||||
|
cmp eax, window.BORDER_SIZE + 10
|
||||||
|
jl .resize_sw_action
|
||||||
|
add ecx, -10
|
||||||
|
cmp eax, ecx
|
||||||
|
jge .resize_se_action
|
||||||
|
mov eax, mouse.WINDOW_RESIZE_S_FLAG
|
||||||
|
jmp .exit
|
||||||
|
|
||||||
|
.resize_w_or_e_action:
|
||||||
|
cmp eax, window.BORDER_SIZE + 10
|
||||||
|
jl .resize_w_action.direct
|
||||||
|
add ecx, -10
|
||||||
|
cmp eax, ecx
|
||||||
|
jg .resize_e_action.direct
|
||||||
|
jmp .no_action
|
||||||
|
|
||||||
|
.resize_w_action:
|
||||||
|
add edx, -10
|
||||||
|
cmp ebx, edx
|
||||||
|
jge .resize_sw_action
|
||||||
|
.resize_w_action.direct:
|
||||||
|
mov eax, mouse.WINDOW_RESIZE_W_FLAG
|
||||||
|
jmp .exit
|
||||||
|
|
||||||
|
.resize_e_action:
|
||||||
|
add edx, -10
|
||||||
|
cmp ebx, edx
|
||||||
|
jge .resize_se_action
|
||||||
|
.resize_e_action.direct:
|
||||||
|
mov eax, mouse.WINDOW_RESIZE_E_FLAG
|
||||||
|
jmp .exit
|
||||||
|
|
||||||
|
.resize_sw_action:
|
||||||
|
mov eax, mouse.WINDOW_RESIZE_SW_FLAG
|
||||||
|
jmp .exit
|
||||||
|
|
||||||
|
.resize_se_action:
|
||||||
|
mov eax, mouse.WINDOW_RESIZE_SE_FLAG
|
||||||
|
jmp .exit
|
||||||
|
|
||||||
|
.move_action:
|
||||||
|
mov eax, mouse.WINDOW_MOVE_FLAG
|
||||||
|
jmp .exit
|
||||||
|
|
||||||
|
.no_action:
|
||||||
|
xor eax, eax
|
||||||
|
|
||||||
|
.exit:
|
||||||
|
ret
|
||||||
|
250
kernel/trunk/gui/mousepointer.inc
Normal file
250
kernel/trunk/gui/mousepointer.inc
Normal file
@ -0,0 +1,250 @@
|
|||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; ;;
|
||||||
|
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
|
||||||
|
;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa ;;
|
||||||
|
;; Distributed under terms of the GNU General Public License ;;
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
$Revision$
|
||||||
|
|
||||||
|
|
||||||
|
iglobal
|
||||||
|
|
||||||
|
align 4
|
||||||
|
mousepointer:
|
||||||
|
db 0x00,0x00,0x00,0x74,0x74,0x74,0x6e,0x6e,0x6e,0x6f
|
||||||
|
db 0x6f,0x6f,0x71,0x71,0x71,0x75,0x75,0x75,0x79,0x79
|
||||||
|
db 0x79,0x7c,0x7c,0x7c,0x7e,0x7e,0x7e,0x80,0x80,0x80
|
||||||
|
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
||||||
|
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
||||||
|
db 0x80,0x00,0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x63
|
||||||
|
db 0x66,0x66,0x66,0x6c,0x6c,0x6c,0x72,0x72,0x72,0x78
|
||||||
|
db 0x78,0x78,0x7c,0x7c,0x7c,0x7e,0x7e,0x7e,0x80,0x80
|
||||||
|
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
||||||
|
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xc0
|
||||||
|
db 0xc0,0xc0,0x00,0x00,0x00,0x54,0x54,0x54,0x57,0x57
|
||||||
|
db 0x57,0x5f,0x5f,0x5f,0x68,0x68,0x68,0x71,0x71,0x71
|
||||||
|
db 0x77,0x77,0x77,0x7c,0x7c,0x7c,0x7e,0x7e,0x7e,0x80
|
||||||
|
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
||||||
|
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xc0,0xc0,0xc0
|
||||||
|
db 0xc0,0xc0,0xc0,0x00,0x00,0x00,0x47,0x47,0x47,0x50
|
||||||
|
db 0x50,0x50,0x5b,0x5b,0x5b,0x67,0x67,0x67,0x70,0x70
|
||||||
|
db 0x70,0x77,0x77,0x77,0x7c,0x7c,0x7c,0x7e,0x7e,0x7e
|
||||||
|
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
||||||
|
db 0x80,0x80,0x80,0x80,0x80,0xff,0xff,0xff,0xc0,0xc0
|
||||||
|
db 0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x3f,0x3f,0x3f
|
||||||
|
db 0x4b,0x4b,0x4b,0x59,0x59,0x59,0x66,0x66,0x66,0x70
|
||||||
|
db 0x70,0x70,0x77,0x77,0x77,0x7c,0x7c,0x7c,0x7e,0x7e
|
||||||
|
db 0x7e,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
||||||
|
db 0x80,0x80,0x80,0xff,0xff,0xff,0xc0,0xc0,0xc0,0xc0
|
||||||
|
db 0xc0,0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x3a,0x3a
|
||||||
|
db 0x3a,0x49,0x49,0x49,0x59,0x59,0x59,0x66,0x66,0x66
|
||||||
|
db 0x70,0x70,0x70,0x77,0x77,0x77,0x7c,0x7c,0x7c,0x7e
|
||||||
|
db 0x7e,0x7e,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
||||||
|
db 0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0xc0,0xc0
|
||||||
|
db 0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x39
|
||||||
|
db 0x39,0x39,0x49,0x49,0x49,0x59,0x59,0x59,0x66,0x66
|
||||||
|
db 0x66,0x71,0x71,0x71,0x78,0x78,0x78,0x7c,0x7c,0x7c
|
||||||
|
db 0x7e,0x7e,0x7e,0x80,0x80,0x80,0x80,0x80,0x80,0xff
|
||||||
|
db 0xff,0xff,0xff,0xff,0xff,0xc0,0xc0,0xc0,0xc0,0xc0
|
||||||
|
db 0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00
|
||||||
|
db 0x39,0x39,0x39,0x4a,0x4a,0x4a,0x5a,0x5a,0x5a,0x68
|
||||||
|
db 0x68,0x68,0x72,0x72,0x72,0x79,0x79,0x79,0x7d,0x7d
|
||||||
|
db 0x7d,0x7f,0x7f,0x7f,0x80,0x80,0x80,0xff,0xff,0xff
|
||||||
|
db 0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0xc0,0xc0,0xc0
|
||||||
|
db 0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x00,0x00
|
||||||
|
db 0x00,0x3c,0x3c,0x3c,0x4e,0x4e,0x4e,0x5e,0x5e,0x5e
|
||||||
|
db 0x6b,0x6b,0x6b,0x75,0x75,0x75,0x7a,0x7a,0x7a,0x7e
|
||||||
|
db 0x7e,0x7e,0x80,0x80,0x80,0xff,0xff,0xff,0xff,0xff
|
||||||
|
db 0xff,0xff,0xff,0xff,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0
|
||||||
|
db 0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x00
|
||||||
|
db 0x00,0x00,0x43,0x43,0x43,0x55,0x55,0x55,0x64,0x64
|
||||||
|
db 0x64,0x70,0x70,0x70,0x78,0x78,0x78,0x7d,0x7d,0x7d
|
||||||
|
db 0x80,0x80,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xc0
|
||||||
|
db 0xc0,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x4e,0x4e,0x4e,0x5f,0x5f,0x5f,0x6d
|
||||||
|
db 0x6d,0x6d,0x76,0x76,0x76,0x7c,0x7c,0x7c,0x80,0x80
|
||||||
|
db 0x80,0xff,0xff,0xff,0xc0,0xc0,0xc0,0x00,0x00,0x00
|
||||||
|
db 0xff,0xff,0xff,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x14
|
||||||
|
db 0x14,0x14,0x1b,0x1b,0x1b,0x29,0x29,0x29,0x3a,0x3a
|
||||||
|
db 0x3a,0x4c,0x4c,0x4c,0x5d,0x5d,0x5d,0x6c,0x6c,0x6c
|
||||||
|
db 0x75,0x75,0x75,0x7b,0x7b,0x7b,0x80,0x80,0x80,0xc0
|
||||||
|
db 0xc0,0xc0,0x00,0x00,0x00,0x2f,0x2f,0x2f,0x80,0x80
|
||||||
|
db 0x80,0xff,0xff,0xff,0xc0,0xc0,0xc0,0x00,0x00,0x00
|
||||||
|
db 0x21,0x21,0x21,0x2e,0x2e,0x2e,0x40,0x40,0x40,0x52
|
||||||
|
db 0x52,0x52,0x62,0x62,0x62,0x6f,0x6f,0x6f,0x77,0x77
|
||||||
|
db 0x77,0x7c,0x7c,0x7c,0x80,0x80,0x80,0x00,0x00,0x00
|
||||||
|
db 0x47,0x47,0x47,0x3b,0x3b,0x3b,0x80,0x80,0x80,0xff
|
||||||
|
db 0xff,0xff,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x25,0x25
|
||||||
|
db 0x25,0x30,0x30,0x30,0x42,0x42,0x42,0x54,0x54,0x54
|
||||||
|
db 0x64,0x64,0x64,0x70,0x70,0x70,0x78,0x78,0x78,0x7d
|
||||||
|
db 0x7d,0x7d,0x00,0x00,0x00,0x62,0x62,0x62,0x52,0x52
|
||||||
|
db 0x52,0x4a,0x4a,0x4a,0x43,0x43,0x43,0x80,0x80,0x80
|
||||||
|
db 0xff,0xff,0xff,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x33
|
||||||
|
db 0x33,0x33,0x42,0x42,0x42,0x54,0x54,0x54,0x64,0x64
|
||||||
|
db 0x64,0x71,0x71,0x71,0x79,0x79,0x79,0x7d,0x7d,0x7d
|
||||||
|
db 0x72,0x72,0x72,0x6b,0x6b,0x6b,0x5f,0x5f,0x5f,0x5a
|
||||||
|
db 0x5a,0x5a,0x54,0x54,0x54,0x80,0x80,0x80,0xff,0xff
|
||||||
|
db 0xff,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x35,0x35,0x35
|
||||||
|
db 0x41,0x41,0x41,0x53,0x53,0x53,0x63,0x63,0x63,0x70
|
||||||
|
db 0x70,0x70,0x78,0x78,0x78,0x7d,0x7d,0x7d,0x77,0x77
|
||||||
|
db 0x77,0x73,0x73,0x73,0x6c,0x6c,0x6c,0x68,0x68,0x68
|
||||||
|
db 0x62,0x62,0x62,0x5a,0x5a,0x5a,0x80,0x80,0x80,0xff
|
||||||
|
db 0xff,0xff,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x41,0x41
|
||||||
|
db 0x41,0x52,0x52,0x52,0x62,0x62,0x62,0x6f,0x6f,0x6f
|
||||||
|
db 0x78,0x78,0x78,0x7d,0x7d,0x7d,0x7b,0x7b,0x7b,0x79
|
||||||
|
db 0x79,0x79,0x74,0x74,0x74,0x72,0x72,0x72,0x6e,0x6e
|
||||||
|
db 0x6e,0x66,0x66,0x66,0x80,0x80,0x80,0xc0,0xc0,0xc0
|
||||||
|
db 0xc0,0xc0,0xc0,0x00,0x00,0x00,0x44,0x44,0x44,0x52
|
||||||
|
db 0x52,0x52,0x62,0x62,0x62,0x6e,0x6e,0x6e,0x77,0x77
|
||||||
|
db 0x77,0x7c,0x7c,0x7c,0x7e,0x7e,0x7e,0x7c,0x7c,0x7c
|
||||||
|
db 0x7a,0x7a,0x7a,0x79,0x79,0x79,0x75,0x75,0x75,0x6f
|
||||||
|
db 0x6f,0x6f,0x65,0x65,0x65,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x48,0x48,0x48,0x4b,0x4b,0x4b,0x56,0x56,0x56
|
||||||
|
db 0x65,0x65,0x65,0x70,0x70,0x70,0x78,0x78,0x78,0x7d
|
||||||
|
db 0x7d,0x7d,0x80,0x80,0x80,0x7f,0x7f,0x7f,0x7e,0x7e
|
||||||
|
db 0x7e,0x7d,0x7d,0x7d,0x7a,0x7a,0x7a,0x76,0x76,0x76
|
||||||
|
db 0x6f,0x6f,0x6f,0x65,0x65,0x65,0x5c,0x5c,0x5c,0x56
|
||||||
|
db 0x56,0x56,0x58,0x58,0x58,0x60,0x60,0x60,0x6b,0x6b
|
||||||
|
db 0x6b,0x73,0x73,0x73,0x7a,0x7a,0x7a,0x7d,0x7d,0x7d
|
||||||
|
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x7f
|
||||||
|
db 0x7f,0x7f,0x7d,0x7d,0x7d,0x7a,0x7a,0x7a,0x76,0x76
|
||||||
|
db 0x76,0x70,0x70,0x70,0x6a,0x6a,0x6a,0x66,0x66,0x66
|
||||||
|
db 0x66,0x66,0x66,0x6c,0x6c,0x6c,0x72,0x72,0x72,0x78
|
||||||
|
db 0x78,0x78,0x7c,0x7c,0x7c,0x7e,0x7e,0x7e,0x80,0x80
|
||||||
|
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
||||||
|
db 0x7f,0x7f,0x7f,0x7d,0x7d,0x7d,0x7b,0x7b,0x7b,0x77
|
||||||
|
db 0x77,0x77,0x73,0x73,0x73,0x71,0x71,0x71,0x71,0x71
|
||||||
|
db 0x71,0x74,0x74,0x74,0x78,0x78,0x78,0x7b,0x7b,0x7b
|
||||||
|
db 0x7d,0x7d,0x7d,0x7f,0x7f,0x7f,0x80,0x80,0x80,0x80
|
||||||
|
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
||||||
|
db 0x80,0x7f,0x7f,0x7f,0x7d,0x7d,0x7d,0x7c,0x7c,0x7c
|
||||||
|
db 0x7a,0x7a,0x7a,0x78,0x78,0x78,0x78,0x78,0x78,0x7a
|
||||||
|
db 0x7a,0x7a,0x7c,0x7c,0x7c,0x7e,0x7e,0x7e,0x7f,0x7f
|
||||||
|
db 0x7f,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
||||||
|
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
||||||
|
db 0x80,0x80,0x7f,0x7f,0x7f,0x7e,0x7e,0x7e,0x7e,0x7e
|
||||||
|
db 0x7e,0x7d,0x7d,0x7d,0x7d,0x7d,0x7d,0x7e,0x7e,0x7e
|
||||||
|
db 0x7e,0x7e,0x7e,0x7f,0x7f,0x7f,0x80,0x80,0x80,0x80
|
||||||
|
db 0x80,0x80
|
||||||
|
|
||||||
|
mousepointer1:
|
||||||
|
db 0xff,0xff,0xff,0x06,0x06,0x06,0x0a,0x0a
|
||||||
|
db 0x0a,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0xff,0xff,0xff,0xff,0xff,0xff,0x19,0x19,0x19,0x16
|
||||||
|
db 0x16,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff
|
||||||
|
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2e,0x2e,0x2e
|
||||||
|
db 0x23,0x23,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff
|
||||||
|
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x3f
|
||||||
|
db 0x3f,0x29,0x29,0x29,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff
|
||||||
|
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x47
|
||||||
|
db 0x47,0x47,0x2c,0x2c,0x2c,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||||
|
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||||
|
db 0x48,0x48,0x48,0x2c,0x2c,0x2c,0x16,0x16,0x16,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||||
|
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||||
|
db 0xff,0x48,0x48,0x48,0x2c,0x2c,0x2c,0x16,0x16,0x16
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff
|
||||||
|
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||||
|
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||||
|
db 0xff,0xff,0x48,0x48,0x48,0x2c,0x2c,0x2c,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff
|
||||||
|
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||||
|
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||||
|
db 0xff,0xff,0xff,0x48,0x48,0x48,0x2c,0x2c,0x2c,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff
|
||||||
|
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||||
|
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||||
|
db 0xff,0xff,0xff,0xff,0x47,0x47,0x47,0x29,0x29,0x29
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||||
|
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||||
|
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||||
|
db 0xff,0xff,0xff,0xff,0xff,0x40,0x40,0x40,0x23,0x23
|
||||||
|
db 0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||||
|
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||||
|
db 0xff,0xaa,0xaa,0xaa,0x9f,0x9f,0x9f,0x8c,0x8c,0x8c
|
||||||
|
db 0x70,0x70,0x70,0x4f,0x4f,0x4f,0x30,0x30,0x30,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff
|
||||||
|
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x8f,0x8f,0x8f
|
||||||
|
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||||
|
db 0xff,0xff,0x9c,0x9c,0x9c,0x87,0x87,0x87,0x6c,0x6c
|
||||||
|
db 0x6c,0x4f,0x4f,0x4f,0x32,0x32,0x32,0x19,0x19,0x19
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff
|
||||||
|
db 0xff,0xff,0x69,0x69,0x69,0x84,0x84,0x84,0xff,0xff
|
||||||
|
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||||
|
db 0x92,0x92,0x92,0x79,0x79,0x79,0x59,0x59,0x59,0x3c
|
||||||
|
db 0x3c,0x3c,0x24,0x24,0x24,0x11,0x11,0x11,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x37,0x37,0x37
|
||||||
|
db 0x5d,0x5d,0x5d,0x70,0x70,0x70,0x76,0x76,0x76,0xff
|
||||||
|
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||||
|
db 0xff,0x75,0x75,0x75,0x51,0x51,0x51,0x31,0x31,0x31
|
||||||
|
db 0x19,0x19,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x16,0x16,0x16,0x2d,0x2d,0x2d,0x49,0x49
|
||||||
|
db 0x49,0x53,0x53,0x53,0x54,0x54,0x54,0xff,0xff,0xff
|
||||||
|
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x78
|
||||||
|
db 0x78,0x78,0x54,0x54,0x54,0x30,0x30,0x30,0x16,0x16
|
||||||
|
db 0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x0f,0x0f,0x0f,0x1f,0x1f,0x1f,0x30,0x30,0x30,0x33
|
||||||
|
db 0x33,0x33,0x33,0x33,0x33,0x3b,0x3b,0x3b,0xff,0xff
|
||||||
|
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||||
|
db 0x62,0x62,0x62,0x3b,0x3b,0x3b,0x1c,0x1c,0x1c,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08
|
||||||
|
db 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x24,0x24,0x24,0xff,0xff,0xff,0xff
|
||||||
|
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x6e,0x6e
|
||||||
|
db 0x6e,0x48,0x48,0x48,0x25,0x25,0x25,0x0e,0x0e,0x0e
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0x00
|
||||||
|
db 0x00,0x00,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x29,0x29,0x29,0xff,0xff,0xff
|
||||||
|
db 0xff,0xff,0xff,0x7c,0x7c,0x7c,0x71,0x71,0x71,0x50
|
||||||
|
db 0x50,0x50,0x2b,0x2b,0x2b,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x02,0x02,0x02,0x04,0x04,0x04,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x36,0x36,0x36,0x56,0x56
|
||||||
|
db 0x56,0x69,0x69,0x69,0x64,0x64,0x64,0x4a,0x4a,0x4a
|
||||||
|
db 0x28,0x28,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x05,0x05,0x05
|
||||||
|
db 0x00,0x00,0x00,0x21,0x21,0x21,0x39,0x39,0x39,0x49
|
||||||
|
db 0x49,0x49,0x48,0x48,0x48,0x35,0x35,0x35,0x1d,0x1d
|
||||||
|
db 0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x27,0x27,0x27
|
||||||
|
db 0x27,0x27,0x27,0x1d,0x1d,0x1d,0x0f,0x0f,0x0f,0x06
|
||||||
|
db 0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||||
|
db 0x00,0x00,0x00,0x00
|
||||||
|
|
||||||
|
endg
|
File diff suppressed because it is too large
Load Diff
@ -1035,9 +1035,8 @@ boot_log:
|
|||||||
align 32
|
align 32
|
||||||
osloop:
|
osloop:
|
||||||
call [draw_pointer]
|
call [draw_pointer]
|
||||||
call check_buttons
|
call window_check_events
|
||||||
call checkwindows
|
call mouse_check_events
|
||||||
; call check_window_move_request
|
|
||||||
call checkmisc
|
call checkmisc
|
||||||
call checkVga_N13
|
call checkVga_N13
|
||||||
call stack_handler
|
call stack_handler
|
||||||
@ -2675,11 +2674,7 @@ sys_getbutton:
|
|||||||
test eax, eax
|
test eax, eax
|
||||||
jz .exit
|
jz .exit
|
||||||
mov eax, [BTN_BUFF]
|
mov eax, [BTN_BUFF]
|
||||||
shl eax, 8
|
and al, 0xFE ; delete left button bit
|
||||||
; // Alver 22.06.2008 // {
|
|
||||||
mov al, byte [btn_down_determ]
|
|
||||||
and al,0xFE ; delete left button bit
|
|
||||||
; } \\ Alver \\
|
|
||||||
mov [BTN_COUNT], byte 0
|
mov [BTN_COUNT], byte 0
|
||||||
mov [esp + 32], eax
|
mov [esp + 32], eax
|
||||||
.exit:
|
.exit:
|
||||||
@ -2911,480 +2906,6 @@ sys_redrawstat:
|
|||||||
srl1:
|
srl1:
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
||||||
sys_drawwindow:
|
|
||||||
|
|
||||||
mov eax,edx
|
|
||||||
shr eax,16+8
|
|
||||||
and eax,15
|
|
||||||
|
|
||||||
; cmp eax,0 ; type I - original style
|
|
||||||
jne nosyswI
|
|
||||||
inc [mouse_pause]
|
|
||||||
call [_display.disable_mouse]
|
|
||||||
call sys_set_window
|
|
||||||
call [_display.disable_mouse]
|
|
||||||
call drawwindow_I
|
|
||||||
;dec [mouse_pause]
|
|
||||||
;call [draw_pointer]
|
|
||||||
;ret
|
|
||||||
jmp draw_window_caption.2
|
|
||||||
nosyswI:
|
|
||||||
|
|
||||||
cmp al,1 ; type II - only reserve area, no draw
|
|
||||||
jne nosyswII
|
|
||||||
inc [mouse_pause]
|
|
||||||
call [_display.disable_mouse]
|
|
||||||
call sys_set_window
|
|
||||||
call [_display.disable_mouse]
|
|
||||||
call sys_window_mouse
|
|
||||||
dec [mouse_pause]
|
|
||||||
call [draw_pointer]
|
|
||||||
ret
|
|
||||||
nosyswII:
|
|
||||||
|
|
||||||
cmp al,2 ; type III - new style
|
|
||||||
jne nosyswIII
|
|
||||||
inc [mouse_pause]
|
|
||||||
call [_display.disable_mouse]
|
|
||||||
call sys_set_window
|
|
||||||
call [_display.disable_mouse]
|
|
||||||
call drawwindow_III
|
|
||||||
;dec [mouse_pause]
|
|
||||||
;call [draw_pointer]
|
|
||||||
;ret
|
|
||||||
jmp draw_window_caption.2
|
|
||||||
nosyswIII:
|
|
||||||
|
|
||||||
cmp al,3 ; type IV - skinned window
|
|
||||||
je draw_skin_window
|
|
||||||
cmp al,4 ; type V - skinned window not sized! {not_sized_skin_window}
|
|
||||||
jne nosyswV
|
|
||||||
draw_skin_window:
|
|
||||||
|
|
||||||
inc [mouse_pause]
|
|
||||||
call [_display.disable_mouse]
|
|
||||||
call sys_set_window
|
|
||||||
call [_display.disable_mouse]
|
|
||||||
mov eax, [TASK_COUNT]
|
|
||||||
movzx eax, word [WIN_POS + eax*2]
|
|
||||||
cmp eax, [CURRENT_TASK]
|
|
||||||
setz al
|
|
||||||
movzx eax, al
|
|
||||||
push eax
|
|
||||||
call drawwindow_IV
|
|
||||||
;dec [mouse_pause]
|
|
||||||
;call [draw_pointer]
|
|
||||||
;ret
|
|
||||||
jmp draw_window_caption.2
|
|
||||||
nosyswV:
|
|
||||||
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
draw_window_caption:
|
|
||||||
inc [mouse_pause]
|
|
||||||
call [_display.disable_mouse]
|
|
||||||
|
|
||||||
xor eax,eax
|
|
||||||
mov edx,[TASK_COUNT]
|
|
||||||
movzx edx,word[WIN_POS+edx*2]
|
|
||||||
cmp edx,[CURRENT_TASK]
|
|
||||||
jne @f
|
|
||||||
inc eax
|
|
||||||
@@: mov edx,[CURRENT_TASK]
|
|
||||||
shl edx,5
|
|
||||||
add edx,window_data
|
|
||||||
movzx ebx,[edx+WDATA.fl_wstyle]
|
|
||||||
and bl,0x0F
|
|
||||||
cmp bl,3
|
|
||||||
je .draw_caption_style_3 ;{for 3 and 4 style write caption}
|
|
||||||
cmp bl,4
|
|
||||||
je .draw_caption_style_3
|
|
||||||
|
|
||||||
jmp .not_style_3
|
|
||||||
.draw_caption_style_3:
|
|
||||||
|
|
||||||
push edx
|
|
||||||
call drawwindow_IV_caption
|
|
||||||
add esp,4
|
|
||||||
jmp .2
|
|
||||||
|
|
||||||
.not_style_3:
|
|
||||||
cmp bl,2
|
|
||||||
jne .not_style_2
|
|
||||||
|
|
||||||
call drawwindow_III_caption
|
|
||||||
jmp .2
|
|
||||||
|
|
||||||
.not_style_2:
|
|
||||||
cmp bl,0
|
|
||||||
jne .2
|
|
||||||
|
|
||||||
call drawwindow_I_caption
|
|
||||||
|
|
||||||
;--------------------------------------------------------------
|
|
||||||
.2: ;jmp @f
|
|
||||||
mov edi,[CURRENT_TASK]
|
|
||||||
shl edi,5
|
|
||||||
test [edi+window_data+WDATA.fl_wstyle],WSTYLE_HASCAPTION
|
|
||||||
jz @f
|
|
||||||
mov edx,[edi*8+SLOT_BASE+APPDATA.wnd_caption]
|
|
||||||
or edx,edx
|
|
||||||
jz @f
|
|
||||||
|
|
||||||
movzx eax,[edi+window_data+WDATA.fl_wstyle]
|
|
||||||
and al,0x0F
|
|
||||||
cmp al,3
|
|
||||||
je .skinned
|
|
||||||
cmp al,4
|
|
||||||
je .skinned
|
|
||||||
|
|
||||||
jmp .not_skinned
|
|
||||||
.skinned:
|
|
||||||
mov ebp,[edi+window_data+WDATA.box.left-2]
|
|
||||||
mov bp,word[edi+window_data+WDATA.box.top]
|
|
||||||
movzx eax,word[edi+window_data+WDATA.box.width]
|
|
||||||
sub ax,[_skinmargins.left]
|
|
||||||
sub ax,[_skinmargins.right]
|
|
||||||
push edx
|
|
||||||
cwde
|
|
||||||
cdq
|
|
||||||
mov ebx,6
|
|
||||||
idiv ebx
|
|
||||||
pop edx
|
|
||||||
or eax,eax
|
|
||||||
js @f
|
|
||||||
mov esi,eax
|
|
||||||
mov ebx,dword[_skinmargins.left-2]
|
|
||||||
mov bx,word[_skinh]
|
|
||||||
sub bx,[_skinmargins.bottom]
|
|
||||||
sub bx,[_skinmargins.top]
|
|
||||||
sar bx,1
|
|
||||||
adc bx,0
|
|
||||||
add bx,[_skinmargins.top]
|
|
||||||
add bx,-3
|
|
||||||
add ebx,ebp
|
|
||||||
jmp .dodraw
|
|
||||||
|
|
||||||
.not_skinned:
|
|
||||||
cmp al,1
|
|
||||||
je @f
|
|
||||||
|
|
||||||
mov ebp,[edi+window_data+WDATA.box.left-2]
|
|
||||||
mov bp,word[edi+window_data+WDATA.box.top]
|
|
||||||
movzx eax,word[edi+window_data+WDATA.box.width]
|
|
||||||
sub eax,16
|
|
||||||
push edx
|
|
||||||
cwde
|
|
||||||
cdq
|
|
||||||
mov ebx,6
|
|
||||||
idiv ebx
|
|
||||||
pop edx
|
|
||||||
or eax,eax
|
|
||||||
js @f
|
|
||||||
mov esi,eax
|
|
||||||
mov ebx,0x00080007
|
|
||||||
add ebx,ebp
|
|
||||||
.dodraw:
|
|
||||||
mov ecx,[common_colours+16];0x00FFFFFF
|
|
||||||
or ecx, 0x80000000
|
|
||||||
xor edi,edi
|
|
||||||
; // Alver 22.06.2008 // {
|
|
||||||
; call dtext
|
|
||||||
call dtext_asciiz_esi
|
|
||||||
; } \\ Alver \\
|
|
||||||
|
|
||||||
@@:
|
|
||||||
;--------------------------------------------------------------
|
|
||||||
dec [mouse_pause]
|
|
||||||
call [draw_pointer]
|
|
||||||
ret
|
|
||||||
|
|
||||||
iglobal
|
|
||||||
align 4
|
|
||||||
window_topleft dd \
|
|
||||||
1, 21,\ ;type 0
|
|
||||||
0, 0,\ ;type 1
|
|
||||||
5, 20,\ ;type 2
|
|
||||||
5, ?,\ ;type 3 {set by skin}
|
|
||||||
5, ? ;type 4 {set by skin}
|
|
||||||
endg
|
|
||||||
|
|
||||||
set_window_clientbox:
|
|
||||||
push eax ecx edi
|
|
||||||
|
|
||||||
mov eax,[_skinh]
|
|
||||||
mov [window_topleft+4*7],eax
|
|
||||||
mov [window_topleft+4*9],eax
|
|
||||||
|
|
||||||
mov ecx,edi
|
|
||||||
sub edi,window_data
|
|
||||||
shl edi,3
|
|
||||||
test [ecx+WDATA.fl_wstyle],WSTYLE_CLIENTRELATIVE
|
|
||||||
jz @f
|
|
||||||
|
|
||||||
movzx eax,[ecx+WDATA.fl_wstyle]
|
|
||||||
and eax,0x0F
|
|
||||||
mov eax,[eax*8+window_topleft+0]
|
|
||||||
mov [edi+SLOT_BASE+APPDATA.wnd_clientbox.left],eax
|
|
||||||
shl eax,1
|
|
||||||
neg eax
|
|
||||||
add eax,[ecx+WDATA.box.width]
|
|
||||||
mov [edi+SLOT_BASE+APPDATA.wnd_clientbox.width],eax
|
|
||||||
|
|
||||||
movzx eax,[ecx+WDATA.fl_wstyle]
|
|
||||||
and eax,0x0F
|
|
||||||
push [eax*8+window_topleft+0]
|
|
||||||
mov eax,[eax*8+window_topleft+4]
|
|
||||||
mov [edi+SLOT_BASE+APPDATA.wnd_clientbox.top],eax
|
|
||||||
neg eax
|
|
||||||
sub eax,[esp]
|
|
||||||
add eax,[ecx+WDATA.box.height]
|
|
||||||
mov [edi+SLOT_BASE+APPDATA.wnd_clientbox.height],eax
|
|
||||||
add esp,4
|
|
||||||
|
|
||||||
pop edi ecx eax
|
|
||||||
ret
|
|
||||||
@@:
|
|
||||||
xor eax,eax
|
|
||||||
mov [edi+SLOT_BASE+APPDATA.wnd_clientbox.left],eax
|
|
||||||
mov [edi+SLOT_BASE+APPDATA.wnd_clientbox.top],eax
|
|
||||||
mov eax,[ecx+WDATA.box.width]
|
|
||||||
mov [edi+SLOT_BASE+APPDATA.wnd_clientbox.width],eax
|
|
||||||
mov eax,[ecx+WDATA.box.height]
|
|
||||||
mov [edi+SLOT_BASE+APPDATA.wnd_clientbox.height],eax
|
|
||||||
|
|
||||||
pop edi ecx eax
|
|
||||||
ret
|
|
||||||
|
|
||||||
sys_set_window:
|
|
||||||
|
|
||||||
mov eax,[CURRENT_TASK]
|
|
||||||
shl eax,5
|
|
||||||
add eax,window_data
|
|
||||||
|
|
||||||
; colors
|
|
||||||
mov [eax+WDATA.cl_workarea],edx
|
|
||||||
mov [eax+WDATA.cl_titlebar],esi
|
|
||||||
mov [eax+WDATA.cl_frames],edi
|
|
||||||
|
|
||||||
mov edi, eax
|
|
||||||
|
|
||||||
; check flag (?)
|
|
||||||
test [edi+WDATA.fl_wdrawn],1
|
|
||||||
jnz newd
|
|
||||||
|
|
||||||
mov eax,[timer_ticks] ;[0xfdf0]
|
|
||||||
add eax,100
|
|
||||||
mov [new_window_starting],eax
|
|
||||||
|
|
||||||
movsx eax,bx
|
|
||||||
mov [edi+WDATA.box.width],eax
|
|
||||||
movsx eax,cx
|
|
||||||
mov [edi+WDATA.box.height],eax
|
|
||||||
sar ebx,16
|
|
||||||
sar ecx,16
|
|
||||||
mov [edi+WDATA.box.left],ebx
|
|
||||||
mov [edi+WDATA.box.top],ecx
|
|
||||||
|
|
||||||
call check_window_position
|
|
||||||
|
|
||||||
push ecx esi edi ; save for window fullscreen/resize
|
|
||||||
;mov esi,edi
|
|
||||||
|
|
||||||
mov cl, [edi+WDATA.fl_wstyle]
|
|
||||||
mov eax, [edi+WDATA.cl_frames]
|
|
||||||
|
|
||||||
sub edi,window_data
|
|
||||||
shl edi,3
|
|
||||||
add edi,SLOT_BASE
|
|
||||||
|
|
||||||
and cl,0x0F
|
|
||||||
mov [edi+APPDATA.wnd_caption],0
|
|
||||||
cmp cl,3
|
|
||||||
je set_APPDATA_wnd_caption
|
|
||||||
cmp cl,4 ; {SPraid.simba}
|
|
||||||
je set_APPDATA_wnd_caption
|
|
||||||
|
|
||||||
jmp @f
|
|
||||||
set_APPDATA_wnd_caption:
|
|
||||||
mov [edi+APPDATA.wnd_caption],eax
|
|
||||||
@@: mov esi,[esp+0]
|
|
||||||
|
|
||||||
add edi, APPDATA.saved_box
|
|
||||||
movsd
|
|
||||||
movsd
|
|
||||||
movsd
|
|
||||||
movsd
|
|
||||||
pop edi esi ecx
|
|
||||||
|
|
||||||
mov esi, [CURRENT_TASK]
|
|
||||||
movzx esi, word [WIN_STACK+esi*2]
|
|
||||||
lea esi, [WIN_POS+esi*2]
|
|
||||||
call waredraw
|
|
||||||
|
|
||||||
;;; mov ebx, 1
|
|
||||||
;;; call delay_hs
|
|
||||||
mov eax, [edi+WDATA.box.left]
|
|
||||||
mov ebx, [edi+WDATA.box.top]
|
|
||||||
mov ecx, [edi+WDATA.box.width]
|
|
||||||
mov edx, [edi+WDATA.box.height]
|
|
||||||
add ecx, eax
|
|
||||||
add edx, ebx
|
|
||||||
call calculatescreen
|
|
||||||
|
|
||||||
mov [KEY_COUNT],byte 0 ; empty keyboard buffer
|
|
||||||
mov [BTN_COUNT],byte 0 ; empty button buffer
|
|
||||||
|
|
||||||
newd:
|
|
||||||
call set_window_clientbox
|
|
||||||
|
|
||||||
mov [edi+WDATA.fl_redraw],byte 0 ; no redraw
|
|
||||||
mov edx,edi
|
|
||||||
|
|
||||||
ret
|
|
||||||
|
|
||||||
syscall_windowsettings:
|
|
||||||
|
|
||||||
.set_window_caption:
|
|
||||||
dec ebx ; subfunction #1 - set window caption
|
|
||||||
jnz .exit_fail
|
|
||||||
|
|
||||||
; NOTE: only window owner thread can set its caption,
|
|
||||||
; so there's no parameter for PID/TID
|
|
||||||
|
|
||||||
mov edi,[CURRENT_TASK]
|
|
||||||
shl edi,5
|
|
||||||
|
|
||||||
; have to check if caption is within application memory limit
|
|
||||||
; check is trivial, and if application resizes its memory,
|
|
||||||
; caption still can become over bounds
|
|
||||||
; diamond, 31.10.2006: check removed because with new memory manager
|
|
||||||
; there can be valid data after APPDATA.mem_size bound
|
|
||||||
; mov ecx,[edi*8+SLOT_BASE+APPDATA.mem_size]
|
|
||||||
; add ecx,255 ; max caption length
|
|
||||||
; cmp ebx,ecx
|
|
||||||
; ja .exit_fail
|
|
||||||
|
|
||||||
mov [edi*8+SLOT_BASE+APPDATA.wnd_caption],ecx
|
|
||||||
or [edi+window_data+WDATA.fl_wstyle],WSTYLE_HASCAPTION
|
|
||||||
|
|
||||||
call draw_window_caption
|
|
||||||
|
|
||||||
xor eax,eax ; eax = 0 (success)
|
|
||||||
ret
|
|
||||||
|
|
||||||
; .get_window_caption:
|
|
||||||
; dec eax ; subfunction #2 - get window caption
|
|
||||||
; jnz .exit_fail
|
|
||||||
|
|
||||||
; not implemented yet
|
|
||||||
|
|
||||||
.exit_fail:
|
|
||||||
xor eax,eax
|
|
||||||
inc eax ; eax = 1 (fail)
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
sys_window_move:
|
|
||||||
|
|
||||||
mov edi,[CURRENT_TASK]
|
|
||||||
shl edi,5
|
|
||||||
add edi,window_data
|
|
||||||
|
|
||||||
test [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED
|
|
||||||
jnz .window_move_return
|
|
||||||
|
|
||||||
push dword [edi + WDATA.box.left] ; save old coordinates
|
|
||||||
push dword [edi + WDATA.box.top]
|
|
||||||
push dword [edi + WDATA.box.width]
|
|
||||||
push dword [edi + WDATA.box.height]
|
|
||||||
|
|
||||||
cmp eax,-1 ; set new position and size
|
|
||||||
je .no_x_reposition
|
|
||||||
mov [edi + WDATA.box.left], eax
|
|
||||||
.no_x_reposition:
|
|
||||||
cmp ebx,-1
|
|
||||||
je .no_y_reposition
|
|
||||||
mov [edi + WDATA.box.top], ebx
|
|
||||||
.no_y_reposition:
|
|
||||||
|
|
||||||
test [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP
|
|
||||||
jnz .no_y_resizing
|
|
||||||
|
|
||||||
cmp ecx,-1
|
|
||||||
je .no_x_resizing
|
|
||||||
mov [edi + WDATA.box.width], ecx
|
|
||||||
.no_x_resizing:
|
|
||||||
cmp edx,-1
|
|
||||||
je .no_y_resizing
|
|
||||||
mov [edi + WDATA.box.height], edx
|
|
||||||
.no_y_resizing:
|
|
||||||
|
|
||||||
call check_window_position
|
|
||||||
call set_window_clientbox
|
|
||||||
|
|
||||||
pushad ; save for window fullscreen/resize
|
|
||||||
mov esi,edi
|
|
||||||
sub edi,window_data
|
|
||||||
shr edi,5
|
|
||||||
shl edi,8
|
|
||||||
add edi, SLOT_BASE + APPDATA.saved_box
|
|
||||||
mov ecx,4
|
|
||||||
cld
|
|
||||||
rep movsd
|
|
||||||
popad
|
|
||||||
|
|
||||||
pushad ; calculcate screen at new position
|
|
||||||
mov eax, [edi + WDATA.box.left]
|
|
||||||
mov ebx, [edi + WDATA.box.top]
|
|
||||||
mov ecx, [edi + WDATA.box.width]
|
|
||||||
mov edx, [edi + WDATA.box.height]
|
|
||||||
add ecx,eax
|
|
||||||
add edx,ebx
|
|
||||||
|
|
||||||
call calculatescreen
|
|
||||||
popad
|
|
||||||
|
|
||||||
pop edx ; calculcate screen at old position
|
|
||||||
pop ecx
|
|
||||||
pop ebx
|
|
||||||
pop eax
|
|
||||||
add ecx,eax
|
|
||||||
add edx,ebx
|
|
||||||
mov [draw_limits.left],eax ; save for drawlimits
|
|
||||||
mov [draw_limits.top],ebx
|
|
||||||
mov [draw_limits.right],ecx
|
|
||||||
mov [draw_limits.bottom],edx
|
|
||||||
call calculatescreen
|
|
||||||
|
|
||||||
mov [edi + WDATA.fl_redraw], 1 ; flag the process as redraw
|
|
||||||
|
|
||||||
mov eax,edi ; redraw screen at old position
|
|
||||||
xor esi,esi
|
|
||||||
call redrawscreen
|
|
||||||
|
|
||||||
mov [DONT_DRAW_MOUSE],byte 0 ; mouse pointer
|
|
||||||
mov [MOUSE_BACKGROUND],byte 0 ; no mouse under
|
|
||||||
mov [MOUSE_DOWN],byte 0 ; react to mouse up/down
|
|
||||||
|
|
||||||
call [draw_pointer]
|
|
||||||
|
|
||||||
mov [window_move_pr],0
|
|
||||||
|
|
||||||
.window_move_return:
|
|
||||||
|
|
||||||
ret
|
|
||||||
|
|
||||||
uglobal
|
|
||||||
window_move_pr dd 0x0
|
|
||||||
window_move_eax dd 0x0
|
|
||||||
window_move_ebx dd 0x0
|
|
||||||
window_move_ecx dd 0x0
|
|
||||||
window_move_edx dd 0x0
|
|
||||||
endg
|
|
||||||
|
|
||||||
;ok - 100% work
|
;ok - 100% work
|
||||||
;nt - not tested
|
;nt - not tested
|
||||||
;---------------------------------------------------------------------------------------------
|
;---------------------------------------------------------------------------------------------
|
||||||
|
@ -41,11 +41,21 @@ $Revision$
|
|||||||
; display 'not used dt: ',`.,13,10
|
; display 'not used dt: ',`.,13,10
|
||||||
; end if }
|
; end if }
|
||||||
|
|
||||||
|
struc POINT {
|
||||||
|
.x dd ?
|
||||||
|
.y dd ?
|
||||||
|
.sizeof:
|
||||||
|
}
|
||||||
|
virtual at 0
|
||||||
|
POINT POINT
|
||||||
|
end virtual
|
||||||
|
|
||||||
struc RECT {
|
struc RECT {
|
||||||
.left dd ?
|
.left dd ?
|
||||||
.top dd ?
|
.top dd ?
|
||||||
.right dd ?
|
.right dd ?
|
||||||
.bottom dd ?
|
.bottom dd ?
|
||||||
|
.sizeof:
|
||||||
}
|
}
|
||||||
virtual at 0
|
virtual at 0
|
||||||
RECT RECT
|
RECT RECT
|
||||||
@ -56,6 +66,7 @@ struc BOX {
|
|||||||
.top dd ?
|
.top dd ?
|
||||||
.width dd ?
|
.width dd ?
|
||||||
.height dd ?
|
.height dd ?
|
||||||
|
.sizeof:
|
||||||
}
|
}
|
||||||
virtual at 0
|
virtual at 0
|
||||||
BOX BOX
|
BOX BOX
|
||||||
|
Loading…
Reference in New Issue
Block a user