forked from KolibriOS/kolibrios
0bcb04f0e3
'msgbox' change select button use [Tab] key git-svn-id: svn://kolibrios.org@4988 a494cfbc-eb01-0410-851d-a64ba20cac60
427 lines
7.7 KiB
NASM
427 lines
7.7 KiB
NASM
format MS COFF
|
||
public EXPORTS
|
||
section '.flat' code readable align 16
|
||
|
||
include '../../../macros.inc'
|
||
purge mov
|
||
include 'strlen.inc'
|
||
|
||
MB_FIRST_BUT_ID equ 3 ;¨¤¥â¨ä¨ª â®à 1-© ª®¯ª¨ á®®¡é¥¨¨
|
||
MB_MAX_BUT equ 8 ;¬ ªá¨¬ «ì®¥ ç¨á«® ª®¯®ª ¢ á®®¡é¥¨¨
|
||
MB_BUT_HEIGHT equ 20 ;¢ëá®â ª®¯ª¨ á®®¡é¥¨¨
|
||
CHAR_WIDTH equ 6 ;è¨à¨ 1-© ¡ãª¢ë ⥪áâ
|
||
MB_BUT_OTY_1 equ 5 ;¢ëà⨪ «ìë©(¥) ®âáâã¯(ë) ¬¥¦¤ã: § £®«®¢ª®¬ ®ª ¨ ⥪á⮬, ⥪á⮬ ª®¯ª ¬¨
|
||
;--- ®âáâã¯ë ª®¯ª å, 㪠§ ë¥ ¢®¯à®á ¬¨: <-?->, ¡¥§ ãç¥â ⥪áâ ---
|
||
MB_BUT_OTX_1 equ 5 ;[<-?->Caption.....]
|
||
MB_BUT_OTX_2 equ 10 ;[<-?->Caption<-?->]
|
||
MB_BUT_OTX_3 equ 15 ;[<-?->Caption<-?->]<-?->
|
||
MB_TEXT_OFFSET equ 2 ;ᬥ饨¥, ¯® ª®â®à®¬ã ç¨ ¥âìáï ⥪áâ § £®«®¢ª ®ª
|
||
|
||
align 4
|
||
start:
|
||
mov eax,48
|
||
mov ebx,3
|
||
mov ecx,sc
|
||
mov edx,sizeof.system_colors
|
||
mcall
|
||
mov eax,40
|
||
mov ebx,0x27
|
||
mcall
|
||
|
||
;-- clear id pressed button ---
|
||
mov ebx,[mb_text]
|
||
mov al,byte[ebx]
|
||
add al,MB_FIRST_BUT_ID
|
||
dec al
|
||
mov byte[mb_key_foc],al
|
||
|
||
push [mb_text]
|
||
call MsgBoxReInit
|
||
|
||
align 4
|
||
red_win:
|
||
mov eax,12
|
||
mov ebx,1
|
||
mcall
|
||
|
||
xor eax,eax
|
||
mov bx,word[mb_left]
|
||
shl ebx,16
|
||
mov bx,word[mb_width]
|
||
mov cx,word[mb_top]
|
||
shl ecx,16
|
||
mov cx,word[mb_height]
|
||
mov edx,[sc.work]
|
||
or edx,0x33000000
|
||
mov edi,[mb_text]
|
||
add edi,MB_TEXT_OFFSET ;Caption
|
||
mcall
|
||
|
||
mcall 9,mb_procinfo,-1
|
||
mov eax,dword[mb_procinfo.client_box.width]
|
||
|
||
sub eax,[but_width]
|
||
shr eax,1
|
||
add eax,MB_BUT_OTX_1
|
||
mov [ot_left],eax
|
||
|
||
mov eax,4 ;à¨á®¢ ¨¥ ⥪áâ
|
||
mov bx,MB_BUT_OTX_1
|
||
shl ebx,16
|
||
mov bx,MB_BUT_OTY_1
|
||
mov ecx,[sc.work_text]
|
||
mov edx,[txtMsg]
|
||
|
||
@@:
|
||
mov esi,edx
|
||
call strlen
|
||
call linlen
|
||
|
||
cmp eax,0
|
||
je @f
|
||
|
||
mov esi,eax
|
||
push eax
|
||
mov eax,4
|
||
int 0x40
|
||
pop eax
|
||
|
||
add edx,eax
|
||
cmp byte[edx],0
|
||
je @f
|
||
inc edx
|
||
|
||
add ebx,10 ; move <--y-->
|
||
jmp @b
|
||
@@:
|
||
|
||
call MsgBoxDrawAllBut
|
||
mcall 12,2
|
||
|
||
align 4
|
||
still:
|
||
mov eax,10
|
||
mcall
|
||
|
||
cmp al,1 ;¨§¬. ¯®«®¦¥¨¥ ®ª
|
||
jz red_win
|
||
cmp al,2
|
||
jz key
|
||
cmp al,3
|
||
jz button
|
||
|
||
jmp still
|
||
|
||
align 4
|
||
key:
|
||
mcall 2
|
||
cmp ah,13
|
||
jne @f
|
||
mov ah,[mb_key_foc]
|
||
jmp close
|
||
@@:
|
||
|
||
cmp ah,176 ;Left
|
||
jne .no_left
|
||
cmp [mb_key_foc],MB_FIRST_BUT_ID
|
||
jg @f
|
||
mov al,[mb_key_max]
|
||
add [mb_key_foc],al
|
||
@@:
|
||
dec [mb_key_foc]
|
||
call MsgBoxDrawAllBut
|
||
.no_left:
|
||
|
||
cmp ah,9 ;Tab
|
||
je @f
|
||
cmp ah,179 ;Right
|
||
je @f
|
||
jmp .no_right
|
||
@@:
|
||
mov al,[mb_key_max]
|
||
add al,MB_FIRST_BUT_ID
|
||
cmp [mb_key_foc],al
|
||
je .no_right
|
||
inc [mb_key_foc]
|
||
cmp [mb_key_foc],al
|
||
jl @f
|
||
mov [mb_key_foc],MB_FIRST_BUT_ID
|
||
@@:
|
||
call MsgBoxDrawAllBut
|
||
.no_right:
|
||
|
||
jmp still
|
||
|
||
align 4
|
||
button:
|
||
mcall 17 ;¯®«ãç¨âì ª®¤ ¦ ⮩ ª®¯ª¨
|
||
cmp ah,MB_FIRST_BUT_ID
|
||
jge close
|
||
cmp ah,1
|
||
jne still
|
||
|
||
;.exit:
|
||
mov ah,MB_FIRST_BUT_ID
|
||
dec ah
|
||
close:
|
||
sub ah,MB_FIRST_BUT_ID
|
||
inc ah
|
||
mov ebx,[mb_text]
|
||
mov byte[ebx],ah
|
||
|
||
;*** call msgbox functions ***
|
||
cmp ah,0
|
||
je @f
|
||
cmp dword[mb_funct],0
|
||
je @f
|
||
xor ebx,ebx
|
||
mov bl,ah
|
||
dec bl
|
||
shl bx,2 ;bx=bx*4
|
||
add ebx,dword[mb_funct]
|
||
cmp dword[ebx],0
|
||
je @f
|
||
call dword[ebx]
|
||
@@:
|
||
mcall -1 ;¢ë室 ¨§ ¯à®£à ¬¬ë
|
||
|
||
align 4
|
||
MsgBoxDrawAllBut:
|
||
mov ebx,[ot_left]
|
||
shl ebx,16
|
||
mov bx,word[ot_top]
|
||
add bx,MB_BUT_OTY_1
|
||
|
||
; Buttons ...
|
||
push edi
|
||
mov edi,txtBut
|
||
mov edx,[edi]
|
||
|
||
mov ecx,MB_FIRST_BUT_ID
|
||
@@:
|
||
;eax = len button caption text
|
||
mov esi,edx
|
||
call strlen
|
||
|
||
cmp eax,0
|
||
je @f
|
||
|
||
call MsgBoxDrawButton
|
||
inc ecx
|
||
|
||
add edi,4
|
||
cmp edi,endBut
|
||
jge @f
|
||
mov edx,[edi]
|
||
|
||
push bx
|
||
ror ebx,16
|
||
imul esi,CHAR_WIDTH
|
||
add esi,MB_BUT_OTX_3
|
||
add ebx,esi ; ...
|
||
ror ebx,16
|
||
pop bx
|
||
|
||
jmp @b
|
||
@@:
|
||
pop edi
|
||
ret
|
||
|
||
;input:
|
||
; ecx = button id
|
||
align 4
|
||
MsgBoxDrawButton:
|
||
push ecx
|
||
|
||
;button
|
||
push eax ebx edx
|
||
mov edx,ecx
|
||
imul eax,CHAR_WIDTH
|
||
add eax,MB_BUT_OTX_2
|
||
|
||
mov esi,[sc.work_button]
|
||
cmp cl,[mb_key_foc]
|
||
jne @f
|
||
mov esi,[sc.work_button_text]
|
||
@@:
|
||
|
||
mov cx,bx
|
||
sub cx,MB_BUT_OTY_1
|
||
shl ecx,16
|
||
mov cx,MB_BUT_HEIGHT
|
||
ror ebx,16
|
||
sub bx,MB_BUT_OTX_1
|
||
ror ebx,16
|
||
mov bx,ax
|
||
|
||
mov eax,8
|
||
int 0x40
|
||
pop edx ebx eax
|
||
|
||
;caption
|
||
mov ecx,[sc.work_button_text]
|
||
cmp esi,ecx
|
||
jne @f
|
||
mov ecx,[sc.work_button]
|
||
@@:
|
||
mov esi,eax
|
||
mov eax,4
|
||
int 0x40
|
||
|
||
pop ecx
|
||
ret
|
||
|
||
align 4
|
||
MsgBoxReInit:
|
||
push ebp
|
||
mov ebp,esp
|
||
m2m dword[mb_text],dword[ebp+8]
|
||
push eax ebx ecx edi esi
|
||
|
||
mov esi,[mb_text]
|
||
add esi,MB_TEXT_OFFSET
|
||
call strlen
|
||
inc esi ;add terminated zero
|
||
add esi,eax ;add len of caption
|
||
mov [txtMsg],esi
|
||
|
||
;--- go to first button text --- buttons 1...MB_MAX_BUT
|
||
mov ebx,txtBut
|
||
mov cx,MB_MAX_BUT
|
||
@@:
|
||
call strlen
|
||
add esi,eax ;add len of caption
|
||
inc esi ;add terminated zero
|
||
|
||
mov dword[ebx],esi
|
||
cmp byte[esi],0
|
||
je @f
|
||
add ebx,4
|
||
loop @b
|
||
@@:
|
||
|
||
;--- calc button top ---
|
||
mov eax,1
|
||
mov ebx,[txtMsg]
|
||
@@:
|
||
inc ebx
|
||
cmp byte[ebx],0
|
||
je @f
|
||
cmp byte[ebx],13
|
||
jne @b
|
||
inc eax
|
||
jmp @b
|
||
@@:
|
||
imul eax,10
|
||
add eax,2*MB_BUT_OTY_1
|
||
mov [ot_top],eax
|
||
|
||
;--- calc window height ---
|
||
add eax,MB_BUT_OTY_1
|
||
add eax,MB_BUT_HEIGHT
|
||
add ax,5 ;height of border
|
||
mov [mb_height],ax
|
||
mcall 48,4 ;skin height
|
||
add [mb_height],ax
|
||
|
||
;--- calc window top ---
|
||
mov eax,14
|
||
int 0x40
|
||
mov word[mb_top],ax
|
||
mov ax,word[mb_height]
|
||
sub word[mb_top],ax
|
||
shr word[mb_top],1
|
||
;---
|
||
shr eax,16
|
||
mov word[mb_left],ax
|
||
mov ax,word[mb_width]
|
||
sub word[mb_left],ax
|
||
shr word[mb_left],1
|
||
|
||
;--- calc button width ---
|
||
xor ebx,ebx
|
||
xor ecx,ecx
|
||
mov esi,[txtBut]
|
||
mov byte[mb_key_max],0
|
||
@@:
|
||
cmp byte[esi],0
|
||
je @f
|
||
inc ecx
|
||
call strlen
|
||
add esi,eax
|
||
inc esi
|
||
inc byte[mb_key_max]
|
||
add ebx,eax
|
||
jmp @b
|
||
@@:
|
||
|
||
imul ebx,CHAR_WIDTH
|
||
imul ecx,MB_BUT_OTX_3
|
||
add ebx,ecx
|
||
add ebx,MB_BUT_OTX_2
|
||
sub ebx,MB_BUT_OTX_3
|
||
mov [but_width],ebx
|
||
|
||
pop esi edi ecx ebx eax
|
||
pop ebp
|
||
ret 4
|
||
|
||
;input:
|
||
; [esp+8] = pointer to msgbox text
|
||
align 4
|
||
MsgBoxCreate:
|
||
push ebp
|
||
mov ebp,esp
|
||
m2m dword[mb_text],dword[ebp+8]
|
||
push eax ebx ecx edx
|
||
|
||
mov eax,51
|
||
mov ebx,1
|
||
mov ecx,start
|
||
mov edx,dword[ebp+12];thread
|
||
int 0x40
|
||
|
||
mov dword[mb_funct],0
|
||
pop edx ecx ebx eax
|
||
pop ebp
|
||
ret 8
|
||
|
||
;input:
|
||
; [esp+8] = pointer to msgbox functions pointers
|
||
align 4
|
||
MsgBoxSetFunctions:
|
||
push ebp
|
||
mov ebp,esp
|
||
m2m dword[mb_funct],dword[ebp+8]
|
||
pop ebp
|
||
ret 4
|
||
|
||
;--- data ---
|
||
txtMsg dd 0 ;㪠§ ⥫ì ç «® ⥪áâ á®®¡é¥¨ï
|
||
txtBut rd MB_MAX_BUT ;㪠§ ⥫ì ç «® ⥪áâ ¯®¤¯¨á¥© ª®¯®ª
|
||
endBut:
|
||
ot_left dd 0 ;®âáâ㯠᫥¢ (¤«ï à¨á®¢ ¨ï ª®¯®ª)
|
||
ot_top dd 0 ;®âáâ㯠ᢥàåã (¤«ï à¨á®¢ ¨ï ª®¯®ª)
|
||
but_width dd 0 ;è¨à¨ ¢á¥å ª®¯®ª + § §®àë ¬¥¦¤ã ¨¬¨
|
||
;--- à §¬¥àë íªà ¥ ®ª á®®¡é¥¨ï ---
|
||
mb_left dw 0
|
||
mb_width dw 300
|
||
mb_top dw 0
|
||
mb_height dw 50
|
||
mb_key_foc db MB_FIRST_BUT_ID ;ª®¯ª ¢ 䮪ãᥠ(á ãç¥â®¬ MB_FIRST_BUT_ID)
|
||
mb_key_max db 1 ;ç¨á«® ¢á¥å ª®¯®ª á®®¡é¥¨ï
|
||
;--------------------------------------------------
|
||
sc system_colors
|
||
mb_procinfo process_information ;㪠§ ⥫ì áâàãªâãàã process_information த¨â¥«ì᪮£® ®ª
|
||
mb_text dd 0 ;msgbox_1 ;㪠§ â¥«ì ¤ ë¥ ¤«ï á®®¡é¥¨ï (ª®â®àë ¯¥à¥¤ îâìáï ®ªã)
|
||
mb_funct dd 0 ;pointer to functions
|
||
;--------------------------------------------------
|
||
align 16
|
||
EXPORTS:
|
||
dd sz_mb_create, MsgBoxCreate
|
||
dd sz_mb_reinit, MsgBoxReInit
|
||
dd sz_mb_setfunctions, MsgBoxSetFunctions
|
||
dd 0,0
|
||
sz_mb_create db 'mb_create',0
|
||
sz_mb_reinit db 'mb_reinit',0
|
||
sz_mb_setfunctions db 'mb_setfunctions',0 |