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:
theonlymirage 2018-10-05 18:58:13 +00:00
parent 2e3d90aedd
commit 66a0391246
4 changed files with 460 additions and 76 deletions

View File

@ -2,7 +2,7 @@
; Hot Angles Config ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Hot Angles Config ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Compile with FASM ; Compile with FASM
; Version 0.3.2: Sep 24, 2018 ; Version 0.3.5: Oct 5, 2018
; Copyright (c) 2018, Efremenkov Sergey aka TheOnlyMirage ; Copyright (c) 2018, Efremenkov Sergey aka TheOnlyMirage
; All rights reserved. ; All rights reserved.
@ -45,20 +45,24 @@ include '../../macros.inc'
include '../../proc32.inc' include '../../proc32.inc'
include '../../dll.inc' include '../../dll.inc'
include '../../develop/libraries/box_lib/trunk/box_lib.mac' ;компоненты checkBox и editBox 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 Otstup = 30
START: START:
call copyKill ;простейшая защита от запуска второй копии приложения call copyKill ;простейшая защита от запуска второй копии приложения
mcall 68, 11 ;инициализация кучи mcall 68, 11 ;инициализация кучи
;mcall 48,3,sc,sizeof.system_colors ;ïîëó÷èòü ñèñòåìíûå öâåòà
mov eax,48 ;получить системные цвета mov eax,48 ;получить системные цвета
mov ebx,3 mov ebx,3
mov ecx, sc mov ecx, sc
mov edx, sizeof.system_colors mov edx, sizeof.system_colors
mcall mcall
stdcall dll.Load, @IMPORT stdcall dll.Load, @IMPORT
or eax, eax or eax, eax
jnz exit jnz exit
@ -69,6 +73,10 @@ START:
mov ebx,0x27 ;система будет реагировать только на сообщение о перерисовке, нажата кнопка, определённая ранее, событие от мыши (что-то случилось - нажатие на кнопку мыши или перемещение; сбрасывается при прочтении) mov ebx,0x27 ;система будет реагировать только на сообщение о перерисовке, нажата кнопка, определённая ранее, событие от мыши (что-то случилось - нажатие на кнопку мыши или перемещение; сбрасывается при прочтении)
mcall mcall
load_libraries l_libs_start,load_lib_end ;çàãðóçêà áèáëèîòåê(è)
;mcall 48,3,sc,sizeof.system_colors ;ïîëó÷èòü ñèñòåìíûå öâåòà
stdcall [OpenDialog_Init],OpenDialog_data ;ïîäãîòîâêà äèàëîãà
call loadConfig ;загружаем конфигурацию из файла, если нет - то выставляем параметры по умолчанию call loadConfig ;загружаем конфигурацию из файла, если нет - то выставляем параметры по умолчанию
call draw_window ;отрисовать окно приложения call draw_window ;отрисовать окно приложения
@ -123,8 +131,34 @@ exit:
mcall mcall
noclose: noclose:
cmp ah, 2 ;кнопка "Применить" cmp ah, 2 ;кнопка "Применить"
jne butend jne @f ;butend
call applyButton ;вызов нашего обработчика нажатия кнопки 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: butend:
jmp event_wait ;this is for ignored events, useful at development jmp event_wait ;this is for ignored events, useful at development
@ -217,10 +251,14 @@ applyButton:
mov dword[createFile.data_adr], eax ;сохраняем адрес буфера в структуру 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 или нет? cmp word[ch1.flags], 110b ;ch_flag_en and ch_flag_middle ;выставлен checkBox или нет?
jne applyButton.no jne applyButton.no
mov byte[eax], 121 ;èíà÷å êëàä¸ì 'y' mov byte[eax], 49;'1' ;121 ;èíà÷å êëàä¸ì 'y'
.no: .no:
inc eax inc eax
call addPerenos call addPerenos
@ -376,11 +414,14 @@ loadConfig:
add edx, eax ;кладём в edx - адрес конца конфиг.данных add edx, eax ;кладём в edx - адрес конца конфиг.данных
.chStart: .chStart:
cmp byte[eax], 121 ;'y' ;âûñòàâëÿåì checkBox - ïàðàìåòð àêòèâíîñòè ïðèëîæåíèÿ cmp byte[eax], 49;'1' ;121 ;'y' ;âûñòàâëÿåì checkBox - ïàðàìåòð àêòèâíîñòè ïðèëîæåíèÿ
jne loadConfig.no jne @f ;loadConfig.no
.yes: .yes:
mov word[ch1.flags], 110b ;ch_flag_en and ch_flag_middle mov word[ch1.flags], 110b ;ch_flag_en and ch_flag_middle
jmp loadConfig.chEnd jmp loadConfig.chEnd
@@:
cmp byte[eax], 50;'2' ;âòîðîé ðåæèì àêòèâèðîâàí
je loadConfig.yes
.no: .no:
mov word[ch1.flags], 100b ;ch_flag_middle mov word[ch1.flags], 100b ;ch_flag_middle
.chEnd: .chEnd:
@ -556,6 +597,16 @@ draw_window:
mov edx, 0x80000002 mov edx, 0x80000002
mcall 8 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 eax, 12 ; function 12: tell os about windowdraw
mov ebx, 1 ; 1, start of draw mov ebx, 1 ; 1, start of draw
mcall mcall
@ -608,6 +659,52 @@ draw_window:
mov esi, buttonTextSize ;5 ;размер текста в символах mov esi, buttonTextSize ;5 ;размер текста в символах
mcall 4 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 call draw_super_text
LineLength = 62 LineLength = 62
@ -654,6 +751,8 @@ import box_lib,\
;координаты (x,y) = (30, 160) размер чекбокса 12, цвет текста 0x224466 ;координаты (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 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 ;если язык сборки русский if lang eq ru ;если язык сборки русский
@ -725,15 +824,182 @@ draw_super_text:
pop esi edi edx ecx ebx eax pop esi edi edx ecx ebx eax
ret 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 указать edMaxSize = 510 ;теперь с новым компонентом можно и 511 указать
edMax = 0 ;max, size, pos edMax = 0 ;max, size, pos
align 4 align 4
editLU edit_box 180,Otstup,85, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.1, mouse_dd, 0, edMax, edMax ;ed_focus 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,Otstup,120, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.2, mouse_dd, 0, edMax, edMax 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,240,85, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.3, 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,240,120, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.4, 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: dataBuffer:
.1: rb 512 .1: rb 512
@ -748,8 +1014,6 @@ dataBuffer:
;два запасных байта необходимы для того что бы не пепереписать следующией байты, в конце буфера 0 ;два запасных байта необходимы для того что бы не пепереписать следующией байты, в конце буфера 0
dataBufferEnd: dataBufferEnd:
mouse_dd dd ?
sc system_colors
I_END: I_END:
rb 4096 rb 4096

View File

@ -2,7 +2,7 @@
; Hot Angles ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Hot Angles ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Compile with FASM ; Compile with FASM
; Version 0.3.3: Sep 25, 2018 ; Version 0.3.5: Oct 5, 2018
; Copyright (c) 2018, Efremenkov Sergey aka TheOnlyMirage ; Copyright (c) 2018, Efremenkov Sergey aka TheOnlyMirage
; All rights reserved. ; All rights reserved.
@ -30,12 +30,12 @@ use32
org 0x0 ; базовый адрес размещения кода, всегда 0x0 org 0x0 ; базовый адрес размещения кода, всегда 0x0
UNLOCKd = 0 UNLOCKd = 0
LOCKd = 1 LOCKd = 1
; заголовок ; заголовок
db 'MENUET01' ;магический идентификатор db 'MENUET01' ;магический идентификатор
dd 0x01 ;версия dd 0x01 ;версия
dd START_DEBUG ;адрес точки старта программы dd START_DEBUG ;адрес точки старта программы
dd I_END ;адрес конца, по факту размер файла программы dd I_END ;адрес конца, по факту размер файла программы
dd 0x100000 ;требуемое кол-во памяти для загрузки программы dd 0x100000 ;требуемое кол-во памяти для загрузки программы
dd 0x7fff0 ;начальное значение регистра esp - адрес конца области стэка так как стэк растет в сторону меньших адресов dd 0x7fff0 ;начальное значение регистра esp - адрес конца области стэка так как стэк растет в сторону меньших адресов
@ -48,21 +48,104 @@ START_DEBUG:
call copyKill ;простейшая защита от повторного запуска call copyKill ;простейшая защита от повторного запуска
mcall 68, 11 ;инициализация кучи mcall 68, 11 ;инициализация кучи
call loadConfig ;загружаем конфигурацию приложения 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 mov eax, 10 ; function 10 : wait until event
mcall ; event type is returned in eax mcall ; event type is returned in eax
cmp eax, 6 ;обработка перемещений и нажатия мыши cmp eax, 6 ;обработка перемещений и нажатия мыши
je mouse je mouse
jmp START jmp mode01
mouse: mouse:
;основной цикл программы push ebx
call get_mouse_pos ;получаем текущие координаты мыши mcall 37, 0 ;получаем текущие координаты мыши
pop ebx
cmp eax, 0 ;левый верхний угол cmp eax, 0 ;левый верхний угол
jne @f jne @f
@ -72,7 +155,7 @@ mouse:
call run_command call run_command
pop ecx pop ecx
jmp START ;finish jmp dword[backAdr] ;finish
@@: @@:
call get_screen_size ;иначе обновляем размеры экрана call get_screen_size ;иначе обновляем размеры экрана
@ -91,7 +174,7 @@ mouse:
call run_command call run_command
pop ecx pop ecx
jmp START jmp dword[backAdr]
Ytrue: Ytrue:
;если Y равны, то нас интересует X=0 (левый нижний угол) или X=ScreenWidth (правый нижний) ;если Y равны, то нас интересует X=0 (левый нижний угол) или X=ScreenWidth (правый нижний)
shr eax, 16 shr eax, 16
@ -102,7 +185,7 @@ Ytrue:
mov ecx, 1 mov ecx, 1
call run_command call run_command
pop ecx pop ecx
jmp START jmp dword[backAdr]
@@: @@:
cmp ax, word[screen.width] cmp ax, word[screen.width]
jne unlockend jne unlockend
@ -112,17 +195,14 @@ Ytrue:
call run_command call run_command
pop ecx pop ecx
jmp START jmp dword[backAdr]
unlockend: unlockend:
mov byte[state], UNLOCKd mov byte[state], UNLOCKd
jmp START jmp dword[backAdr]
;структурка данных для хранения параметров экрана
screen:
.width dw 0
.height dw 0
;получить размер экрана ;получить размер экрана
get_screen_size: get_screen_size:
push eax push eax
@ -136,14 +216,7 @@ get_screen_size:
ret 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 ;запуск приложения: ecx - активный угол: lu=0, ld=1, ru=2, rd=3
@ -151,14 +224,14 @@ run_command:
cmp byte[state], UNLOCKd cmp byte[state], UNLOCKd
jne run_command.end jne run_command.end
push eax ; cmp byte[mode], 2 ;если режим второй
push ebx ; jne @f
push ecx
push eax ebx ecx
cmp ecx, 0 cmp ecx, 0
jne @f jne @f
mov eax, dword[newData.lu] ;testData.lu mov eax, dword[newData.lu]
mov dword[struct70.path_adr], eax mov dword[struct70.path_adr], eax
jmp .end_set_path jmp .end_set_path
@@: @@:
@ -196,10 +269,9 @@ run_command:
mcall 70, struct70 mcall 70, struct70
@@: @@:
mov byte[state], LOCKd mov byte[state], LOCKd
;mov byte[keyState], 0
pop ecx pop ecx ebx eax
pop ebx
pop eax
.end: .end:
ret ret
@ -211,23 +283,6 @@ struct70: ;
.path db 0 ; "/rd/1/TINYPAD",0 ; путь .path db 0 ; "/rd/1/TINYPAD",0 ; путь
.path_adr dd 0 ;testData.lu .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 fileName: db 'SETTINGS/HOTANGLES.CFG', 0
@ -242,8 +297,25 @@ loadConfig:
add edx, eax ;иначе кладём в edx - адрес конца файла add edx, eax ;иначе кладём в edx - адрес конца файла
cmp byte[eax], 121 ;'y' ;если параметр активности приложения имеет статус: не активно mov byte[mode], 0
jne loadConfig.exit ;то завершаем работу приложения 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 edi
push esi push esi
@ -316,7 +388,7 @@ selfNameSize = 10 ;
; ;
compareBytes: compareBytes:
push edi esi ecx ebx push edi esi ecx ebx
mov eax, 0 ;xor eax, eax xor eax, eax
mov ecx, selfNameSize ;max размер строк 11 mov ecx, selfNameSize ;max размер строк 11
@@: @@:
mov bl, byte[edi] mov bl, byte[edi]
@ -334,9 +406,6 @@ compareBytes:
pop ebx ecx esi edi pop ebx ecx esi edi
ret ret
; ;
slotMax dd 0
selfPID dd 0
buf db 1024 dup(0)
copyKill: copyKill:
push eax ebx ecx esi edi push eax ebx ecx esi edi
@ -380,5 +449,31 @@ copyKill:
ret 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: I_END:

View File

@ -1,13 +1,16 @@
Hot Angles Hot Angles
Version 0.3.3: Sep 25, 2018 Version 0.3.5: Oct 5, 2018
RU RU
Комплект утилит (аналог Hot Corners в других ОС) для расширения возможностей рабочего стола пользователя. Название выбрано путём голосования. В комплект входят две утилиты: Комплект утилит (аналог Hot Corners в других ОС) для расширения возможностей рабочего стола пользователя. Название выбрано путём голосования. В комплект входят две утилиты:
@HOTANGLES - основная утилита, позволяющая запускать приложения путём наведения курсора в угол экрана (угол рабочей области); @HOTANGLES - основная утилита, позволяющая запускать приложения путём наведения курсора в угол экрана (угол рабочей области);
HACONFIG - утилита конфигуратор, позволяющая настроить действия на каждый угол и активировать/деактивировать эту опцию. HACONFIG - утилита конфигуратор, позволяющая настроить действия на каждый угол и активировать/деактивировать эту опцию.
Файл конфигурации: RD/1/SETTINGS/HOTANGLES.CFG (где RD/1/ это тот же SYS - путь к системной директории). Файл состоит из пяти строк: Файл конфигурации: RD/1/SETTINGS/HOTANGLES.CFG (где RD/1/ это тот же SYS - путь к системной директории). Файл состоит из пяти строк:
1) состояние активности опции: y - опция активна, n или любой другой символ - опция отключена; 1) состояние активности опции (один символ):
1 или y - опция активна, активирован классический режим работы уголков,
2 - опция активна, активирован режим работы по горячей клавише,
n или любой другой символ - опция отключена;
2) команда (полное имя приложения) для верхнего левого угла экрана; 2) команда (полное имя приложения) для верхнего левого угла экрана;
3) команда (полное имя приложения) для левого нижнего угла экрана; 3) команда (полное имя приложения) для левого нижнего угла экрана;
4) команда (полное имя приложения) для правого верхнего угла экрана; 4) команда (полное имя приложения) для правого верхнего угла экрана;
@ -19,16 +22,38 @@ HACONFIG -
@HOTANGLES не запустится, если конфигурационный файл отсутствует или был переименован. @HOTANGLES не запустится, если конфигурационный файл отсутствует или был переименован.
HACONFIG при отсутствии конфигурационного файла выставляет все поля по умолчанию, но не создаёт файл конфигурации самостоятельно (для этого необходимо нажать кнопку "Применить", тогда отсутствующий файл конфигурации будет создан, а существующий перезаписан). HACONFIG при отсутствии конфигурационного файла выставляет все поля по умолчанию, но не создаёт файл конфигурации самостоятельно (для этого необходимо нажать кнопку "Применить", тогда отсутствующий файл конфигурации будет создан, а существующий перезаписан).
При первом старте утилиты все углы рабочей области настроены на запуск конфигуратора, где вы можете настроить утилиту под себя или отключить её. При первом старте утилиты все углы рабочей области настроены на запуск конфигуратора, где вы можете настроить утилиту под себя или отключить её.
Hot Angles начиная с revision #7392 включен в состав дистрибутива и добавлен в автозапуск при старте системы. Поддержка русского языка добавлена в revision #7395. Hot Angles начиная с revision #7392 включен в состав дистрибутива и добавлен в автозапуск при старте системы. Поддержка русского языка добавлена в revision #7395. Начиная с версии 0.3.5 добавлен второй режим работы утилиты и возможность выбора программ через Open Dialog.
В директории extra, рядом с исходным кодом утилит, расположены дополнительные функциональные блоки. На текущий момент директория содержит: 1 утилиту. В директории extra, рядом с исходным кодом утилит, расположены дополнительные функциональные блоки. На текущий момент директория содержит: 1 утилиту.
MIN - минимизировать/свернуть все окна (кроме системных). Вы можете назначить запуск MIN на любой активный угол вашего рабочего стола, чтобы одним движением курсора в этот угол свернуть все окна на экране. MIN - минимизировать/свернуть все окна (кроме системных). Вы можете назначить запуск MIN на любой активный угол вашего рабочего стола, чтобы одним движением курсора в этот угол свернуть все окна на экране.
См. подробнее раздел "Extra-расширения функциональности".
Режимы работы:
--------------------------------------------------
Текущая версия конфигуратора и утилиты работают стабильно только в классическом режиме.
В классическом режиме угол активируется путём наведения курсора. Всё происходит автоматически. Вы наводите мышь в заданный угол рабочего стола, и запускается приложение, связанное с этим углом.
Этот режим активируется символом '1' или символом 'y' в начале конфигурационного файла.
Начиная с версии 0.3.5 утилита @HOTANGLES поддерживает второй режим работы - активацию углов по горячей клавише. Эта функциональность тестируется, поэтому настроить её через конфигуратор нельзя.
Активируется режим символом '2' в начале конфигурационного файла. Изменить клавишу активации нельзя, по умолчанию это символ тильда '~' или '`'. В этом режиме для активации угла требуется зажать клавишу тильда и, одновременно с этим, навести курсор в нужный угол рабочего стола.
Прочие рекомендации: Прочие рекомендации:
Некоторым пользователям может быть удобно настроить открытие меню при попадании в угол его расположения. Например, если у вас кнопка "Меню" рассположена в левом нижнем углу, то задайте для этого угла команду: --------------------------------------------------
Некоторым пользователям может быть удобно настроить открытие меню при попадании в угол его расположения. Например, если у вас кнопка "Меню" расположена в левом нижнем углу, то задайте для этого угла команду:
/rd/1/@MENU /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 отключите эту опцию. Так же, если вы желаете добиться максимальной скорости работы ОС, то использование этой опции не рекомендуется. Если вы используете систему в задачах реального времени или в задачах с высокой нагрузкой на CPU отключите эту опцию. Так же, если вы желаете добиться максимальной скорости работы ОС, то использование этой опции не рекомендуется.
Приложение может увеличивать нагрузку на систему в два раза при обычном использовании мыши (перемещение курсора, клики в определённых областях экрана). Приложение может увеличивать нагрузку на систему в два раза при обычном использовании мыши (перемещение курсора, клики в определённых областях экрана).
При выполнении основной функции (запуск любого приложения при наведении курсора в угол экрана) нагрузка на систему возрастает естественным образом. При выполнении основной функции (запуск любого приложения при наведении курсора в угол экрана) нагрузка на систему возрастает естественным образом.
@ -42,7 +67,7 @@ MIN -
[-] повреждение файла конфигурации после многократного вкл./выкл. опции Hot Angles; [-] повреждение файла конфигурации после многократного вкл./выкл. опции Hot Angles;
[-] режим явной команды клавишей активации: зажимаем горячую клавишу (например, shift), наводим курсор в угол - происходит реакция; [-] режим явной команды клавишей активации: зажимаем горячую клавишу (например, shift), наводим курсор в угол - происходит реакция;
[-] режим жеста/направления: зажимаем активирующую клавишу, после этого приложение анализирует мышь, в зависимости от направления движения мыши (от начальных координат в момент активации опции) выбирается активируемый угол - происходит реакция; [-] режим жеста/направления: зажимаем активирующую клавишу, после этого приложение анализирует мышь, в зависимости от направления движения мыши (от начальных координат в момент активации опции) выбирается активируемый угол - происходит реакция;
[-] добавить диалог выбора пути OpenDialog в конфигураторе; [+] добавить диалог выбора пути OpenDialog в конфигураторе;
[+] переход на EditBox из библиотеки box_lib; [+] переход на EditBox из библиотеки box_lib;
[+] размазывание текста или его наслоение при вводе в поле EditBox'а; [+] размазывание текста или его наслоение при вводе в поле EditBox'а;
[+] после запуска приложения, все поля находятся в фокусе (это фича из-за бага в компоненте EditBox); [+] после запуска приложения, все поля находятся в фокусе (это фича из-за бага в компоненте EditBox);

View File

@ -1,4 +1,4 @@
y 1
/rd/1/HACONFIG /rd/1/HACONFIG
/rd/1/HACONFIG /rd/1/HACONFIG
/rd/1/HACONFIG /rd/1/HACONFIG