1,6 → 1,6 |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
;; ;; |
;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;; |
;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;; |
;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa ;; |
;; Distributed under terms of the GNU General Public License ;; |
;; ;; |
8,10 → 8,6 |
|
$Revision$ |
|
;============================================================================== |
;///// public functions /////////////////////////////////////////////////////// |
;============================================================================== |
|
button.MAX_BUTTONS = 4095 |
|
struct SYS_BUTTON |
25,12 → 21,11 |
dw ? |
ends |
|
align 4 |
;------------------------------------------------------------------------------ |
syscall_button: ;///// system function 8 ////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;--------------------------------------------------------------- |
syscall_button: ;////////////// system function 8 ////////////// |
;--------------------------------------------------------------- |
;? Define/undefine GUI button object |
;------------------------------------------------------------------------------ |
;--------------------------------------------------------------- |
;; Define button: |
;> ebx = pack[16(x), 16(width)] |
;> ecx = pack[16(y), 16(height)] |
40,12 → 35,12 |
;> 6 (30) = don't draw button |
;> 5 (29) = don't draw button frame when pressed |
;> esi = button color |
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
;; Undefine button: |
;> edx = pack[8(flags), 24(button identifier)] |
;> flags bits: |
;> 7 (31) = 1 |
;------------------------------------------------------------------------------ |
;--------------------------------------------------------------- |
; do we actually need to undefine the button? |
test edx, 0x80000000 |
jnz .remove_button |
74,13 → 69,12 |
pop eax |
|
; basic checks passed, define the button |
push ebx ecx edx |
inc eax |
mov [edi], ax |
shl eax, 4 |
add edi, eax |
; NOTE: this code doesn't rely on SYS_BUTTON struct, please revise it |
; if you change something |
; NOTE: this code doesn't rely on SYS_BUTTON struct, |
; please revise it, if you change something. |
mov ax, [CURRENT_TASK] |
stosw |
mov ax, dx |
94,18 → 88,52 |
mov eax, edx |
shr eax, 16 |
stosw ; button id number: bits 16-31 |
pop edx ecx ebx |
|
; do we also need to draw the button? |
test edx, 0x40000000 |
jnz .exit |
|
; draw button body |
and esi, 0xFFFFFF |
xor edi, edi |
push ebx ecx esi |
dec cx |
dec cx |
cmp [buttontype], 1 |
jnz .draw |
cmp cx, 65 |
jnc .draw |
|
pushad |
; calculate gradient data |
mov eax, esi |
shl eax, 8 |
mov edx, 3 |
.calculate: |
rol eax, 8 |
shl al, 1 |
jnc @f |
neg al |
jnz @f |
mov al, 64 |
@@: |
cmp al, 65 |
jc @f |
mov al, 64 |
@@: |
div cl |
shl ax, 8 |
dec edx |
jnz .calculate |
mov dl, cl |
dec edx |
shr edx, 1 |
shr eax, 8 |
mov edi, eax |
mul edx |
add esi, eax |
|
; calculate window-relative coordinates |
movzx edi, cx |
.draw: ; calculate window-relative coordinates |
movzx ebp, cx |
dec ebp |
shr ebx, 16 |
shr ecx, 16 |
mov eax, [TASK_BASE] |
113,110 → 141,73 |
add ecx, [eax - twdw + WDATA.box.top] |
mov eax, ebx |
inc eax |
shl eax, 16 |
mov ax, bx |
add ax, word[esp + 16] |
dec ax |
mov edx, ebx |
add dx, [esp+8] |
dec edx |
mov ebx, ecx |
shl ebx, 16 |
mov bx, cx |
|
; calculate initial color |
mov ecx, esi |
cmp [buttontype], 0 |
je @f |
call button._.incecx2 |
|
; set button height counter |
@@: |
mov edx, edi |
add ebx, 0x00010001 |
dec edx |
|
shr ecx, 1 |
and cx, 7F7Fh |
push esi |
mov esi, edi |
xor edi, edi |
call hline ; top border |
inc ebx |
or ecx, 808080h |
call hline ; top light line |
pop ecx |
inc ebx |
.next_line: |
call button._.button_dececx |
push edi |
xor edi, edi |
; call [draw_line] |
call __sys_draw_line |
pop edi |
add ebx, 0x00010001 |
dec edx |
call hline ; button body |
inc ebx |
sub ecx, esi |
dec ebp |
jnz .next_line |
|
popad |
|
; draw button frame |
|
push ebx ecx |
|
; calculate window-relative coordinates |
shr ebx, 16 |
shr ecx, 16 |
mov eax, [TASK_BASE] |
add ebx, [eax - twdw + WDATA.box.left] |
add ecx, [eax - twdw + WDATA.box.top] |
|
; top border |
mov eax, ebx |
shl eax, 16 |
mov ax, bx |
add ax, [esp + 4] |
mov ebx, ecx |
shl ebx, 16 |
mov bx, cx |
push ebx |
xor edi, edi |
mov ecx, esi |
call button._.incecx |
; call [draw_line] |
call __sys_draw_line |
|
; bottom border |
movzx edx, word[esp + 4 + 0] |
add ebx, edx |
shl edx, 16 |
add ebx, edx |
mov ecx, esi |
call button._.dececx |
; call [draw_line] |
call __sys_draw_line |
|
; left border |
pop ebx |
shr ecx, 2 |
and cx, 3F3Fh |
mov ebp, ecx |
shl ecx, 1 |
add ecx, ebp |
call hline ; bottom dark line |
inc ebx |
sub ecx, ebp |
call hline ; bottom border |
pop ecx |
shr ecx, 1 |
inc edx |
push edx |
mov edx, eax |
shr edx, 16 |
mov ax, dx |
mov edx, ebx |
shr edx, 16 |
mov bx, dx |
add bx, [esp + 4 + 0] |
pop edx |
mov ecx, esi |
call button._.incecx |
; call [draw_line] |
dec ebx |
call __sys_draw_line |
|
; right border |
mov dx, [esp + 4] |
add ax, dx |
shl edx, 16 |
add eax, edx |
add ebx, 0x00010000 |
mov ecx, esi |
call button._.dececx |
; call [draw_line] |
call __sys_draw_line |
|
sub bx, [esp+4] |
dec edx |
inc ebx |
cmp [buttontype], 0 |
jnz @f |
dec edx |
or ecx, 808080h |
call vline ; left light line |
inc edx |
@@: |
and ecx, 7F7F7Fh |
dec eax |
call vline ; left border |
pop eax |
call vline ; right border |
cmp [buttontype], 0 |
jnz @f |
mov ebp, ecx |
shr ecx, 1 |
and cx, 7F7Fh |
add ecx, ebp |
dec eax |
inc ebx |
call vline ; right dark line |
@@: |
pop ecx ebx |
|
.exit: |
ret |
|
; FIXME: mutex needed |
syscall_button.remove_button: |
.remove_button: |
and edx, 0x00ffffff |
mov edi, [BTN_ADDR] |
mov ebx, [edi] |
256,87 → 247,19 |
pop ebx |
jmp .next_button |
|
.exit: |
ret |
|
align 4 |
;------------------------------------------------------------------------------ |
sys_button_activate_handler: ;///////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? <description> |
;------------------------------------------------------------------------------ |
;--------------------------------------------------------------- |
sys_button_activate_handler: |
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 |
|
.exit: |
ret |
|
align 4 |
;------------------------------------------------------------------------------ |
sys_button_deactivate_handler: ;/////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? <description> |
;------------------------------------------------------------------------------ |
;> 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 |
|
.exit: |
ret |
|
align 4 |
;------------------------------------------------------------------------------ |
sys_button_perform_handler: ;////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? <description> |
;------------------------------------------------------------------------------ |
;> 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 |
;------------------------------------------------------------------------------ |
;--------------------------------------------------------------- |
; find system button by specified process slot, id and coordinates |
push ecx edx esi edi |
|
mov edx, eax |
shr edx, 24 |
and eax, 0x0ffffff |
|
mov edi, [BTN_ADDR] |
mov ecx, [edi] |
imul esi, ecx, sizeof.SYS_BUTTON |
343,11 → 266,9 |
add esi, edi |
inc ecx |
add esi, sizeof.SYS_BUTTON |
|
.next_button: |
dec ecx |
jz .not_found |
|
jz .popexit |
add esi, -sizeof.SYS_BUTTON |
|
; does it belong to our process? |
367,147 → 288,58 |
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 |
mov ebx, dword[eax + SYS_BUTTON.id_hi - 2] |
|
;------------------------------------------------------------------------------ |
button._.dececx: ;///////////////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? <description> |
;------------------------------------------------------------------------------ |
sub cl, 0x20 |
jnc @f |
xor cl, cl |
@@: |
sub ch, 0x20 |
jnc @f |
xor ch, ch |
@@: |
rol ecx, 16 |
sub cl, 0x20 |
jnc @f |
xor cl, cl |
@@: |
rol ecx, 16 |
ret |
; display button border on press? |
bt ebx, 29 |
jc .exit |
|
;------------------------------------------------------------------------------ |
button._.incecx: ;///////////////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? <description> |
;------------------------------------------------------------------------------ |
add cl, 0x20 |
jnc @f |
or cl, -1 |
@@: |
add ch, 0x20 |
jnc @f |
or ch, -1 |
@@: |
rol ecx, 16 |
add cl, 0x20 |
jnc @f |
or cl, -1 |
@@: |
rol ecx, 16 |
ret |
|
;------------------------------------------------------------------------------ |
button._.incecx2: ;//////////////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? <description> |
;------------------------------------------------------------------------------ |
add cl, 0x14 |
jnc @f |
or cl, -1 |
@@: |
add ch, 0x14 |
jnc @f |
or ch, -1 |
@@: |
rol ecx, 16 |
add cl, 0x14 |
jnc @f |
or cl, -1 |
@@: |
rol ecx, 16 |
ret |
|
;------------------------------------------------------------------------------ |
button._.button_dececx: ;////////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? <description> |
;------------------------------------------------------------------------------ |
cmp [buttontype], 1 |
jne .finish |
|
push eax |
mov al, 1 |
cmp edi, 20 |
jg @f |
mov al, 2 |
|
@@: |
sub cl, al |
jnc @f |
xor cl, cl |
@@: |
sub ch, al |
jnc @f |
xor ch, ch |
@@: |
rol ecx, 16 |
sub cl, al |
jnc @f |
xor cl, cl |
@@: |
rol ecx, 16 |
|
pop eax |
|
.finish: |
ret |
|
;------------------------------------------------------------------------------ |
button._.negative_button: ;//////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? Invert system button border |
;------------------------------------------------------------------------------ |
; if requested, do not display button border on press. |
test ebx, 0x20000000 |
jnz .exit |
|
; invert system button border |
pushad |
|
xchg esi, eax |
|
mov esi, eax |
mov edi, ebx |
movzx ecx, [esi + SYS_BUTTON.pslot] |
shl ecx, 5 |
add ecx, window_data |
|
mov eax, dword[esi + SYS_BUTTON.left] |
mov ebx, dword[esi + SYS_BUTTON.top] |
add eax, [ecx + WDATA.box.left] |
add ebx, [ecx + WDATA.box.top] |
push eax ebx |
pop edx ecx |
mov ecx, eax |
mov edx, ebx |
bt edi, 30 |
jc @f |
inc ax |
inc bx |
dec cx |
dec dx |
@@: |
rol eax, 16 |
rol ebx, 16 |
add ax, cx |
add bx, dx |
|
mov esi, 0x01000000 |
mov esi, 1000000h |
call draw_rectangle.forced |
|
popad |
|
.exit: |
ret |
.popexit: |
pop edi esi edx ecx |
ret |
|
;--------------------------------------------------------------- |
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 |