forked from KolibriOS/kolibrios
HotAngles 0.3.5: ability to select programs through OpenDialog and mode 2 "hotkey activation" in test mode, updated file ReadMe
git-svn-id: svn://kolibrios.org@7436 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
2e3d90aedd
commit
66a0391246
@ -2,7 +2,7 @@
|
||||
; Hot Angles Config ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; Compile with FASM
|
||||
; Version 0.3.2: Sep 24, 2018
|
||||
; Version 0.3.5: Oct 5, 2018
|
||||
|
||||
; Copyright (c) 2018, Efremenkov Sergey aka TheOnlyMirage
|
||||
; All rights reserved.
|
||||
@ -45,20 +45,24 @@ include '../../macros.inc'
|
||||
include '../../proc32.inc'
|
||||
include '../../dll.inc'
|
||||
include '../../develop/libraries/box_lib/trunk/box_lib.mac' ;компоненты checkBox и editBox
|
||||
|
||||
;![
|
||||
include '../../develop/libraries/box_lib/load_lib.mac' ;ìàêðîñ äëÿ çàãðóçêè áèáëèîòåê
|
||||
@use_library
|
||||
;@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load
|
||||
;!]
|
||||
Otstup = 30
|
||||
|
||||
START:
|
||||
call copyKill ;простейшая защита от запуска второй копии приложения
|
||||
mcall 68, 11 ;инициализация кучи
|
||||
|
||||
;mcall 48,3,sc,sizeof.system_colors ;ïîëó÷èòü ñèñòåìíûå öâåòà
|
||||
mov eax,48 ;получить системные цвета
|
||||
mov ebx,3
|
||||
mov ecx, sc
|
||||
mov edx, sizeof.system_colors
|
||||
mcall
|
||||
|
||||
|
||||
stdcall dll.Load, @IMPORT
|
||||
or eax, eax
|
||||
jnz exit
|
||||
@ -69,6 +73,10 @@ START:
|
||||
mov ebx,0x27 ;система будет реагировать только на сообщение о перерисовке, нажата кнопка, определённая ранее, событие от мыши (что-то случилось - нажатие на кнопку мыши или перемещение; сбрасывается при прочтении)
|
||||
mcall
|
||||
|
||||
load_libraries l_libs_start,load_lib_end ;çàãðóçêà áèáëèîòåê(è)
|
||||
;mcall 48,3,sc,sizeof.system_colors ;ïîëó÷èòü ñèñòåìíûå öâåòà
|
||||
stdcall [OpenDialog_Init],OpenDialog_data ;ïîäãîòîâêà äèàëîãà
|
||||
|
||||
call loadConfig ;загружаем конфигурацию из файла, если нет - то выставляем параметры по умолчанию
|
||||
call draw_window ;отрисовать окно приложения
|
||||
|
||||
@ -123,8 +131,34 @@ exit:
|
||||
mcall
|
||||
noclose:
|
||||
cmp ah, 2 ;кнопка "Применить"
|
||||
jne butend
|
||||
jne @f ;butend
|
||||
call applyButton ;вызов нашего обработчика нажатия кнопки
|
||||
jmp event_wait
|
||||
@@:
|
||||
cmp ah, 4
|
||||
jne @f
|
||||
mov byte[editID], 4
|
||||
call but_open_dlg
|
||||
jmp event_wait
|
||||
@@:
|
||||
cmp ah, 5
|
||||
jne @f
|
||||
mov byte[editID], 5
|
||||
call but_open_dlg
|
||||
jmp event_wait
|
||||
@@:
|
||||
cmp ah, 6
|
||||
jne @f
|
||||
mov byte[editID], 6
|
||||
call but_open_dlg
|
||||
jmp event_wait
|
||||
@@:
|
||||
cmp ah, 7
|
||||
jne @f
|
||||
mov byte[editID], 7
|
||||
call but_open_dlg
|
||||
jmp event_wait
|
||||
@@:
|
||||
butend:
|
||||
jmp event_wait ;this is for ignored events, useful at development
|
||||
|
||||
@ -217,10 +251,14 @@ applyButton:
|
||||
mov dword[createFile.data_adr], eax ;сохраняем адрес буфера в структуру
|
||||
|
||||
;заполним буфер содержимого:
|
||||
mov byte[eax], 110; 'n' ;ïî óìîë÷àíèþ ôëàã ñíÿò
|
||||
;cmp byte[mode], 0
|
||||
;jne @f
|
||||
;@@:
|
||||
;
|
||||
mov byte[eax], 48;'0' ;110; 'n' ;ïî óìîë÷àíèþ ôëàã ñíÿò
|
||||
cmp word[ch1.flags], 110b ;ch_flag_en and ch_flag_middle ;выставлен checkBox или нет?
|
||||
jne applyButton.no
|
||||
mov byte[eax], 121 ;èíà÷å êëàä¸ì 'y'
|
||||
mov byte[eax], 49;'1' ;121 ;èíà÷å êëàä¸ì 'y'
|
||||
.no:
|
||||
inc eax
|
||||
call addPerenos
|
||||
@ -376,11 +414,14 @@ loadConfig:
|
||||
add edx, eax ;кладём в edx - адрес конца конфиг.данных
|
||||
|
||||
.chStart:
|
||||
cmp byte[eax], 121 ;'y' ;âûñòàâëÿåì checkBox - ïàðàìåòð àêòèâíîñòè ïðèëîæåíèÿ
|
||||
jne loadConfig.no
|
||||
cmp byte[eax], 49;'1' ;121 ;'y' ;âûñòàâëÿåì checkBox - ïàðàìåòð àêòèâíîñòè ïðèëîæåíèÿ
|
||||
jne @f ;loadConfig.no
|
||||
.yes:
|
||||
mov word[ch1.flags], 110b ;ch_flag_en and ch_flag_middle
|
||||
jmp loadConfig.chEnd
|
||||
@@:
|
||||
cmp byte[eax], 50;'2' ;âòîðîé ðåæèì àêòèâèðîâàí
|
||||
je loadConfig.yes
|
||||
.no:
|
||||
mov word[ch1.flags], 100b ;ch_flag_middle
|
||||
.chEnd:
|
||||
@ -556,6 +597,16 @@ draw_window:
|
||||
mov edx, 0x80000002
|
||||
mcall 8
|
||||
|
||||
;óäàëÿåì åù¸ 4 êíîïêè åñëè îíè åñòü
|
||||
mov edx, 0x80000004
|
||||
mcall 8
|
||||
mov edx, 0x80000005
|
||||
mcall 8
|
||||
mov edx, 0x80000006
|
||||
mcall 8
|
||||
mov edx, 0x80000007
|
||||
mcall 8
|
||||
|
||||
mov eax, 12 ; function 12: tell os about windowdraw
|
||||
mov ebx, 1 ; 1, start of draw
|
||||
mcall
|
||||
@ -608,6 +659,52 @@ draw_window:
|
||||
mov esi, buttonTextSize ;5 ;размер текста в символах
|
||||
mcall 4
|
||||
|
||||
;ðèñóåì åù¸ 4 êíîïêè äëÿ äèàëîãîâîãî îêíà âûáîðà ôàéëà
|
||||
;íîìåðà 4,5,6 è 7
|
||||
buttonH = 14 ;20
|
||||
buttonW = 30
|
||||
;ëåâûé âåðõíèé óãîë
|
||||
mov ebx, Otstup*65536 + buttonW ;êîîðäèíàòà X, øèðèíà êíîïêè
|
||||
mov ecx, 85*65536 + buttonH ;êîîðäèíàòà Y, âûñîòà êíîïêè
|
||||
mov edx, 0x00000004 ;íîìåð êíîïêè
|
||||
mov esi, 0x00AABBCC ;öâåò êíîïêè
|
||||
mcall 8
|
||||
;ëåâûé íèæíèé óãîë
|
||||
mov ebx, Otstup*65536 + buttonW ;êîîðäèíàòà X, øèðèíà êíîïêè
|
||||
mov ecx, 120*65536 + buttonH ;êîîðäèíàòà Y, âûñîòà êíîïêè
|
||||
mov edx, 0x00000005 ;íîìåð êíîïêè
|
||||
mov esi, 0x00AABBCC ;öâåò êíîïêè
|
||||
mcall 8
|
||||
;ïðàâûé âåðõíèé óãîë
|
||||
mov ebx, (WindowsWidth-Otstup-buttonW)*65536 + buttonW ;êîîðäèíàòà X, øèðèíà êíîïêè
|
||||
mov ecx, 85*65536 + buttonH ;êîîðäèíàòà Y, âûñîòà êíîïêè
|
||||
mov edx, 0x00000006 ;íîìåð êíîïêè
|
||||
mov esi, 0x00AABBCC ;öâåò êíîïêè
|
||||
mcall 8
|
||||
;ïðàâûé íèæíèé óãîë
|
||||
mov ebx, (WindowsWidth-Otstup-buttonW)*65536 + buttonW ;êîîðäèíàòà X, øèðèíà êíîïêè
|
||||
mov ecx, 120*65536 + buttonH ;êîîðäèíàòà Y, âûñîòà êíîïêè
|
||||
mov edx, 0x00000007 ;íîìåð êíîïêè
|
||||
mov esi, 0x00AABBCC ;öâåò êíîïêè
|
||||
mcall 8
|
||||
|
||||
;ðèñóåì òåêñòû äëÿ ýòèõ 4 êíîïîê
|
||||
mov ecx, 0xFFFFFF ;áåëûé öâåò òåêñòà
|
||||
mov edx, commonButtonText ;ñòðîêà òåêñòà
|
||||
mov esi, commonButtonTextSize ;ðàçìåð òåêñòà â ñèìâîëàõ
|
||||
;êîîðäèíàòû òåêñòà (x, y)
|
||||
deltaCommonTextX = 7
|
||||
deltaCommonTextY = 2
|
||||
mov ebx, (Otstup+deltaCommonTextX) * 65536 + (85 + deltaCommonTextY)
|
||||
mcall 4
|
||||
mov ebx, (Otstup+deltaCommonTextX) * 65536 + (120 + deltaCommonTextY)
|
||||
mcall 4
|
||||
mov ebx, (WindowsWidth-Otstup-buttonW+deltaCommonTextX) * 65536 + (85 + deltaCommonTextY)
|
||||
mcall 4
|
||||
mov ebx, (WindowsWidth-Otstup-buttonW+deltaCommonTextX) * 65536 + (120 + deltaCommonTextY)
|
||||
mcall 4
|
||||
|
||||
|
||||
call draw_super_text
|
||||
|
||||
LineLength = 62
|
||||
@ -654,6 +751,8 @@ import box_lib,\
|
||||
;координаты (x,y) = (30, 160) размер чекбокса 12, цвет текста 0x224466
|
||||
ch1 check_box2 30 shl 16 + 12, 160 shl 16 + 12, 6, 0xFFFFFFFF, 0xAABBCC, 0x224466, ch_text, 110b ; ch_flag_en and ch_flag_middle
|
||||
|
||||
commonButtonText db '...', 0 ;òåêñò äëÿ êíîïîê âûçîâà OpenDial
|
||||
commonButtonTextSize = 3
|
||||
|
||||
if lang eq ru ;если язык сборки русский
|
||||
|
||||
@ -725,15 +824,182 @@ draw_super_text:
|
||||
pop esi edi edx ecx ebx eax
|
||||
ret
|
||||
|
||||
;![
|
||||
editID db 0
|
||||
initEBX:
|
||||
cmp byte[editID], 4
|
||||
jne @f
|
||||
mov ebx, dataBuffer.1
|
||||
ret
|
||||
@@:
|
||||
cmp byte[editID], 5
|
||||
jne @f
|
||||
mov ebx, dataBuffer.2
|
||||
ret
|
||||
@@:
|
||||
cmp byte[editID], 6
|
||||
jne @f
|
||||
mov ebx, dataBuffer.3
|
||||
ret
|
||||
@@:
|
||||
cmp byte[editID], 7
|
||||
jne @f
|
||||
mov ebx, dataBuffer.4
|
||||
ret
|
||||
@@:
|
||||
ret
|
||||
setRESULT:
|
||||
cmp byte[editID], 4
|
||||
jne @f
|
||||
mov dword[dataBuffer.size1], ecx
|
||||
mov dword[editLU.size], ecx
|
||||
mov dword[editLU.pos], ecx
|
||||
ret
|
||||
@@:
|
||||
cmp byte[editID], 5
|
||||
jne @f
|
||||
mov dword[dataBuffer.size2], ecx
|
||||
mov dword[editLD.size], ecx
|
||||
mov dword[editLD.pos], ecx
|
||||
ret
|
||||
@@:
|
||||
cmp byte[editID], 6
|
||||
jne @f
|
||||
mov dword[dataBuffer.size3], ecx
|
||||
mov dword[editRU.size], ecx
|
||||
mov dword[editRU.pos], ecx
|
||||
ret
|
||||
@@:
|
||||
cmp byte[editID], 7
|
||||
jne @f
|
||||
mov dword[dataBuffer.size4], ecx
|
||||
mov dword[editRD.size], ecx
|
||||
mov dword[editRD.pos], ecx
|
||||
ret
|
||||
@@:
|
||||
ret
|
||||
copyPath:
|
||||
push eax ebx ecx edx ;copy file name path
|
||||
mov eax, openfile_path ;dword[OpenDialog_data.openfile_path]
|
||||
call initEBX ;mov ebx, dataBuffer.1 ;.data
|
||||
mov ecx, 0
|
||||
@@:
|
||||
mov dl, byte[eax]
|
||||
cmp dl, 0 ;byte[eax], 0
|
||||
je @f
|
||||
mov byte[ebx], dl
|
||||
inc eax
|
||||
inc ebx
|
||||
inc ecx
|
||||
jmp @b
|
||||
@@:
|
||||
mov byte[ebx], 0
|
||||
call setRESULT
|
||||
pop edx ecx ebx eax
|
||||
ret
|
||||
|
||||
|
||||
align 4
|
||||
but_open_dlg:
|
||||
pushad
|
||||
copy_path open_dialog_name,communication_area_default_path,file_name,0
|
||||
mov [OpenDialog_data.type],0
|
||||
stdcall[OpenDialog_Start], OpenDialog_data
|
||||
cmp [OpenDialog_data.status],2
|
||||
je @f
|
||||
cmp [OpenDialog_data.status],0 ;ïîëüçîâàòåëü íàæàë Cancel?
|
||||
je .end_open
|
||||
;êîä ïðè óäà÷íîì îòêðûòèè äèàëîãà
|
||||
call copyPath
|
||||
jmp .end_open
|
||||
@@:
|
||||
;êîä ïðè íå óäà÷íîì îòêðûòèè äèàëîãà
|
||||
;...
|
||||
.end_open:
|
||||
popad
|
||||
ret
|
||||
|
||||
;äûííûå äëÿ äèàëîãà îòêðûòèÿ ôàéëîâ
|
||||
align 4
|
||||
OpenDialog_data:
|
||||
.type dd 0 ;0 - îòêðûòü, 1 - ñîõðàíèòü, 2 - âûáðàòü äèðåêòîðèþ
|
||||
.procinfo dd procinfo
|
||||
.com_area_name dd communication_area_name ;+8
|
||||
.com_area dd 0 ;+12
|
||||
.opendir_path dd plugin_path ;+16
|
||||
.dir_default_path dd default_dir ;+20
|
||||
.start_path dd file_name ;+24 ïóòü ê äèàëîãó îòêðûòèÿ ôàéëîâ
|
||||
.draw_window dd draw_window ;+28
|
||||
.status dd 0 ;+32
|
||||
.openfile_path dd openfile_path ;+36 ïóòü ê îòêðûâàåìîìó ôàéëó
|
||||
.filename_area dd filename_area ;+40
|
||||
.filter_area dd Filter
|
||||
.x:
|
||||
.x_size dw 420 ;+48 ; Window X size
|
||||
.x_start dw 10 ;+50 ; Window X position
|
||||
.y:
|
||||
.y_size dw 320 ;+52 ; Window y size
|
||||
.y_start dw 10 ;+54 ; Window Y position
|
||||
|
||||
default_dir db '/rd/1',0 ;äèðåêòîðèÿ ïî óìîë÷àíèþ
|
||||
communication_area_name: db 'FFFFFFFF_open_dialog',0
|
||||
open_dialog_name: db 'opendial',0
|
||||
communication_area_default_path: db '/rd/1/File managers/',0
|
||||
|
||||
Filter:
|
||||
dd Filter.end - Filter.1
|
||||
.1:
|
||||
;db 'ASM',0
|
||||
;db 'KEX',0
|
||||
;db 'TXT',0
|
||||
.end:
|
||||
db 0
|
||||
|
||||
align 4
|
||||
proclib_import: ;îïèñàíèå ýêñïîðòèðóåìûõ ôóíêöèé
|
||||
OpenDialog_Init dd aOpenDialog_Init
|
||||
OpenDialog_Start dd aOpenDialog_Start
|
||||
dd 0,0
|
||||
aOpenDialog_Init db 'OpenDialog_init',0
|
||||
aOpenDialog_Start db 'OpenDialog_start',0
|
||||
|
||||
head_f_i:
|
||||
head_f_l db 'Ñèñòåìíàÿ îøèáêà',0
|
||||
err_message_found_lib0 db 'Íå íàéäåíà áèáëèîòåêà ',39,'proc_lib.obj',39,0
|
||||
err_message_import0 db 'Îøèáêà ïðè èìïîðòå áèáëèîòåêè ',39,'proc_lib.obj',39,0
|
||||
|
||||
system_dir0 db '/sys/lib/'
|
||||
lib0_name db 'proc_lib.obj',0
|
||||
|
||||
;library structures
|
||||
l_libs_start:
|
||||
lib0 l_libs lib0_name, sys_path, file_name, system_dir0, err_message_found_lib0, head_f_l, proclib_import,err_message_import0, head_f_i
|
||||
load_lib_end:
|
||||
|
||||
;txt_open db 'Îòêðûòü',0
|
||||
|
||||
sys_path: rb 4096
|
||||
file_name: rb 4096
|
||||
plugin_path: rb 4096
|
||||
openfile_path: rb 4096
|
||||
filename_area: rb 256
|
||||
rb 1024
|
||||
procinfo process_information
|
||||
;!]
|
||||
|
||||
|
||||
|
||||
edMaxSize = 510 ;теперь с новым компонентом можно и 511 указать
|
||||
edMax = 0 ;max, size, pos
|
||||
|
||||
align 4
|
||||
editLU edit_box 180,Otstup,85, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.1, mouse_dd, 0, edMax, edMax ;ed_focus
|
||||
editLD edit_box 180,Otstup,120, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.2, mouse_dd, 0, edMax, edMax
|
||||
editRU edit_box 180,240,85, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.3, mouse_dd, 0, edMax, edMax
|
||||
editRD edit_box 180,240,120, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.4, mouse_dd, 0, edMax, edMax
|
||||
editLU edit_box 180-buttonW,Otstup+buttonW,85, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.1, mouse_dd, 0, edMax, edMax ;ed_focus
|
||||
editLD edit_box 180-buttonW,Otstup+buttonW,120, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.2, mouse_dd, 0, edMax, edMax
|
||||
editRU edit_box 180-buttonW,240,85, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.3, mouse_dd, 0, edMax, edMax
|
||||
editRD edit_box 180-buttonW,240,120, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.4, mouse_dd, 0, edMax, edMax
|
||||
|
||||
mouse_dd dd ?
|
||||
sc system_colors
|
||||
|
||||
dataBuffer:
|
||||
.1: rb 512
|
||||
@ -748,8 +1014,6 @@ dataBuffer:
|
||||
;два запасных байта необходимы для того что бы не пепереписать следующией байты, в конце буфера 0
|
||||
dataBufferEnd:
|
||||
|
||||
mouse_dd dd ?
|
||||
sc system_colors
|
||||
|
||||
I_END:
|
||||
rb 4096
|
||||
|
@ -2,7 +2,7 @@
|
||||
; Hot Angles ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; Compile with FASM
|
||||
; Version 0.3.3: Sep 25, 2018
|
||||
; Version 0.3.5: Oct 5, 2018
|
||||
|
||||
; Copyright (c) 2018, Efremenkov Sergey aka TheOnlyMirage
|
||||
; All rights reserved.
|
||||
@ -30,12 +30,12 @@ use32
|
||||
org 0x0 ; базовый адрес размещения кода, всегда 0x0
|
||||
|
||||
UNLOCKd = 0
|
||||
LOCKd = 1
|
||||
LOCKd = 1
|
||||
|
||||
; заголовок
|
||||
db 'MENUET01' ;магический идентификатор
|
||||
dd 0x01 ;версия
|
||||
dd START_DEBUG ;адрес точки старта программы
|
||||
dd START_DEBUG ;адрес точки старта программы
|
||||
dd I_END ;адрес конца, по факту размер файла программы
|
||||
dd 0x100000 ;требуемое кол-во памяти для загрузки программы
|
||||
dd 0x7fff0 ;начальное значение регистра esp - адрес конца области стэка так как стэк растет в сторону меньших адресов
|
||||
@ -48,21 +48,104 @@ START_DEBUG:
|
||||
call copyKill ;простейшая защита от повторного запуска
|
||||
mcall 68, 11 ;инициализация кучи
|
||||
call loadConfig ;загружаем конфигурацию приложения
|
||||
mov ebx, 00000100000000000000000000100000b ;подписываемся на интересные нам события
|
||||
mcall 40
|
||||
|
||||
START:
|
||||
cmp byte[mode], 0 ;функция отключена - выход
|
||||
jne @f
|
||||
mcall -1
|
||||
@@:
|
||||
;режим активации горячей клавишей?
|
||||
cmp byte[mode], 2 ;подписываемся на интересные нам события в зависимости от режима работы
|
||||
jne @f
|
||||
mov ebx, 00000100000000000000000000100010b ;если да, то подписываемся на клавиши
|
||||
mcall 40
|
||||
jmp init02
|
||||
@@:
|
||||
; во всех остальных случаях - классический режим работы
|
||||
;mode=1 классический режим работы - реакция при наведении в угол
|
||||
mov byte[mode], 1
|
||||
mov ebx, 00000100000000000000000000100000b
|
||||
mcall 40
|
||||
jmp init01
|
||||
|
||||
|
||||
|
||||
init02:
|
||||
mov dword[backAdr], mode02
|
||||
call setHotKey
|
||||
mode02:
|
||||
mcall 10
|
||||
cmp eax, 2 ;обработка нажатия клавиши
|
||||
je hotkey
|
||||
|
||||
cmp byte[keyState], 0
|
||||
je mode02
|
||||
cmp eax, 6 ;обработка перемещений и нажатия мыши
|
||||
je mouse
|
||||
|
||||
jmp mode02
|
||||
|
||||
|
||||
setHotKey: ;установить горячую клавишу
|
||||
push eax ebx ecx edx
|
||||
xor ecx, ecx
|
||||
mov cl, byte[keyActivate] ;нажатие горячей клавиши
|
||||
mov edx, 0x000
|
||||
mcall 66, 4, ecx, edx
|
||||
|
||||
;mov cl, byte[keyActivate]
|
||||
add cl, 128 ;отпускание горячей клавиши
|
||||
;mov edx, 0x000
|
||||
mcall 66, 4, ecx, edx
|
||||
pop edx ecx ebx eax
|
||||
ret
|
||||
|
||||
|
||||
hotkey:
|
||||
mcall 2
|
||||
cmp eax, 1 ;буфер клавиш пуст?
|
||||
je hotkey.end
|
||||
|
||||
cmp al, 2 ;нас интересует только скан код горячей клавиши, иначе выходим
|
||||
jne hotkey.end
|
||||
|
||||
cmp ah, byte[keyActivate] ;если нажата наша горячая клавиша
|
||||
jne @f
|
||||
mov byte[keyState], 1
|
||||
mov byte[state], UNLOCKd
|
||||
jmp hotkey.end
|
||||
@@:
|
||||
push edx
|
||||
xor edx, edx
|
||||
mov dl, byte[keyActivate]
|
||||
add dl, 128
|
||||
cmp ah, dl ;если отпущена наша горячая клавиша
|
||||
jne @f ;hotkey.end
|
||||
;mov ecx, 0 ;строки для отладки и теста
|
||||
;call run_command
|
||||
mov byte[keyState], 0
|
||||
mov byte[state], LOCKd
|
||||
@@:
|
||||
pop edx
|
||||
.end:
|
||||
jmp mode02
|
||||
|
||||
|
||||
init01:
|
||||
mov dword[backAdr], mode01
|
||||
mode01:
|
||||
mov eax, 10 ; function 10 : wait until event
|
||||
mcall ; event type is returned in eax
|
||||
|
||||
cmp eax, 6 ;обработка перемещений и нажатия мыши
|
||||
je mouse
|
||||
|
||||
jmp START
|
||||
jmp mode01
|
||||
|
||||
|
||||
mouse:
|
||||
;основной цикл программы
|
||||
call get_mouse_pos ;получаем текущие координаты мыши
|
||||
push ebx
|
||||
mcall 37, 0 ;получаем текущие координаты мыши
|
||||
pop ebx
|
||||
|
||||
cmp eax, 0 ;левый верхний угол
|
||||
jne @f
|
||||
@ -72,7 +155,7 @@ mouse:
|
||||
call run_command
|
||||
pop ecx
|
||||
|
||||
jmp START ;finish
|
||||
jmp dword[backAdr] ;finish
|
||||
@@:
|
||||
call get_screen_size ;иначе обновляем размеры экрана
|
||||
|
||||
@ -91,7 +174,7 @@ mouse:
|
||||
call run_command
|
||||
pop ecx
|
||||
|
||||
jmp START
|
||||
jmp dword[backAdr]
|
||||
Ytrue:
|
||||
;если Y равны, то нас интересует X=0 (левый нижний угол) или X=ScreenWidth (правый нижний)
|
||||
shr eax, 16
|
||||
@ -102,7 +185,7 @@ Ytrue:
|
||||
mov ecx, 1
|
||||
call run_command
|
||||
pop ecx
|
||||
jmp START
|
||||
jmp dword[backAdr]
|
||||
@@:
|
||||
cmp ax, word[screen.width]
|
||||
jne unlockend
|
||||
@ -112,17 +195,14 @@ Ytrue:
|
||||
call run_command
|
||||
pop ecx
|
||||
|
||||
jmp START
|
||||
jmp dword[backAdr]
|
||||
|
||||
unlockend:
|
||||
mov byte[state], UNLOCKd
|
||||
jmp START
|
||||
jmp dword[backAdr]
|
||||
|
||||
|
||||
|
||||
;структурка данных для хранения параметров экрана
|
||||
screen:
|
||||
.width dw 0
|
||||
.height dw 0
|
||||
;получить размер экрана
|
||||
get_screen_size:
|
||||
push eax
|
||||
@ -136,14 +216,7 @@ get_screen_size:
|
||||
ret
|
||||
|
||||
|
||||
;получить позицию мыши
|
||||
get_mouse_pos:
|
||||
;push eax
|
||||
push ebx
|
||||
mcall 37, 0
|
||||
pop ebx
|
||||
;pop eax
|
||||
ret
|
||||
|
||||
|
||||
|
||||
;запуск приложения: ecx - активный угол: lu=0, ld=1, ru=2, rd=3
|
||||
@ -151,14 +224,14 @@ run_command:
|
||||
cmp byte[state], UNLOCKd
|
||||
jne run_command.end
|
||||
|
||||
push eax
|
||||
push ebx
|
||||
push ecx
|
||||
; cmp byte[mode], 2 ;если режим второй
|
||||
; jne @f
|
||||
|
||||
push eax ebx ecx
|
||||
|
||||
cmp ecx, 0
|
||||
jne @f
|
||||
mov eax, dword[newData.lu] ;testData.lu
|
||||
mov eax, dword[newData.lu]
|
||||
mov dword[struct70.path_adr], eax
|
||||
jmp .end_set_path
|
||||
@@:
|
||||
@ -196,10 +269,9 @@ run_command:
|
||||
mcall 70, struct70
|
||||
@@:
|
||||
mov byte[state], LOCKd
|
||||
;mov byte[keyState], 0
|
||||
|
||||
pop ecx
|
||||
pop ebx
|
||||
pop eax
|
||||
pop ecx ebx eax
|
||||
.end:
|
||||
ret
|
||||
|
||||
@ -211,23 +283,6 @@ struct70: ;
|
||||
.path db 0 ; "/rd/1/TINYPAD",0 ; путь
|
||||
.path_adr dd 0 ;testData.lu
|
||||
|
||||
|
||||
state: db 0 ; 0=unlock, 1=lock
|
||||
mode: db 0 ;режим работы (для будущего расширения функционала)
|
||||
|
||||
;testData:
|
||||
; .lu db '/rd/1/SHELL', 0
|
||||
; .ld db '/rd/1/RUN', 0
|
||||
; .ru db "/rd/1/TINYPAD", 0
|
||||
; .rd db '/rd/1/File Managers/EOLITE', 0
|
||||
|
||||
newData: ;табличка адресов командных строк
|
||||
.lu dd 0
|
||||
.ld dd 0
|
||||
.ru dd 0
|
||||
.rd dd 0
|
||||
newDataEnd:
|
||||
|
||||
;имя конфигурационного файла
|
||||
fileName: db 'SETTINGS/HOTANGLES.CFG', 0
|
||||
|
||||
@ -242,8 +297,25 @@ loadConfig:
|
||||
|
||||
add edx, eax ;иначе кладём в edx - адрес конца файла
|
||||
|
||||
cmp byte[eax], 121 ;'y' ;если параметр активности приложения имеет статус: не активно
|
||||
jne loadConfig.exit ;то завершаем работу приложения
|
||||
mov byte[mode], 0
|
||||
cmp byte[eax], '0' ;121 ;'y' ;если параметр активности приложения имеет статус: не активно
|
||||
je loadConfig.exit ;то завершаем работу приложения
|
||||
cmp byte[eax], 110 ;'n'
|
||||
je loadConfig.exit
|
||||
|
||||
;иначе выставляем режим
|
||||
cmp byte[eax], '2' ;режим активации по горячей клавише
|
||||
jne @f
|
||||
mov byte[mode], 2
|
||||
jmp loadConfig.modeEnd
|
||||
@@:
|
||||
cmp byte[eax], '3' ;режим жеста при зажатой клавише
|
||||
jne @f
|
||||
mov byte[mode], 3
|
||||
jmp loadConfig.modeEnd
|
||||
@@:
|
||||
mov byte[mode], 1 ;во всех остальных случаях - классический режим
|
||||
.modeEnd:
|
||||
|
||||
push edi
|
||||
push esi
|
||||
@ -316,7 +388,7 @@ selfNameSize = 10 ;
|
||||
;
|
||||
compareBytes:
|
||||
push edi esi ecx ebx
|
||||
mov eax, 0 ;xor eax, eax
|
||||
xor eax, eax
|
||||
mov ecx, selfNameSize ;max размер строк 11
|
||||
@@:
|
||||
mov bl, byte[edi]
|
||||
@ -334,9 +406,6 @@ compareBytes:
|
||||
pop ebx ecx esi edi
|
||||
ret
|
||||
;
|
||||
slotMax dd 0
|
||||
selfPID dd 0
|
||||
buf db 1024 dup(0)
|
||||
copyKill:
|
||||
push eax ebx ecx esi edi
|
||||
|
||||
@ -380,5 +449,31 @@ copyKill:
|
||||
ret
|
||||
|
||||
|
||||
keyActivate db 41 ;16 ;'Q' ;клавиша активации
|
||||
keyState db 0 ;0-клавиша не активна, 1 - клавиша активна
|
||||
|
||||
backAdr rd 1 ;dd 0 ; адрес для возврата из проверки мыши
|
||||
|
||||
;slotMax dd 0
|
||||
;selfPID dd 0
|
||||
;buf db 1024 dup(0)
|
||||
slotMax rd 1
|
||||
selfPID rd 1
|
||||
buf rb 1024
|
||||
|
||||
;структурка данных для хранения параметров экрана
|
||||
screen:
|
||||
.width rw 1 ;dw 0
|
||||
.height rw 1 ;dw 0
|
||||
|
||||
state: rb 1 ;состояние: 0=unlock, 1=lock
|
||||
mode: rb 1 ;режим работы приложения: 0=не работает, 1=классический, 2=по горячей клавише
|
||||
|
||||
newData: ;табличка адресов командных строк
|
||||
.lu rd 1
|
||||
.ld rd 1
|
||||
.ru rd 1
|
||||
.rd rd 1
|
||||
newDataEnd:
|
||||
|
||||
I_END:
|
||||
|
@ -1,13 +1,16 @@
|
||||
Hot Angles
|
||||
|
||||
Version 0.3.3: Sep 25, 2018
|
||||
Version 0.3.5: Oct 5, 2018
|
||||
RU
|
||||
|
||||
Комплект утилит (аналог Hot Corners в других ОС) для расширения возможностей рабочего стола пользователя. Название выбрано путём голосования. В комплект входят две утилиты:
|
||||
@HOTANGLES - основная утилита, позволяющая запускать приложения путём наведения курсора в угол экрана (угол рабочей области);
|
||||
HACONFIG - утилита конфигуратор, позволяющая настроить действия на каждый угол и активировать/деактивировать эту опцию.
|
||||
Файл конфигурации: RD/1/SETTINGS/HOTANGLES.CFG (где RD/1/ это тот же SYS - путь к системной директории). Файл состоит из пяти строк:
|
||||
1) состояние активности опции: y - опция активна, n или любой другой символ - опция отключена;
|
||||
1) состояние активности опции (один символ):
|
||||
1 или y - опция активна, активирован классический режим работы уголков,
|
||||
2 - опция активна, активирован режим работы по горячей клавише,
|
||||
n или любой другой символ - опция отключена;
|
||||
2) команда (полное имя приложения) для верхнего левого угла экрана;
|
||||
3) команда (полное имя приложения) для левого нижнего угла экрана;
|
||||
4) команда (полное имя приложения) для правого верхнего угла экрана;
|
||||
@ -19,16 +22,38 @@ HACONFIG -
|
||||
@HOTANGLES не запустится, если конфигурационный файл отсутствует или был переименован.
|
||||
HACONFIG при отсутствии конфигурационного файла выставляет все поля по умолчанию, но не создаёт файл конфигурации самостоятельно (для этого необходимо нажать кнопку "Применить", тогда отсутствующий файл конфигурации будет создан, а существующий перезаписан).
|
||||
При первом старте утилиты все углы рабочей области настроены на запуск конфигуратора, где вы можете настроить утилиту под себя или отключить её.
|
||||
Hot Angles начиная с revision #7392 включен в состав дистрибутива и добавлен в автозапуск при старте системы. Поддержка русского языка добавлена в revision #7395.
|
||||
Hot Angles начиная с revision #7392 включен в состав дистрибутива и добавлен в автозапуск при старте системы. Поддержка русского языка добавлена в revision #7395. Начиная с версии 0.3.5 добавлен второй режим работы утилиты и возможность выбора программ через Open Dialog.
|
||||
|
||||
В директории extra, рядом с исходным кодом утилит, расположены дополнительные функциональные блоки. На текущий момент директория содержит: 1 утилиту.
|
||||
MIN - минимизировать/свернуть все окна (кроме системных). Вы можете назначить запуск MIN на любой активный угол вашего рабочего стола, чтобы одним движением курсора в этот угол свернуть все окна на экране.
|
||||
См. подробнее раздел "Extra-расширения функциональности".
|
||||
|
||||
|
||||
Режимы работы:
|
||||
--------------------------------------------------
|
||||
Текущая версия конфигуратора и утилиты работают стабильно только в классическом режиме.
|
||||
В классическом режиме угол активируется путём наведения курсора. Всё происходит автоматически. Вы наводите мышь в заданный угол рабочего стола, и запускается приложение, связанное с этим углом.
|
||||
Этот режим активируется символом '1' или символом 'y' в начале конфигурационного файла.
|
||||
|
||||
Начиная с версии 0.3.5 утилита @HOTANGLES поддерживает второй режим работы - активацию углов по горячей клавише. Эта функциональность тестируется, поэтому настроить её через конфигуратор нельзя.
|
||||
Активируется режим символом '2' в начале конфигурационного файла. Изменить клавишу активации нельзя, по умолчанию это символ тильда '~' или '`'. В этом режиме для активации угла требуется зажать клавишу тильда и, одновременно с этим, навести курсор в нужный угол рабочего стола.
|
||||
|
||||
|
||||
Прочие рекомендации:
|
||||
Некоторым пользователям может быть удобно настроить открытие меню при попадании в угол его расположения. Например, если у вас кнопка "Меню" рассположена в левом нижнем углу, то задайте для этого угла команду:
|
||||
--------------------------------------------------
|
||||
Некоторым пользователям может быть удобно настроить открытие меню при попадании в угол его расположения. Например, если у вас кнопка "Меню" расположена в левом нижнем углу, то задайте для этого угла команду:
|
||||
/rd/1/@MENU
|
||||
|
||||
|
||||
Extra-расширения функциональности:
|
||||
--------------------------------------------------
|
||||
Утилита MIN - сворачивает окна на рабочем столе (кроме окон системных процессов с именем, начинающимся с символа @). MIN можно назначить как действие для запуска в Hot Angles, тогда при наведении курсора в заданный угол все окна будут свёрнуты. MIN, как и остальные (extra-расширения) функциональные блоки, не входит в дистрибутив. К тому же утилита очень проста и дублирует функционал панели задач (taskbar). Каждый сам решает о необходимости её использования.
|
||||
СКАЧАТЬ MIN (rev.7417):
|
||||
http://websvn.kolibrios.org/dl.php?repname=Kolibri+OS&path=%2Fprograms%2Fother%2Fha%2Fextra%2FMIN&rev=7417&peg=7417
|
||||
|
||||
|
||||
Влияние на производительность:
|
||||
--------------------------------------------------
|
||||
Если вы используете систему в задачах реального времени или в задачах с высокой нагрузкой на CPU отключите эту опцию. Так же, если вы желаете добиться максимальной скорости работы ОС, то использование этой опции не рекомендуется.
|
||||
Приложение может увеличивать нагрузку на систему в два раза при обычном использовании мыши (перемещение курсора, клики в определённых областях экрана).
|
||||
При выполнении основной функции (запуск любого приложения при наведении курсора в угол экрана) нагрузка на систему возрастает естественным образом.
|
||||
@ -42,7 +67,7 @@ MIN -
|
||||
[-] повреждение файла конфигурации после многократного вкл./выкл. опции Hot Angles;
|
||||
[-] режим явной команды клавишей активации: зажимаем горячую клавишу (например, shift), наводим курсор в угол - происходит реакция;
|
||||
[-] режим жеста/направления: зажимаем активирующую клавишу, после этого приложение анализирует мышь, в зависимости от направления движения мыши (от начальных координат в момент активации опции) выбирается активируемый угол - происходит реакция;
|
||||
[-] добавить диалог выбора пути OpenDialog в конфигураторе;
|
||||
[+] добавить диалог выбора пути OpenDialog в конфигураторе;
|
||||
[+] переход на EditBox из библиотеки box_lib;
|
||||
[+] размазывание текста или его наслоение при вводе в поле EditBox'а;
|
||||
[+] после запуска приложения, все поля находятся в фокусе (это фича из-за бага в компоненте EditBox);
|
||||
|
@ -1,4 +1,4 @@
|
||||
y
|
||||
1
|
||||
/rd/1/HACONFIG
|
||||
/rd/1/HACONFIG
|
||||
/rd/1/HACONFIG
|
||||
|
Loading…
Reference in New Issue
Block a user