forked from KolibriOS/kolibrios
039660a246
git-svn-id: svn://kolibrios.org@710 a494cfbc-eb01-0410-851d-a64ba20cac60
535 lines
13 KiB
PHP
535 lines
13 KiB
PHP
;****************************************************************
|
|
;***************Elements of menegment for Controls***************
|
|
;****************************************************************
|
|
|
|
;**********************************************************
|
|
;********************craete control*************************
|
|
;**********************************************************
|
|
|
|
;IN
|
|
;eax - ctructure's size
|
|
;ebx - Parend(pointer to structure for parend)
|
|
;OUT
|
|
;eax - pointer to new control
|
|
|
|
craete_control:
|
|
|
|
test eax,eax
|
|
jnz no_null_size
|
|
|
|
mov eax,1
|
|
no_null_size:
|
|
|
|
call malloc
|
|
mov [ReturnControl],eax
|
|
|
|
push ebx ;parend
|
|
push eax ;control
|
|
call AddObject
|
|
|
|
mov eax,[ReturnControl]
|
|
|
|
;information about craete control output to debug board
|
|
call new_line
|
|
mov [s_p],s_craete
|
|
call print_string
|
|
debug_print_dec [ReturnControl]
|
|
mov [s_p],s_parend
|
|
call print_string
|
|
debug_print_dec dword[eax+20]
|
|
mov [s_p],s_last
|
|
call print_string
|
|
debug_print_dec dword[eax+4]
|
|
;--------------------------------
|
|
|
|
ret
|
|
|
|
AddObject:
|
|
|
|
mov ecx,[esp+4] ;control
|
|
mov edx,[esp+8] ;parend
|
|
|
|
mov eax,[edx+12] ;eax=parend->child_fd
|
|
test eax,eax
|
|
jnz else_parend_add_object
|
|
|
|
add [ControlID],1
|
|
mov esi,[ControlID]
|
|
|
|
mov [edx+12],ecx ;Parend->child_fd=control
|
|
mov [edx+16],ecx ;Parend->child_bk=control
|
|
|
|
mov [ecx+20],edx ;control->parend=Parend
|
|
mov [ecx+4],edx ;control->ctrl_fd=Parend
|
|
mov [ecx+40],esi ;control->ctrl_ID=ID
|
|
|
|
jmp exit_if_parend_add_object
|
|
else_parend_add_object:
|
|
|
|
add [ControlID],1
|
|
mov esi,[ControlID]
|
|
|
|
mov edi,[edx+16] ;last_control=Parend->child_bk
|
|
mov [edx+16],ecx ;Parend->child_bk=control
|
|
|
|
mov [edi+8],ecx ;last_control->ctrl_bk=control
|
|
mov [ecx+4],edi ;control->ctrl_fd=last_control;
|
|
mov [ecx+20],edx ;control->parend=Parend;
|
|
mov [ecx+40],esi ;control->ctrl_ID=ID
|
|
|
|
exit_if_parend_add_object:
|
|
|
|
ret 8
|
|
|
|
|
|
;************************************************************
|
|
;***********************Destroy control**********************
|
|
;************************************************************
|
|
|
|
;Delete Control.
|
|
;IN
|
|
;pointer to control for delete
|
|
;OUT
|
|
;not returned value
|
|
align 4
|
|
|
|
destroy_control:
|
|
|
|
push eax
|
|
push ebx
|
|
push ecx
|
|
push edx
|
|
push esi
|
|
push edi
|
|
push ebp
|
|
|
|
mov eax,[esp+28+4]
|
|
|
|
mov ebx,[eax+20] ;get parend for control
|
|
|
|
;checking pointer of control to 0
|
|
test eax,eax
|
|
jz exit_destroy_control
|
|
|
|
;checking parend to main parend(parend of window)
|
|
;if parend equ main parend than exit
|
|
test ebx,ebx
|
|
jz exit_destroy_control
|
|
|
|
mov ecx,[ebx+12] ;Parend->child_fd
|
|
test ecx,ecx
|
|
jz exit_destroy_control
|
|
|
|
mov ecx,[ebx+12] ;Parend->child_fd
|
|
mov edx,[ebx+16] ;Parend->child_bk
|
|
|
|
cmp ecx,edx
|
|
jne no_if_parend_child_fd_child_bk
|
|
|
|
cmp ecx,eax
|
|
jne no_if_parend_child_fd_control
|
|
|
|
mov [ebx+12],dword 0 ;Parend->child_fd=0
|
|
mov [ebx+16],dword 0 ;Parend->child_bk=0
|
|
|
|
;send message to control for deleting
|
|
push eax
|
|
|
|
mov [Message],dword -1
|
|
mov ebx,[eax] ;load .... for control
|
|
push Message
|
|
push eax
|
|
call ebx
|
|
|
|
pop eax
|
|
|
|
push eax
|
|
call free
|
|
pop eax
|
|
|
|
call new_line
|
|
mov [s_p],s_destroy
|
|
call print_string
|
|
debug_print_dec eax
|
|
mov [s_p],s_1
|
|
call print_string
|
|
|
|
jmp exit_destroy_control
|
|
no_if_parend_child_fd_control:
|
|
|
|
no_if_parend_child_fd_child_bk:
|
|
;----------------------------------------------
|
|
mov esi,ecx ;seek_control=Parend->child_fd
|
|
|
|
while_seek_control:
|
|
cmp esi,0
|
|
je exit_destroy_control
|
|
;*******************************************************************
|
|
cmp esi,eax
|
|
jne no_if_seek_control_control
|
|
;***************************************************************
|
|
mov edi,[esi+8]
|
|
test edi,edi
|
|
jz no_if_seek_control_ctrl_bk
|
|
;***********************************************************
|
|
mov ecx,[esi+4]
|
|
mov edx,[esi+8]
|
|
mov [edx+4],ecx
|
|
|
|
cmp ecx,ebx
|
|
je no_if_last_control_parend
|
|
;*******************************************************
|
|
mov [ecx+8],edx
|
|
jmp else_seek_control_ctrl_bk
|
|
;*******************************************************
|
|
no_if_last_control_parend:
|
|
|
|
mov [ebx+12],edx
|
|
|
|
jmp else_seek_control_ctrl_bk
|
|
;*********************************************************
|
|
no_if_seek_control_ctrl_bk:
|
|
;**********************************************************
|
|
|
|
mov ecx,[esi+4] ;last_control=seek_control->ctrl_fd
|
|
mov [ecx+8],dword 0 ;last_control->ctrl_bk=0
|
|
mov [ebx+16],ecx ;Parend->child_bk=last_control
|
|
|
|
else_seek_control_ctrl_bk:
|
|
;**********************************************************
|
|
|
|
;send message to control for deleting
|
|
push eax
|
|
|
|
mov [Message],dword -1
|
|
mov ebx,[eax] ;load .... for control
|
|
push Message
|
|
push eax
|
|
call ebx
|
|
|
|
pop eax
|
|
|
|
push eax
|
|
call free
|
|
pop eax
|
|
|
|
call new_line
|
|
mov [s_p],s_destroy
|
|
call print_string
|
|
debug_print_dec eax
|
|
mov [s_p],s_2
|
|
call print_string
|
|
|
|
jmp exit_destroy_control
|
|
|
|
no_if_seek_control_control:
|
|
;****************************************************************
|
|
|
|
mov edi,[esi+8] ;exchange_control=seek_control->ctrl_bk
|
|
mov esi,edi ;seek_control=exchange_control
|
|
|
|
jmp while_seek_control
|
|
;*******************************************************************
|
|
exit_destroy_control:
|
|
|
|
pop ebp
|
|
pop edi
|
|
pop esi
|
|
pop edx
|
|
pop ecx
|
|
pop ebx
|
|
pop eax
|
|
|
|
ret 4
|
|
|
|
;***********************************************************
|
|
;*****************Send message to Control*******************
|
|
;***********************************************************
|
|
|
|
;IN
|
|
;pointer to message
|
|
;pointer to parend(structure)
|
|
;OUT
|
|
;not returned value
|
|
align 4
|
|
|
|
send_message:
|
|
|
|
push eax
|
|
push ebx
|
|
push ecx
|
|
push edx
|
|
push esi
|
|
push edi
|
|
push ebp
|
|
|
|
;get pointer to parend
|
|
mov eax,[esp+28+4]
|
|
mov [Parend],eax
|
|
|
|
;get message
|
|
mov esi,[esp+28+8]
|
|
mov edi,dword Message
|
|
mov ecx,4
|
|
rep movsd
|
|
|
|
;load event type
|
|
mov eax,[Message]
|
|
|
|
|
|
;check for event type and get parameters for Control
|
|
dec eax
|
|
jnz no_window_redraw
|
|
|
|
mov ebx,[Parend]
|
|
mov esi,[ebx+12] ;get pointer to first child control of parend
|
|
mov ebx,esi
|
|
|
|
send_message_for_redraw_to_next_control:
|
|
|
|
;if esi=0 than exit
|
|
test esi,esi
|
|
jz exit_check_event_type
|
|
|
|
push ebx
|
|
push esi
|
|
|
|
mov eax,ebx
|
|
mov ebx,[eax] ;load .... for control
|
|
push Message
|
|
push eax
|
|
call ebx
|
|
|
|
pop esi
|
|
pop ebx
|
|
|
|
mov esi,[ebx+8]
|
|
mov ebx,esi
|
|
|
|
jmp send_message_for_redraw_to_next_control
|
|
|
|
no_window_redraw:
|
|
|
|
dec eax
|
|
jnz no_keys
|
|
|
|
|
|
;if have active control than send message
|
|
;checking for active control
|
|
mov ebx,[ActiveControlForKeys]
|
|
test ebx,ebx
|
|
jz exit_check_event_type
|
|
|
|
mov eax,[ActiveControlForKeys]
|
|
mov ebx,[eax] ;load proc for control
|
|
push Message
|
|
push eax
|
|
call ebx
|
|
|
|
jmp exit_check_event_type
|
|
no_keys:
|
|
|
|
dec eax
|
|
jnz no_special_system_message
|
|
|
|
mov ebx,[Parend];
|
|
mov esi,[ebx+12]
|
|
mov ebx,esi
|
|
|
|
send_special_message_to_next_control:
|
|
|
|
;if esi=0 than exit
|
|
test esi,esi
|
|
jz exit_check_event_type
|
|
|
|
push ebx
|
|
push esi
|
|
|
|
mov eax,ebx
|
|
mov ebx,[eax] ;load .... for control
|
|
push Message
|
|
push eax
|
|
call ebx
|
|
|
|
pop esi
|
|
pop ebx
|
|
|
|
mov esi,[ebx+8]
|
|
mov ebx,esi
|
|
|
|
jmp send_special_message_to_next_control
|
|
|
|
no_special_system_message:
|
|
|
|
;*************************************************
|
|
;****************Mouse send message***************
|
|
;*************************************************
|
|
|
|
cmp eax,3
|
|
jne no_mouse
|
|
|
|
;check childrens of parend for crossing
|
|
mov ebx,[Parend]
|
|
mov esi,[ebx+12] ;esi =first child control
|
|
mov ebx,esi ;ebx =first child control
|
|
|
|
mov eax,[Message+12]
|
|
and eax,1b
|
|
test eax,eax
|
|
jz left_button_of_mouse_not_pressed
|
|
|
|
mov eax,[ActiveControl]
|
|
test eax,eax
|
|
jz havent_active_control
|
|
|
|
mov eax,[ActiveControl]
|
|
mov ebx,[eax] ;load proc for control
|
|
push Message
|
|
push eax
|
|
call ebx
|
|
|
|
jmp exit_check_event_type
|
|
havent_active_control:
|
|
|
|
jmp exit_if_left_button_of_mouse__pressed
|
|
left_button_of_mouse_not_pressed:
|
|
|
|
mov eax,[ActiveControl]
|
|
test eax,eax
|
|
jz havent_active_control_
|
|
|
|
mov [ActiveControl],dword 0
|
|
|
|
havent_active_control_:
|
|
|
|
exit_if_left_button_of_mouse__pressed:
|
|
|
|
|
|
next_conrol_check_for_crossing_with_mouse:
|
|
|
|
test esi,esi
|
|
jz exit_next_conrol_check_for_crossing_with_mouse
|
|
|
|
mov [PointerToControl],ebx
|
|
|
|
|
|
push ebx
|
|
push esi
|
|
|
|
mov eax,[ebx+28] ;eax = y coordinat of control
|
|
mov [y_ctl],eax
|
|
mov eax,[ebx+24] ;eax = x coordinat of control
|
|
|
|
mov ecx,[ebx+32] ;ecx = size x of control
|
|
mov edx,[ebx+36] ;edx = size y of control
|
|
mov esi,[Message+4] ;mouse x
|
|
mov edi,[Message+8] ;mouse y
|
|
mov ebx,[y_ctl]
|
|
|
|
call CheckCrossingBox
|
|
|
|
cmp eax,0xffffff
|
|
jne no_activate_control
|
|
|
|
mov eax,[Message+12]
|
|
and eax,1b
|
|
test eax,eax
|
|
jz no_activate_control
|
|
|
|
mov eax,[PointerToControl]
|
|
mov [ActiveControl],eax
|
|
mov [ActiveControlForKeys],eax
|
|
|
|
no_activate_control:
|
|
|
|
mov eax,[PointerToControl]
|
|
mov ebx,[eax] ;load proc for control
|
|
push Message
|
|
push eax
|
|
call ebx
|
|
|
|
pop esi
|
|
pop ebx
|
|
|
|
mov esi,[ebx+8] ;16 but not 8
|
|
mov ebx,esi
|
|
|
|
jmp next_conrol_check_for_crossing_with_mouse
|
|
|
|
exit_next_conrol_check_for_crossing_with_mouse:
|
|
|
|
no_mouse:
|
|
|
|
exit_check_event_type:
|
|
|
|
pop ebp
|
|
pop edi
|
|
pop esi
|
|
pop edx
|
|
pop ecx
|
|
pop ebx
|
|
pop eax
|
|
|
|
ret 8
|
|
|
|
|
|
new_line:
|
|
|
|
pushad
|
|
|
|
mov eax,63
|
|
mov ebx,1
|
|
xor ecx,ecx
|
|
mov cl,13
|
|
int 0x40
|
|
|
|
mov eax,63
|
|
mov ebx,1
|
|
xor ecx,ecx
|
|
mov cl,10
|
|
int 0x40
|
|
|
|
popad
|
|
|
|
ret
|
|
|
|
print_string:
|
|
|
|
pushad
|
|
|
|
xor esi,esi
|
|
|
|
next_symbol_print:
|
|
|
|
mov edi,[s_p]
|
|
add edi,esi
|
|
|
|
xor edx,edx
|
|
mov dl,byte[edi]
|
|
test dl,dl
|
|
jz exit_print_str
|
|
|
|
mov eax,63
|
|
mov ebx,1
|
|
xor ecx,ecx
|
|
mov cl,byte[edi]
|
|
int 0x40
|
|
|
|
inc esi
|
|
jmp next_symbol_print
|
|
|
|
exit_print_str:
|
|
|
|
popad
|
|
|
|
|
|
ret
|
|
|
|
s_p dd 0
|
|
s_craete db 'craete ',0
|
|
s_destroy db 'destroy ',0
|
|
s_parend db ' parend ',0
|
|
s_last db ' ctrl_fd ',0
|
|
s_next db ' ctrl_bk ',0
|
|
s_1 db ' 1',0
|
|
s_2 db ' 2',0 |