diff --git a/programs/other/ha/HACONFIG.ASM b/programs/other/ha/HACONFIG.ASM index 49eaee468b..d389422640 100644 --- a/programs/other/ha/HACONFIG.ASM +++ b/programs/other/ha/HACONFIG.ASM @@ -2,7 +2,7 @@ ; Hot Angles Config ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Compile with FASM -; Version 0.3.6: Oct 9, 2018 +; Version 0.3.7: Oct 14, 2018 ; Copyright (c) 2018, Efremenkov Sergey aka TheOnlyMirage ; All rights reserved. @@ -115,6 +115,7 @@ event_wait: invoke edit_box_mouse, editRU invoke edit_box_mouse, editRD ;stdcall [kmainmenu_dispatch_cursorevent], [modeMenu] ;проверка мыши для комбобокса + invoke edit_box_mouse, editRadius jmp event_wait @@ -127,10 +128,66 @@ key: ; Keypress event handler mov eax, 2 ; The key is returned in ah. The key must be mcall ; read and cleared from the system queue. + ;push eax invoke edit_box_key, editLU invoke edit_box_key, editLD invoke edit_box_key, editRU invoke edit_box_key, editRD + invoke edit_box_key, editRadius + ;pop eax + + cmp eax, 1 + je event_wait ;.end ;@f + cmp word[hkSymbol], 0 + jne event_wait ;.end ;@f + cmp al, 0 + jne .next + mov byte[hkSymbol], ah + + push eax ecx esi ;сохраняем сканкод клавиши + shr eax, 16 + mov byte[keyscan], al + mov ecx, 0 + mov cl, al ;byte[keyscan] + mov esi, keystr.data + call IntToStr + + ;считаем полученный размер строки + xor ecx, ecx + mov esi, keystr.data + @@: + cmp byte[esi], 0 + je @f + inc esi + inc ecx + ;cmp ecx, 4 + ;je @f + jmp @b + @@: + ;и сохраняем его + mov dword[keystr.size], ecx + +; cmp ecx, 3 +; jbe @f +; mcall -1 +; @@: + + pop esi ecx eax + + jmp red +.next: + ;cmp al, 2 + ;jne @f + ;cmp ah, 0 + ;jne @f + ;считываем управляющие клавиши + ;shr eax, 16 + ;bt eax, 0 ;left shift + ;jne @f + ;mov byte[hkSymbol], 2 + ;jmp red +@@: +;.end: jmp event_wait ; Just read the key, ignore it and jump to event_wait. button: ; Buttonpress event handler @@ -177,17 +234,22 @@ noclose: push eax ebx ecx mcall 9, pi, -1 ;get window coord - mov eax, dword[pi+34] - add eax, buttonModeX ;+ 5 - mov word[coordModeMenu.x], ax + mov eax, dword[pi+34] + add eax, buttonModeX ;+ 5 + mov word[coordModeMenu.x], ax - mov eax, dword[pi+38] - add eax, buttonModeY + 17 ;20 ;42 - mov word[coordModeMenu.y], ax + mov eax, dword[pi+38] + add eax, buttonModeY + 13 ;17 + mov word[coordModeMenu.y], ax - stdcall [ksubmenu_draw], [modeMenu], coordModeMenu + stdcall [ksubmenu_draw], [modeMenu], coordModeMenu pop ecx ebx eax jmp event_wait +@@: + cmp ah, 9 + jne @f + mov word[hkSymbol], 0 + jmp red ;event_wait @@: cmp ah, 110 jne @f @@ -227,8 +289,8 @@ createFile: .path_adr dd fileName ;путь ;строка параметров по умолчанию и её размер -defaultDataForConfig db 121,13,10,'/rd/1/HACONFIG',13,10,'/rd/1/HACONFIG',13,10,'/rd/1/HACONFIG',13,10,'/rd/1/HACONFIG',13,10 -defaultDataSize = 48+19 +defaultDataForConfig db 121,13,10,'/rd/1/HACONFIG',13,10,'/rd/1/HACONFIG',13,10,'/rd/1/HACONFIG',13,10,'/rd/1/HACONFIG',13,10,'Space',13,10,'57',13,10,'10',13,10,'s',13,10 +defaultDataSize = 85 ;48+19+4 copyParam: ;копирует параметр(команду запуска) в буфер (см. дальше) @@ -271,11 +333,21 @@ applyButton: ;mov dword[createFile.size], defaultDataSize ;вычислим размер файла конфигурации в байтах - mov ecx, 5*2+1 ;1 байт на состояние активности и 5 пар переносов строк (символы 13, 10) + mov ecx, 9*2+1 ;1 байт на состояние активности и 9 пар переносов строк (символы 13, 10) add ecx, dword[editLU.size] ;плюс размер каждой строки в байтах add ecx, dword[editLD.size] add ecx, dword[editRU.size] add ecx, dword[editRD.size] ;dataBuffer.size4] + add ecx, dword[editRadius.size] + add ecx, dword[hkSize] ;размер имени активационной кнопки + add ecx, dword[keystr.size] ;размер сканкода активационной кнопки + inc ecx ; ещё 1 байт для хранения размера элементов + ;mov ecx, 85 + + cmp dword[keystr.size], 3 + jbe @f + ;mcall -1 + @@: ;если заданы пустые строки, то мы автоматически добавляем знак минус, значит размер +1 байт cmp dword[editLU.size], 0 @@ -304,7 +376,6 @@ applyButton: ;cmp byte[mode], 0 ;jne @f ;@@: - ; push ebx ;сохраняем выбранный режим mov bl, byte[mode] @@ -337,6 +408,41 @@ applyButton: call copyParam call addPerenos ;добавляем перенос строки + ;сохраняем кнопку активации + call saveKey + call addPerenos + + ;сохраняем сканкод кнопки + mov esi, keystr.data ;записываем строку keystr в файл + xor ebx, ebx + @@: + cmp byte[esi], 0 + je @f + mov bl, byte[esi] + mov byte[eax], bl + inc eax + inc esi + cmp esi, keystr.size-1 + jae @f + jmp @b + @@: + call addPerenos + + ;сохраняем радиус + ;!!! если радиус оставлен пустым, то нужно сохранять значение по умолчанию (сейчас пишется '-') + mov esi, radiusBuffer.data + mov ebx, editRadius.size ;radiusBuffer.size + call copyParam + call addPerenos + + ;добавляем размер элементов + push ebx ;сохраняем выбранный режим + mov bl, byte[sizeStyle] + mov byte[eax], bl + pop ebx + inc eax + call addPerenos + pop ebx esi @@ -440,6 +546,9 @@ UpdateEditsSizes: mov eax, dword[editRD.size] mov dword[dataBuffer.size4], eax + mov eax, dword[editRadius.size] + mov dword[radiusBuffer.size], eax + pop eax ret @@ -474,7 +583,13 @@ loadConfig: mov byte[mode], 48 ;'0' jmp loadConfig.modeEnd @@: - mov byte[mode], 49 ;'1' иначе по умолчанию включён классический режим работы + cmp bl, 'y' ;если y - то классический режим + jne @f + mov byte[mode], 49 ;'1' + jmp loadConfig.modeEnd +@@: + mov byte[mode], 48 ;'0' иначе по умолчанию отключено + ;mov byte[mode], 49 ;'1' иначе по умолчанию включён классический режим работы .modeEnd: pop ebx ;jmp loadConfig.end ;команда для удобства отладки и поиска ошибок @@ -530,6 +645,18 @@ loadConfig: cmp edi, dataBuffer.size1 ;если это был последний буфер (и мы вышли за адреса размеров буферов), то выходим jb loadConfig.block + call readOptKey ;считываем клавишу + call gotoEndString + + ;считываем сканкод клавиши + call readScanKey + call gotoEndString + + call readOptRadius ;считываем значение радиуса для mode 3 + call gotoEndString + call readOptSize ;считываем размер элементов + call gotoEndString + pop eax ebx ecx esi edi jmp loadConfig.end @@ -544,10 +671,333 @@ loadConfig: mcall 68, 13, ecx ;выгружаем файл из памяти @@: call updateParams ;применяем настройки каждого буфера + call setMySize ;применяем настройки размера элементов pop edx ecx ebx eax ret +setMySize: + push eax + ;выставляем mysize в зависимости от значения sizeStyle + cmp byte[sizeStyle], '0' + jb @f + cmp byte[sizeStyle], '7' + ja @f + mov eax, 0 ;если значение размера задано, то его и выставляем + mov al, byte[sizeStyle] + sub al, '0' + jmp .end +@@: + cmp byte[sizeStyle], 'a' + je .auto + ;cmp byte[sizeStyle], 's' + ;je .system +.system: ;иначе значение по умолчанию: s - системная +; push ebx ecx + ;!!! +; mov eax, 9 +; mcall 48, 11 ;получаем системный размер шрифта + ;eax - высота шрифта в пикселях +; mov ecx, eax +; push eax +; mcall 48, 12, ecx ;применяем размер шрифта +; pop eax +; pop ecx ebx + ;temp fix - делим на текущий размер шрифта and -1 +; push ebx edx +; mov ebx, 9 + ;div ebx +; pop edx ebx + ;cmp eax, 0 + ;je .end + ;dec eax + mov eax, 0 ;xor eax, eax ;test temp + jmp .end +.auto: ;a - выставляем в зависимости от разрешения экрана + ;!!! + mcall 14 + push ebx + xor ebx, ebx + mov bx, ax + shr eax, 16 + cmp ax, bx ;получаем больший размер стороны + jae .a + mov ax, bx +.a: + pop ebx + cmp ax, 1919 ;размеры полученные выше от 0 и на 1 меньше + jb .size0 + cmp ax, 2047 + jb .size1 + cmp ax, 4095 + jb .size2 + cmp ax, 8191 + jb .size3 + + jmp .size4 + +.size0: + mov eax, 0 + jmp .end +.size1: + mov eax, 1 + jmp .end +.size2: + mov eax, 2 + jmp .end +.size3: + mov eax, 3 + jmp .end +.size4: + mov eax, 4 + jmp .end +.size5: + mov eax, 5 + jmp .end +.size6: + mov eax, 6 + jmp .end +.size7: + mov eax, 7 + jmp .end + +;.default: +; mov eax, 1 +.end: + mov byte[mysize], al ;mov dword[mysize], eax + pop eax + ret + + +readScanKey: + ;пропускаем переносы строк в начале + cmp eax, edx ;если файл закончился, то + ja .default ;настройки по умолчанию + cmp byte[eax], 10 + je @f + cmp byte[eax], 0 + je @f + cmp byte[eax], 13 + je @f + + push ecx ebx esi + mov ecx, 0 ;xor ecx, ecx + mov esi, keystr.data +.copy: + mov bl, byte[eax] + cmp bl, 0 + je .copyEnd + cmp bl, 10 + je .copyEnd + cmp bl, 13 + je .copyEnd + cmp esi, keystr.size-1 + jae .copyEnd + mov byte[esi], bl + inc esi + inc eax + inc ecx + jmp .copy +.copyEnd: + mov byte[esi], 0 + mov dword[keystr.size], ecx + pop esi ebx ecx + + jmp .end +@@: + inc eax + jmp readScanKey +.default: + mov byte[keyscan], 57 + mov word[keystr.data], '57' + mov byte[keystr.data+2], 0 + mov dword[keystr.size], 2 +.end: + ret + +readOptKey: ;1;3;4;5 - space or shift + ;пропускаем переносы строк в начале + cmp eax, edx ;если файл закончился, то + ja .default ;настройки по умолчанию + cmp byte[eax], 10 + je @f + cmp byte[eax], 0 + je @f + cmp byte[eax], 13 + je @f + ;иначе читаем клавишу и выходим + cmp dword[eax], 'Ctrl' + jne .notCtrl + mov byte[hkSymbol], 3 + mov dword[hkSize], 4 + jmp .end +.notCtrl: + cmp dword[eax], 'Shif' + jne .notShift + mov byte[hkSymbol], 2 + mov dword[hkSize], 5 + jmp .end +.notShift: + cmp dword[eax], 'Spac' + jne .notSpace + mov byte[hkSymbol], 32 + mov dword[hkSize], 5 + jmp .end +.notSpace: + cmp word[eax], 'Al' + jne .notAlt + mov byte[hkSymbol], 1 + mov dword[hkSize], 3 + jmp .end +.notAlt: + ;убедимся, что там 1 символ, а не строка + cmp byte[eax+1], 10 + je .oneSymb + cmp byte[eax+1], 0 + je .oneSymb + cmp byte[eax+1], 13 + je .oneSymb + jmp .default +.oneSymb: + ;проверяем, что символ разрешённый !!! + + ;добавляем символ как есть + push ebx + ;xor ebx, ebx + mov bl, byte[eax] + mov byte[hkSymbol], bl + mov dword[hkSize], 1 + pop ebx + + jmp .end +@@: + inc eax + jmp readOptKey + +.default: + mov byte[hkSymbol], 32 + mov dword[hkSize], 5 +.end: + mov byte[hkSymbol+1], 0 + ret + +;проходим до конца текущей строки +gotoEndString: + cmp eax, edx ;если файл закончился, то + ja @f ;выходим + cmp byte[eax], 10 + je @f + cmp byte[eax], 0 + je @f + cmp byte[eax], 13 + je @f + ;иначе переходим на следующий символ + inc eax + jmp gotoEndString +@@: + ret + +readOptRadius: + ;пропускаем переносы строк в начале + cmp eax, edx ;если файл закончился, то + ja .default ;настройки по умолчанию + cmp byte[eax], 10 + je @f + cmp byte[eax], 0 + je @f + cmp byte[eax], 13 + je @f + + ;иначе считываем значение + push ebx ecx + xor ecx, ecx +.readValue: + mov bl, byte[eax] + mov byte[radiusBuffer.data+ecx], bl + inc ecx + inc eax + cmp eax, edx ;если файл закончился, то выход + ja .readEnd + cmp byte[eax], 10 + je .readEnd + cmp byte[eax], 0 + je .readEnd + cmp byte[eax], 13 + je .readEnd + cmp ecx, 6 + jae .readEnd + jmp .readValue +.readEnd: + mov byte[radiusBuffer.data+ecx], 0 + mov dword[radiusBuffer.size], ecx + pop ecx ebx + + jmp .end +@@: + inc eax + jmp readOptRadius +.default: + mov byte[radiusBuffer.data], '0' + mov byte[radiusBuffer.data+1], 0 + mov dword[radiusBuffer.size], 1 +.end: + + ret + + +readOptSize: + ;пропускаем переносы строк в начале + cmp eax, edx ;если файл закончился, то + ja .default ;настройки по умолчанию + cmp byte[eax], 10 + je @f + cmp byte[eax], 0 + je @f + cmp byte[eax], 13 + je @f + + ;проверяем, что это допустимое значение: 1-7, a, s + cmp byte[eax], 'a' + je .setValue + cmp byte[eax], 's' + je .setValue + cmp byte[eax], '0' + je .setValue + cmp byte[eax], '1' + je .setValue + cmp byte[eax], '2' + je .setValue + cmp byte[eax], '3' + je .setValue + cmp byte[eax], '4' + je .setValue + cmp byte[eax], '5' + je .setValue + cmp byte[eax], '6' + je .setValue + cmp byte[eax], '7' + je .setValue + + jmp .default ;иначе ставим значение по умолчанию + +.setValue: + push ebx + mov bl, byte[eax] + mov byte[sizeStyle], bl + pop ebx + + jmp .end +@@: + inc eax + jmp readOptSize +.default: + mov byte[sizeStyle], 's' ;системный +.end: + ret + + + + updateParams: ;max, size, pos push eax mov eax, dword[dataBuffer.size1] @@ -565,6 +1015,10 @@ updateParams: ;max, size, pos mov eax, dword[dataBuffer.size4] mov dword[editRD.size], eax mov dword[editRD.pos], eax + + mov eax, dword[radiusBuffer.size] + mov dword[editRadius.size], eax + mov dword[editRadius.pos], eax pop eax ret @@ -639,7 +1093,7 @@ copyKill: ret WindowsWidth = 450 - WindowsHeight = 195 + WindowsHeight = 195 + 35 - 5 coord: ;координаты окна приложения .y dw 0 .x dw 0 @@ -697,13 +1151,14 @@ draw_window: invoke edit_box_draw, editRD ;рисуем кнопку + buttonAppleY = WindowsHeight-35 ;160 mov ebx, (WindowsWidth-80-Otstup)*65536 + 80 ;координата X, ширина кнопки - mov ecx, 160*65536 + 20 ;координата Y, высота кнопки + mov ecx, buttonAppleY*65536 + 20 ;координата Y, высота кнопки mov edx, 0x00000002 ;2 ;номер кнопки mov esi, 0x00AABBCC ;цвет кнопки mcall 8 ;рисуем текст кнопки - mov ebx, (WindowsWidth-80-Otstup+25-buttonTextXoffset) * 65536 + 166 ;координаты текста (x, y) + mov ebx, (WindowsWidth-80-Otstup+25-buttonTextXoffset) * 65536 + (buttonAppleY+6) ;координаты текста (x, y) mov ecx, 0xFFFFFF ;белый цвет текста mov edx, buttonText mov esi, buttonTextSize ;размер текста в символах @@ -761,7 +1216,8 @@ draw_window: buttonModeX = 30 ;433 buttonModeY = 160 ;50 buttonModeWidth = 221 - buttonModeHeight = 20 + buttonModeHeight = 14 ;20 + buttonModeTextYoffset = 3;6 buttonModeTextXoffset = 5 mov ebx, buttonModeX*65536 + buttonModeWidth ;X + Width mov ecx, buttonModeY*65536 + buttonModeHeight ;Y + Height @@ -773,21 +1229,73 @@ draw_window: mov edx, 0xAABBCC mcall 13 ;draw text for button Mode - mov ebx, (buttonModeX+buttonModeTextXoffset) * 65536 + (buttonModeY+6) ;(x, y) + mov ebx, (buttonModeX+buttonModeTextXoffset) * 65536 + (buttonModeY+buttonModeTextYoffset) ;(x, y) mov ecx, 0x000000 call setTextModeMenu mov esi, valueModeMenuSize mcall 4 - mov ebx, (buttonModeX+buttonModeWidth-12) * 65536 + (buttonModeY+6) + mov ebx, (buttonModeX+buttonModeWidth-12) * 65536 + (buttonModeY+buttonModeTextYoffset) mov ecx, 0x80FFFFFF mov edx, symbolDownArrow mcall 4 + ;кнопка выбора горячей клавиши + buttonHotKeyX = 280-10 + buttonHotKeyWidth = 90 + mov edx, 0x80000009 ;удаляем + mcall 8 + cmp byte[mode], 49 ;рисуем выбор клавиши, только если mode > 1 + jbe @f + ;рисуем новую + push eax ebx ecx edx esi + mov ebx, buttonHotKeyX*65536 + buttonHotKeyWidth ;X + Width + mov ecx, buttonModeY*65536 + buttonModeHeight ;Y + Height + mov edx, 0x00000009 ;button id + mov esi, 0x00FFFFFF ;color button + mcall 8 + pop esi edx ecx ebx eax + ;текст подсказки для горячей клавиши + mov ebx, (buttonHotKeyX+buttonModeTextXoffset) * 65536 + (buttonModeY+buttonModeTextYoffset) ;(x, y) + mov ecx, 0x80224466 + call setTextForHotKey + mov esi, valueModeMenuSize + mcall 4 + ;заголовок + push eax ebx ecx edx edi esi + mov ebx, buttonHotKeyX * 65536 + (buttonModeY-11) + mov ecx, 0x80224466 + mov edx, hkCaption + mov esi, 3 + mcall 4 + pop esi edi edx ecx ebx eax + @@: + + ;отображаем настройку радиуса действия жеста, только если выбран режим 3 + cmp byte[mode], 51 + jne @f + ;заголовок + push eax ebx ecx edx edi esi + mov ebx, (buttonHotKeyX + buttonHotKeyWidth + 20) * 65536 + (buttonModeY-11) + mov ecx, 0x80224466 + mov edx, radiusCaption + mov esi, 3 + mcall 4 + pop esi edi edx ecx ebx eax + invoke edit_box_draw, editRadius + @@: + call draw_super_text LineLength = 62 mov ebx, 40 * 65536 + 36 ; draw info text with function 4 (x, y) + + ;xor ecx, ecx + ;mov cl, 1 ;byte[mysize] + ;shl ecx, 24 + ;add ecx, 0x224466 + ;or ecx, 0x00224466 ;80224466 mov ecx, 0x224466 + mov edx, text mov esi, LineLength mov eax, 4 @@ -805,6 +1313,79 @@ draw_window: ret +hkSymbol: db 0, 0 + +setTextForHotKey: + push eax + mov al, byte[hkSymbol] + cmp al, 0 + jne @f + mov edx, hkHint + mov dword[hkSize], 5 ;значение по умолчанию SPACE ;shift + jmp setTextForHotKey.end +@@: + cmp al, 1 + jne @f + mov edx, hkAlt + mov dword[hkSize], 3 + jmp setTextForHotKey.end +@@: + cmp al, 2 + jne @f + mov edx, hkShift + mov dword[hkSize], 5 + jmp setTextForHotKey.end +@@: + cmp al, 3 + jne @f + mov edx, hkCtrl + mov dword[hkSize], 4 + jmp setTextForHotKey.end +@@: + cmp al, 32 + jne @f + mov edx, hkSpace + mov dword[hkSize], 5 + jmp setTextForHotKey.end +@@: + cmp al, 96 ;'`' + je setTextForHotKey.symb + cmp al, 126 ;'~' + je setTextForHotKey.symb + cmp al, 48 ;'0' + jb @f + cmp al, 57 ;'9' + ja @f +.symb: + mov edx, hkSymbol + mov dword[hkSize], 1 + jmp setTextForHotKey.end +@@: + cmp al, 97 ;'a' + jb @f + cmp al, 122 ;'z' + ja @f + ;jmp setTextForHotKey.symb + mov edx, hkSymbol + mov dword[hkSize], 1 + jmp setTextForHotKey.end +@@: + cmp al, 65 ;'A' + jb @f + cmp al, 90 ;'Z' + ja @f + ;jmp setTextForHotKey.symb + mov edx, hkSymbol + mov dword[hkSize], 1 + jmp setTextForHotKey.end +@@: + mov word[hkSymbol], 0 ;если же попало что-то неизвестное, то сотрём его + mov edx, hkHint + mov dword[hkSize], 5 ;shift or space - значение по умолчанию +.end: + pop eax + ret + setTextModeMenu: cmp byte[mode], 48 @@ -831,6 +1412,49 @@ setTextModeMenu: ret + + +saveKey: + cmp word[hkSymbol], 0 + je .default + cmp byte[hkSymbol], 1 + je .alt + cmp byte[hkSymbol], 2 + je .shift + cmp byte[hkSymbol], 3 + je .ctrl + cmp byte[hkSymbol], 32 + je .space +.other: + mov esi, hkSymbol + mov byte[esi+1], 0 + mov dword[hkSize], 1 + jmp .end +.space: + mov esi, hkSpace + mov dword[hkSize], 5 + jmp .end +.ctrl: + mov esi, hkCtrl + mov dword[hkSize], 4 + jmp .end +.alt: + mov esi, hkAlt + mov dword[hkSize], 3 + jmp .end +.default: +.shift: + mov esi, hkShift + mov dword[hkSize], 5 +.end: + mov ebx, hkSize ;указатель на dword[hkSize] + call copyParam + ret + + + + + align 16 @IMPORT: @@ -883,6 +1507,10 @@ head_f_i: err_message_found_lib1 db 'ЌҐ ­ ©¤Ґ­  ЎЁЎ«Ё®вҐЄ  ',39,'kmenu.obj',39,0 err_message_import1 db 'ЋиЁЎЄ  ЇаЁ Ё¬Ї®а⥠ЎЁЎ«Ё®вҐЄЁ ',39,'kmenu',39,0 +hkCaption: db 'Љ« ўЁи :',0 +;hkHint: db 'Ќ ¦¬ЁвҐ «оЎго Є« ўЁиг',0 +radiusCaption: db 'ђ ¤Ёгб:',0 + else ;иначе английский текст text db "This is a Hot Angles Configurator. " @@ -917,13 +1545,29 @@ head_f_i: err_message_found_lib1 db 'Could not find library ',39,'kmenu.obj',39,0 err_message_import1 db 'Error importing library ',39,'kmenu',39,0 +hkCaption: db 'Key:',0 +;hkHint: db 'press any key',0 +radiusCaption: db 'Radius:',0 + end if +hkAlt: db 'Alt',0 +hkShift: db 'Shift',0 +hkCtrl: db 'Ctrl',0 +hkSpace: db 'Space',0 +hkHint: db '?',0 +hkSize: rd 1 ;размер строки с именем клавиши draw_super_text: push eax ebx ecx edx edi esi + + mov ecx, 0 + mov ch, byte[mysize] + shl ecx, 16 + add ecx, 0x224466 + mov ebx, Otstup * 65536 + 74 ; draw info text with function 4 (x, y) - mov ecx, 0x224466 + ;mov ecx, 0x224466 mov eax, superText.lu mov edx, eax mov esi, superTextSize @@ -950,6 +1594,12 @@ draw_super_text: mov esi, 3 mcall 4 +; mov ebx, buttonHotKeyX * 65536 + (buttonModeY-11) +; or ecx, 0x80000000 +; mov edx, hkCaption +; mov esi, 3 +; mcall 4 + pop esi edi edx ecx ebx eax ret @@ -1027,6 +1677,72 @@ copyPath: ret +IntToStr: ;in esi - строка; eсx - число + push eax ecx edx esi + cmp ecx, 0 + jne @f + mov byte[esi], 48 ; '0' + inc esi + jmp .end +@@: + mov eax, ecx + mov ecx, 10 +.next: + mov edx, 0 + div ecx + add edx, 48 + + mov byte[esi], dl + + inc esi + cmp eax, 0 + je .end + jmp .next +.end: + mov byte[esi], 0 ;кладём завершающий ноль + pop esi edx ecx eax + call reverseString ;делаем реверс строки + ret + +;вход: esi - указатель на строку +reverseString: + push eax esi edi + + mov al, byte[esi] ;если строка пустая то выходим реверс делать не надо + cmp al, 0 + je reverseString.end + + mov edi, esi ;иначе найдём позицию последнего символа строки и положим её в edi +.go_last_symbol: + mov al, byte[edi+1] + cmp al, 0 + je @f + + inc edi + jmp reverseString.go_last_symbol +@@: + push ebx +.rev: + cmp esi, edi + jae @f + + ;меняем местами символы в цикле + mov al, byte[edi] + mov bl, byte[esi] + mov byte[edi], bl + mov byte[esi], al + + inc esi + dec edi + jmp reverseString.rev +@@: + pop ebx +.end: + pop edi esi eax + ret + + + align 4 but_open_dlg: pushad @@ -1117,6 +1833,7 @@ editLU edit_box 180-buttonW,Otstup+buttonW,85, 0xffffff, 0x6a9480, 0, 0xAABBCC 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 +editRadius edit_box 40,(buttonHotKeyX + buttonHotKeyWidth + 20),buttonModeY, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, 4, radiusBuffer.data, mouse_dd, ed_figure_only, edMax, edMax align 4 import_libkmenu: @@ -1142,8 +1859,16 @@ dd 0,0 akmenuitem_delete db 'kmenuitem_delete',0 akmenuitem_draw db 'kmenuitem_draw',0 -mouse_dd dd ? +;mouse_dd dd ? sc system_colors +mouse_dd rd 1 + +sizeStyle: rb 1 ;размер текста и остальных элементов окна +mysize: rb 1 ;rd 1 +radiusBuffer: ;буфер для поля радиуса жеста + .data: rb 6 + .size: rd 1 +radiusBufferEnd: button_press rd 0 ;for kmenu @@ -1156,6 +1881,10 @@ rb 1024 procinfo process_information pi rb 1024 +keyscan: rb 1 +keystr: + .data: rb 4 ;строка со значением сканкода активационной клавиши + .size: rd 1 ;размер содержимого строки без последнего нуля dataBuffer: .1: rb 512 diff --git a/programs/other/ha/HOTANGLES.ASM b/programs/other/ha/HOTANGLES.ASM index 49d42eb238..d46e66c93e 100644 --- a/programs/other/ha/HOTANGLES.ASM +++ b/programs/other/ha/HOTANGLES.ASM @@ -2,7 +2,7 @@ ; Hot Angles ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Compile with FASM -; Version 0.3.6: Oct 9, 2018 +; Version 0.3.7: Oct 14, 2018 ; Copyright (c) 2018, Efremenkov Sergey aka TheOnlyMirage ; All rights reserved. @@ -31,6 +31,7 @@ org 0x0 ; UNLOCKd = 0 LOCKd = 1 +SUPERLOCKd = 2 ; заголовок db 'MENUET01' ;магический идентификатор @@ -118,9 +119,11 @@ hotkey: cmp ah, byte[keyActivate] ;если нажата наша горячая клавиша jne @f -;for mode 3 [ + ;проверки для mode 3 + cmp byte[state], SUPERLOCKd + je hotkey.end cmp byte[keyState], 1 - je hotkey.e + je hotkey.end push eax ebx mcall 37, 0 ;запоминаем текущие(начальные) координаты мыши @@ -132,9 +135,6 @@ hotkey: mov byte[keyState], 1 mov byte[state], UNLOCKd -.e: -;] - ;mov byte[state], UNLOCKd jmp hotkey.end @@: push edx @@ -143,8 +143,7 @@ hotkey: add dl, 128 cmp ah, dl ;если отпущена наша горячая клавиша jne @f ;hotkey.end - ;mov ecx, 0 ;строки для отладки и теста - ;call run_command + mov byte[keyState], 0 mov byte[state], LOCKd @@: @@ -247,53 +246,56 @@ run_command: cmp byte[state], UNLOCKd jne run_command.end -; cmp byte[mode], 2 ;если режим второй -; jne @f - push eax ebx ecx cmp ecx, 0 jne @f - mov eax, dword[newData.lu] + mov eax, apps.path1 ;dword[newData.lu] + cmp byte[eax], 0 ;если по адресу пусто (или лежал символ '-'), то адрес 0 + je .set0 mov dword[struct70.path_adr], eax + mov eax, apps.param1 + mov dword[struct70.param_adr], eax jmp .end_set_path @@: cmp ecx, 1 jne @f - mov eax, dword[newData.ld] + mov eax, apps.path2 ;dword[newData.ld] + cmp byte[eax], 0 ;если по адресу пусто (или лежал символ '-'), то адрес 0 + je .set0 mov dword[struct70.path_adr], eax + mov eax, apps.param2 + mov dword[struct70.param_adr], eax jmp .end_set_path @@: cmp ecx, 2 jne @f - mov eax, dword[newData.ru] + mov eax, apps.path3 ;dword[newData.ru] + cmp byte[eax], 0 ;если по адресу пусто (или лежал символ '-'), то адрес 0 + je .set0 mov dword[struct70.path_adr], eax + mov eax, apps.param3 + mov dword[struct70.param_adr], eax jmp .end_set_path @@: cmp ecx, 3 - jne .end_set_path - mov eax, dword[newData.rd] + jne .set0 ;.end_set_path + mov eax, apps.path4 ;dword[newData.rd] + cmp byte[eax], 0 ;если по адресу пусто (или лежал символ '-'), то адрес 0 + je .set0 mov dword[struct70.path_adr], eax + mov eax, apps.param4 + mov dword[struct70.param_adr], eax jmp .end_set_path -.end_set_path: - - ;параметры - ;mov dword[struct.adr], - -;если адрес 0, то ничего не делать - cmp dword[struct70.path_adr], 0 - jne .next - ;mov eax, testData.ld - ;mov dword[struct70.path_adr], eax +.set0: + ;mov dword[struct70.path_adr], 0 + ;mov dword[struct70.param_adr], 0 jmp @f -.next: -;конец кода для замены - +.end_set_path: mcall 70, struct70 @@: mov byte[state], LOCKd ;mov byte[keyState], 0 - pop ecx ebx eax .end: ret @@ -303,15 +305,106 @@ struct70: ; .mask dd 0 .param_adr dd 0 ; указатель на ASCIIZ-строку с параметрами .other dd 0, 0 - .path db 0 ; "/rd/1/TINYPAD",0 ; путь - .path_adr dd 0 ;testData.lu + .path db 0 + .path_adr dd 0 ; указатель на строку с путём ;имя конфигурационного файла fileName: db 'SETTINGS/HOTANGLES.CFG', 0 + +;проходим до конца текущей строки +gotoEndString: + cmp eax, edx ;если файл закончился, то + ja @f ;выходим + cmp byte[eax], 10 + je @f + cmp byte[eax], 0 + je @f + cmp byte[eax], 13 + je @f + ;иначе переходим на следующий символ + inc eax + jmp gotoEndString +@@: + ret + +;пропускаем переносы в начале строки до первого адекватного символа +gotoStartString: + cmp eax, edx ;если файл закончился, то + ja @f ;выходим + cmp byte[eax], 10 + je .next + cmp byte[eax], 0 + je .next + cmp byte[eax], 13 + je .next + jmp @f ;если это другой символ, то выходим +.next: ;переходим на следующий символ + inc eax + jmp gotoStartString +@@: + ret + + +sep: db '|' ;символ разделитель строки пути + параметры запуска +readPath: + push ebx esi edi + mov bh, 0 ; 0 - знак того, что параметры ещё не встречались + mov byte[esi], 0 ;проинициализируем буферы-строки пустотой (на всякий случай) + mov byte[edi], 0 +@@: + cmp eax, edx ;если файл закончился, то + ja @f ;выходим + mov bl, byte[eax] + ;если очередной символ не конец строки + cmp bl, 10 + je @f ;иначе выход + cmp bl, 0 + je @f + cmp bl, 13 + je @f + ;и не начало параметров + cmp bl, byte[sep] + jne .read + ;если sep уже встречали ранее, то + cmp bh, 0 + jne .read ;просто продолжаем считывать параметры дальше (в них может быть что угодно) + ;иначе кладём завершающий 0 и переходим к буферу с параметрами + mov byte[esi], 0 + call trim ;ещё не забудем убрать лишние табуляции и пробелы на конце нашей строки + mov esi, edi + mov bh, 1 + inc eax + jmp @b +.read: ;то записываем символ в наш буфер и переходим на следующий символ + mov byte[esi], bl + inc esi + inc eax + jmp @b +@@: + mov byte[esi], 0 ;кладём завершающий ноль + pop edi esi ebx + ret + +trim: ;esi - последний нулевой символ строки + ;push esi + mov byte[esi], 0 + dec esi + cmp byte[esi], 8 + je trim + cmp byte[esi], 32 + je trim + inc esi + ;pop esi + ret + + +cfgFileAdr: dd 0 ;адрес конфигурационного файла в памяти + loadConfig: push eax ebx ecx edx mcall 68, 27, fileName ;загружаем конфигурационный файл в ОЗУ + mov dword[cfgFileAdr], eax cmp eax, 0 je loadConfig.exit ;если файла конфигурации нет, то завершаем работу приложения ;иначе данные загружены в ОЗУ, размер в edx @@ -321,12 +414,22 @@ loadConfig: add edx, eax ;иначе кладём в edx - адрес конца файла mov byte[mode], 0 - cmp byte[eax], '0' ;121 ;'y' ;если параметр активности приложения имеет статус: не активно - je loadConfig.exit ;то завершаем работу приложения + cmp byte[eax], '0' ;если параметр активности приложения имеет статус: не активно + je loadConfig.exit ;то завершаем работу приложения cmp byte[eax], 110 ;'n' je loadConfig.exit ;иначе выставляем режим + cmp byte[eax], 121 ;'y' ;классический режим + jne @f + mov byte[mode], 1 + jmp loadConfig.modeEnd +@@: + cmp byte[eax], '1' ;классический режим + jne @f + mov byte[mode], 1 + jmp loadConfig.modeEnd +@@: cmp byte[eax], '2' ;режим активации по горячей клавише jne @f mov byte[mode], 2 @@ -337,72 +440,290 @@ loadConfig: mov byte[mode], 3 jmp loadConfig.modeEnd @@: - mov byte[mode], 1 ;во всех остальных случаях - классический режим + mov byte[mode], 0 ;во всех остальных случаях - отключено + jmp loadConfig.exit .modeEnd: - push edi - push esi - ; сохраняем в edi указатель на начало таблицы адресов наших команд - mov edi, newData - ; сохраняем адреса строк и добавляем 0 в конце - mov esi, eax -.block: - inc esi - cmp byte[esi], 10 ;если очередной код символа 10 или 13, то пропускаем символы - je loadConfig.propusk ;до первого отличного от них - cmp byte[esi], 13 - je loadConfig.propusk + ;идём до конца этой строки + call gotoEndString + ;находим начало следующей строки + call gotoStartString - ; символ отличен от переноса строки и возврата каретки - если это на знак минус, то запоминаем его - mov dword[edi], esi - add edi, 4 + push esi edi - ;идём до конца этой строки: пока не встретим очередной 10, 13, 0 или file end -.while: - inc esi - cmp esi, edx ;тут будет проблема - тк файл закончился, а нуля не было !!! исправить - jae loadConfig.fileend - cmp byte[esi], 10 - je loadConfig.ura - cmp byte[esi], 0 - je loadConfig.ura - cmp byte[esi], 13 - jne loadConfig.while -.ura: - mov byte[esi], 0 + ;считываем путь для левого верхнего угла + mov esi, apps.path1 + mov edi, apps.param1 + call readPath + call gotoStartString ;находим начало следующей строки - ;cmp byte[esi-1], '-' - ;jne @f - push esi ;если это был знак минус, то меняем адрес на ноль - mov esi, dword[edi-4] - cmp byte[esi], '-' - jne @f - cmp byte[esi+1], 0 - jne @f - mov dword[edi-4], 0 -@@: - pop esi + ;считываем путь для левого нижнего угла + mov esi, apps.path2 + mov edi, apps.param2 + call readPath + call gotoStartString - cmp edi, newDataEnd ;newData.end ;если вся таблица адресов заполнена, то выходим из цикла - jb loadConfig.block -.fileend: + ;считываем путь для правого верхнего угла + mov esi, apps.path3 + mov edi, apps.param3 + call readPath + call gotoStartString - pop esi - pop edi + ;считываем путь для правого нижнего угла + mov esi, apps.path4 + mov edi, apps.param4 + call readPath + call gotoStartString - jmp loadConfig.end + ;call checkAdr ;проверим строки на '-' и пустоту и выставим битовую маску + call checkPathAdr -.propusk: - mov byte[esi], 0 - jmp loadConfig.block + pop edi esi + + ;пропускаем строку с именем клавиши + call gotoEndString + call gotoStartString + + ;считываем сканкод активационной клавиши + ;call readKey + ;call gotoEndString + push esi edi ecx + mov esi, keystr + mov edi, keystr + call readPath + ;преобразуем строку в число + mov esi, keystr + call strToInteger + mov byte[keyActivate], cl + pop ecx edi esi + call gotoStartString + + ;считываем радиус + push esi edi ecx + mov esi, radstr + mov edi, radstr + call readPath + ;преобразуем строку в число + mov esi, radstr + call strToInteger + ;теперь ecx - значение радиуса + ;!!! добавить проверку, чтобы число не было больше области экрана + ;нас интересует квадрат числа + push eax edx + mov eax, ecx ;dword[radius2] + mul ecx + mov dword[radius2], eax + pop edx eax + + pop ecx edi esi + + ;считывать размер элементов интерфейса нам не нужно (пока что этот параметр только для конфига) + jmp .end .exit: pop edx ecx ebx eax mcall -1 ;закрыть эту программу .end: + mov ecx, dword[cfgFileAdr] ;если файл был загружен, то + cmp ecx, 0 + je @f + mcall 68, 13, ecx ;выгружаем файл из памяти +@@: pop edx ecx ebx eax ret +;readKey: + ;читаем клавишу и выходим +; cmp dword[eax], 'Ctrl' +; jne .notCtrl +; mov byte[keyActivate], 3 +; jmp .end +;.notCtrl: +; cmp dword[eax], 'Shif' +; jne .notShift +; mov byte[keyActivate], 2 +; jmp .end +;.notShift: +; cmp dword[eax], 'Spac' +; jne .notSpace +; mov byte[keyActivate], 32 +; jmp .end +;.notSpace: +; cmp word[eax], 'Al' +; jne .notAlt +; mov byte[keyActivate], 1 +; jmp .end +;.notAlt: + ;убедимся, что там 1 символ, а не строка +; cmp byte[eax+1], 10 +; je .oneSymb +; cmp byte[eax+1], 0 +; je .oneSymb +; cmp byte[eax+1], 13 +; je .oneSymb +; jmp .default ;в любом другом случае ошибка конфига - выход +;.oneSymb: + ;проверяем, что символ разрешённый !!! доделать + + ;добавляем символ как есть +; push ebx +; ;xor ebx, ebx +; mov bl, byte[eax] +; mov byte[keyActivate], bl +; pop ebx + +; jmp .end +;.default: +; mcall -1 +; ;mov byte[keyActivate], 2 +;.end: +; ret + + +checkPathAdr: + push eax ebx + xor eax, eax + + mov ebx, apps.path1 + cmp byte[ebx], '-' + jne @f + ;cmp byte[ebx+1], 0 + ;jne @f + mov byte[ebx], 0 +@@: + mov ebx, apps.path2 + cmp byte[ebx], '-' + jne @f + ;cmp byte[ebx+1], 0 + ;jne @f + mov byte[ebx], 0 +@@: + mov ebx, apps.path3 + cmp byte[ebx], '-' + jne @f + ;cmp byte[ebx+1], 0 + ;jne @f + mov byte[ebx], 0 +@@: + mov ebx, apps.path4 + cmp byte[ebx], '-' + jne @f + ;cmp byte[ebx+1], 0 + ;jne @f + mov byte[ebx], 0 +@@: + pop ebx eax + ret + + +checkAdr: + push eax ebx + xor eax, eax + + mov ebx, apps.path1 + cmp byte[ebx], '-' + jne @f + inc eax +@@: + mov ebx, apps.path2 + cmp byte[ebx], '-' + jne @f + add eax, 2 +@@: + mov ebx, apps.path3 + cmp byte[ebx], '-' + jne @f + add eax, 4 +@@: + mov ebx, apps.path4 + cmp byte[ebx], '-' + jne @f + add eax, 8 +@@: + + mov ebx, apps.param1 + cmp byte[ebx], '-' + jne @f + add eax, 16 +@@: + mov ebx, apps.param2 + cmp byte[ebx], '-' + jne @f + add eax, 32 +@@: + mov ebx, apps.param3 + cmp byte[ebx], '-' + jne @f + add eax, 64 +@@: + mov ebx, apps.param4 + cmp byte[ebx], '-' + jne @f + add eax, 128 +@@: + + mov byte[apps.bits], al + pop ebx eax + ret + + + +;преобразование строки в целое число +strToInteger: ;вход: esi - указатель на строку с десятичной записью числа, выход: eсx - число + push eax ebx edx edi + xor eax, eax ;обнуляем eax + xor ecx, ecx + mov edi, esi +.get_last_symbol: + ;читаем очередной символ + mov al, byte[edi] + + ;если это ноль, то строка закончилась + cmp al, 0 + je @f + + ;иначе переходим на следующий символ + inc edi + jmp .get_last_symbol +@@: ;дошли до последнего символа и кладём адрес на него в edi + dec edi + + cmp edi, esi ;адрес последнего символа должен быть дальше адреса первого символа + jae @f + jmp .error ;иначе ошибка +@@: + ;теперь в edi последний символ, а esi указывает на начало строки (на первй символ строки) + mov cl, byte[edi] + sub cl, 48 ;0x30 ;'0' + dec edi ;переходим на след символ от конца + mov ebx, 10 ;множитель степени +.tranform_cicle: + cmp edi, esi ;если больше нет символов строке, то число преобразовали - выходим + jb .end + + mov eax, 0 + mov al, byte[edi] + sub al, 48 ;'0' + cmp al, 9 ;0x39 ;если число больше 9, то видимо в строке было что-то не так + ja .error + cmp al, 0 ;0x30 ;если число меньше 0, то видимо в строке было что-то не так + jb .error + mov edx, 0 + mul ebx + + add ecx, eax + + dec edi + mov edx, 0 + mov eax, 10 + mul ebx + mov ebx, eax + jmp .tranform_cicle +.error: + mov ecx, 0 +.end: + pop edi edx ebx eax + ret ;Вынести код ниже в отдельный общий модуль @@ -474,7 +795,7 @@ copyKill: ;MODE 3 init03: - mov dword[radius2], 100; 10*10 + ;mov dword[radius2], 100; 10*10 mov dword[backAdr], mode03 call setHotKey mode03: @@ -496,6 +817,9 @@ mouse03: cmp byte[state], LOCKd ;если угол заблокирован, то обновим начальные координаты je mouse03.updateCoord + cmp byte[state], SUPERLOCKd ;если действие было выполнено и получили блокировку, то ждём отпускания клавиши активации + je @f + call checkPointInCircle ;иначе если преодолели радиус активации, то вызываем действие нужного угла jmp @f .updateCoord: @@ -589,7 +913,7 @@ activateCorner: mov ecx, 1 call run_command mov byte[keyState], 0 - mov byte[state], LOCKd + mov byte[state], SUPERLOCKd jmp activateCorner.end .leftup: @@ -597,7 +921,7 @@ activateCorner: mov ecx, 0 call run_command mov byte[keyState], 0 - mov byte[state], LOCKd + mov byte[state], SUPERLOCKd jmp activateCorner.end .right: ;правая сторона экрана @@ -610,7 +934,7 @@ activateCorner: mov ecx, 3 call run_command mov byte[keyState], 0 - mov byte[state], LOCKd + mov byte[state], SUPERLOCKd jmp activateCorner.end .rightup: @@ -618,7 +942,7 @@ activateCorner: mov ecx, 2 call run_command mov byte[keyState], 0 - mov byte[state], LOCKd + mov byte[state], SUPERLOCKd jmp activateCorner.end .end: @@ -631,10 +955,6 @@ keyActivate db 41 ;16 ;'Q' ; keyState db 0 ;0-клавиша не активна, 1 - клавиша активна backAdr rd 1 ;адрес для возврата из проверки мыши - -;slotMax dd 0 -;selfPID dd 0 -;buf db 1024 dup(0) slotMax rd 1 selfPID rd 1 buf rb 1024 @@ -644,14 +964,23 @@ screen: .width rw 1 .height rw 1 -state: rb 1 ;состояние: 0=unlock, 1=lock +state: rb 1 ;состояние: 0=unlock, 1=lock, 2=superlock for mode 3 mode: rb 1 ;режим работы приложения: 0=не работает, 1=классический, 2=по горячей клавише -newData: ;табличка адресов командных строк - .lu rd 1 - .ld rd 1 - .ru rd 1 - .rd rd 1 -newDataEnd: + +keystr: rb 4 ;строка со значением сканкода активационной клавиши +radstr: rb 5 ;строка со значением радиуса +apps: + .bits: rb 1 + .path1: rb 512 + .path2: rb 512 + .path3: rb 512 + .path4: rb 512 + .param1: rb 512 + .param2: rb 512 + .param3: rb 512 + .param4: rb 512 +appsEnd: + I_END: diff --git a/programs/other/ha/ReadMe.txt b/programs/other/ha/ReadMe.txt index 8edaa14fd2..e77207dffb 100644 --- a/programs/other/ha/ReadMe.txt +++ b/programs/other/ha/ReadMe.txt @@ -1,23 +1,31 @@ Hot Angles -Version 0.3.6: Oct 9, 2018 +Version 0.3.7: Oct 14, 2018 RU Комплект утилит (аналог Hot Corners в других ОС) для расширения возможностей рабочего стола пользователя. Название выбрано путём голосования. В комплект входят две утилиты: @HOTANGLES - основная утилита, позволяющая запускать приложения путём наведения курсора в угол экрана (угол рабочей области); HACONFIG - утилита конфигуратор, позволяющая настроить действия на каждый угол и активировать/деактивировать эту опцию. -Файл конфигурации: RD/1/SETTINGS/HOTANGLES.CFG (где RD/1/ это тот же SYS - путь к системной директории). Файл состоит из пяти строк: +Файл конфигурации: RD/1/SETTINGS/HOTANGLES.CFG (где RD/1/ это тот же SYS - путь к системной директории). Файл состоит из девяти строк: 1) состояние активности опции (один символ): 1 или y - опция активна, активирован классический режим работы уголков, 2 - опция активна, активирован режим работы по горячей клавише, 3 - опция активна, активирован режим жеста при зажатой активационной клавише, n или 0 - опция отключена, - любой другой символ - поведение по умолчанию (зависит от версии); + любой другой символ - поведение по умолчанию (зависит от версии), в большинстве версий означает "опция отключена"; 2) команда (полное имя приложения) для верхнего левого угла экрана; 3) команда (полное имя приложения) для левого нижнего угла экрана; 4) команда (полное имя приложения) для правого верхнего угла экрана; -5) команда (полное имя приложения) для правого нижнего угла экрана. +5) команда (полное имя приложения) для правого нижнего угла экрана; +6) клавиша активации (для режимов 2 и 3): '0'..'9','a'..'z','A'..'Z',Space,Shift,Alt,Ctrl,'~' (примечание: клавиши Shift,Alt,Ctrl не работают в версии 0.3.7); +7) сканкод клавиши активации (десятичное число, используется @HOTANGLES); +8) радиус срабатывания жеста от начальной точки в момент нажатия клавиши (для mode 3); +9) размер элементов окна конфигуратора: + a - auto, автоматически в зависимости от разрешения экрана; + значение от 1 до 7 - нужный размер на основе размера текста; + s - в зависимости от системных настроек (опция по умолчанию). Если необходимо настроить только часть углов, а остальные оставить без действия, то в конфигураторе или на нужной строке конфигурационного файла укажите знак минус (символ '-'). +Примечание: До версии 0.3.6 включительно файл конфигурации состоял только из 5 первых строк. Обе утилиты содержат защиту от повторного запуска. Утилита @HOTANGLES добавлена в автозагрузку ОС. diff --git a/programs/other/ha/SETTINGS/HOTANGLES.CFG b/programs/other/ha/SETTINGS/HOTANGLES.CFG index 482017834e..f92272d994 100644 --- a/programs/other/ha/SETTINGS/HOTANGLES.CFG +++ b/programs/other/ha/SETTINGS/HOTANGLES.CFG @@ -1,5 +1,9 @@ -1 +0 /rd/1/HACONFIG /rd/1/HACONFIG /rd/1/HACONFIG /rd/1/HACONFIG +Space +57 +10 +s