From 90de905a6057c5cc7f25ad606c06c4388ae491b9 Mon Sep 17 00:00:00 2001 From: IgorA Date: Thu, 8 Jul 2021 20:45:01 +0000 Subject: [PATCH] kfar: add mouse double click events, fix mouse in menu git-svn-id: svn://kolibrios.org@9039 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/fs/kfar/trunk/dialogs.inc | 145 ++++++++++++++++------------- programs/fs/kfar/trunk/kfar.asm | 93 ++++++++++++------ 2 files changed, 144 insertions(+), 94 deletions(-) diff --git a/programs/fs/kfar/trunk/dialogs.inc b/programs/fs/kfar/trunk/dialogs.inc index 748e7238cf..e881a685cb 100644 --- a/programs/fs/kfar/trunk/dialogs.inc +++ b/programs/fs/kfar/trunk/dialogs.inc @@ -151,85 +151,93 @@ align 4 mov eax,SF_MOUSE_GET mov ebx,SSF_WINDOW_POSITION int 0x40 - cmp ax, word[skinh] - jl .event - sub ax, word[skinh] - xor dx,dx - mov bx, font_height - div bx - movzx edx,ax - shr eax,16 + cmp ax, word[skinh] + jl .event + sub ax, word[skinh] + xor dx,dx + mov bx, font_height + div bx + movzx edx,ax + shr eax,16 sub eax, 5 ;window border - push edx - xor dx,dx - mov bx, font_width - div bx - movzx eax,ax - pop edx + push edx + xor dx,dx + mov bx, font_width + div bx + movzx eax,ax + pop edx mov ebx, [esp+24h+8] ;DLGTEMPLATE* dlg - cmp edx, [ebx+dlgtemplate.y] - jl .event - cmp eax, [ebx+dlgtemplate.x] - jl .event - sub edx, [ebx+dlgtemplate.y] - sub eax, [ebx+dlgtemplate.x] - cmp edx, [ebx+dlgtemplate.height] - jge .event - cmp eax, [ebx+dlgtemplate.width] - jge .event + cmp dword[ebx+dlgtemplate.size], 0 + jne .event ;если диалоговое окно не стандартное (список значений) + cmp edx, [ebx+dlgtemplate.y] + jl .event + cmp eax, [ebx+dlgtemplate.x] + jl .event + sub edx, [ebx+dlgtemplate.y] + sub eax, [ebx+dlgtemplate.x] + cmp edx, [ebx+dlgtemplate.height] + jge .event + cmp eax, [ebx+dlgtemplate.width] + jge .event add ebx, dlgtemplate.size+12 mov ecx, [ebx-4] - or ecx, ecx - jz .event + or ecx, ecx + jz .event push ebx ecx .m_loop: - cmp [ebx+dlgitemtemplate.type], 2 ;button - je .m_comp - cmp [ebx+dlgitemtemplate.type], 3 ;edit - je .m_comp - ;cmp [ebx+dlgitemtemplate.type], 5 ;check - ;je .m_comp - jmp .m_next + cmp [ebx+dlgitemtemplate.type], 2 ;button + je .m_comp + cmp [ebx+dlgitemtemplate.type], 3 ;edit + je .m_comp + ;cmp [ebx+dlgitemtemplate.type], 5 ;check + ;je .m_comp + jmp .m_next align 4 .m_comp: - cmp [ebx+dlgitemtemplate.x1], eax - jg .m_next - cmp [ebx+dlgitemtemplate.y1], edx - jg .m_next - cmp [ebx+dlgitemtemplate.x2], eax - jl .m_next - cmp [ebx+dlgitemtemplate.y2], edx - jl .m_next - - mov eax, [ebx+dlgitemtemplate.flags] - and eax, 4 - jnz .m_old_focus - mov eax, ebx - jmp .m_new_focus + cmp [ebx+dlgitemtemplate.x1], eax + jg .m_next + cmp [ebx+dlgitemtemplate.y1], edx + jg .m_next + cmp [ebx+dlgitemtemplate.x2], eax + jl .m_next + cmp [ebx+dlgitemtemplate.y2], edx + jl .m_next + + cmp [ebx+dlgitemtemplate.type], 2 ;button + jne @f + mov [esp+28+8], ebx ;save to eax + pop ecx ebx + jmp .exit +@@: + mov eax, [ebx+dlgitemtemplate.flags] + and eax, 4 + jnz .m_old_focus + mov eax, ebx + jmp .m_new_focus align 4 .m_next: - add ebx, sizeof.DlgBtn - loop .m_loop + add ebx, sizeof.DlgBtn + loop .m_loop .m_old_focus: - pop ecx ebx - jmp .event + pop ecx ebx + jmp .event align 4 .m_new_focus: - pop ecx ebx + pop ecx ebx call DlgClearFocus - or dword[eax+dlgitemtemplate.flags], 4 + or dword[eax+dlgitemtemplate.flags], 4 - sub ebx, dlgtemplate.size+12 + sub ebx, dlgtemplate.size+12 push ebp - mov ebp, ebx + mov ebp, ebx call ManagerDlgProc.dodraw pop ebp call draw_image - jmp .event + jmp .event align 4 .exit: popad @@ -253,10 +261,10 @@ DlgClearFocus: push ebx ecx @@: and byte [ebx+dlgitemtemplate.flags], not 4 - add ebx, sizeof.DlgBtn - loop @b - pop ecx ebx - ret + add ebx, sizeof.DlgBtn + loop @b + pop ecx ebx + ret ; int __stdcall ShowGenericBox(DLGTEMPLATE* dlg, void* DlgProc); align 16 @@ -438,6 +446,7 @@ draw_dialog_shadow: ret ; void __stdcall DrawGenericBox(DLGDATA* dlg, void* DlgProc) +align 16 DrawGenericBox: pushad mov ebx, [esp+24h] @@ -720,6 +729,7 @@ restore_console_data: ; int __stdcall menu(void* variants, const char* title, unsigned flags); ; variants указывает на текущий элемент в двусвязном линейном списке +align 16 menu: pop eax push [cur_height] @@ -734,11 +744,11 @@ menu_centered_in: pushad mov ecx, 60 ; 40 bytes for dlgtemplate + additional: -; +40: dd cur_variant -; +44: dd num_variants -; +48: dd begin_variant -; +52: dd end_variant -; +56: dd cur_variant_idx +; +40: dd cur_variant - [???] +; +44: dd num_variants - сколько элементов влазит в окно +; +48: dd begin_variant - [dd ..,..,???] +; +52: dd end_variant - [dd ..,..,???] +; +56: dd cur_variant_idx - ??? call xpgalloc test eax, eax jnz @f @@ -749,7 +759,7 @@ menu_centered_in: @@: mov ebx, eax mov eax, 1 - test byte [esp+20h+28], 1 + test byte [esp+20h+28], 1 ;unsigned flags jz @f mov al, 3 @@: @@ -760,7 +770,7 @@ menu_centered_in: ; Находим ширину и высоту окна xor eax, eax xor ecx, ecx - mov esi, [esp+20h+20] + mov esi, [esp+20h+20] ;void* variants mov [ebx+40], esi mov dword [ebx+56], eax @@: @@ -889,6 +899,7 @@ menu_centered_in: popad ret 28 +align 16 MenuDlgProc: mov eax, [esp+8] cmp al, 1 diff --git a/programs/fs/kfar/trunk/kfar.asm b/programs/fs/kfar/trunk/kfar.asm index 09596bcfa4..bae06ab209 100644 --- a/programs/fs/kfar/trunk/kfar.asm +++ b/programs/fs/kfar/trunk/kfar.asm @@ -819,34 +819,39 @@ mouse: mov eax,SF_MOUSE_GET mov ebx,SSF_BUTTON_EXT int 0x40 + mov byte[mousestate], 1 + bt eax,24 ;left but. double click + jc @f + mov byte[mousestate], 0 bt eax,8 ;left but. down - jnc event - + jc @f + jmp event +@@: mov eax,SF_MOUSE_GET mov ebx,SSF_WINDOW_POSITION int 0x40 - cmp ax, word[skinh] - jl event - sub ax, word[skinh] - xor dx,dx - mov bx, font_height - div bx - movzx edx,ax - dec edx ;верхняя рамка - dec edx ;заголовки - shr eax,16 + cmp ax, word[skinh] + jl event + sub ax, word[skinh] + xor dx,dx + mov bx, font_height + div bx + movzx edx,ax + dec edx ;верхняя рамка + dec edx ;заголовки + shr eax,16 cmp edx, 0 - jl .no_ch_pos - mov ebx, [cur_height] - sub ebx, 3 - cmp edx, ebx - je .on_panel - sub ebx, 7-3 - cmp edx, ebx - jge .no_ch_pos - - push edx eax + jl .no_ch_pos + mov ebx, [cur_height] + sub ebx, 3 + cmp edx, ebx + je .on_panel + sub ebx, 7-3 + cmp edx, ebx + jge .no_ch_pos + + push edx eax mov ecx, [cur_width] if font_width & 3 imul ecx, font_width @@ -897,9 +902,14 @@ end if cmp edx, 0 jl @f mov [ebp + PanelData.index], edx + cmp byte[mousestate], 0 + je @f + call panels_OnKey.enter + jmp event @@: call draw_panel jmp event +align 4 .on_panel: call get_keybar_ind lea eax, [panels_mouse+4*eax] @@ -908,7 +918,6 @@ end if mov ebp, [active_panel] mov ecx, [ebp + PanelData.index] call dword[eax] -@@: jmp event ;input: @@ -958,7 +967,7 @@ get_keybar_ind: inc edx @@: cmp edx, edi - ja .ret + ja .ret cmp edx, [cur_width] ja .ret cmp ecx, 12 @@ -970,10 +979,18 @@ get_keybar_ind: inc ecx jmp .l .ret: - lea eax, [esi+ecx-1] + lea eax, [esi+ecx-1] pop edi esi edx ecx ebx ret +align 4 +OnMouse_ctrl_f39: + sub eax, panels_mouse.ctrl+8 + shr eax, 2 + add eax, 0x3D + call panels_OnKey.ctrl_f39 + ret + align 16 process_ctrl_keys: cmp byte [esi], 0 @@ -1106,6 +1123,7 @@ enum_associations_callback: xor eax, eax ret 16 +align 4 enum_plugins_callback: ; LongBool __stdcall callback(f_name,sec_name,key_name,key_value); ; [esp+4] = f_name, [esp+8] = sec_name, [esp+12] = key_name, [esp+16] = key_value @@ -3478,6 +3496,7 @@ close_plugin_panels: jnz @b ret +align 4 close_plugin_panel: ; close plugin and restore old directory mov esi, [ebp + PanelData.parents] @@ -3515,6 +3534,7 @@ close_plugin_panel: @@: pop ebx edx +align 4 close_handle_if_unused: ; edx=hPlugin, ebx=hFile push ebp @@ -3534,6 +3554,7 @@ close_handle_if_unused: pop ebp ret +align 4 panels_IsHandleUsed: ; edx=hPlugin, ebx=hFile mov ebp, panel1 @@ -3570,6 +3591,7 @@ panels_IsHandleUsed: inc esi ret +align 4 panels_OnExit: ; close plugin panels mov ebp, panel1 @@ -3578,6 +3600,7 @@ panels_OnExit: call close_plugin_panels ret +align 4 panels_OnRedraw: or [cursor_x], -1 or [cursor_y], -1 @@ -3590,6 +3613,7 @@ panels_OnRedraw: call draw_panel ret +align 4 init_console: mov ecx, [console_data_ptr] call pgfree @@ -3624,12 +3648,15 @@ init_console: mov [panel2.height], eax ret +align 4 get_curfile_folder_entry: mov ecx, [ebp + PanelData.index] shl ecx, 2 add ecx, [ebp + PanelData.files] mov ecx, [ecx] ret + +align 4 get_curfile_name: call get_curfile_folder_entry add ecx, 40 @@ -4970,6 +4997,7 @@ end if sub ecx, edi ret 8 +align 4 get_file_color: mov ah, [esi + 6] cmp ebp, [active_panel] @@ -4989,6 +5017,7 @@ get_file_color: @@: ret +align 4 draw_name_column: mov eax, [column_index] mov [last_column_index], eax @@ -5151,6 +5180,7 @@ draw_name_column: draw_empty_column: ret +align 4 draw_size_column: add edi, [column_width] add edi, [column_width] @@ -5295,6 +5325,7 @@ end if cld ret +align 4 draw_date_column: mov ecx, [column_height] dec ecx @@ -5361,6 +5392,7 @@ draw_date_column: cld ret +align 4 draw_time_column: mov ecx, [column_height] dec ecx @@ -5445,6 +5477,7 @@ draw_time_column: ;@@: pop esi ; ret +align 4 read_folder: mov eax, [ebp + PanelData.nfa] mov [dirinfo.size], eax @@ -7530,8 +7563,12 @@ panels_mouse: rd 4 dd panels_OnKey.shift_f5 rd 7 -; Ctrl - rd 12 +.ctrl: + rd 2 +repeat 9-3+1 + dd OnMouse_ctrl_f39 +end repeat + rd 3 ; Ctrl+Shift rd 12 ; Alt @@ -7929,6 +7966,8 @@ FolderShortcuts dd 0,0,0,0,0,0,0,0,0,0 bWasE0 db 0 ctrlstate db 0 +mousestate db 0 +align 4 MemForImage dd 0 restore_semicolon dd 0 bForHex db 0