1,59 → 1,59 |
diff16 'tp-mouse.asm',0,$ |
|
proc check_mouse_in_edit_area |
mcall 37,1 |
mov ebx,eax |
and ebx,0x0000FFFF |
shr eax,16 |
mov ecx,[cur_editor.Bounds.Top] |
inc ecx |
pushd [cur_editor.Bounds.Left] ecx [cur_editor.Bounds.Right] ecx |
popd [__rc+0xC] [__rc+0x8] [__rc+0x4] [__rc+0x0] |
sub [__rc+0x8],SCRLW+6 |
mov ecx,[cur_editor.Gutter.Width] |
add [__rc+0x0],ecx |
mov ecx,[lines.scr] |
imul ecx,[lineHeight] |
dec ecx |
add [__rc+0xC],ecx |
mov ecx,__rc |
call pt_in_rect |
ret |
mcall 37,1 |
mov ebx,eax |
and ebx,0x0000FFFF |
shr eax,16 |
mov ecx,[cur_editor.Bounds.Top] |
inc ecx |
pushd [cur_editor.Bounds.Left] ecx [cur_editor.Bounds.Right] ecx |
popd [__rc+0xC] [__rc+0x8] [__rc+0x4] [__rc+0x0] |
sub [__rc+0x8],SCRLW+6 |
mov ecx,[cur_editor.Gutter.Width] |
add [__rc+0x0],ecx |
mov ecx,[lines.scr] |
imul ecx,[lineHeight] |
dec ecx |
add [__rc+0xC],ecx |
mov ecx,__rc |
call pt_in_rect |
ret |
endp |
|
proc get_mouse_event |
mcall 37,2 |
and al,3 |
mov bl,[ecx] |
cmp [ecx],al |
mov [ecx],al |
jne @f |
mcall 37,7 |
or eax,eax |
jz .mv |
add [ecx+6],ax |
shr eax,16 |
add [ecx+4],ax |
mov eax,MEV_WHEEL |
ret |
.mv: mov eax,MEV_MOVE |
ret |
@@: mov bh,al |
and ebx,0x0101 |
cmp bl,bh |
je .rb |
test al,1 |
jz @f |
mov eax,MEV_LDOWN |
ret |
@@: mov eax,MEV_LUP |
ret |
.rb: test al,2 |
jz @f |
mov eax,MEV_RDOWN |
ret |
@@: mov eax,MEV_RUP |
ret |
mcall 37,2 |
and al,3 |
mov bl,[ecx] |
cmp [ecx],al |
mov [ecx],al |
jne @f |
mcall 37,7 |
or eax,eax |
jz .mv |
add [ecx+6],ax |
shr eax,16 |
add [ecx+4],ax |
mov eax,MEV_WHEEL |
ret |
.mv: mov eax,MEV_MOVE |
ret |
@@: mov bh,al |
and ebx,0x0101 |
cmp bl,bh |
je .rb |
test al,1 |
jz @f |
mov eax,MEV_LDOWN |
ret |
@@: mov eax,MEV_LUP |
ret |
.rb: test al,2 |
jz @f |
mov eax,MEV_RDOWN |
ret |
@@: mov eax,MEV_RUP |
ret |
endp |
|
mouse_ev dd mouse.l_down,mouse.l_up,mouse.r_down,mouse.r_up,mouse.wheel,mouse.move |
60,316 → 60,329 |
|
mouse: |
|
mcall 9,p_info,-1 |
|
mov eax,[p_info+70] ;status of window |
test eax,100b |
jne still.skip_write |
|
mov ecx,mst |
call get_mouse_event |
cmp [bot_mode],0 |
je @f |
mov ah,al |
mov al,4 |
call [bot_dlg_handler] |
jmp still.skip_write |
@@: cmp al,MEV_MOVE |
jne .no_move |
cmp [popup_active],1 |
je @f |
mcall 9,p_info,-1 |
|
mov eax,[p_info+70] ;status of window |
test eax,100b |
jne still.skip_write |
|
mov ecx,mst |
call get_mouse_event |
cmp [bot_mode],0 |
je @f |
mov ah,al |
mov al,4 |
call [bot_dlg_handler] |
jmp still.skip_write |
@@: cmp al,MEV_MOVE |
jne .no_move |
cmp [popup_active],1 |
je @f |
.no_move: |
mov [s_status],0 |
mov [s_status],0 |
|
push eax |
mcall 9,p_info,-1 |
cmp ax,[p_info.window_stack_position] |
pop eax |
jne still.skip_write |
push eax |
mcall 9,p_info,-1 |
cmp ax,[p_info.window_stack_position] |
pop eax |
jne still.skip_write |
@@: |
;!!! cmp [just_from_popup],0 |
;!!! je @f |
;!!! cmp al,MEV_LUP |
;!!! jne still.skip_write |
@@: mov [mev],al |
jmp [mouse_ev+eax*4-4] |
@@: mov [mev],al |
jmp [mouse_ev+eax*4-4] |
|
.wheel: |
movsx eax,word[mst+4] |
lea eax,[eax*3] |
add [cur_editor.TopLeft.X],eax |
movsx eax,word[mst+6] |
lea eax,[eax*3] |
add [cur_editor.TopLeft.Y],eax |
xor eax,eax |
mov [mst+4],eax |
call check_bottom_right |
call draw_editor |
jmp still.skip_write |
test [shi], 0x0C ; left or right ctrl key pressed |
jnz .wheel_ctrl |
movsx eax,word[mst+4] |
lea eax,[eax*3] |
add [cur_editor.TopLeft.X],eax |
movsx eax,word[mst+6] |
lea eax,[eax*3] |
add [cur_editor.TopLeft.Y],eax |
xor eax,eax |
mov [mst+4],eax |
call check_bottom_right |
call draw_editor |
jmp still.skip_write |
|
.wheel_ctrl: |
cmp word[mst+6], 0 ; vertical scroll? |
je still.skip_write |
test word[mst+6], 0x8000 ; scroll up or down? |
jnz .wheel_ctrl_down |
call key.ctrl_plus ; zoom in |
jmp still.skip_write |
.wheel_ctrl_down: |
call key.ctrl_minus ; zoom out |
jmp still.skip_write |
|
.move: |
mcall 37,1 |
movsx ebx,ax |
sar eax,16 |
cmp [body_capt],0 |
jge .check_body.2 |
cmp [vscrl_capt],0 |
jge .check_vscroll.2 |
cmp [hscrl_capt],0 |
jge .check_hscroll.2 |
mcall 37,1 |
movsx ebx,ax |
sar eax,16 |
cmp [body_capt],0 |
jge .check_body.2 |
cmp [vscrl_capt],0 |
jge .check_vscroll.2 |
cmp [hscrl_capt],0 |
jge .check_hscroll.2 |
|
cmp [do_not_draw],0 |
jne still.skip_write |
mov eax,[mi_cur] |
call get_active_menu_item |
cmp eax,[mi_cur] |
je still.skip_write |
push [mi_cur] |
cmp [popup_active],0 |
je @f |
mov [mi_cur],eax |
@@: call draw_main_menu |
pop [mi_cur] |
cmp [popup_active],0 |
je still.skip_write |
mov ecx,[mi_cur] |
or ecx,ecx |
js still.skip_write |
mov eax,[main_menu.popups+ecx*4-4] |
mov edx,main_menu |
call dword[main_menu.onshow+ecx*4-4] |
call setup_main_menu_popup |
mcall 60,2,[h_popup],POPUP_STACK,4 |
|
call draw_main_menu |
cmp [do_not_draw],0 |
jne still.skip_write |
mov eax,[mi_cur] |
call get_active_menu_item |
cmp eax,[mi_cur] |
je still.skip_write |
push [mi_cur] |
cmp [popup_active],0 |
je @f |
mov [mi_cur],eax |
@@: call draw_main_menu |
pop [mi_cur] |
cmp [popup_active],0 |
je still.skip_write |
mov ecx,[mi_cur] |
or ecx,ecx |
js still.skip_write |
mov eax,[main_menu.popups+ecx*4-4] |
mov edx,main_menu |
call dword[main_menu.onshow+ecx*4-4] |
call setup_main_menu_popup |
mcall 60,2,[h_popup],POPUP_STACK,4 |
|
call draw_main_menu |
|
jmp still.skip_write |
jmp still.skip_write |
|
|
.r_down: |
@@: cmp [popup_active],0 |
je @f |
mcall 5,1 |
jmp @b |
@@: cmp [mouse_captured],0 |
jne still.skip_write |
call check_mouse_in_edit_area |
jnc still.skip_write |
mcall 37,0 |
mov [mm.Edit+POPUP.pos],eax |
@@: mcall 37,2 |
cmp eax,ebx |
jnz @f |
mcall 5,1 |
jmp @b |
@@: and [mst],0xFD |
call onshow.edit |
mov dword[POPUP_STACK],mm.Edit |
mcall 51,1,popup_thread_start,POPUP_STACK |
mov [h_popup],eax |
jmp still.skip_write |
@@: cmp [popup_active],0 |
je @f |
mcall 5,1 |
jmp @b |
@@: cmp [mouse_captured],0 |
jne still.skip_write |
call check_mouse_in_edit_area |
jnc still.skip_write |
mcall 37,0 |
mov [mm.Edit+POPUP.pos],eax |
@@: mcall 37,2 |
cmp eax,ebx |
jnz @f |
mcall 5,1 |
jmp @b |
@@: and [mst],0xFD |
call onshow.edit |
mov dword[POPUP_STACK],mm.Edit |
mcall 51,1,popup_thread_start,POPUP_STACK |
mov [h_popup],eax |
jmp still.skip_write |
|
.r_up: |
jmp still.skip_write |
jmp still.skip_write |
|
.l_down: |
call check_mouse_in_edit_area |
jnc .check_vscroll |
mov [mouse_captured],1 |
mov [body_capt],1 |
call check_mouse_in_edit_area |
jnc .check_vscroll |
mov [mouse_captured],1 |
mov [body_capt],1 |
|
call clear_selection |
call clear_selection |
|
.check_body.2: |
sub eax,[cur_editor.Bounds.Left] |
sub ebx,[cur_editor.Bounds.Top] |
sub eax,[cur_editor.Gutter.Width] |
sub eax,LCHGW |
sub ebx,2 |
push eax |
mov eax,ebx |
cdq |
mov ecx,[lineHeight] |
idiv ecx |
@@: add eax,[cur_editor.TopLeft.Y] |
mov ebx,eax |
pop eax |
cdq |
mov ecx,[charWidth] |
idiv ecx |
@@: add eax,[cur_editor.TopLeft.X] |
mov ecx, ebx |
call get_line_offset |
cmp eax,[esi] |
jl @f |
mov eax,[esi] |
@@: cmp ebx,[cur_editor.Lines.Count] |
jl @f |
mov ebx,[cur_editor.Lines.Count] |
dec ebx |
sub eax,[cur_editor.Bounds.Left] |
sub ebx,[cur_editor.Bounds.Top] |
sub eax,[cur_editor.Gutter.Width] |
sub eax,LCHGW |
sub ebx,2 |
push eax |
mov eax,ebx |
cdq |
mov ecx,[lineHeight] |
idiv ecx |
@@: add eax,[cur_editor.TopLeft.Y] |
mov ebx,eax |
pop eax |
cdq |
mov ecx,[charWidth] |
idiv ecx |
@@: add eax,[cur_editor.TopLeft.X] |
mov ecx, ebx |
call get_line_offset |
cmp eax,[esi] |
jl @f |
mov eax,[esi] |
@@: cmp ebx,[cur_editor.Lines.Count] |
jl @f |
mov ebx,[cur_editor.Lines.Count] |
dec ebx |
@@: |
cmp [cur_editor.Caret.X],eax |
jne .change_cur_pos |
cmp [cur_editor.Caret.Y],ebx |
jne .change_cur_pos |
call editor_check_for_changes |
jmp still.skip_write |
cmp [cur_editor.Caret.X],eax |
jne .change_cur_pos |
cmp [cur_editor.Caret.Y],ebx |
jne .change_cur_pos |
call editor_check_for_changes |
jmp still.skip_write |
|
.change_cur_pos: |
mov [cur_editor.Caret.X],eax |
mov [cur_editor.Caret.Y],ebx |
call editor_check_for_changes |
jmp still |
mov [cur_editor.Caret.X],eax |
mov [cur_editor.Caret.Y],ebx |
call editor_check_for_changes |
jmp still |
|
.check_vscroll: |
mov ecx,[cur_editor.Bounds.Right] |
sub ecx,SCRLW-1 |
pushd ecx [cur_editor.Bounds.Top] ecx [cur_editor.Bounds.Bottom] |
popd [__rc+0xC] [__rc+0x8] [__rc+0x4] [__rc+0x0] |
add [__rc+0x8],SCRLW-2 |
add [__rc+0x4],SCRLW-1 |
sub [__rc+0xC],SCRLW*2+1 |
mov ecx,__rc |
call pt_in_rect |
jnc .check_hscroll |
mov ecx,[cur_editor.Bounds.Right] |
sub ecx,SCRLW-1 |
pushd ecx [cur_editor.Bounds.Top] ecx [cur_editor.Bounds.Bottom] |
popd [__rc+0xC] [__rc+0x8] [__rc+0x4] [__rc+0x0] |
add [__rc+0x8],SCRLW-2 |
add [__rc+0x4],SCRLW-1 |
sub [__rc+0xC],SCRLW*2+1 |
mov ecx,__rc |
call pt_in_rect |
jnc .check_hscroll |
|
.check_vscroll.2: |
sub ebx,[cur_editor.Bounds.Top] |
sub ebx,SCRLW |
cmp [vscrl_capt],0 |
jge .vcaptured |
mov eax,[cur_editor.VScroll.Top] |
cmp ebx,eax |
jb .center_vcapture |
add eax,[cur_editor.VScroll.Size] |
cmp ebx,eax |
jae .center_vcapture |
mov eax,ebx |
sub eax,[cur_editor.VScroll.Top] |
dec eax |
mov [vscrl_capt],eax |
dec ebx |
jmp .vcaptured |
sub ebx,[cur_editor.Bounds.Top] |
sub ebx,SCRLW |
cmp [vscrl_capt],0 |
jge .vcaptured |
mov eax,[cur_editor.VScroll.Top] |
cmp ebx,eax |
jb .center_vcapture |
add eax,[cur_editor.VScroll.Size] |
cmp ebx,eax |
jae .center_vcapture |
mov eax,ebx |
sub eax,[cur_editor.VScroll.Top] |
dec eax |
mov [vscrl_capt],eax |
dec ebx |
jmp .vcaptured |
.center_vcapture: |
mov eax,[cur_editor.VScroll.Size] |
shr eax,1 |
mov [vscrl_capt],eax |
mov eax,[cur_editor.VScroll.Size] |
shr eax,1 |
mov [vscrl_capt],eax |
.vcaptured: |
sub ebx,[vscrl_capt] |
jns @f |
xor ebx,ebx |
@@: mov [mouse_captured],1 |
mov eax,[cur_editor.Bounds.Bottom] |
sub eax,[cur_editor.Bounds.Top] |
sub eax,[cur_editor.VScroll.Size] |
sub eax,SCRLW*3 |
cmp eax,ebx |
jge @f |
mov ebx,eax |
sub ebx,[vscrl_capt] |
jns @f |
xor ebx,ebx |
@@: mov [mouse_captured],1 |
mov eax,[cur_editor.Bounds.Bottom] |
sub eax,[cur_editor.Bounds.Top] |
sub eax,[cur_editor.VScroll.Size] |
sub eax,SCRLW*3 |
cmp eax,ebx |
jge @f |
mov ebx,eax |
@@: |
mov [cur_editor.VScroll.Top],ebx |
mov eax,[cur_editor.Lines.Count] |
sub eax,[lines.scr] |
imul ebx |
mov ebx,[cur_editor.Bounds.Bottom] |
sub ebx,[cur_editor.Bounds.Top] |
sub ebx,SCRLW*3 |
sub ebx,[cur_editor.VScroll.Size] |
idiv ebx |
cmp eax,[cur_editor.TopLeft.Y] |
je still.skip_write |
mov [cur_editor.TopLeft.Y],eax |
call check_bottom_right |
call draw_editor |
jmp still.skip_write |
mov [cur_editor.VScroll.Top],ebx |
mov eax,[cur_editor.Lines.Count] |
sub eax,[lines.scr] |
imul ebx |
mov ebx,[cur_editor.Bounds.Bottom] |
sub ebx,[cur_editor.Bounds.Top] |
sub ebx,SCRLW*3 |
sub ebx,[cur_editor.VScroll.Size] |
idiv ebx |
cmp eax,[cur_editor.TopLeft.Y] |
je still.skip_write |
mov [cur_editor.TopLeft.Y],eax |
call check_bottom_right |
call draw_editor |
jmp still.skip_write |
|
.check_hscroll: |
pushd [cur_editor.Bounds.Left] [cur_editor.Bounds.Bottom] [cur_editor.Bounds.Right] [cur_editor.Bounds.Bottom] |
popd [__rc+0xC] [__rc+0x8] [__rc+0x4] [__rc+0x0] |
add [__rc+0x8],-SCRLW*2-1 |
add [__rc+0x4],-SCRLW+1 |
add [__rc+0xC],-1 |
add [__rc+0x0],SCRLW+1 |
mov ecx,__rc |
call pt_in_rect |
jnc .check_main_menu |
pushd [cur_editor.Bounds.Left] [cur_editor.Bounds.Bottom] [cur_editor.Bounds.Right] [cur_editor.Bounds.Bottom] |
popd [__rc+0xC] [__rc+0x8] [__rc+0x4] [__rc+0x0] |
add [__rc+0x8],-SCRLW*2-1 |
add [__rc+0x4],-SCRLW+1 |
add [__rc+0xC],-1 |
add [__rc+0x0],SCRLW+1 |
mov ecx,__rc |
call pt_in_rect |
jnc .check_main_menu |
|
.check_hscroll.2: |
mov ebx,eax |
sub ebx,SCRLW+1 |
sub ebx,[cur_editor.Bounds.Left] |
cmp [hscrl_capt],0 |
jge .hcaptured |
mov eax,[cur_editor.HScroll.Top] |
cmp ebx,eax |
jl .center_hcapture |
add eax,[cur_editor.HScroll.Size] |
cmp ebx,eax |
jge .center_hcapture |
mov eax,ebx |
sub eax,[cur_editor.HScroll.Top] |
dec eax |
mov [hscrl_capt],eax |
dec ebx |
jmp .hcaptured |
mov ebx,eax |
sub ebx,SCRLW+1 |
sub ebx,[cur_editor.Bounds.Left] |
cmp [hscrl_capt],0 |
jge .hcaptured |
mov eax,[cur_editor.HScroll.Top] |
cmp ebx,eax |
jl .center_hcapture |
add eax,[cur_editor.HScroll.Size] |
cmp ebx,eax |
jge .center_hcapture |
mov eax,ebx |
sub eax,[cur_editor.HScroll.Top] |
dec eax |
mov [hscrl_capt],eax |
dec ebx |
jmp .hcaptured |
.center_hcapture: |
mov eax,[cur_editor.HScroll.Size] |
shr eax,1 |
mov [hscrl_capt],eax |
mov eax,[cur_editor.HScroll.Size] |
shr eax,1 |
mov [hscrl_capt],eax |
.hcaptured: |
sub ebx,[hscrl_capt] |
jns @f |
xor ebx,ebx |
@@: mov [mouse_captured],1 |
mov eax,[cur_editor.Bounds.Right] |
sub eax,[cur_editor.HScroll.Size] |
sub eax,SCRLW*3+1 |
cmp eax,ebx |
jge @f |
mov ebx,eax |
sub ebx,[hscrl_capt] |
jns @f |
xor ebx,ebx |
@@: mov [mouse_captured],1 |
mov eax,[cur_editor.Bounds.Right] |
sub eax,[cur_editor.HScroll.Size] |
sub eax,SCRLW*3+1 |
cmp eax,ebx |
jge @f |
mov ebx,eax |
@@: |
mov [cur_editor.HScroll.Top],ebx |
mov eax,[cur_editor.Columns.Count] |
sub eax,[columns.scr] |
imul ebx |
mov ebx,[cur_editor.Bounds.Right] |
sub ebx,SCRLW*3+1 |
sub ebx,[cur_editor.HScroll.Size] |
idiv ebx |
cmp eax,[cur_editor.TopLeft.X] |
je still.skip_write |
mov [cur_editor.TopLeft.X],eax |
call check_bottom_right |
call draw_editor |
jmp still.skip_write |
mov [cur_editor.HScroll.Top],ebx |
mov eax,[cur_editor.Columns.Count] |
sub eax,[columns.scr] |
imul ebx |
mov ebx,[cur_editor.Bounds.Right] |
sub ebx,SCRLW*3+1 |
sub ebx,[cur_editor.HScroll.Size] |
idiv ebx |
cmp eax,[cur_editor.TopLeft.X] |
je still.skip_write |
mov [cur_editor.TopLeft.X],eax |
call check_bottom_right |
call draw_editor |
jmp still.skip_write |
|
.check_main_menu: |
cmp [do_not_draw],0 |
jne .capture_off |
cmp [do_not_draw],0 |
jne .capture_off |
|
@@: mcall 37,2 |
test eax,0x01 |
jz @f |
mcall 5,1 |
jmp @b |
@@: and [mst],0xFE |
@@: mcall 37,2 |
test eax,0x01 |
jz @f |
mcall 5,1 |
jmp @b |
@@: and [mst],0xFE |
|
cmp [mi_cur],0 |
jle .capture_off |
mov ecx,[mi_cur] |
mov eax,[main_menu.popups+ecx*4-4] |
mov edx,main_menu |
call dword[main_menu.onshow+ecx*4-4] |
call setup_main_menu_popup |
mcall 51,1,popup_thread_start,POPUP_STACK |
mov [h_popup],eax |
cmp [mi_cur],0 |
jle .capture_off |
mov ecx,[mi_cur] |
mov eax,[main_menu.popups+ecx*4-4] |
mov edx,main_menu |
call dword[main_menu.onshow+ecx*4-4] |
call setup_main_menu_popup |
mcall 51,1,popup_thread_start,POPUP_STACK |
mov [h_popup],eax |
|
.l_up: |
.capture_off: |
or eax,-1 |
mov [vscrl_capt],eax |
mov [hscrl_capt],eax |
mov [body_capt],eax |
mov [mouse_captured],0 |
or eax,-1 |
mov [vscrl_capt],eax |
mov [hscrl_capt],eax |
mov [body_capt],eax |
mov [mouse_captured],0 |
;!!! mov [just_from_popup],0 |
jmp still.skip_write |
jmp still.skip_write |