From ddd29cc90fa3da781fceb359cb1a597ae017ea86 Mon Sep 17 00:00:00 2001 From: "Mihail Semenyako (mike.dld)" Date: Sat, 6 Feb 2010 19:08:19 +0000 Subject: [PATCH] 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 --- kernel/trunk/core/syscall.inc | 8 +- kernel/trunk/gui/button.inc | 300 +++--- kernel/trunk/gui/event.inc | 8 +- kernel/trunk/gui/mouse.inc | 951 ++++++++++++++----- kernel/trunk/gui/mousepointer.inc | 250 +++++ kernel/trunk/gui/window.inc | 1417 +++++++++++++++++------------ kernel/trunk/kernel.asm | 485 +--------- kernel/trunk/kernel32.inc | 11 + 8 files changed, 1896 insertions(+), 1534 deletions(-) create mode 100644 kernel/trunk/gui/mousepointer.inc diff --git a/kernel/trunk/core/syscall.inc b/kernel/trunk/core/syscall.inc index 6dbe1184d7..fd2d017f92 100644 --- a/kernel/trunk/core/syscall.inc +++ b/kernel/trunk/core/syscall.inc @@ -169,7 +169,7 @@ iglobal dd 0 dd syscall_putimage_palette; 65-PutImagePalette dd sys_process_def ; 66-Process definitions - keyboard - dd sys_window_move ; 67-Window move or resize + dd 0 dd 0 dd 0 dd file_system_lfn ; 70-Common file system interface, version 2 @@ -180,7 +180,7 @@ iglobal align 4 servetable2: - dd sys_drawwindow ; 0-DrawWindow + dd syscall_draw_window ; 0-DrawWindow dd syscall_setpixel ; 1-SetPixel dd sys_getkey ; 2-GetKey dd sys_clock ; 3-GetTime @@ -247,11 +247,11 @@ iglobal dd sys_resize_app_memory ; 64-Resize application memory usage dd cross_order ; 65-PutImagePalette 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 sys_debug_services ; 69-Debug 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 times 255 - ( ($-servetable2) /4 ) dd undefined_syscall dd sys_end ; -1-end application diff --git a/kernel/trunk/gui/button.inc b/kernel/trunk/gui/button.inc index 0d0515ac3c..e474696e8d 100644 --- a/kernel/trunk/gui/button.inc +++ b/kernel/trunk/gui/button.inc @@ -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 ;; ;; Distributed under terms of the GNU General Public License ;; ;; ;; @@ -8,14 +8,12 @@ $Revision$ - -button._.MAX_BUTTONS = 4095 - - ;============================================================================== ;///// public functions /////////////////////////////////////////////////////// ;============================================================================== +button.MAX_BUTTONS = 4095 + struc SYS_BUTTON { .pslot dw ? @@ -25,20 +23,13 @@ struc SYS_BUTTON .top dw ? .height dw ? .id_hi dw ? - .align dw ? + dw ? .sizeof: } virtual at 0 SYS_BUTTON SYS_BUTTON 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 ;------------------------------------------------------------------------------ syscall_button: ;///// system function 8 ////////////////////////////////////// @@ -67,7 +58,7 @@ syscall_button: ;///// system function 8 ////////////////////////////////////// ; do we have free button slots available? mov edi, [BTN_ADDR] mov eax, [edi] - cmp eax, button._.MAX_BUTTONS + cmp eax, button.MAX_BUTTONS jge .exit ; does it have positive size? (otherwise it doesn't have sense) @@ -228,6 +219,7 @@ syscall_button.remove_button: add esi, edi xor ecx, ecx add ecx, -SYS_BUTTON.sizeof + add esi, SYS_BUTTON.sizeof .next_button: dec ebx @@ -263,201 +255,123 @@ syscall_button.remove_button: align 4 ;------------------------------------------------------------------------------ -check_buttons: ;/////////////////////////////////////////////////////////////// +sys_button_activate_handler: ;///////////////////////////////////////////////// ;------------------------------------------------------------------------------ ;? ;------------------------------------------------------------------------------ - cmp byte[BTN_DOWN], 0 ; mouse buttons pressed - jnz @f - mov [bPressedMouseXY_B], 0 - ret +;> eax = pack[8(process slot), 24(button id)] +;> ebx = pack[16(button x coord), 16(button y coord)] +;> cl = mouse button mask this system button was pressed with +;------------------------------------------------------------------------------ + call button._.find_button + or eax, eax + jz .exit - @@: pushad - 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 + mov ebx, dword[eax + SYS_BUTTON.id_hi - 2] call button._.negative_button - pushad - push eax - mov al, [BTN_DOWN] - mov byte[btn_down_determ], al - pop eax + .exit: + ret - .cbwaitmouseup: - call checkidle - call [draw_pointer] - - pushad - call stack_handler - popad - - cmp byte[BTN_DOWN], 0 ; mouse buttons pressed ? - jnz .cbwaitmouseup - popad +align 4 +;------------------------------------------------------------------------------ +sys_button_deactivate_handler: ;/////////////////////////////////////////////// +;------------------------------------------------------------------------------ +;? +;------------------------------------------------------------------------------ +;> eax = pack[8(process slot), 24(button id)] +;> ebx = pack[16(button x coord), 16(button y coord)] +;> cl = mouse button mask this system button was pressed with +;------------------------------------------------------------------------------ + call button._.find_button + or eax, eax + jz .exit + mov ebx, dword[eax + SYS_BUTTON.id_hi - 2] call button._.negative_button - mov byte[MOUSE_BACKGROUND], 0 ; no mouse background - mov byte[DONT_DRAW_MOUSE], 0 ; draw mouse - ; check coordinates - pusha + .exit: + ret - ; mouse x >= button x ? - movzx ebx, [eax + SYS_BUTTON.pslot] - shl ebx, 5 - add ebx, window_data - mov ecx, [ebx + WDATA.box.left] - movzx edx, [eax + SYS_BUTTON.left] - add edx, ecx - mov cx, [MOUSE_X] - cmp edx, ecx - jg .no_on_button ;if we release the pointer out of the button area - - movzx ebx, [eax + SYS_BUTTON.width] - add edx, ebx - cmp ecx, edx - jg .no_on_button - - ; 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 +align 4 +;------------------------------------------------------------------------------ +sys_button_perform_handler: ;////////////////////////////////////////////////// +;------------------------------------------------------------------------------ +;? +;------------------------------------------------------------------------------ +;> eax = pack[8(process slot), 24(button id)] +;> ebx = pack[16(button x coord), 16(button y coord)] +;> cl = mouse button mask this system button was pressed with +;------------------------------------------------------------------------------ + shl eax, 8 + mov al, cl + movzx ebx, byte[BTN_COUNT] + mov [BTN_BUFF + ebx * 4], eax + inc bl + mov [BTN_COUNT], bl ret ;============================================================================== ;///// 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: ;///////////////////////////////////////////////////////////// ;------------------------------------------------------------------------------ @@ -546,7 +460,7 @@ button._.button_dececx: ;////////////////////////////////////////////////////// ;------------------------------------------------------------------------------ button._.negative_button: ;//////////////////////////////////////////////////// ;------------------------------------------------------------------------------ -;? +;? Invert system button border ;------------------------------------------------------------------------------ ; if requested, do not display button border on press. test ebx, 0x20000000 diff --git a/kernel/trunk/gui/event.inc b/kernel/trunk/gui/event.inc index 2046feac41..8be2f68ea0 100644 --- a/kernel/trunk/gui/event.inc +++ b/kernel/trunk/gui/event.inc @@ -368,11 +368,13 @@ sys_sendwindowmsg: ;; f72 cli sub ecx,2 je .sendkey - loop .retf + dec ecx + jnz .retf .sendbtn: cmp byte[BTN_COUNT],1 jae .result ;overflow inc byte[BTN_COUNT] + shl edx, 8 mov [BTN_BUFF],edx jmp .result .sendkey: @@ -467,7 +469,9 @@ get_event_for_app: ;; used from f10,f11,f23 je .loop ; empty ??? cmp edx,[TASK_COUNT] 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 mov [window_minimize],1 dec byte[BTN_COUNT] diff --git a/kernel/trunk/gui/mouse.inc b/kernel/trunk/gui/mouse.inc index 98b38f88c7..deb3714977 100644 --- a/kernel/trunk/gui/mouse.inc +++ b/kernel/trunk/gui/mouse.inc @@ -1,250 +1,701 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; ;; -;; 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 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; Copyright (C) KolibriOS team 2010. All rights reserved. ;; +;; Distributed under terms of the GNU General Public License ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +$Revision: -1 $ + +include 'mousepointer.inc' + +;============================================================================== +;///// public functions /////////////////////////////////////////////////////// +;============================================================================== + +mouse.LEFT_BUTTON_FLAG = 0001b +mouse.RIGHT_BUTTON_FLAG = 0010b +mouse.MIDDLE_BUTTON_FLAG = 0100b + +mouse.BUTTONS_MASK = \ + mouse.LEFT_BUTTON_FLAG or \ + mouse.RIGHT_BUTTON_FLAG or \ + mouse.MIDDLE_BUTTON_FLAG + +mouse.WINDOW_RESIZE_N_FLAG = 000001b +mouse.WINDOW_RESIZE_W_FLAG = 000010b +mouse.WINDOW_RESIZE_S_FLAG = 000100b +mouse.WINDOW_RESIZE_E_FLAG = 001000b +mouse.WINDOW_MOVE_FLAG = 010000b + +mouse.WINDOW_RESIZE_SW_FLAG = \ + mouse.WINDOW_RESIZE_S_FLAG or \ + mouse.WINDOW_RESIZE_W_FLAG +mouse.WINDOW_RESIZE_SE_FLAG = \ + mouse.WINDOW_RESIZE_S_FLAG or \ + mouse.WINDOW_RESIZE_E_FLAG + +align 4 +;------------------------------------------------------------------------------ +mouse_check_events: ;////////////////////////////////////////////////////////// +;------------------------------------------------------------------------------ +;? Check if mouse buttons state or cursor position has changed and call +;? appropriate handlers +;------------------------------------------------------------------------------ + push eax ebx + + mov al, [BTN_DOWN] + mov bl, [mouse.state.buttons] + and al, mouse.BUTTONS_MASK + mov cl, al + xchg cl, [mouse.state.buttons] + xor bl, al + push eax ebx + + ; did any mouse button changed its state? + or bl, bl + jz .check_position + + ; yes it did, is that the first button of all pressed down? + or cl, cl + jnz .check_buttons_released + + ; yes it is, activate window user is pointing at, if needed + call mouse._.activate_sys_window_under_cursor + + ; NOTE: this code wouldn't be necessary if we knew window did + ; already redraw itself after call above + or eax, eax + jz @f + + and [mouse.state.buttons], 0 + jmp .exit + + ; is there any system button under cursor? + @@: call mouse._.find_sys_button_under_cursor + or eax, eax + jz .check_buttons_released + + ; yes there is, activate it and exit + mov [mouse.active_sys_button.pbid], eax + mov [mouse.active_sys_button.coord], ebx + mov cl, [mouse.state.buttons] + mov [mouse.active_sys_button.buttons], cl + call sys_button_activate_handler + jmp .exit + + .check_buttons_released: + cmp [mouse.state.buttons], 0 + jnz .buttons_changed + + ; did we press some button earlier? + cmp [mouse.active_sys_button.pbid], 0 + je .buttons_changed + + ; yes we did, deactivate it + xor eax, eax + xchg eax, [mouse.active_sys_button.pbid] + mov ebx, [mouse.active_sys_button.coord] + mov cl, [mouse.active_sys_button.buttons] + push eax ebx + call sys_button_deactivate_handler + pop edx ecx + + ; is the button under cursor the one we deactivated? + call mouse._.find_sys_button_under_cursor + cmp eax, ecx + jne .exit + cmp ebx, edx + jne .exit + + ; yes it is, perform associated action + mov cl, [mouse.active_sys_button.buttons] + call sys_button_perform_handler + jmp .exit + + .buttons_changed: + test byte[esp], mouse.LEFT_BUTTON_FLAG + jz @f + mov eax, [esp + 4] + call .call_left_button_handler + + @@: test byte[esp], mouse.RIGHT_BUTTON_FLAG + jz @f + mov eax, [esp + 4] + call .call_right_button_handler + + @@: test byte[esp], mouse.MIDDLE_BUTTON_FLAG + jz .check_position + mov eax, [esp + 4] + call .call_middle_button_handler + + .check_position: + movzx eax, word[MOUSE_X] + movzx ebx, word[MOUSE_Y] + cmp eax, [mouse.state.pos.x] + jne .position_changed + cmp ebx, [mouse.state.pos.y] + je .exit + + .position_changed: + xchg eax, [mouse.state.pos.x] + xchg ebx, [mouse.state.pos.y] + + call mouse._.move_handler + + .exit: + add esp, 8 + pop ebx eax + ret + + .call_left_button_handler: + test eax, mouse.LEFT_BUTTON_FLAG + jnz mouse._.left_button_press_handler + jmp mouse._.left_button_release_handler + + .call_right_button_handler: + test eax, mouse.RIGHT_BUTTON_FLAG + jnz mouse._.right_button_press_handler + jmp mouse._.right_button_release_handler + + .call_middle_button_handler: + test eax, mouse.MIDDLE_BUTTON_FLAG + jnz mouse._.middle_button_press_handler + jmp mouse._.middle_button_release_handler + +;============================================================================== +;///// private functions ////////////////////////////////////////////////////// +;============================================================================== + +uglobal + mouse.state: + .pos POINT + .buttons db ? + + ; NOTE: since there's no unique and lifetime-constant button identifiers, + ; we're using two dwords to identify each of them: + ; * pbid - process slot (high 8 bits) and button id (low 24 bits) pack + ; * coord - left (high 16 bits) and top (low 16 bits) coordinates pack + align 4 + mouse.active_sys_button: + .pbid dd ? + .coord dd ? + .buttons db ? + + align 4 + mouse.active_sys_window: + .pslot dd ? + .old_box BOX + .new_box BOX + .delta POINT + .last_ticks dd ? + .action db ? +endg + +align 4 +;------------------------------------------------------------------------------ +mouse._.left_button_press_handler: ;/////////////////////////////////////////// +;------------------------------------------------------------------------------ +;? Called when left mouse button has been pressed down +;------------------------------------------------------------------------------ + test [mouse.state.buttons], not mouse.LEFT_BUTTON_FLAG + jnz .exit + + call mouse._.find_sys_window_under_cursor + call mouse._.check_sys_window_actions + mov [mouse.active_sys_window.action], al + or eax, eax + jz .exit + + xchg eax, edx + test dl, mouse.WINDOW_MOVE_FLAG + jz @f + + mov eax, [timer_ticks] + mov ebx, eax + xchg ebx, [mouse.active_sys_window.last_ticks] + sub eax, ebx + cmp eax, 50 + jg @f + + mov [mouse.active_sys_window.last_ticks], 0 + call sys_window_maximize_handler + jmp .exit + + @@: test [edi + WDATA.fl_wstate], WSTATE_MAXIMIZED + jnz .exit + mov [mouse.active_sys_window.pslot], esi + lea eax, [edi + WDATA.box] + mov ebx, mouse.active_sys_window.old_box + mov ecx, BOX.sizeof + call memmove + mov ebx, mouse.active_sys_window.new_box + call memmove + test edx, mouse.WINDOW_MOVE_FLAG + jz @f + + call .calculate_n_delta + call .calculate_w_delta + jmp .call_window_handler + + @@: test dl, mouse.WINDOW_RESIZE_W_FLAG + jz @f + call .calculate_w_delta + + @@: test dl, mouse.WINDOW_RESIZE_S_FLAG + jz @f + call .calculate_s_delta + + @@: test dl, mouse.WINDOW_RESIZE_E_FLAG + 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: ;//////////////////////////////////// +;------------------------------------------------------------------------------ +;? +;------------------------------------------------------------------------------ + ; 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: ;//////////////////////////////////////////// +;------------------------------------------------------------------------------ +;? +;------------------------------------------------------------------------------ +;< 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 diff --git a/kernel/trunk/gui/mousepointer.inc b/kernel/trunk/gui/mousepointer.inc new file mode 100644 index 0000000000..98b38f88c7 --- /dev/null +++ b/kernel/trunk/gui/mousepointer.inc @@ -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 diff --git a/kernel/trunk/gui/window.inc b/kernel/trunk/gui/window.inc index b4dedf55fc..9080cb396c 100644 --- a/kernel/trunk/gui/window.inc +++ b/kernel/trunk/gui/window.inc @@ -1,6 +1,6 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; -;; Copyright (C) KolibriOS team 2004-2009. All rights reserved. ;; +;; Copyright (C) KolibriOS team 2004-2010. All rights reserved. ;; ;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa ;; ;; Distributed under terms of the GNU General Public License ;; ;; ;; @@ -8,40 +8,82 @@ $Revision$ - ;============================================================================== ;///// public functions /////////////////////////////////////////////////////// ;============================================================================== -macro FuncTable name, [label] +window.BORDER_SIZE = 5 + +macro FuncTable name, table_name, [label] { common align 4 - \label name#.ftable dword + \label name#.#table_name dword forward dd name#.#label common - name#.sizeof.ftable = $ - name#.ftable + name#.sizeof.#table_name = $ - name#.#table_name } -iglobal - FuncTable syscall_display_settings, \ - 00, 01, 02, 03, 04, 05, 06, 07, 08 +uglobal + common_colours rd 32 + draw_limits RECT endg -uglobal - common_colours rd 32 - new_window_starting dd ? - latest_window_touch dd ? - latest_window_touch_delta dd ? - old_window_pos BOX - new_window_pos BOX - draw_limits RECT - bPressedMouseXY_W db ? - do_resize db ? - do_resize_from_corner db ? - reposition db ? -endg +align 4 +;------------------------------------------------------------------------------ +syscall_draw_window: ;///// system function 0 ///////////////////////////////// +;------------------------------------------------------------------------------ +;? +;------------------------------------------------------------------------------ + mov eax, edx + shr eax, 24 + and al, 0x0f + cmp al, 5 + jae .exit + + push eax + inc [mouse_pause] + call [_display.disable_mouse] + call window._.sys_set_window + call [_display.disable_mouse] + pop eax + + or al, al + jnz @f + + ; type I - original style + call drawwindow_I + jmp window._.draw_window_caption.2 + + @@: dec al + jnz @f + + ; type II - only reserve area, no draw + call sys_window_mouse + dec [mouse_pause] + call [draw_pointer] + jmp .exit + + @@: dec al + jnz @f + + ; type III - new style + call drawwindow_III + jmp window._.draw_window_caption.2 + + ; type IV & V - skinned window (resizable & not) + @@: 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 + jmp window._.draw_window_caption.2 + + .exit: + ret align 4 ;------------------------------------------------------------------------------ @@ -267,6 +309,83 @@ syscall_set_window_shape: ;///// system function 50 /////////////////////////// .exit: ret +align 4 +;------------------------------------------------------------------------------ +syscall_move_window: ;///// system function 67 //////////////////////////////// +;------------------------------------------------------------------------------ +;? +;------------------------------------------------------------------------------ + mov edi, [CURRENT_TASK] + shl edi, 5 + add edi, window_data + + test [edi + WDATA.fl_wstate], WSTATE_MAXIMIZED + jnz .exit + + cmp ebx, -1 + jne @f + mov ebx, [edi + WDATA.box.left] + @@: cmp ecx, -1 + jne @f + mov ecx, [edi + WDATA.box.top] + @@: cmp edx, -1 + jne @f + mov edx, [edi + WDATA.box.width] + @@: cmp esi, -1 + jne @f + mov esi, [edi + WDATA.box.height] + + @@: push esi edx ecx ebx + mov eax, esp + mov bl, [edi + WDATA.fl_wstate] + call window._.set_window_box + add esp, BOX.sizeof + + ; NOTE: do we really need this? to be reworked +; mov byte[DONT_DRAW_MOUSE], 0 ; mouse pointer +; mov byte[MOUSE_BACKGROUND], 0 ; no mouse under +; mov byte[MOUSE_DOWN], 0 ; react to mouse up/down + + ; NOTE: do we really need this? to be reworked +; call [draw_pointer] + + .exit: + ret + +align 4 +;------------------------------------------------------------------------------ +syscall_window_settings: ;///// system function 71 ///////////////////////////// +;------------------------------------------------------------------------------ +;? +;------------------------------------------------------------------------------ + 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 + + mov [edi * 8 + SLOT_BASE + APPDATA.wnd_caption], ecx + or [edi + window_data + WDATA.fl_wstyle], WSTYLE_HASCAPTION + + call window._.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 + align 4 ;------------------------------------------------------------------------------ set_window_defaults: ;///////////////////////////////////////////////////////// @@ -429,7 +548,7 @@ repos_windows: ;/////////////////////////////////////////////////////////////// mov [edi + WDATA.box.height], eax .fix_client_box: - call set_window_clientbox + call window._.set_window_clientbox add edi, WDATA.sizeof loop .next_window @@ -437,99 +556,27 @@ repos_windows: ;/////////////////////////////////////////////////////////////// .exit: ret -align 4 -;------------------------------------------------------------------------------ -check_window_position: ;/////////////////////////////////////////////////////// -;------------------------------------------------------------------------------ -;? Check if window is inside screen area -;------------------------------------------------------------------------------ -;> edi = pointer to WDATA -;------------------------------------------------------------------------------ - push eax ebx ecx edx esi - - mov eax, [edi + WDATA.box.left] - mov ebx, [edi + WDATA.box.top] - mov ecx, [edi + WDATA.box.width] - mov edx, [edi + WDATA.box.height] - - mov esi, [Screen_Max_X] - cmp ecx, esi - ja .fix_width - - .check_left: - or eax, eax - jl .fix_left_low - add eax, ecx - cmp eax, esi - jg .fix_left_high - - .check_height: - mov esi, [Screen_Max_Y] - cmp edx, esi - ja .fix_height - - .check_top: - or ebx, ebx - jl .fix_top_low - add ebx, edx - cmp ebx, esi - jg .fix_top_high - - .exit: - pop esi edx ecx ebx eax - ret - - .fix_width: - mov ecx, esi - mov [edi + WDATA.box.width], esi - jmp .check_left - - .fix_left_low: - xor eax, eax - mov [edi + WDATA.box.left], eax - jmp .check_height - - .fix_left_high: - mov eax, esi - sub eax, ecx - mov [edi + WDATA.box.left], eax - jmp .check_height - - .fix_height: - mov edx, esi - mov [edi + WDATA.box.height], esi - jmp .check_top - - .fix_top_low: - xor ebx, ebx - mov [edi + WDATA.box.top], ebx - jmp .exit - - .fix_top_high: - mov ebx, esi - sub ebx, edx - mov [edi + WDATA.box.top], ebx - jmp .exit - align 4 ;------------------------------------------------------------------------------ sys_window_mouse: ;//////////////////////////////////////////////////////////// ;------------------------------------------------------------------------------ ;? ;------------------------------------------------------------------------------ - push eax - - mov eax, [timer_ticks] - cmp [new_window_starting], eax - jb .exit - - mov byte[MOUSE_BACKGROUND], 0 - mov byte[DONT_DRAW_MOUSE], 0 - - mov [new_window_starting], eax - - .exit: - pop eax + ; NOTE: commented out since doesn't provide necessary functionality + ; anyway, to be reworked +; push eax +; +; mov eax, [timer_ticks] +; cmp [new_window_starting], eax +; jb .exit +; +; mov byte[MOUSE_BACKGROUND], 0 +; mov byte[DONT_DRAW_MOUSE], 0 +; +; mov [new_window_starting], eax +; +; .exit: +; pop eax ret align 4 @@ -809,6 +856,13 @@ waredraw: ;//////////////////////////////////////////////////////////////////// ;------------------------------------------------------------------------------ ;? Activate window, redrawing if necessary ;------------------------------------------------------------------------------ + push -1 + mov eax, [TASK_COUNT] + lea eax, [WIN_POS + eax * 2] + cmp eax, esi + pop eax + je .exit + ; is it overlapped by another window now? push ecx call window._.check_window_draw @@ -841,15 +895,19 @@ waredraw: ;//////////////////////////////////////////////////////////////////// ; tell application to redraw itself mov [edi + WDATA.fl_redraw], 1 - mov byte[MOUSE_DOWN], 0 - ret + xor eax, eax + jmp .exit .do_not_draw: ; no it's not, just activate the window call window._.window_activate - mov byte[MOUSE_DOWN], 0 mov byte[MOUSE_BACKGROUND], 0 mov byte[DONT_DRAW_MOUSE], 0 + xor eax, eax + + .exit: + mov byte[MOUSE_DOWN], 0 + inc eax ret align 4 @@ -940,16 +998,15 @@ restore_minimized_window: ;//////////////////////////////////////////////////// ret align 4 +; TODO: remove this proc ;------------------------------------------------------------------------------ -checkwindows: ;//////////////////////////////////////////////////////////////// +window_check_events: ;///////////////////////////////////////////////////////// ;------------------------------------------------------------------------------ -;? Check for user-initiated window operations +;? ;------------------------------------------------------------------------------ - pushad - ; do we have window minimize/restore request? cmp [window_minimize], 0 - je .check_for_mouse_buttons_state + je .exit ; okay, minimize or restore top-most window and exit mov eax, [TASK_COUNT] @@ -958,443 +1015,456 @@ checkwindows: ;//////////////////////////////////////////////////////////////// dec bl jnz @f call minimize_window - jmp .check_for_mouse_buttons_state + jmp .exit + @@: call restore_minimized_window - .check_for_mouse_buttons_state: - ; do we have any mouse buttons pressed? - cmp byte[BTN_DOWN], 0 - jne .mouse_buttons_pressed + .exit: + ret - mov [bPressedMouseXY_W], 0 - jmp .exit - - .mouse_buttons_pressed: - ; yes we do, iterate and ... - mov esi, [TASK_COUNT] - inc esi - - cmp [bPressedMouseXY_W], 1 - ja .next_window - inc [bPressedMouseXY_W] - jnc .next_window - push dword[MOUSE_X] - pop dword[mx] - - .next_window: - cmp esi, 2 - jb .exit - - dec esi - - ; is that window not minimized? - movzx edi, word[WIN_POS + esi * 2] +align 4 +;------------------------------------------------------------------------------ +sys_window_maximize_handler: ;///////////////////////////////////////////////// +;------------------------------------------------------------------------------ +;? +;------------------------------------------------------------------------------ +;> esi = process slot +;------------------------------------------------------------------------------ + mov edi, esi shl edi, 5 add edi, window_data - test [edi + WDATA.fl_wstate], WSTATE_MINIMIZED - jnz .next_window - movzx eax, [mx] - movzx ebx, [my] - - ; is the cursor inside screen bounds of that window? - mov ecx, [edi + WDATA.box.left] - mov edx, [edi + WDATA.box.top] - cmp eax, ecx - jl .next_window - cmp ebx, edx - jl .next_window - add ecx, [edi + WDATA.box.width] - add edx, [edi + WDATA.box.height] - cmp eax, ecx - jge .next_window - cmp ebx, edx - jge .next_window - - ; is that a top-most (which means active) window? - cmp esi, [TASK_COUNT] - je .check_for_moving_or_resizing - - ; no it's not, did we just press mouse button down above it or was it - ; already pressed before? - cmp [bPressedMouseXY_W], 1 - ja .exit - - ; okay, we just pressed the button, activate this window and exit - lea esi, [WIN_POS + esi * 2] - call waredraw - jmp .exit - - .check_for_moving_or_resizing: - ; is that window movable? - test byte[edi + WDATA.cl_titlebar + 3], 0x01 - jnz .exit - - ; yes it is, is it rolled up? - test [edi + WDATA.fl_wstate], WSTATE_ROLLEDUP - jnz .check_for_cursor_on_caption - - ; no it's not, can it be resized then? - mov [do_resize_from_corner], 0 + ; can window change its height? mov dl, [edi + WDATA.fl_wstyle] and dl, 0x0f - cmp dl, 0x00 - je .check_for_cursor_on_caption - cmp dl, 0x01 - je .check_for_cursor_on_caption cmp dl, 0x04 - je .check_for_cursor_on_caption + je .exit - ; are we going to resize it? - mov edx, [edi + WDATA.box.top] - add edx, [edi + WDATA.box.height] - sub edx, 6 - cmp ebx, edx - jl .check_for_cursor_on_caption + ; toggle normal/maximized window state + mov bl, [edi + WDATA.fl_wstate] + xor bl, WSTATE_MAXIMIZED - ; yes we do, remember that - mov [do_resize_from_corner], 1 - jmp .set_move_resize_flag + ; calculate and set appropriate window bounds + test bl, WSTATE_MAXIMIZED + jz .restore_size - .check_for_cursor_on_caption: - ; is the cursor inside window titlebar? - push eax - call window._.get_titlebar_height - add eax, [edi + WDATA.box.top] - cmp ebx, eax - pop eax - jge .exit + mov eax, [screen_workarea.left] + mov ecx, [screen_workarea.top] + push [screen_workarea.bottom] \ + [screen_workarea.right] \ + ecx \ + eax + sub [esp + BOX.width], eax + sub [esp + BOX.height], ecx + mov eax, esp + jmp .set_box - ; calculate duration between two clicks - mov ecx, [timer_ticks] - mov edx, ecx - sub edx, [latest_window_touch] - mov [latest_window_touch], ecx - mov [latest_window_touch_delta], edx + .restore_size: + mov eax, esi + shl eax, 8 + add eax, SLOT_BASE + APPDATA.saved_box + push [eax + BOX.height] \ + [eax + BOX.width] \ + [eax + BOX.top] \ + [eax + BOX.left] + mov eax, esp - .set_move_resize_flag: - mov cl, [BTN_DOWN] - mov [do_resize], cl + .set_box: + test bl, WSTATE_ROLLEDUP + jz @f - mov ecx, [edi + WDATA.box.left] - mov edx, [edi + WDATA.box.top] - - push ecx edx - mov [draw_limits.left], ecx - mov [draw_limits.top], edx - add ecx, [edi + WDATA.box.width] - add edx, [edi + WDATA.box.height] - mov [draw_limits.right], ecx - mov [draw_limits.bottom], edx - pop edx ecx - - ; calculate window-relative cursor coordinates - sub eax, ecx - sub ebx, edx - - push dword[MOUSE_X] - pop dword[WIN_TEMP_XY] - - ; save old window coordinates - push eax - mov eax, [edi + WDATA.box.left] - mov [old_window_pos.left], eax - mov [new_window_pos.left], eax - mov eax, [edi + WDATA.box.top] - mov [old_window_pos.top], eax - mov [new_window_pos.top], eax - mov eax, [edi + WDATA.box.width] - mov [old_window_pos.width], eax - mov [new_window_pos.width], eax - mov eax, [edi + WDATA.box.height] - mov [old_window_pos.height], eax - mov [new_window_pos.height], eax - pop eax - - ; draw negative moving/sizing frame - call window._.draw_window_frames - - mov [reposition], 0 - mov byte[MOUSE_DOWN], 1 - - .next_mouse_state_check: - ; process OS events - mov byte[DONT_DRAW_MOUSE], 1 - call checkidle - call checkVga_N13 - mov byte[MOUSE_BACKGROUND], 0 - call [draw_pointer] - pushad - call stack_handler - popad - - ; did cursor position change? - mov esi, [WIN_TEMP_XY] - cmp esi, [MOUSE_X] - je .check_for_new_mouse_buttons_state - - ; yes it did, calculate window-relative cursor coordinates - movzx ecx, word[MOUSE_X] - movzx edx, word[MOUSE_Y] - sub ecx, eax - sub edx, ebx - - push eax ebx - - ; we're going to draw new frame, erasing the old one - call window._.draw_window_frames - - ; are we moving it right now? - cmp [do_resize_from_corner], 0 - jne .resize_window - - ; yes we do, check if it's inside the screen area - mov eax, [Screen_Max_X] - mov ebx, [Screen_Max_Y] - - mov [new_window_pos.left], 0 - or ecx, ecx - jle .check_for_new_vert_cursor_pos - mov [reposition], 1 - sub eax, [new_window_pos.width] - mov [new_window_pos.left], eax - cmp ecx, eax - jge .check_for_new_vert_cursor_pos - mov [new_window_pos.left], ecx - - .check_for_new_vert_cursor_pos: - mov [new_window_pos.top], 0 - or edx, edx - jle .draw_new_window_frame - mov [reposition], 1 - sub ebx, [new_window_pos.height] - mov [new_window_pos.top], ebx - cmp edx, ebx - jge .draw_new_window_frame - mov [new_window_pos.top], edx - jmp .draw_new_window_frame - - .resize_window: - push eax ebx edx - - mov edx, edi - sub edx, window_data - lea edx, [SLOT_BASE + edx * 8] - - movzx eax, word[MOUSE_X] - cmp eax, [edi + WDATA.box.left] - jb .fix_new_vert_size - sub eax, [edi + WDATA.box.left] - cmp eax, 32 - jge @f - mov eax, 32 - @@: mov [new_window_pos.width], eax - - .fix_new_vert_size: + xchg eax, ecx call window._.get_rolledup_height - mov ebx, eax - movzx eax, word[MOUSE_Y] - cmp eax, [edi + WDATA.box.top] - jb .set_reposition_flag - sub eax, [edi + WDATA.box.top] - cmp eax, ebx - jge @f - mov eax, ebx - @@: mov [new_window_pos.height], eax + mov [ecx + BOX.height], eax + xchg eax, ecx - .set_reposition_flag: - mov [reposition], 1 + @@: call window._.set_window_box + add esp, BOX.sizeof - pop edx ebx eax + .exit: + ret - .draw_new_window_frame: - pop ebx eax - - ; draw new window moving/sizing frame - call window._.draw_window_frames - - mov esi, [MOUSE_X] - mov [WIN_TEMP_XY], esi - - .check_for_new_mouse_buttons_state: - ; did user release mouse button(s)? - cmp byte[BTN_DOWN], 0 - jne .next_mouse_state_check - - ; yes he did, moving/sizing is over - mov byte[DONT_DRAW_MOUSE], 1 - mov cl, 0 - test [edi + WDATA.fl_wstate], WSTATE_MAXIMIZED - jnz .check_other_actions - - mov cl, [reposition] - - ; draw negative frame once again to hide it - call window._.draw_window_frames - - ; save new window bounds - mov eax, [new_window_pos.left] - mov [edi + WDATA.box.left], eax - mov eax, [new_window_pos.top] - mov [edi + WDATA.box.top], eax - mov eax, [new_window_pos.width] - mov [edi + WDATA.box.width], eax - mov eax, [new_window_pos.height] - mov [edi + WDATA.box.height], eax - call set_window_clientbox - - cmp cl, 1 - jne .check_other_actions - push esi edi ecx - mov esi, edi - mov ecx, 2 - test [edi + WDATA.fl_wstate], WSTATE_ROLLEDUP or WSTATE_MAXIMIZED - jnz @f - add ecx, 2 - @@: sub edi, window_data - shr edi, 5 - shl edi, 8 - add edi, SLOT_BASE + APPDATA.saved_box - cld - rep movsd - pop ecx edi esi - - .check_other_actions: - mov [reposition], cl - - pushad - - mov dl, [edi + WDATA.fl_wstyle] - and dl, 0x0f - cmp dl, 0x00 - je .check_if_window_fits_screen - cmp dl, 0x01 - je .check_if_window_fits_screen - - cmp cl, 1 - je .no_window_sizing - mov edx, edi - sub edx, window_data - shr edx, 5 +align 4 +;------------------------------------------------------------------------------ +sys_window_rollup_handler: ;/////////////////////////////////////////////////// +;------------------------------------------------------------------------------ +;? +;------------------------------------------------------------------------------ +;> esi = process slot +;------------------------------------------------------------------------------ + mov edx, esi shl edx, 8 add edx, SLOT_BASE - ; did we right-click on titlebar? - cmp [do_resize], 2 - jne .check_maximization_request - - ; yes we did, toggle normal/rolled up window state - xor [edi + WDATA.fl_wstate], WSTATE_ROLLEDUP - mov [reposition], 1 - - ; calculate and set appropriate window height - test [edi + WDATA.fl_wstate], WSTATE_ROLLEDUP - jz @f - call window._.get_rolledup_height - jmp .set_new_window_height - @@: mov eax, [edx + APPDATA.saved_box.height] - test [edi + WDATA.fl_wstate], WSTATE_MAXIMIZED - jz .set_new_window_height - mov eax, [screen_workarea.bottom] - sub eax, [screen_workarea.top] - - .set_new_window_height: - mov [edi + WDATA.box.height], eax - add eax, [edi + WDATA.box.top] - cmp eax, [Screen_Max_Y] - jbe @f - mov eax, [Screen_Max_Y] - sub eax, [edi + WDATA.box.height] - mov [edi + WDATA.box.top], eax - @@: call check_window_position - call set_window_clientbox - - .check_maximization_request: - ; can window change its height? - push edx - mov dl, [edi + WDATA.fl_wstyle] - and dl, 0x0f - cmp dl, 0x04 - pop edx - je .check_if_window_fits_screen - - ; was it really a maximize/restore request? - cmp [do_resize], 1 - jne .check_if_window_fits_screen - cmp [do_resize_from_corner], 0 - jne .check_if_window_fits_screen - cmp [latest_window_touch_delta], 50 - jg .check_if_window_fits_screen - - ; yes is was, toggle normal/maximized window state - xor [edi + WDATA.fl_wstate], WSTATE_MAXIMIZED - mov [reposition], 1 + ; toggle normal/rolled up window state + mov bl, [edi + WDATA.fl_wstate] + xor bl, WSTATE_ROLLEDUP ; calculate and set appropriate window bounds - test [edi + WDATA.fl_wstate], WSTATE_MAXIMIZED - jz .restore_normal_window_size - mov eax, [screen_workarea.left] - mov [edi + WDATA.box.left], eax - sub eax, [screen_workarea.right] - neg eax - mov [edi + WDATA.box.width], eax - mov eax, [screen_workarea.top] - mov [edi + WDATA.box.top], eax - test [edi + WDATA.fl_wstate], WSTATE_ROLLEDUP - jnz .calculate_window_client_area - sub eax, [screen_workarea.bottom] - neg eax - mov [edi + WDATA.box.height], eax - jmp .calculate_window_client_area + test bl, WSTATE_ROLLEDUP + jz .restore_size - .restore_normal_window_size: - push [edi + WDATA.box.height] - push edi - lea esi, [edx + APPDATA.saved_box] - mov ecx, 4 - cld - rep movsd - pop edi + call window._.get_rolledup_height + push eax \ + [edi + WDATA.box.width] \ + [edi + WDATA.box.top] \ + [edi + WDATA.box.left] + mov eax, esp + jmp .set_box + + .restore_size: + test bl, WSTATE_MAXIMIZED + jnz @f + add esp, -BOX.sizeof + lea eax, [edx + APPDATA.saved_box] + jmp .set_box + + @@: mov eax, [screen_workarea.top] + push [screen_workarea.bottom] \ + [edi + WDATA.box.width] \ + eax \ + [edi + WDATA.box.left] + sub [esp + BOX.height], eax + mov eax, esp + + .set_box: + call window._.set_window_box + add esp, BOX.sizeof + + ret + +align 4 +;------------------------------------------------------------------------------ +sys_window_start_moving_handler: ;///////////////////////////////////////////// +;------------------------------------------------------------------------------ +;? +;------------------------------------------------------------------------------ +;> eax = old (original) window box +;> esi = process slot +;------------------------------------------------------------------------------ + mov edi, eax + call window._.draw_negative_box + + ret + +align 4 +;------------------------------------------------------------------------------ +sys_window_end_moving_handler: ;/////////////////////////////////////////////// +;------------------------------------------------------------------------------ +;? +;------------------------------------------------------------------------------ +;> eax = old (original) window box +;> ebx = new (final) window box +;> esi = process slot +;------------------------------------------------------------------------------ + mov edi, ebx + call window._.draw_negative_box + + mov edi, esi + shl edi, 5 + add edi, window_data + + mov eax, ebx + mov bl, [edi + WDATA.fl_wstate] + call window._.set_window_box + ret + +align 4 +;------------------------------------------------------------------------------ +sys_window_moving_handler: ;/////////////////////////////////////////////////// +;------------------------------------------------------------------------------ +;? +;------------------------------------------------------------------------------ +;> eax = old (from previous call) window box +;> ebx = new (current) window box +;> esi = process_slot +;------------------------------------------------------------------------------ + mov edi, eax + call window._.draw_negative_box + mov edi, ebx + call window._.draw_negative_box + ret + +;============================================================================== +;///// private functions ////////////////////////////////////////////////////// +;============================================================================== + +iglobal + FuncTable syscall_display_settings, ftable, \ + 00, 01, 02, 03, 04, 05, 06, 07, 08 + + 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 + +;uglobal + ; NOTE: commented out since doesn't provide necessary functionality anyway, + ; to be reworked +; new_window_starting dd ? +;endg + +align 4 +;------------------------------------------------------------------------------ +window._.invalidate_screen: ;////////////////////////////////////////////////// +;------------------------------------------------------------------------------ +;? +;------------------------------------------------------------------------------ +;> eax = old (original) window box +;> ebx = new (final) window box +;> edi = pointer to WDATA struct +;------------------------------------------------------------------------------ + push eax ebx + + ; TODO: do we really need `draw_limits`? + mov ecx, [eax + BOX.left] + mov edx, [ebx + BOX.left] + cmp ecx, edx + jle @f + xchg ecx, edx + @@: mov [draw_limits.left], ecx + mov ecx, [eax + BOX.width] + cmp ecx, [ebx + BOX.width] + jae @f + mov ecx, [ebx + BOX.width] + @@: add ecx, edx + mov [draw_limits.right], ecx + mov ecx, [eax + BOX.top] + mov edx, [ebx + BOX.top] + cmp ecx, edx + jle @f + xchg ecx, edx + @@: mov [draw_limits.top], ecx + mov ecx, [eax + BOX.height] + cmp ecx, [ebx + BOX.height] + jae @f + mov ecx, [ebx + BOX.height] + @@: add ecx, edx + mov [draw_limits.bottom], ecx + + ; recalculate screen buffer at old position + push ebx + mov edx, [eax + BOX.height] + mov ecx, [eax + BOX.width] + mov ebx, [eax + BOX.top] + mov eax, [eax + BOX.left] + add ecx, eax + add edx, ebx + call calculatescreen pop eax - test [edi + WDATA.fl_wstate], WSTATE_ROLLEDUP - jz .calculate_window_client_area - mov [edi + WDATA.box.height], eax - - .calculate_window_client_area: - call set_window_clientbox - - .check_if_window_fits_screen: - ; does window fit into screen area? - mov eax, [edi + WDATA.box.top] - add eax, [edi + WDATA.box.height] - cmp eax, [Screen_Max_Y] - jbe .no_window_sizing - mov eax, [edi + WDATA.box.left] - add eax, [edi + WDATA.box.width] - cmp eax, [Screen_Max_X] - jbe .no_window_sizing - - ; no it doesn't, fix that - mov eax, [Screen_Max_X] - sub eax, [edi + WDATA.box.width] - mov [edi + WDATA.box.left], eax - mov eax, [Screen_Max_Y] - sub eax, [edi + WDATA.box.height] - mov [edi + WDATA.box.top], eax - call set_window_clientbox - - .no_window_sizing: - popad - - ; did somethins actually change its place? - cmp [reposition], 0 - je .reset_vars - - mov byte[DONT_DRAW_MOUSE], 1 - - push eax ebx ecx edx ; recalculate screen buffer at new position + mov edx, [eax + BOX.height] + mov ecx, [eax + BOX.width] + mov ebx, [eax + BOX.top] + mov eax, [eax + BOX.left] + add ecx, eax + add edx, ebx + call calculatescreen + + mov eax, edi + call redrawscreen + + ; tell window to redraw itself + mov [edi + WDATA.fl_redraw], 1 + + pop ebx eax + ret + +align 4 +;------------------------------------------------------------------------------ +window._.set_window_box: ;///////////////////////////////////////////////////// +;------------------------------------------------------------------------------ +;? +;------------------------------------------------------------------------------ +;> eax = pointer to BOX struct +;> bl = new window state flags +;> edi = pointer to WDATA struct +;------------------------------------------------------------------------------ + push eax ebx esi + + add esp, -BOX.sizeof + + mov ebx, esp + lea esi, [edi + WDATA.box] + xchg eax, esi + mov ecx, BOX.sizeof + call memmove + xchg eax, esi + xchg ebx, esi + call memmove + xchg ebx, esi + + call window._.check_window_position + call window._.set_window_clientbox + call window._.invalidate_screen + + add esp, BOX.sizeof + + mov cl, [esp + 4] + mov ch, cl + xchg cl, [edi + WDATA.fl_wstate] + + or cl, ch + test cl, WSTATE_MAXIMIZED + jnz .exit + + mov eax, edi + sub eax, window_data + shl eax, 3 + add eax, SLOT_BASE + + lea ebx, [edi + WDATA.box] + xchg esp, ebx + + pop [eax + APPDATA.saved_box.left] \ + [eax + APPDATA.saved_box.top] \ + [eax + APPDATA.saved_box.width] \ + edx + + xchg esp, ebx + + test ch, WSTATE_ROLLEDUP + jnz .exit + + mov [eax + APPDATA.saved_box.height], edx + + .exit: + pop esi ebx eax + ret + +align 4 +;------------------------------------------------------------------------------ +window._.set_window_clientbox: ;/////////////////////////////////////////////// +;------------------------------------------------------------------------------ +;? +;------------------------------------------------------------------------------ +;> edi = pointer to WDATA struct +;------------------------------------------------------------------------------ + push eax ecx edi + + mov eax, [_skinh] + mov [window_topleft + 8 * 3 + 4], eax + mov [window_topleft + 8 * 4 + 4], eax + + mov ecx, edi + sub edi, window_data + shl edi, 3 + test [ecx + WDATA.fl_wstyle], WSTYLE_CLIENTRELATIVE + jz .whole_window + + 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 + jmp .exit + + .whole_window: + 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 + + .exit: + pop edi ecx eax + ret + +align 4 +;------------------------------------------------------------------------------ +window._.sys_set_window: ;///////////////////////////////////////////////////// +;------------------------------------------------------------------------------ +;? +;------------------------------------------------------------------------------ +;< edx = pointer to WDATA struct +;------------------------------------------------------------------------------ + mov eax, [CURRENT_TASK] + shl eax, 5 + add eax, window_data + + ; save window colors + mov [eax + WDATA.cl_workarea], edx + mov [eax + WDATA.cl_titlebar], esi + mov [eax + WDATA.cl_frames], edi + + mov edi, eax + + ; was it already defined before? + test [edi + WDATA.fl_wdrawn], 1 + jnz .set_client_box + + ; NOTE: commented out since doesn't provide necessary functionality + ; anyway, to be reworked +; mov eax, [timer_ticks] ; [0xfdf0] +; add eax, 100 +; mov [new_window_starting], eax + + ; no it wasn't, performing initial window definition + movzx eax, bx + mov [edi + WDATA.box.width], eax + movzx 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 window._.check_window_position + + push ecx 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 + cmp cl, 3 + je @f + cmp cl, 4 + je @f + + xor eax, eax + + @@: mov [edi + APPDATA.wnd_caption], eax + + mov esi, [esp] + add edi, APPDATA.saved_box + movsd + movsd + movsd + movsd + + pop edi ecx + + mov esi, [CURRENT_TASK] + movzx esi, word[WIN_STACK + esi * 2] + lea esi, [WIN_POS + esi * 2] + call waredraw + mov eax, [edi + WDATA.box.left] mov ebx, [edi + WDATA.box.top] mov ecx, [edi + WDATA.box.width] @@ -1403,50 +1473,98 @@ checkwindows: ;//////////////////////////////////////////////////////////////// add edx, ebx call calculatescreen - ; recalculate screen buffer at old position - mov eax, [old_window_pos.left] - mov ebx, [old_window_pos.top] - mov ecx, [old_window_pos.width] - mov edx, [old_window_pos.height] - add ecx, eax - add edx, ebx - call calculatescreen + mov byte[KEY_COUNT], 0 ; empty keyboard buffer + mov byte[BTN_COUNT], 0 ; empty button buffer - pop edx ecx ebx eax + .set_client_box: + ; update window client box coordinates + call window._.set_window_clientbox - mov eax, edi - call redrawscreen - - ; tell window to redraw itself - mov [edi + WDATA.fl_redraw], 1 - - ; wait a bit for window to redraw itself - mov ecx, 100 - - .next_idle_cycle: - mov byte[DONT_DRAW_MOUSE], 1 - call checkidle - cmp [edi + WDATA.fl_redraw], 0 - jz .reset_vars - loop .next_idle_cycle - - .reset_vars: - mov byte[DONT_DRAW_MOUSE], 0 ; mouse pointer - mov byte[MOUSE_BACKGROUND], 0 ; no mouse under - mov byte[MOUSE_DOWN], 0 ; react to mouse up/down - - .exit: - popad + ; reset window redraw flag and exit + mov [edi + WDATA.fl_redraw], 0 + mov edx, edi ret -;============================================================================== -;///// private functions ////////////////////////////////////////////////////// -;============================================================================== +align 4 +;------------------------------------------------------------------------------ +window._.check_window_position: ;////////////////////////////////////////////// +;------------------------------------------------------------------------------ +;? Check if window is inside screen area +;------------------------------------------------------------------------------ +;> edi = pointer to WDATA +;------------------------------------------------------------------------------ + push eax ebx ecx edx esi + + mov eax, [edi + WDATA.box.left] + mov ebx, [edi + WDATA.box.top] + mov ecx, [edi + WDATA.box.width] + mov edx, [edi + WDATA.box.height] + + mov esi, [Screen_Max_X] + cmp ecx, esi + ja .fix_width_high + + .check_left: + or eax, eax + jl .fix_left_low + add eax, ecx + cmp eax, esi + jg .fix_left_high + + .check_height: + mov esi, [Screen_Max_Y] + cmp edx, esi + ja .fix_height_high + + .check_top: + or ebx, ebx + jl .fix_top_low + add ebx, edx + cmp ebx, esi + jg .fix_top_high + + .exit: + pop esi edx ecx ebx eax + ret + + .fix_width_high: + mov ecx, esi + mov [edi + WDATA.box.width], esi + jmp .check_left + + .fix_left_low: + xor eax, eax + mov [edi + WDATA.box.left], eax + jmp .check_height + + .fix_left_high: + mov eax, esi + sub eax, ecx + mov [edi + WDATA.box.left], eax + jmp .check_height + + .fix_height_high: + mov edx, esi + mov [edi + WDATA.box.height], esi + jmp .check_top + + .fix_top_low: + xor ebx, ebx + mov [edi + WDATA.box.top], ebx + jmp .exit + + .fix_top_high: + mov ebx, esi + sub ebx, edx + mov [edi + WDATA.box.top], ebx + jmp .exit align 4 ;------------------------------------------------------------------------------ window._.get_titlebar_height: ;//////////////////////////////////////////////// ;------------------------------------------------------------------------------ +;? +;------------------------------------------------------------------------------ ;> edi = pointer to WDATA ;------------------------------------------------------------------------------ mov al, [edi + WDATA.fl_wstyle] @@ -1462,6 +1580,8 @@ align 4 ;------------------------------------------------------------------------------ window._.get_rolledup_height: ;//////////////////////////////////////////////// ;------------------------------------------------------------------------------ +;? +;------------------------------------------------------------------------------ ;> edi = pointer to WDATA ;------------------------------------------------------------------------------ mov al, [edi + WDATA.fl_wstyle] @@ -1732,9 +1852,9 @@ window._.check_window_draw: ;////////////////////////////////////////////////// ;------------------------------------------------------------------------------ mov cl, [edi + WDATA.fl_wstyle] and cl, 0x0f - cmp cl, 0x03 + cmp cl, 3 je .exit.redraw ; window type 3 - cmp cl, 0x04 + cmp cl, 4 je .exit.redraw ; window type 4 push eax ebx edx esi @@ -1743,8 +1863,6 @@ window._.check_window_draw: ;////////////////////////////////////////////////// sub eax, window_data shr eax, 5 - ; esi = process number - movzx eax, word[WIN_STACK + eax * 2] ; get value of the curr process lea esi, [WIN_POS + eax * 2] ; get address of this process at 0xC400 @@ -1798,49 +1916,142 @@ window._.check_window_draw: ;////////////////////////////////////////////////// align 4 ;------------------------------------------------------------------------------ -window._.draw_window_frames: ;///////////////////////////////////////////////// +window._.draw_window_caption: ;//////////////////////////////////////////////// ;------------------------------------------------------------------------------ -;? Draw negative window frames +;? ;------------------------------------------------------------------------------ -;> edi = pointer to WDATA -;------------------------------------------------------------------------------ - push eax - cli + inc [mouse_pause] + call [_display.disable_mouse] - test [edi + WDATA.fl_wstate], WSTATE_MAXIMIZED - jnz .exit - mov eax, [new_window_pos.left] - cmp eax, [edi + WDATA.box.left] - jnz .draw - mov eax, [new_window_pos.width] - cmp eax, [edi + WDATA.box.width] - jnz .draw - mov eax, [new_window_pos.top] - cmp eax, [edi + WDATA.box.top] - jnz .draw - mov eax, [new_window_pos.height] - cmp eax, [edi + WDATA.box.height] - jnz .draw - xor [edi + WDATA.fl_wdrawn], 2 + 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 + cmp bl, 4 + je .draw_caption_style_3 - .draw: - push ebx esi - mov eax, [new_window_pos.left - 2] - mov ax, word[new_window_pos.left] - add ax, word[new_window_pos.width] - mov ebx, [new_window_pos.top - 2] - mov bx, word[new_window_pos.top] - add bx, word[new_window_pos.height] - mov esi, 0x01000000 - call draw_rectangle.forced - pop esi ebx + 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: mov edi, [CURRENT_TASK] + shl edi, 5 + test [edi + window_data + WDATA.fl_wstyle], WSTYLE_HASCAPTION + jz .exit + mov edx, [edi * 8 + SLOT_BASE + APPDATA.wnd_caption] + or edx, edx + jz .exit + + 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 .exit + + 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 .exit + + 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 .exit + + mov esi, eax + mov ebx, 0x00080007 + add ebx, ebp + + .dodraw: + mov ecx, [common_colours + 16] + or ecx, 0x80000000 + xor edi, edi + call dtext_asciiz_esi .exit: - sti - pop eax + dec [mouse_pause] + call [draw_pointer] ret - .forced: - push eax - cli - jmp .draw +align 4 +;------------------------------------------------------------------------------ +window._.draw_negative_box: ;////////////////////////////////////////////////// +;------------------------------------------------------------------------------ +;? Draw negative box +;------------------------------------------------------------------------------ +;> edi = pointer to BOX struct +;------------------------------------------------------------------------------ + push eax ebx esi + mov eax, [edi + BOX.left - 2] + mov ax, word[edi + BOX.left] + add ax, word[edi + BOX.width] + mov ebx, [edi + BOX.top - 2] + mov bx, word[edi + BOX.top] + add bx, word[edi + BOX.height] + mov esi, 0x01000000 + call draw_rectangle.forced + pop esi ebx eax + ret diff --git a/kernel/trunk/kernel.asm b/kernel/trunk/kernel.asm index bc41773594..2b7e0f37d2 100644 --- a/kernel/trunk/kernel.asm +++ b/kernel/trunk/kernel.asm @@ -1035,9 +1035,8 @@ boot_log: align 32 osloop: call [draw_pointer] - call check_buttons - call checkwindows -; call check_window_move_request + call window_check_events + call mouse_check_events call checkmisc call checkVga_N13 call stack_handler @@ -2675,11 +2674,7 @@ sys_getbutton: test eax, eax jz .exit mov eax, [BTN_BUFF] - shl eax, 8 -; // Alver 22.06.2008 // { - mov al, byte [btn_down_determ] - and al,0xFE ; delete left button bit -; } \\ Alver \\ + and al, 0xFE ; delete left button bit mov [BTN_COUNT], byte 0 mov [esp + 32], eax .exit: @@ -2911,480 +2906,6 @@ sys_redrawstat: srl1: 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 ;nt - not tested ;--------------------------------------------------------------------------------------------- diff --git a/kernel/trunk/kernel32.inc b/kernel/trunk/kernel32.inc index f0520e1427..071f655345 100644 --- a/kernel/trunk/kernel32.inc +++ b/kernel/trunk/kernel32.inc @@ -41,11 +41,21 @@ $Revision$ ; display 'not used dt: ',`.,13,10 ; end if } +struc POINT { + .x dd ? + .y dd ? + .sizeof: +} +virtual at 0 + POINT POINT +end virtual + struc RECT { .left dd ? .top dd ? .right dd ? .bottom dd ? + .sizeof: } virtual at 0 RECT RECT @@ -56,6 +66,7 @@ struc BOX { .top dd ? .width dd ? .height dd ? + .sizeof: } virtual at 0 BOX BOX