kolibrios/programs/develop/libraries/box_lib/trunk/menubar.asm
Andrew Dent a7816e7613 Consistent use of KolibriOS name
- Ensure consistent naming for brand integrity.

git-svn-id: svn://kolibrios.org@10049 a494cfbc-eb01-0410-851d-a64ba20cac60
2024-05-22 10:10:18 +00:00

599 lines
13 KiB
NASM

;**************************************************************
; MenuBar Macro for KolibriOS
; Copyright (c) 2009, Marat Zakiyanov aka Mario79, aka Mario
; All rights reserved.
;
; Redistribution and use in source and binary forms, with or without
; modification, are permitted provided that the following conditions are met:
; * Redistributions of source code must retain the above copyright
; notice, this list of conditions and the following disclaimer.
; * Redistributions in binary form must reproduce the above copyright
; notice, this list of conditions and the following disclaimer in the
; documentation and/or other materials provided with the distribution.
; * Neither the name of the <organization> nor the
; names of its contributors may be used to endorse or promote products
; derived from this software without specific prior written permission.
;
; THIS SOFTWARE IS PROVIDED BY Marat Zakiyanov ''AS IS'' AND ANY
; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
; DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
;*****************************************************************************
macro menu_bar_exit
{
popa
ret 4
}
;*****************************************************************************
align 16
menu_bar:
m_type equ [edi]
m_size_x equ [edi+4]
m_start_x equ [edi+6]
m_size_y equ [edi+8]
m_start_y equ [edi+10]
m_text_pointer equ [edi+12]
m_pos_pointer equ [edi+16]
m_text_end equ [edi+20]
m_ret_key equ [edi+24]
m_mouse_keys equ [edi+28]
m_size_x1 equ [edi+32]
m_start_x1 equ [edi+34]
m_size_y1 equ [edi+36]
m_start_y1 equ [edi+38]
m_bckg_col equ [edi+40]
m_frnt_col equ [edi+44]
m_menu_col equ [edi+48]
m_select equ [edi+52]
m_out_select equ [edi+56]
m_buf_adress equ [edi+60]
m_procinfo equ [edi+64]
m_click equ [edi+68]
m_cursor equ [edi+72]
m_cursor_old equ [edi+76]
m_interval equ [edi+80]
m_cursor_max equ [edi+84]
m_extended_key equ [edi+88]
m_menu_sel_col equ [edi+92]
m_bckg_text_col equ [edi+96]
m_frnt_text_col equ [edi+100]
m_mouse_keys_old equ [edi+104]
m_font_height equ [edi+108]
m_cursor_out equ [edi+112]
m_get_mouse_flag equ [edi+116]
;*****************************************************************************
;*****************************************************************************
; draw event
;*****************************************************************************
;*****************************************************************************
.draw:
pusha
mov edi,dword [esp+36]
call .draw_1
menu_bar_exit
.draw_1:
call .calc_m_cursor_max
dec dword m_cursor_max
mov eax,m_cursor_max
imul eax,m_interval
mov m_size_y1,ax
mov ebx,m_size_x
mov ecx,m_size_y
cmp dword m_select,1
je .active
mov edx,m_bckg_col
jmp @f
.active:
mov edx,m_frnt_col
@@:
mcall SF_DRAW_RECT
shr ecx,16
mov bx,cx
movzx eax,word m_size_y
call .calculate_font_offset
cmp dword m_select,1
je .active_1
mov ecx,m_bckg_text_col
add ecx,0x80000000
jmp @f
.active_1:
mov ecx,m_frnt_text_col
add ecx,0x80000000
@@:
mov edx,m_text_pointer
mcall SF_DRAW_TEXT
ret
.draw_2:
mcall SF_DRAW_RECT,m_size_x1,m_size_y1,m_menu_col
ret
.calculate_font_offset:
sub eax,m_font_height
shr eax,1
add ebx,eax
add ebx,4 shl 16
ret
.draw_3:
mov ebx,m_size_x1
mov ecx,m_size_y1
push ebx ecx
mov eax,m_cursor_old
imul eax,m_interval
shl eax,16
add ecx,eax
mov cx,m_interval
mcall SF_DRAW_RECT,,,m_menu_col
pop ecx ebx
push ebx ecx
mov eax,m_cursor
imul eax,m_interval
shl eax,16
add ecx,eax
mov cx,m_interval
mov edx,m_menu_sel_col
mcall SF_DRAW_RECT
pop ecx ebx
shr ecx,16
mov bx,cx
mov eax,m_interval
call .calculate_font_offset
mov edx,m_pos_pointer
xor ebp,ebp
@@:
cmp ebp,m_cursor
jne .no_active_text
mov ecx,m_frnt_text_col
mov eax,m_menu_sel_col
jmp .active_text
.no_active_text:
mov ecx,m_bckg_text_col
mov eax,m_menu_col
.active_text:
add ecx,0xC0000000
push edi
mov edi,eax
mcall SF_DRAW_TEXT
pop edi
call .get_next_text
inc ebp
add ebx,m_interval
jmp @r
.draw_end:
ret
.calc_m_cursor_max:
mov edx,m_pos_pointer
mov m_cursor_max,dword 0
@@:
inc dword m_cursor_max
call .get_next_text
jmp @r
;*****************************************************************************
.get_next_text:
mov esi,edx
@@:
cmp esi,m_text_end
je .get_next_text_end
cld
lodsb
test al,al
jnz @r
mov edx,esi
ret
.get_next_text_end:
add esp,4
ret
;*****************************************************************************
;*****************************************************************************
; mouse event
;*****************************************************************************
;*****************************************************************************
.activate:
pusha
mov edi,dword [esp+36]
jmp .start_loop
.mouse:
pusha
mov edi,dword [esp+36]
call .processing_real_mouse
test eax,0x80000000
jnz .exit_menu
test eax,0x8000
jnz .exit_menu
mov ebx,eax
shr ebx,16 ; x position
shl eax,16
shr eax,16 ; y position
mov cx,m_start_x
cmp bx,cx
jb .exit_menu
add cx,m_size_x
dec cx
cmp bx,cx
ja .exit_menu
mov cx,m_start_y
cmp ax,cx
jb .exit_menu
add cx,m_size_y
cmp ax,cx
ja .exit_menu
test dword m_mouse_keys,1b
jnz @f
cmp dword m_select,1
je .exit_menu_1
mov dword m_select,1
call .draw_1
jmp .exit_menu_1
@@:
cmp dword m_get_mouse_flag,1
mov m_get_mouse_flag,dword 0
je @f
mov eax,m_mouse_keys
cmp eax,m_mouse_keys_old
je .exit_menu_1
@@:
cmp dword m_type,1
jne .start_loop
xor eax,eax
inc eax
mov m_cursor_out,eax
mov m_click,eax
menu_bar_exit
.start_loop:
mov m_select,dword 1
call .draw_1
call .allocate_menu_area
call .get_menu_area
call .draw_2
.red:
call .draw_3
.still:
mcall SF_WAIT_EVENT
cmp eax,1
je .exit_menu_3
cmp eax,2
je .key_menu
cmp eax,3
je .exit_menu_3
cmp eax,6
je .mouse_menu
jmp .still
.key_menu:
mcall SF_GET_KEY
cmp dword m_extended_key,1
je .extended_key
test al,al
jnz .key_menu_end
cmp ah, 0xE0
jne @f
mov m_extended_key,dword 1
.key_menu_end:
jmp .still
@@:
cmp ah,72 ;Arrow Up
je .menu_key_72_1
cmp ah,80 ; Arrow Down
je .menu_key_80_1
cmp ah,28 ; Enter
je .menu_key_28_1
cmp ah,1 ; Esc
je .menu_key_1_1
cmp ah,75 ; L-Arrow down
je .menu_key_75_1
cmp ah,77 ; R-Arrow down
je .menu_key_77_1
.key_menu_end_1:
cmp ah,208 ; Arrow Down
je .key_menu_end
cmp ah,200 ; Arrow Up
je .key_menu_end
cmp ah,156 ; Enter
je .key_menu_end
cmp ah,129 ; Esc
je .key_menu_end
cmp ah,199 ;Home
je .key_menu_end
cmp ah,207 ;End
je .key_menu_end
cmp ah,201 ;Page UP
je .key_menu_end
cmp ah,209 ;Page Down
je .key_menu_end
cmp ah,42 ; NumLock ON
je .key_menu_end
cmp ah,170 ; NumLock ON
je .key_menu_end
cmp ah,210 ; Insert
je .key_menu_end
cmp ah,211 ; Delete
je .key_menu_end
cmp ah,157 ; Ctrl up
je .key_menu_end
cmp ah,184 ; Alt up
je .key_menu_end
cmp ah,170 ; L-Shift up
je .key_menu_end
cmp ah,182 ; R-Shift up
je .key_menu_end
cmp ah,203 ; L-Arrow up
je .key_menu_end
cmp ah,205 ; R-Arrow up
je .key_menu_end
jmp .exit_menu_3
;---------------------------------------------------------------------
.extended_key:
mov m_extended_key, dword 0
.menu_key_80:
cmp ah,80 ; arrow down
jne .menu_key_72
.menu_key_80_1:
mov eax,m_cursor_max
dec eax
cmp eax,m_cursor
je .still ;@f
mov ebx,m_cursor
mov m_cursor_old,ebx
inc dword m_cursor
;@@:
jmp .red
;---------------------------------------------------------------------
.menu_key_72:
cmp ah,72 ;arrow up
jne .menu_key_71
.menu_key_72_1:
cmp m_cursor,dword 0
je .still ;@f
mov ebx,m_cursor
mov m_cursor_old,ebx
dec dword m_cursor
;@@:
jmp .red
;---------------------------------------------------------------------
.menu_key_71:
cmp ah,71 ;Home
je @f
cmp ah,73 ;PageUp
jne .menu_key_79
@@:
cmp dword m_cursor,0
je .still
mov ebx,m_cursor
mov m_cursor_old,ebx
mov m_cursor,dword 0
jmp .red
;---------------------------------------------------------------------
.menu_key_79:
cmp ah,79 ; End
je @f
cmp ah,81 ; PageDown
jne .menu_key_1
@@:
mov ecx,m_cursor_max
dec ecx
cmp m_cursor,ecx
je .still
mov ebx,m_cursor
mov m_cursor_old,ebx
mov m_cursor,ecx
jmp .red
;---------------------------------------------------------------------
.menu_key_1:
cmp ah,1 ; Esc
jne .menu_key_28
.menu_key_1_1:
jmp .exit_menu_3
;---------------------------------------------------------------------
.menu_key_28:
cmp ah,28 ; Enter
jne .menu_key_75
.menu_key_28_1:
xor eax,eax
mov m_mouse_keys_old,eax
inc eax
mov m_mouse_keys,eax
jmp .exit_menu_2
;---------------------------------------------------------------------
.menu_key_75:
cmp ah,75 ; L-Arrow down
jne .menu_key_77
.menu_key_75_1:
mov m_ret_key,dword 1
jmp .exit_menu_3
;---------------------------------------------------------------------
.menu_key_77:
cmp ah,77 ; R-Arrow down
jne .key_menu_end_1
.menu_key_77_1:
mov m_ret_key,dword 2
jmp .exit_menu_3
;---------------------------------------------------------------------
.processing_real_mouse:
mcall SF_MOUSE_GET,SSF_BUTTON
mov ebx,m_mouse_keys
mov m_mouse_keys_old,ebx
mov m_mouse_keys,eax
mcall SF_MOUSE_GET,SSF_WINDOW_POSITION
ret
;---------------------------------------------------------------------
.allocate_menu_area:
call .free_menu_area
movzx ecx,word m_size_x1
movzx eax,word m_size_y1
imul ecx,eax
lea ecx,[ecx*3]
mcall SF_SYS_MISC,SSF_MEM_ALLOC
mov m_buf_adress,eax
ret
;---------------------------------------------------------------------
.free_menu_area:
cmp dword m_buf_adress,0
je @f
mcall SF_SYS_MISC,SSF_MEM_FREE,m_buf_adress
xor eax,eax
mov m_buf_adress,eax
@@:
ret
;---------------------------------------------------------------------
.get_menu_area:
mcall SF_THREAD_INFO, m_procinfo,-1
mov cx,m_size_x1
shl ecx,16
mov cx,m_size_y1
mov dx,m_start_x1
mov eax,m_procinfo
add dx,[eax+34]
add dx,[eax+54]
shl edx,16
mov dx,m_start_y1
add dx,[eax+38]
add dx,[eax+58]
mcall SF_GET_IMAGE, m_buf_adress
ret
;---------------------------------------------------------------------
.put_menu_area:
mov cx,m_size_x1
shl ecx,16
mov cx,m_size_y1
mov dx,m_start_x1
shl edx,16
mov dx,m_start_y1
mcall SF_PUT_IMAGE, m_buf_adress
call .free_menu_area
ret
;---------------------------------------------------------------------
.mouse_menu:
call .processing_real_mouse
test eax,0x80000000
jnz .still
test eax,0x8000
jnz .still
mov ebx,eax
shr ebx,16
shl eax,16
shr eax,16
xor ecx,ecx
mov cx,m_start_y1
cmp ax,cx
jbe .close
add cx,m_size_y1
cmp ax,cx
jae .close
mov cx,m_start_x1
cmp bx,cx
jbe .close
add cx,m_size_x1
cmp bx,cx
jae .close
sub ax,m_start_y1
mov ebx,m_interval
xor edx,edx
div ebx
mov ebx,m_cursor
cmp eax,ebx
je .no_red
mov m_cursor_old,ebx
cmp eax,m_cursor_max
jb @f
mov eax,m_cursor_max
@@:
mov m_cursor,eax
test m_mouse_keys,dword 1b
jz .red
jmp .exit_menu_2
.no_red:
test m_mouse_keys,dword 1b
jz .still
jmp .exit_menu_2
.close:
test m_mouse_keys,dword 1b
jz .still
jmp .exit_menu_3
.exit_menu:
cmp dword m_select,0
je .exit_menu_1
mov m_select,dword 0
call .draw_1
test m_mouse_keys,dword 1b
jz .exit_menu_1
.exit_menu_3:
mov m_select,dword 0
call .put_menu_area
xor eax,eax
mov m_cursor_out,eax
jmp .exit
.exit_menu_2:
mov m_select,dword 0
call .put_menu_area
mov edx,m_pos_pointer
mov ebx,m_cursor
@@:
cmp ebx,0
jz @f
dec ebx
call .get_next_text
jmp @r
@@:
mov m_out_select,edx
mov eax,m_cursor
inc eax
mov m_cursor_out,eax
mov eax,m_mouse_keys
cmp eax,m_mouse_keys_old
jne .exit
xor eax,eax
mov m_cursor_out,eax
.exit:
call .draw_1
mov m_click,dword 1
jmp @f
.exit_menu_1:
mov m_click,dword 0
@@:
menu_bar_exit