Rev 7460 | Rev 7776 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
7389 | theonlymir | 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ; Hot Angles Config ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
3 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
4 | ; Compile with FASM |
||
7469 | theonlymir | 5 | ; Version 0.3.8: Oct 14, 2018 |
7389 | theonlymir | 6 | |
7 | ; Copyright (c) 2018, Efremenkov Sergey aka TheOnlyMirage |
||
8 | ; All rights reserved. |
||
9 | ; Redistribution and use in source and binary forms, with or without modification, |
||
10 | ; are permitted provided that the following conditions are met: |
||
11 | ; * Redistributions of source code must retain the above copyright notice, this |
||
12 | ; list of conditions and the following disclaimer. |
||
13 | ; * Redistributions in binary form must reproduce the above copyright notice, |
||
14 | ; this list of conditions and the following disclaimer in the documentation and/or |
||
15 | ; other materials provided with the distribution. |
||
16 | ; * Neither the name of the |
||
17 | ; be used to endorse or promote products derived from this software without |
||
18 | ; specific prior written permission. |
||
19 | |||
20 | ; THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, |
||
21 | ; INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A |
||
22 | ; PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT |
||
23 | ; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION |
||
24 | ; OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
||
25 | ; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
||
26 | ; -------------------------------------------------------------------------------------- |
||
27 | |||
7408 | theonlymir | 28 | ;P.S. Коду требуется оптимизация и доработка (см. тему форума) |
7389 | theonlymir | 29 | format binary as "" ; Binary file format without extension |
30 | use32 ; Tell compiler to use 32 bit instructions |
||
31 | org 0 ; the base address of code, always 0x0 |
||
32 | |||
33 | ; Заголовок исполняемого файла Колибри ОС |
||
34 | db 'MENUET01' |
||
35 | dd 1 |
||
36 | dd START |
||
37 | dd I_END |
||
38 | dd MEM |
||
39 | dd STACKTOP |
||
40 | dd 0, 0 |
||
41 | |||
42 | ; Начало области кода |
||
7395 | theonlymir | 43 | include 'lang.inc' ;поддержка языков при компиляции |
7389 | theonlymir | 44 | include '../../macros.inc' |
7402 | theonlymir | 45 | include '../../proc32.inc' |
46 | include '../../dll.inc' |
||
7408 | theonlymir | 47 | include '../../develop/libraries/box_lib/trunk/box_lib.mac' ;компоненты checkBox и editBox |
7443 | theonlymir | 48 | include '../../develop/libraries/box_lib/load_lib.mac' ;макрос для загрузки библиотек |
7436 | theonlymir | 49 | @use_library |
7443 | theonlymir | 50 | |
51 | KMENUITEM_NORMAL equ 0 |
||
52 | KMENUITEM_SUBMENU equ 1 |
||
53 | KMENUITEM_SEPARATOR equ 2 |
||
54 | |||
7389 | theonlymir | 55 | Otstup = 30 |
56 | |||
57 | START: |
||
58 | call copyKill ;простейшая защита от запуска второй копии приложения |
||
59 | mcall 68, 11 ;инициализация кучи |
||
60 | |||
7436 | theonlymir | 61 | ;mcall 48,3,sc,sizeof.system_colors ;получить системные цвета |
7389 | theonlymir | 62 | mov eax,48 ;получить системные цвета |
63 | mov ebx,3 |
||
64 | mov ecx, sc |
||
65 | mov edx, sizeof.system_colors |
||
66 | mcall |
||
67 | |||
7402 | theonlymir | 68 | stdcall dll.Load, @IMPORT |
69 | or eax, eax |
||
70 | jnz exit |
||
71 | |||
7389 | theonlymir | 72 | mov eax,40 ;установить маску для ожидаемых событий |
73 | mov ebx,0x27 ;система будет реагировать только на сообщение о перерисовке, нажата кнопка, определённая ранее, событие от мыши (что-то случилось - нажатие на кнопку мыши или перемещение; сбрасывается при прочтении) |
||
74 | mcall |
||
75 | |||
7436 | theonlymir | 76 | load_libraries l_libs_start,load_lib_end ;загрузка библиотек(и) |
77 | stdcall [OpenDialog_Init],OpenDialog_data ;подготовка диалога |
||
78 | |||
7443 | theonlymir | 79 | ;mode menu |
80 | stdcall [kmenu_init], sc ;kmenu initialisation |
||
81 | stdcall [ksubmenu_new] |
||
82 | mov [modeMenu], eax |
||
83 | stdcall [kmenuitem_new], KMENUITEM_NORMAL, valueModeMenu0, 110 |
||
84 | stdcall [ksubmenu_add], [modeMenu], eax |
||
85 | stdcall [kmenuitem_new], KMENUITEM_NORMAL, valueModeMenu1, 111 |
||
86 | stdcall [ksubmenu_add], [modeMenu], eax |
||
87 | stdcall [kmenuitem_new], KMENUITEM_NORMAL, valueModeMenu2, 112 |
||
88 | stdcall [ksubmenu_add], [modeMenu], eax |
||
89 | stdcall [kmenuitem_new], KMENUITEM_NORMAL, valueModeMenu3, 113 |
||
90 | stdcall [ksubmenu_add], [modeMenu], eax |
||
91 | stdcall [kmenuitem_new], KMENUITEM_SUBMENU, valueModeMenu1, [modeMenu] |
||
92 | |||
7389 | theonlymir | 93 | call loadConfig ;загружаем конфигурацию из файла, если нет - то выставляем параметры по умолчанию |
7469 | theonlymir | 94 | call defaultElems ;устанавливаем размеры элементов в зависимости от настроек |
95 | call resizeElems |
||
7389 | theonlymir | 96 | call draw_window ;отрисовать окно приложения |
97 | |||
98 | ; Обработка цикла событий |
||
99 | event_wait: |
||
100 | mov eax, 10 ; function 10 : wait until event |
||
101 | mcall ; event type is returned in eax |
||
102 | |||
103 | cmp eax, 1 ; Event redraw request ? |
||
104 | je red ; Expl.: there has been activity on screen and |
||
105 | ; parts of the applications has to be redrawn. |
||
106 | |||
107 | cmp eax, 2 ; Event key in buffer ? |
||
108 | je key ; Expl.: User has pressed a key while the |
||
109 | ; app is at the top of the window stack. |
||
110 | |||
111 | cmp eax, 3 ; Event button in buffer ? |
||
112 | je button ; Expl.: User has pressed one of the |
||
113 | ; applications buttons. |
||
114 | |||
7408 | theonlymir | 115 | invoke edit_box_mouse, editLU ;проверка событий мыши для editBox'ов |
7402 | theonlymir | 116 | invoke edit_box_mouse, editLD |
117 | invoke edit_box_mouse, editRU |
||
118 | invoke edit_box_mouse, editRD |
||
7459 | theonlymir | 119 | invoke edit_box_mouse, editRadius |
7402 | theonlymir | 120 | |
7389 | theonlymir | 121 | jmp event_wait |
122 | |||
123 | |||
124 | red: ;обработка события перерисовки окна |
||
125 | call draw_window |
||
126 | jmp event_wait |
||
127 | |||
128 | key: ; Keypress event handler |
||
129 | mov eax, 2 ; The key is returned in ah. The key must be |
||
130 | mcall ; read and cleared from the system queue. |
||
7408 | theonlymir | 131 | |
7402 | theonlymir | 132 | invoke edit_box_key, editLU |
133 | invoke edit_box_key, editLD |
||
134 | invoke edit_box_key, editRU |
||
135 | invoke edit_box_key, editRD |
||
7459 | theonlymir | 136 | invoke edit_box_key, editRadius |
137 | |||
138 | cmp eax, 1 |
||
7460 | theonlymir | 139 | je event_wait |
7459 | theonlymir | 140 | cmp word[hkSymbol], 0 |
7460 | theonlymir | 141 | jne event_wait |
7459 | theonlymir | 142 | cmp al, 0 |
143 | jne .next |
||
144 | mov byte[hkSymbol], ah |
||
145 | |||
146 | push eax ecx esi ;сохраняем сканкод клавиши |
||
147 | shr eax, 16 |
||
148 | mov byte[keyscan], al |
||
149 | mov ecx, 0 |
||
150 | mov cl, al ;byte[keyscan] |
||
151 | mov esi, keystr.data |
||
152 | call IntToStr |
||
153 | |||
154 | ;считаем полученный размер строки |
||
155 | xor ecx, ecx |
||
156 | mov esi, keystr.data |
||
157 | @@: |
||
158 | cmp byte[esi], 0 |
||
159 | je @f |
||
160 | inc esi |
||
161 | inc ecx |
||
162 | ;cmp ecx, 4 |
||
163 | ;je @f |
||
164 | jmp @b |
||
165 | @@: |
||
166 | ;и сохраняем его |
||
167 | mov dword[keystr.size], ecx |
||
168 | |||
169 | pop esi ecx eax |
||
170 | jmp red |
||
171 | .next: |
||
172 | ;cmp al, 2 |
||
173 | ;jne @f |
||
174 | ;cmp ah, 0 |
||
175 | ;jne @f |
||
176 | ;считываем управляющие клавиши |
||
177 | ;shr eax, 16 |
||
178 | ;bt eax, 0 ;left shift |
||
179 | ;jne @f |
||
180 | ;mov byte[hkSymbol], 2 |
||
181 | ;jmp red |
||
182 | @@: |
||
7389 | theonlymir | 183 | jmp event_wait ; Just read the key, ignore it and jump to event_wait. |
184 | |||
185 | button: ; Buttonpress event handler |
||
186 | mov eax,17 ; The button number defined in window_draw |
||
187 | mcall ; is returned to ah. |
||
188 | |||
189 | cmp ah,1 ; button id=1 ? |
||
190 | jne noclose |
||
7402 | theonlymir | 191 | exit: |
7389 | theonlymir | 192 | mov eax,-1 ; Function -1 : close this program |
193 | mcall |
||
194 | noclose: |
||
195 | cmp ah, 2 ;кнопка "Применить" |
||
7436 | theonlymir | 196 | jne @f ;butend |
7389 | theonlymir | 197 | call applyButton ;вызов нашего обработчика нажатия кнопки |
7436 | theonlymir | 198 | jmp event_wait |
199 | @@: |
||
200 | cmp ah, 4 |
||
201 | jne @f |
||
202 | mov byte[editID], 4 |
||
203 | call but_open_dlg |
||
204 | jmp event_wait |
||
205 | @@: |
||
206 | cmp ah, 5 |
||
207 | jne @f |
||
208 | mov byte[editID], 5 |
||
209 | call but_open_dlg |
||
210 | jmp event_wait |
||
211 | @@: |
||
212 | cmp ah, 6 |
||
213 | jne @f |
||
214 | mov byte[editID], 6 |
||
215 | call but_open_dlg |
||
216 | jmp event_wait |
||
217 | @@: |
||
218 | cmp ah, 7 |
||
219 | jne @f |
||
220 | mov byte[editID], 7 |
||
221 | call but_open_dlg |
||
222 | jmp event_wait |
||
223 | @@: |
||
7443 | theonlymir | 224 | cmp ah, 8 |
225 | jne @f |
||
226 | push eax ebx ecx |
||
227 | mcall 9, pi, -1 ;get window coord |
||
228 | |||
7459 | theonlymir | 229 | mov eax, dword[pi+34] |
7469 | theonlymir | 230 | add eax, Otstup ;buttonModeX ;+ 5 |
7459 | theonlymir | 231 | mov word[coordModeMenu.x], ax |
7443 | theonlymir | 232 | |
7459 | theonlymir | 233 | mov eax, dword[pi+38] |
7469 | theonlymir | 234 | add ax, word[elem.butModeY] |
235 | add ax, word[elem.butDialHeight] |
||
236 | dec ax ;add eax, buttonModeY + 13 ;17 |
||
7459 | theonlymir | 237 | mov word[coordModeMenu.y], ax |
7443 | theonlymir | 238 | |
7459 | theonlymir | 239 | stdcall [ksubmenu_draw], [modeMenu], coordModeMenu |
7443 | theonlymir | 240 | pop ecx ebx eax |
241 | jmp event_wait |
||
242 | @@: |
||
7459 | theonlymir | 243 | cmp ah, 9 |
244 | jne @f |
||
245 | mov word[hkSymbol], 0 |
||
246 | jmp red ;event_wait |
||
247 | @@: |
||
7443 | theonlymir | 248 | cmp ah, 110 |
249 | jne @f |
||
250 | mov byte[mode], 48 ;'0' |
||
251 | jmp event_wait |
||
252 | @@: |
||
253 | cmp ah, 111 |
||
254 | jne @f |
||
255 | mov byte[mode], 49 ;'1' |
||
256 | jmp event_wait |
||
257 | @@: |
||
258 | cmp ah, 112 |
||
259 | jne @f |
||
260 | mov byte[mode], 50 ;'2' |
||
261 | jmp event_wait |
||
262 | @@: |
||
263 | cmp ah, 113 |
||
264 | jne @f |
||
265 | mov byte[mode], 51 ;'3' |
||
266 | jmp event_wait |
||
267 | @@: |
||
7389 | theonlymir | 268 | butend: |
269 | jmp event_wait ;this is for ignored events, useful at development |
||
270 | |||
271 | |||
272 | |||
273 | ;имя конфигурационного файла |
||
274 | fileName: db 'SETTINGS/HOTANGLES.CFG', 0 |
||
275 | |||
276 | ;структура для создания/перезаписи файла |
||
277 | createFile: |
||
278 | .func dd 2 ;номер подфункции |
||
279 | .re dd 0, 0 ;зарезервировано |
||
280 | .size dd 0 ;сколько байт писать |
||
281 | .data_adr dd 0 ;указатель на данные |
||
282 | .path db 0 |
||
283 | .path_adr dd fileName ;путь |
||
284 | |||
285 | ;строка параметров по умолчанию и её размер |
||
7459 | theonlymir | 286 | 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 |
287 | defaultDataSize = 85 ;48+19+4 |
||
7389 | theonlymir | 288 | |
289 | |||
290 | copyParam: ;копирует параметр(команду запуска) в буфер (см. дальше) |
||
291 | push esi ebx ecx |
||
292 | mov ecx, dword[ebx] ;читаем размер строки |
||
7412 | theonlymir | 293 | |
294 | cmp ecx, 0 ;пуста ли строка? |
||
295 | jne copyParam.copy ;если нет, то переходим к копированию содержимого строки (к циклу) |
||
296 | |||
297 | mov byte[eax], '-' ;если же пусто, то заменяем символом минус '-' |
||
298 | inc eax |
||
299 | ;jmp copyParam.copyEnd ;и выходим |
||
300 | ;далее в начале цикла произойдёт сравнение и выход |
||
301 | |||
7389 | theonlymir | 302 | .copy: ;копируем символы |
303 | cmp ecx, 0 |
||
304 | je copyParam.copyEnd |
||
305 | mov bl, byte[esi] |
||
306 | mov byte[eax], bl |
||
307 | dec ecx |
||
308 | inc eax |
||
309 | inc esi |
||
310 | jmp copyParam.copy |
||
311 | .copyEnd: |
||
312 | pop ecx ebx esi |
||
313 | ret |
||
314 | |||
315 | |||
316 | addPerenos: ;добавляет перенос строки в буфер |
||
317 | mov byte[eax], 13 |
||
318 | inc eax |
||
319 | mov byte[eax], 10 |
||
320 | inc eax |
||
321 | ret |
||
322 | |||
323 | ;обработчик кнопки "Применить" |
||
324 | applyButton: |
||
325 | push eax ebx ecx |
||
326 | ;mov dword[createFile.data_adr], defaultDataForConfig |
||
327 | ;mov dword[createFile.size], defaultDataSize |
||
328 | |||
329 | ;вычислим размер файла конфигурации в байтах |
||
7459 | theonlymir | 330 | mov ecx, 9*2+1 ;1 байт на состояние активности и 9 пар переносов строк (символы 13, 10) |
7408 | theonlymir | 331 | add ecx, dword[editLU.size] ;плюс размер каждой строки в байтах |
332 | add ecx, dword[editLD.size] |
||
333 | add ecx, dword[editRU.size] |
||
7389 | theonlymir | 334 | add ecx, dword[editRD.size] ;dataBuffer.size4] |
7459 | theonlymir | 335 | add ecx, dword[editRadius.size] |
336 | add ecx, dword[hkSize] ;размер имени активационной кнопки |
||
337 | add ecx, dword[keystr.size] ;размер сканкода активационной кнопки |
||
338 | inc ecx ; ещё 1 байт для хранения размера элементов |
||
7412 | theonlymir | 339 | |
340 | ;если заданы пустые строки, то мы автоматически добавляем знак минус, значит размер +1 байт |
||
341 | cmp dword[editLU.size], 0 |
||
342 | jne @f |
||
343 | inc ecx |
||
344 | @@: |
||
345 | cmp dword[editLD.size], 0 |
||
346 | jne @f |
||
347 | inc ecx |
||
348 | @@: |
||
349 | cmp dword[editRU.size], 0 |
||
350 | jne @f |
||
351 | inc ecx |
||
352 | @@: |
||
353 | cmp dword[editRD.size], 0 |
||
354 | jne @f |
||
355 | inc ecx |
||
356 | @@: |
||
357 | |||
7389 | theonlymir | 358 | ;теперь размер файла конфигурации в ecx |
359 | mov dword[createFile.size], ecx ;положим размер байт в структуру создания/перезаписи файла |
||
360 | mcall 68, 12, ecx ;выделяем блок памяти под буфер содержимого |
||
361 | mov dword[createFile.data_adr], eax ;сохраняем адрес буфера в структуру |
||
362 | |||
363 | ;заполним буфер содержимого: |
||
7443 | theonlymir | 364 | push ebx ;сохраняем выбранный режим |
365 | mov bl, byte[mode] |
||
366 | mov byte[eax], bl |
||
367 | pop ebx |
||
368 | |||
7389 | theonlymir | 369 | inc eax |
370 | call addPerenos |
||
371 | |||
372 | push esi ebx |
||
373 | call UpdateEditsSizes ;обновить размеры текста в edit'ах |
||
374 | |||
7469 | theonlymir | 375 | mov esi, dataBuffer.1 |
376 | mov ebx, dataBuffer.size1 |
||
7389 | theonlymir | 377 | call copyParam |
378 | call addPerenos ;добавляем перенос строки |
||
379 | |||
7408 | theonlymir | 380 | mov esi, dataBuffer.2 |
381 | mov ebx, dataBuffer.size2 |
||
7389 | theonlymir | 382 | call copyParam |
383 | call addPerenos ;добавляем перенос строки |
||
384 | |||
385 | mov esi, dataBuffer.3 |
||
386 | mov ebx, dataBuffer.size3 |
||
387 | call copyParam |
||
388 | call addPerenos ;добавляем перенос строки |
||
389 | |||
390 | mov esi, dataBuffer.4 |
||
391 | mov ebx, dataBuffer.size4 |
||
392 | call copyParam |
||
393 | call addPerenos ;добавляем перенос строки |
||
394 | |||
7459 | theonlymir | 395 | ;сохраняем кнопку активации |
396 | call saveKey |
||
397 | call addPerenos |
||
398 | |||
399 | ;сохраняем сканкод кнопки |
||
400 | mov esi, keystr.data ;записываем строку keystr в файл |
||
401 | xor ebx, ebx |
||
402 | @@: |
||
403 | cmp byte[esi], 0 |
||
404 | je @f |
||
405 | mov bl, byte[esi] |
||
406 | mov byte[eax], bl |
||
407 | inc eax |
||
408 | inc esi |
||
409 | cmp esi, keystr.size-1 |
||
410 | jae @f |
||
411 | jmp @b |
||
412 | @@: |
||
413 | call addPerenos |
||
414 | |||
415 | ;сохраняем радиус |
||
416 | ;!!! если радиус оставлен пустым, то нужно сохранять значение по умолчанию (сейчас пишется '-') |
||
417 | mov esi, radiusBuffer.data |
||
418 | mov ebx, editRadius.size ;radiusBuffer.size |
||
419 | call copyParam |
||
420 | call addPerenos |
||
421 | |||
422 | ;добавляем размер элементов |
||
423 | push ebx ;сохраняем выбранный режим |
||
424 | mov bl, byte[sizeStyle] |
||
425 | mov byte[eax], bl |
||
426 | pop ebx |
||
427 | inc eax |
||
428 | call addPerenos |
||
429 | |||
7389 | theonlymir | 430 | pop ebx esi |
431 | |||
432 | |||
433 | mov ebx, createFile |
||
434 | mcall 70 |
||
435 | cmp eax, 0 |
||
436 | je .end |
||
437 | ;иначе здесь нужно вывести окно с ошибкой !!! |
||
438 | .end: |
||
439 | mcall 68, 13, dword[createFile.data_adr] ;освобождаем память под буфер |
||
7412 | theonlymir | 440 | call finishHotAnglesApp ;завершаем работу всех копий сервиса @HOTANGLES |
441 | call loadConfig ;перезагружаем файл конфига |
||
442 | call draw_window ;перерисовываем окно |
||
443 | call startHotAnglesApp ;перезапускаем @HOTANGLES |
||
7389 | theonlymir | 444 | pop ecx ebx eax |
445 | ret |
||
446 | |||
447 | |||
448 | |||
449 | |||
450 | |||
451 | |||
452 | compareBytes2: |
||
453 | push edi esi ecx ebx |
||
454 | xor eax, eax |
||
455 | mov ecx, 10 ;max размер строк 11 |
||
456 | @@: |
||
457 | mov bl, byte[edi] |
||
458 | cmp bl, byte[esi] |
||
459 | jne compareBytes.no |
||
460 | inc edi |
||
461 | inc esi |
||
462 | cmp ecx, 0 |
||
463 | je @f |
||
464 | dec ecx |
||
465 | jmp @b |
||
466 | .no: |
||
467 | mov eax, 1 |
||
468 | @@: |
||
469 | pop ebx ecx esi edi |
||
470 | ret |
||
471 | |||
472 | |||
7412 | theonlymir | 473 | finishHotAnglesApp: |
7389 | theonlymir | 474 | ;находим все копии приложения по имени и завершаем их |
475 | push eax ebx ecx esi edi |
||
476 | ;указатели, которые никогда не меняются: |
||
477 | mov esi, startAppData.file_name ;первая строка - искомое имя приложения |
||
478 | mov edi, buf ;вторая строка - имя текущего слота |
||
479 | add edi, 10 |
||
480 | |||
481 | mov ecx, 1 |
||
482 | @@: |
||
483 | mcall 9, buf, ecx ;получаем данные очередного слота |
||
484 | mov dword[slotMax], eax |
||
485 | |||
486 | call compareBytes2 ;сравниваем имя |
||
487 | cmp eax, 0 |
||
7412 | theonlymir | 488 | jne finishHotAnglesApp.next ;если не совпало, то переходим на следующий слот |
7389 | theonlymir | 489 | |
490 | mcall 18, 2, ecx ;иначе завершаем слот |
||
491 | .next: |
||
492 | inc ecx |
||
493 | cmp ecx, dword[slotMax] |
||
494 | ja @f |
||
495 | jmp @b |
||
496 | @@: |
||
497 | pop edi esi ecx ebx eax |
||
7412 | theonlymir | 498 | ret |
7389 | theonlymir | 499 | |
7412 | theonlymir | 500 | startHotAnglesApp: |
7389 | theonlymir | 501 | ;запускаем приложение заново |
502 | push eax ebx |
||
503 | mcall 70, startAppData |
||
504 | cmp eax, 0 |
||
505 | ja @f ;если eax>0, то успешно запущено |
||
506 | ;!!! иначе тут печатаем ошибку |
||
507 | @@: |
||
508 | pop ebx eax |
||
509 | ret |
||
510 | |||
511 | startAppData: |
||
512 | .subfunction dd 7 |
||
513 | .flags dd 0 |
||
514 | .param dd 0 |
||
515 | .rezerv dd 0, 0 |
||
516 | .full_name db '/rd/1/' |
||
517 | .file_name db '@HOTANGLES', 0 |
||
518 | |||
519 | UpdateEditsSizes: |
||
520 | push eax |
||
521 | mov eax, dword[editLU.size] |
||
522 | mov dword[dataBuffer.size1], eax |
||
523 | |||
524 | mov eax, dword[editLD.size] |
||
525 | mov dword[dataBuffer.size2], eax |
||
526 | |||
527 | mov eax, dword[editRU.size] |
||
528 | mov dword[dataBuffer.size3], eax |
||
529 | |||
530 | mov eax, dword[editRD.size] |
||
531 | mov dword[dataBuffer.size4], eax |
||
532 | |||
7459 | theonlymir | 533 | mov eax, dword[editRadius.size] |
534 | mov dword[radiusBuffer.size], eax |
||
535 | |||
7389 | theonlymir | 536 | pop eax |
537 | ret |
||
538 | |||
539 | fileAdr dd 0 |
||
540 | |||
541 | loadConfig: |
||
542 | push eax ebx ecx edx |
||
543 | mcall 68, 27, fileName ;загружаем конфигурационный файл в ОЗУ |
||
544 | mov dword[fileAdr], eax ;сохраняем адрес блока памяти файла |
||
545 | cmp eax, 0 |
||
546 | je loadConfig.default ;если файла конфигурации нет, то ставим настройки по умолчанию |
||
547 | ;иначе данные загружены в ОЗУ, размер в edx |
||
548 | cmp edx, 0 ;если файл пуст, в нём нет данных, то ставим настройки по умолчанию |
||
549 | je loadConfig.default |
||
550 | .start: |
||
551 | add edx, eax ;кладём в edx - адрес конца конфиг.данных |
||
552 | |||
553 | .chStart: |
||
7443 | theonlymir | 554 | |
555 | push ebx |
||
556 | mov bl, byte[eax] |
||
557 | cmp bl, 48 ; если значение выходит за допустимые пределы, то проверяем на 'n' (для совместимости) |
||
558 | jb loadConfig.checkN |
||
559 | cmp bl, 51 |
||
560 | ja loadConfig.checkN |
||
561 | |||
562 | mov byte[mode], bl ;иначе устанавливаем этот режим как есть |
||
563 | jmp loadConfig.modeEnd ;и идём дальше |
||
564 | .checkN: |
||
565 | cmp bl, 'n' ;если n - то режим "отключено" |
||
566 | jne @f |
||
567 | mov byte[mode], 48 ;'0' |
||
568 | jmp loadConfig.modeEnd |
||
7436 | theonlymir | 569 | @@: |
7459 | theonlymir | 570 | cmp bl, 'y' ;если y - то классический режим |
571 | jne @f |
||
572 | mov byte[mode], 49 ;'1' |
||
573 | jmp loadConfig.modeEnd |
||
574 | @@: |
||
575 | mov byte[mode], 48 ;'0' иначе по умолчанию отключено |
||
576 | ;mov byte[mode], 49 ;'1' иначе по умолчанию включён классический режим работы |
||
7443 | theonlymir | 577 | .modeEnd: |
578 | pop ebx |
||
7389 | theonlymir | 579 | ;jmp loadConfig.end ;команда для удобства отладки и поиска ошибок |
580 | |||
581 | ;копируем содержимое строк в буфер |
||
582 | push edi esi ecx ebx eax |
||
583 | ;инициализируем указатели на адреса буфера строки и её размера |
||
7408 | theonlymir | 584 | mov edi, dataBuffer.1 |
585 | mov esi, dataBuffer.size1 |
||
7389 | theonlymir | 586 | ;ecx - счётчик байт в строке |
587 | .block: |
||
588 | xor ecx, ecx ;обнуляем счётчик |
||
589 | inc eax |
||
590 | cmp byte[eax], 10 ;если очередной код символа 10 или 13, то пропускаем символы |
||
7408 | theonlymir | 591 | je loadConfig.block ;до первого отличного от них |
7389 | theonlymir | 592 | cmp byte[eax], 13 |
7408 | theonlymir | 593 | je loadConfig.block |
7389 | theonlymir | 594 | |
595 | ; символ отличен от переноса строки и возврата каретки - начинаем копировать отсюда в буфер |
||
596 | mov bl, byte[eax] |
||
597 | mov byte[edi], bl |
||
598 | inc edi |
||
599 | inc eax |
||
600 | inc ecx ;увеличиваем счётчик символов в строке |
||
601 | |||
602 | ;идём до конца этой строки: пока не встретим очередной 10, 13, 0 или file end |
||
603 | .while: ;и копируем всё в буфер |
||
604 | cmp eax, edx ;проверяем закончился ли файл, а конца строки не было !!! |
||
605 | ja loadConfig.ura |
||
606 | cmp byte[eax], 10 |
||
607 | je loadConfig.ura |
||
608 | cmp byte[eax], 0 |
||
609 | je loadConfig.ura |
||
610 | cmp byte[eax], 13 |
||
611 | je loadConfig.ura |
||
612 | |||
613 | mov bl, byte[eax] |
||
614 | mov byte[edi], bl |
||
615 | inc edi |
||
616 | inc eax |
||
617 | inc ecx |
||
618 | cmp ecx, 511 |
||
619 | jae loadConfig.ura |
||
620 | jmp loadConfig.while |
||
621 | .ura: |
||
622 | mov byte[edi], 0 ;кладём завершающий 0 в строку |
||
623 | mov dword[esi], ecx ;сохраняем размер строки |
||
624 | add esi, 4 ;переходим на размер следующего буфера |
||
625 | sub edi, ecx ;переходим на следующий буфер |
||
626 | add edi, 512 |
||
7408 | theonlymir | 627 | ;xor ecx, ecx ;обнуляем размер строки |
7389 | theonlymir | 628 | |
629 | cmp edi, dataBuffer.size1 ;если это был последний буфер (и мы вышли за адреса размеров буферов), то выходим |
||
630 | jb loadConfig.block |
||
631 | |||
7459 | theonlymir | 632 | call readOptKey ;считываем клавишу |
633 | call gotoEndString |
||
634 | |||
635 | ;считываем сканкод клавиши |
||
636 | call readScanKey |
||
637 | call gotoEndString |
||
638 | |||
639 | call readOptRadius ;считываем значение радиуса для mode 3 |
||
640 | call gotoEndString |
||
641 | call readOptSize ;считываем размер элементов |
||
642 | call gotoEndString |
||
643 | |||
7389 | theonlymir | 644 | pop eax ebx ecx esi edi |
645 | |||
646 | jmp loadConfig.end |
||
647 | .default: |
||
648 | mov eax, defaultDataForConfig |
||
649 | mov edx, defaultDataSize |
||
650 | jmp loadConfig.start |
||
651 | .end: |
||
652 | mov ecx, dword[fileAdr] ;если файл был загружен, то |
||
653 | cmp ecx, 0 |
||
654 | je @f |
||
655 | mcall 68, 13, ecx ;выгружаем файл из памяти |
||
656 | @@: |
||
657 | call updateParams ;применяем настройки каждого буфера |
||
7459 | theonlymir | 658 | call setMySize ;применяем настройки размера элементов |
7389 | theonlymir | 659 | pop edx ecx ebx eax |
660 | ret |
||
661 | |||
662 | |||
7459 | theonlymir | 663 | setMySize: |
664 | push eax |
||
665 | ;выставляем mysize в зависимости от значения sizeStyle |
||
666 | cmp byte[sizeStyle], '0' |
||
667 | jb @f |
||
668 | cmp byte[sizeStyle], '7' |
||
669 | ja @f |
||
670 | mov eax, 0 ;если значение размера задано, то его и выставляем |
||
671 | mov al, byte[sizeStyle] |
||
672 | sub al, '0' |
||
673 | jmp .end |
||
674 | @@: |
||
675 | cmp byte[sizeStyle], 'a' |
||
676 | je .auto |
||
7469 | theonlymir | 677 | cmp byte[sizeStyle], 'x' |
678 | je .x |
||
7459 | theonlymir | 679 | .system: ;иначе значение по умолчанию: s - системная |
7469 | theonlymir | 680 | push ebx ecx edx |
681 | mcall 48, 11 ;получаем системный размер шрифта |
||
682 | ;теперь eax - высота шрифта в пикселях |
||
683 | mov ebx, 9 ;temp fix - делим на текущий размер шрифта and -1 |
||
684 | mov edx, 0 |
||
685 | div ebx |
||
686 | pop edx ecx ebx |
||
687 | |||
688 | cmp eax, 0 |
||
689 | je .end |
||
690 | cmp eax, 7 |
||
691 | jae .size7 |
||
692 | dec eax |
||
693 | ;mov eax, 0 ;test |
||
7459 | theonlymir | 694 | jmp .end |
7469 | theonlymir | 695 | .x: |
696 | mov byte[sizeStyle], 'x' |
||
697 | mov eax, 0 |
||
698 | jmp .end |
||
7459 | theonlymir | 699 | .auto: ;a - выставляем в зависимости от разрешения экрана |
700 | mcall 14 |
||
701 | push ebx |
||
702 | xor ebx, ebx |
||
703 | mov bx, ax |
||
704 | shr eax, 16 |
||
705 | cmp ax, bx ;получаем больший размер стороны |
||
706 | jae .a |
||
707 | mov ax, bx |
||
708 | .a: |
||
709 | pop ebx |
||
7469 | theonlymir | 710 | cmp ax, 1300 ;1919 ;размеры полученные выше от 0 и на 1 меньше |
7459 | theonlymir | 711 | jb .size0 |
7469 | theonlymir | 712 | cmp ax, 1899 ;919 |
713 | jb .x |
||
7459 | theonlymir | 714 | cmp ax, 2047 |
715 | jb .size1 |
||
716 | cmp ax, 4095 |
||
717 | jb .size2 |
||
718 | cmp ax, 8191 |
||
719 | jb .size3 |
||
7469 | theonlymir | 720 | cmp ax, 16383 |
721 | jb .size4 |
||
722 | cmp ax, 32767 |
||
723 | jb .size5 |
||
724 | cmp ax, 65535 |
||
725 | jb .size6 |
||
7459 | theonlymir | 726 | |
7469 | theonlymir | 727 | jmp .size7 |
7459 | theonlymir | 728 | |
729 | .size0: |
||
730 | mov eax, 0 |
||
731 | jmp .end |
||
732 | .size1: |
||
733 | mov eax, 1 |
||
734 | jmp .end |
||
735 | .size2: |
||
736 | mov eax, 2 |
||
737 | jmp .end |
||
738 | .size3: |
||
739 | mov eax, 3 |
||
740 | jmp .end |
||
741 | .size4: |
||
742 | mov eax, 4 |
||
743 | jmp .end |
||
744 | .size5: |
||
745 | mov eax, 5 |
||
746 | jmp .end |
||
747 | .size6: |
||
748 | mov eax, 6 |
||
749 | jmp .end |
||
750 | .size7: |
||
751 | mov eax, 7 |
||
752 | jmp .end |
||
753 | |||
754 | ;.default: |
||
755 | ; mov eax, 1 |
||
756 | .end: |
||
757 | mov byte[mysize], al ;mov dword[mysize], eax |
||
758 | pop eax |
||
759 | ret |
||
760 | |||
761 | |||
762 | readScanKey: |
||
763 | ;пропускаем переносы строк в начале |
||
764 | cmp eax, edx ;если файл закончился, то |
||
765 | ja .default ;настройки по умолчанию |
||
766 | cmp byte[eax], 10 |
||
767 | je @f |
||
768 | cmp byte[eax], 0 |
||
769 | je @f |
||
770 | cmp byte[eax], 13 |
||
771 | je @f |
||
772 | |||
773 | push ecx ebx esi |
||
774 | mov ecx, 0 ;xor ecx, ecx |
||
775 | mov esi, keystr.data |
||
776 | .copy: |
||
777 | mov bl, byte[eax] |
||
778 | cmp bl, 0 |
||
779 | je .copyEnd |
||
780 | cmp bl, 10 |
||
781 | je .copyEnd |
||
782 | cmp bl, 13 |
||
783 | je .copyEnd |
||
784 | cmp esi, keystr.size-1 |
||
785 | jae .copyEnd |
||
786 | mov byte[esi], bl |
||
787 | inc esi |
||
788 | inc eax |
||
789 | inc ecx |
||
790 | jmp .copy |
||
791 | .copyEnd: |
||
792 | mov byte[esi], 0 |
||
793 | mov dword[keystr.size], ecx |
||
794 | pop esi ebx ecx |
||
795 | |||
796 | jmp .end |
||
797 | @@: |
||
798 | inc eax |
||
799 | jmp readScanKey |
||
800 | .default: |
||
801 | mov byte[keyscan], 57 |
||
802 | mov word[keystr.data], '57' |
||
803 | mov byte[keystr.data+2], 0 |
||
804 | mov dword[keystr.size], 2 |
||
805 | .end: |
||
806 | ret |
||
807 | |||
808 | readOptKey: ;1;3;4;5 - space or shift |
||
809 | ;пропускаем переносы строк в начале |
||
810 | cmp eax, edx ;если файл закончился, то |
||
811 | ja .default ;настройки по умолчанию |
||
812 | cmp byte[eax], 10 |
||
813 | je @f |
||
814 | cmp byte[eax], 0 |
||
815 | je @f |
||
816 | cmp byte[eax], 13 |
||
817 | je @f |
||
818 | ;иначе читаем клавишу и выходим |
||
819 | cmp dword[eax], 'Ctrl' |
||
820 | jne .notCtrl |
||
821 | mov byte[hkSymbol], 3 |
||
822 | mov dword[hkSize], 4 |
||
823 | jmp .end |
||
824 | .notCtrl: |
||
825 | cmp dword[eax], 'Shif' |
||
826 | jne .notShift |
||
827 | mov byte[hkSymbol], 2 |
||
828 | mov dword[hkSize], 5 |
||
829 | jmp .end |
||
830 | .notShift: |
||
831 | cmp dword[eax], 'Spac' |
||
832 | jne .notSpace |
||
833 | mov byte[hkSymbol], 32 |
||
834 | mov dword[hkSize], 5 |
||
835 | jmp .end |
||
836 | .notSpace: |
||
837 | cmp word[eax], 'Al' |
||
838 | jne .notAlt |
||
839 | mov byte[hkSymbol], 1 |
||
840 | mov dword[hkSize], 3 |
||
841 | jmp .end |
||
842 | .notAlt: |
||
843 | ;убедимся, что там 1 символ, а не строка |
||
844 | cmp byte[eax+1], 10 |
||
845 | je .oneSymb |
||
846 | cmp byte[eax+1], 0 |
||
847 | je .oneSymb |
||
848 | cmp byte[eax+1], 13 |
||
849 | je .oneSymb |
||
850 | jmp .default |
||
851 | .oneSymb: |
||
852 | ;проверяем, что символ разрешённый !!! |
||
853 | |||
854 | ;добавляем символ как есть |
||
855 | push ebx |
||
856 | ;xor ebx, ebx |
||
857 | mov bl, byte[eax] |
||
858 | mov byte[hkSymbol], bl |
||
859 | mov dword[hkSize], 1 |
||
860 | pop ebx |
||
861 | |||
862 | jmp .end |
||
863 | @@: |
||
864 | inc eax |
||
865 | jmp readOptKey |
||
866 | |||
867 | .default: |
||
868 | mov byte[hkSymbol], 32 |
||
869 | mov dword[hkSize], 5 |
||
870 | .end: |
||
871 | mov byte[hkSymbol+1], 0 |
||
872 | ret |
||
873 | |||
874 | ;проходим до конца текущей строки |
||
875 | gotoEndString: |
||
876 | cmp eax, edx ;если файл закончился, то |
||
877 | ja @f ;выходим |
||
878 | cmp byte[eax], 10 |
||
879 | je @f |
||
880 | cmp byte[eax], 0 |
||
881 | je @f |
||
882 | cmp byte[eax], 13 |
||
883 | je @f |
||
884 | ;иначе переходим на следующий символ |
||
885 | inc eax |
||
886 | jmp gotoEndString |
||
887 | @@: |
||
888 | ret |
||
889 | |||
890 | readOptRadius: |
||
891 | ;пропускаем переносы строк в начале |
||
892 | cmp eax, edx ;если файл закончился, то |
||
893 | ja .default ;настройки по умолчанию |
||
894 | cmp byte[eax], 10 |
||
895 | je @f |
||
896 | cmp byte[eax], 0 |
||
897 | je @f |
||
898 | cmp byte[eax], 13 |
||
899 | je @f |
||
900 | |||
901 | ;иначе считываем значение |
||
902 | push ebx ecx |
||
903 | xor ecx, ecx |
||
904 | .readValue: |
||
905 | mov bl, byte[eax] |
||
906 | mov byte[radiusBuffer.data+ecx], bl |
||
907 | inc ecx |
||
908 | inc eax |
||
909 | cmp eax, edx ;если файл закончился, то выход |
||
910 | ja .readEnd |
||
911 | cmp byte[eax], 10 |
||
912 | je .readEnd |
||
913 | cmp byte[eax], 0 |
||
914 | je .readEnd |
||
915 | cmp byte[eax], 13 |
||
916 | je .readEnd |
||
917 | cmp ecx, 6 |
||
918 | jae .readEnd |
||
919 | jmp .readValue |
||
920 | .readEnd: |
||
921 | mov byte[radiusBuffer.data+ecx], 0 |
||
922 | mov dword[radiusBuffer.size], ecx |
||
923 | pop ecx ebx |
||
924 | |||
925 | jmp .end |
||
926 | @@: |
||
927 | inc eax |
||
928 | jmp readOptRadius |
||
929 | .default: |
||
930 | mov byte[radiusBuffer.data], '0' |
||
931 | mov byte[radiusBuffer.data+1], 0 |
||
932 | mov dword[radiusBuffer.size], 1 |
||
933 | .end: |
||
934 | |||
935 | ret |
||
936 | |||
937 | |||
938 | readOptSize: |
||
939 | ;пропускаем переносы строк в начале |
||
940 | cmp eax, edx ;если файл закончился, то |
||
941 | ja .default ;настройки по умолчанию |
||
942 | cmp byte[eax], 10 |
||
943 | je @f |
||
944 | cmp byte[eax], 0 |
||
945 | je @f |
||
946 | cmp byte[eax], 13 |
||
947 | je @f |
||
948 | |||
949 | ;проверяем, что это допустимое значение: 1-7, a, s |
||
950 | cmp byte[eax], 'a' |
||
951 | je .setValue |
||
952 | cmp byte[eax], 's' |
||
953 | je .setValue |
||
7469 | theonlymir | 954 | cmp byte[eax], 'x' |
955 | je .setValue |
||
7459 | theonlymir | 956 | cmp byte[eax], '0' |
957 | je .setValue |
||
958 | cmp byte[eax], '1' |
||
959 | je .setValue |
||
960 | cmp byte[eax], '2' |
||
961 | je .setValue |
||
962 | cmp byte[eax], '3' |
||
963 | je .setValue |
||
964 | cmp byte[eax], '4' |
||
965 | je .setValue |
||
966 | cmp byte[eax], '5' |
||
967 | je .setValue |
||
968 | cmp byte[eax], '6' |
||
969 | je .setValue |
||
970 | cmp byte[eax], '7' |
||
971 | je .setValue |
||
972 | |||
973 | jmp .default ;иначе ставим значение по умолчанию |
||
974 | |||
975 | .setValue: |
||
976 | push ebx |
||
977 | mov bl, byte[eax] |
||
978 | mov byte[sizeStyle], bl |
||
979 | pop ebx |
||
980 | |||
981 | jmp .end |
||
982 | @@: |
||
983 | inc eax |
||
984 | jmp readOptSize |
||
985 | .default: |
||
986 | mov byte[sizeStyle], 's' ;системный |
||
987 | .end: |
||
988 | ret |
||
989 | |||
990 | |||
991 | |||
992 | |||
7389 | theonlymir | 993 | updateParams: ;max, size, pos |
994 | push eax |
||
995 | mov eax, dword[dataBuffer.size1] |
||
996 | mov dword[editLU.size], eax |
||
997 | mov dword[editLU.pos], eax |
||
998 | |||
999 | mov eax, dword[dataBuffer.size2] |
||
1000 | mov dword[editLD.size], eax |
||
1001 | mov dword[editLD.pos], eax |
||
1002 | |||
1003 | mov eax, dword[dataBuffer.size3] |
||
1004 | mov dword[editRU.size], eax |
||
1005 | mov dword[editRU.pos], eax |
||
1006 | |||
1007 | mov eax, dword[dataBuffer.size4] |
||
1008 | mov dword[editRD.size], eax |
||
1009 | mov dword[editRD.pos], eax |
||
7459 | theonlymir | 1010 | |
1011 | mov eax, dword[radiusBuffer.size] |
||
1012 | mov dword[editRadius.size], eax |
||
1013 | mov dword[editRadius.pos], eax |
||
7389 | theonlymir | 1014 | pop eax |
1015 | ret |
||
1016 | |||
1017 | |||
1018 | |||
7408 | theonlymir | 1019 | selfName db 'HACONFIG', 0 |
1020 | selfNameSize = 8 ;до 11 byte |
||
7389 | theonlymir | 1021 | ; |
1022 | compareBytes: |
||
1023 | push edi esi ecx ebx |
||
1024 | mov eax, 0 ;xor eax, eax |
||
7408 | theonlymir | 1025 | mov ecx, selfNameSize ;max размер строк 11 |
7389 | theonlymir | 1026 | @@: |
1027 | mov bl, byte[edi] |
||
1028 | cmp bl, byte[esi] |
||
1029 | jne compareBytes.no |
||
1030 | inc edi |
||
1031 | inc esi |
||
1032 | cmp ecx, 0 |
||
1033 | je @f |
||
1034 | dec ecx |
||
1035 | jmp @b |
||
1036 | .no: |
||
1037 | mov eax, 1 |
||
1038 | @@: |
||
1039 | pop ebx ecx esi edi |
||
1040 | ret |
||
1041 | ; |
||
1042 | slotMax dd 0 |
||
1043 | selfPID dd 0 |
||
1044 | buf db 1024 dup(0) |
||
1045 | copyKill: |
||
1046 | push eax ebx ecx esi edi |
||
1047 | |||
1048 | ;сперва прочтём свою информацию |
||
1049 | mcall 9, buf, -1 |
||
1050 | mov eax, dword[buf+30] |
||
1051 | mov dword[selfPID], eax |
||
1052 | |||
1053 | ;указатели, которые никогда не меняются: |
||
1054 | mov esi, selfName ;первая строка - имя текущего приложения |
||
1055 | mov edi, buf ;вторая строка - имя текущего слота |
||
1056 | add edi, 10 |
||
1057 | |||
1058 | mov ecx, 1 |
||
1059 | @@: |
||
1060 | mcall 9, buf, ecx |
||
1061 | mov dword[slotMax], eax |
||
1062 | |||
1063 | ;если это мы сами, то пропускаем проверку |
||
1064 | mov eax, dword[buf+30] |
||
1065 | cmp eax, dword[selfPID] |
||
1066 | je copyKill.propusk |
||
1067 | |||
1068 | call compareBytes ;сравниваем 11 байт строк, результат в eax |
||
1069 | |||
1070 | cmp eax, 0 |
||
1071 | je copyKill.selfKill |
||
1072 | |||
1073 | .propusk: |
||
1074 | inc ecx |
||
1075 | cmp ecx, dword[slotMax] |
||
1076 | ja @f |
||
1077 | jmp @b |
||
1078 | |||
1079 | .selfKill: |
||
1080 | pop edi esi ecx ebx eax |
||
1081 | mcall -1 |
||
1082 | ret |
||
1083 | @@: |
||
1084 | pop edi esi ecx ebx eax |
||
1085 | ret |
||
1086 | |||
7469 | theonlymir | 1087 | |
1088 | |||
1089 | |||
1090 | reg: dw 0 |
||
1091 | shlRegForSizeElems: |
||
1092 | push eax edx |
||
1093 | xor eax, eax |
||
1094 | xor edx, edx |
||
1095 | mov ax, word[reg] |
||
1096 | mov dl, byte[mysize] |
||
1097 | @@: |
||
1098 | cmp dl, 0 |
||
1099 | je @f |
||
1100 | shl ax, 1 |
||
1101 | dec dl |
||
1102 | jmp @b |
||
1103 | @@: |
||
1104 | mov word[reg], ax |
||
1105 | pop edx eax |
||
1106 | ret |
||
1107 | |||
7389 | theonlymir | 1108 | WindowsWidth = 450 |
7459 | theonlymir | 1109 | WindowsHeight = 195 + 35 - 5 |
7389 | theonlymir | 1110 | coord: ;координаты окна приложения |
1111 | .y dw 0 |
||
1112 | .x dw 0 |
||
1113 | |||
7469 | theonlymir | 1114 | |
1115 | |||
1116 | |||
1117 | |||
1118 | BaseY = 36 ;смещение до первого, самого верхнего, элемента внутри окна |
||
1119 | |||
1120 | elem: |
||
1121 | .winWidth: dw 450 |
||
1122 | .winHeight: dw 225 |
||
1123 | .butAppleWidth: dw 80 |
||
1124 | .butAppleHeight: dw 20 |
||
1125 | .textDelta: dw 3 ;отступ между строками многострочного текста |
||
1126 | .butDialWidth: dw 30 ;высота и ширина для 4 кнопок диалогового окна |
||
1127 | .butDialHeight: dw 14 |
||
1128 | .textHeight: dw 9 ;размер высота шрифта |
||
1129 | ;.editHeight: dw |
||
1130 | .editCommandWidth: dw 150 ;180-butDialWidth |
||
1131 | .butModeWidth: dw 221 |
||
1132 | ;.textCommandUpY: dw 74 |
||
1133 | .butModeY: dw 160 |
||
1134 | ;.editRadiusWidth: dw 40 |
||
1135 | elemEnd: |
||
1136 | |||
1137 | |||
1138 | ;выставляем все значения по умолчанию |
||
1139 | defaultElems: |
||
1140 | mov word[elem.winWidth], 450 |
||
1141 | mov word[elem.winHeight], 225 |
||
1142 | mov word[elem.butAppleWidth], 80 |
||
1143 | mov word[elem.butAppleHeight], 20 |
||
1144 | mov word[elem.textDelta], 3 |
||
1145 | mov word[elem.butDialWidth], 30 |
||
1146 | mov word[elem.butDialHeight], 14 |
||
1147 | mov word[elem.textHeight], 9 |
||
1148 | mov word[elem.editCommandWidth], 150 |
||
1149 | mov word[elem.butModeWidth], 221 |
||
1150 | mov word[elem.butModeY], 160 |
||
1151 | ;mov word[elem.editRadiusWidth], 40 |
||
1152 | ret |
||
1153 | |||
1154 | ;проходим по всем элементам и перевычисляем параметры (функция выполняется 1 раз при загрузке конфигурации) |
||
1155 | resizeElems: |
||
1156 | push ebx esi |
||
1157 | xor ebx, ebx |
||
1158 | mov esi, elem |
||
1159 | @@: |
||
1160 | cmp esi, elemEnd |
||
1161 | jae @f |
||
1162 | |||
1163 | mov bx, word[esi] |
||
1164 | mov word[reg], bx |
||
1165 | call shlRegForSizeElems |
||
1166 | mov bx, word[reg] |
||
1167 | mov word[esi], bx |
||
1168 | add esi, 2 |
||
1169 | jmp @b |
||
1170 | @@: |
||
1171 | pop esi ebx |
||
1172 | ret |
||
1173 | |||
1174 | |||
1175 | |||
1176 | |||
1177 | |||
1178 | |||
1179 | |||
1180 | |||
7389 | theonlymir | 1181 | draw_window: |
7469 | theonlymir | 1182 | ;удаляем кнопку, если есть |
1183 | mov edx, 0x80000002 |
||
1184 | mcall 8 |
||
7389 | theonlymir | 1185 | |
7469 | theonlymir | 1186 | ;удаляем ещё 4 кнопки если они есть |
1187 | mov edx, 0x80000004 |
||
1188 | mcall 8 |
||
1189 | mov edx, 0x80000005 |
||
1190 | mcall 8 |
||
1191 | mov edx, 0x80000006 |
||
1192 | mcall 8 |
||
1193 | mov edx, 0x80000007 |
||
1194 | mcall 8 |
||
7436 | theonlymir | 1195 | |
7469 | theonlymir | 1196 | mov eax, 12 ; function 12: tell os about windowdraw |
1197 | mov ebx, 1 ; 1, start of draw |
||
1198 | mcall |
||
7389 | theonlymir | 1199 | |
7469 | theonlymir | 1200 | cmp byte[sizeStyle], 'x' |
1201 | je draw_window_x |
||
1202 | jmp draw_window_old |
||
1203 | |||
1204 | draw_window_x: |
||
1205 | mov word[elem.winWidth], 450+150 |
||
1206 | mov word[elem.winHeight], 225+220/2 |
||
1207 | mov word[elem.butAppleWidth], 80+80/3 |
||
1208 | mov word[elem.butAppleHeight], 20+20/3 |
||
1209 | mov word[elem.textDelta], 3 |
||
1210 | mov word[elem.butDialWidth], 30+10 |
||
1211 | mov word[elem.butDialHeight], 14+7 |
||
1212 | mov word[elem.textHeight], 9*2 |
||
1213 | mov word[elem.editCommandWidth], 150+50 |
||
1214 | mov word[elem.butModeWidth], 221 |
||
1215 | mov word[elem.butModeY], 160+90 |
||
1216 | |||
1217 | draw_window_old: |
||
7389 | theonlymir | 1218 | ;отобразим окно по центру экрана для этого: |
1219 | mcall 14 ;получим размеры экрана |
||
1220 | mov dword[coord], eax ;положим размеры экрана в координаты |
||
1221 | shr word[coord.x], 1 ;вернее положим их половину |
||
1222 | shr word[coord.y], 1 |
||
1223 | |||
1224 | ;вычисляем координаты окна, чтобы окно было по середине экрана |
||
7469 | theonlymir | 1225 | mov bx, word[elem.winWidth] ;отнимаем от середины экрана половину размера окна |
1226 | shr bx, 1 |
||
1227 | sub word[coord.x], bx |
||
7389 | theonlymir | 1228 | |
7469 | theonlymir | 1229 | mov bx, word[elem.winHeight] |
1230 | shr bx, 1 |
||
1231 | sub word[coord.y], bx |
||
1232 | |||
7389 | theonlymir | 1233 | mov eax, 0 ; function 0 : define and draw window |
7408 | theonlymir | 1234 | mov ebx, 0 ; [x start] *65536 + [x size] |
7389 | theonlymir | 1235 | mov bx, word[coord.x] |
1236 | shl ebx, 16 |
||
7469 | theonlymir | 1237 | mov bx, word[elem.winWidth] |
7389 | theonlymir | 1238 | |
1239 | mov ecx, 0 |
||
7408 | theonlymir | 1240 | mov cx, word[coord.y] ; [y start] *65536 + [y size] |
7389 | theonlymir | 1241 | shl ecx, 16 |
7469 | theonlymir | 1242 | mov cx, word[elem.winHeight] |
7389 | theonlymir | 1243 | |
1244 | mov edx, 0x14ffffff ; color of work area RRGGBB |
||
1245 | ; 0x02000000 = window type 4 (fixed size, skinned window) |
||
1246 | mov esi, 0x808899ff ; color of grab bar RRGGBB |
||
1247 | ; 0x80000000 = color glide |
||
1248 | mov edi, title |
||
1249 | mcall |
||
1250 | |||
7469 | theonlymir | 1251 | |
1252 | ;размеры и координаты |
||
1253 | ;push eax |
||
1254 | xor eax, eax ;mov eax, 0 |
||
1255 | mov ax, word[elem.editCommandWidth] |
||
1256 | mov dword[editLU.width], eax |
||
1257 | mov dword[editLD.width], eax |
||
1258 | mov dword[editRU.width], eax |
||
1259 | mov dword[editRD.width], eax |
||
1260 | |||
1261 | ;mov ax, word[elem.editRadiusWidth] |
||
1262 | mov ax, word[elem.winWidth] |
||
1263 | sub ax, word[elem.butModeWidth] |
||
1264 | sub ax, Otstup |
||
1265 | sub ax, word[elem.butAppleHeight] ;Otstup |
||
1266 | shr ax, 1 |
||
1267 | sub ax, Otstup |
||
1268 | mov dword[editRadius.width], eax |
||
1269 | |||
1270 | ;mov ax, word[elem.butDialHeight] |
||
1271 | xor ecx, ecx |
||
1272 | call setNewSizeForText |
||
1273 | mov dword[editLU.text_color], ecx ;0x90000000 ;eax |
||
1274 | mov dword[editLD.text_color], ecx |
||
1275 | mov dword[editRU.text_color], ecx |
||
1276 | mov dword[editRD.text_color], ecx |
||
1277 | mov dword[editRadius.text_color], ecx |
||
1278 | |||
1279 | ;mov ecx, dword[editRadius.height] |
||
1280 | ;mov word[elem.butDialHeight], cx |
||
1281 | |||
1282 | ;mov eax, 0 |
||
1283 | mov ax, word[elem.winWidth] |
||
1284 | sub ax, Otstup |
||
1285 | sub ax, word[elem.butDialWidth] |
||
1286 | sub ax, word[elem.editCommandWidth] |
||
1287 | mov dword[editRU.left], eax |
||
1288 | mov dword[editRD.left], eax |
||
1289 | |||
1290 | mov ax, Otstup |
||
1291 | add ax, word[elem.butDialWidth] |
||
1292 | mov dword[editLU.left], eax |
||
1293 | mov dword[editLD.left], eax |
||
1294 | |||
1295 | mov ax, word[elem.textHeight] |
||
1296 | add ax, word[elem.textDelta] |
||
1297 | shl ax, 2 |
||
1298 | add ax, BaseY+2 |
||
1299 | mov dword[editLU.top], eax |
||
1300 | mov dword[editRU.top], eax |
||
1301 | |||
1302 | add ax, 4 |
||
1303 | ;mov ax, word[elem.textHeight] |
||
1304 | ;add ax, word[elem.textDelta] |
||
1305 | ;shl ax, 2 |
||
1306 | sub ax, word[elem.textHeight] |
||
1307 | ;add ax, BaseY |
||
1308 | add ax, word[elem.textHeight] |
||
1309 | ;add ax, 6 |
||
1310 | add ax, word[elem.butDialHeight] |
||
1311 | add ax, word[elem.textHeight] |
||
1312 | add ax, word[elem.textHeight] |
||
1313 | mov dword[editLD.top], eax |
||
1314 | mov dword[editRD.top], eax |
||
1315 | |||
1316 | ;pop eax |
||
1317 | ;mcall 48,3,sc,40 |
||
1318 | ;edit_boxes_set_sys_color editRadius, sc ;editLU, editLD, editRU, editRD, editRadius, sc |
||
1319 | |||
7402 | theonlymir | 1320 | invoke edit_box_draw, editLU ;рисование edit box'ов |
1321 | invoke edit_box_draw, editLD |
||
1322 | invoke edit_box_draw, editRU |
||
1323 | invoke edit_box_draw, editRD |
||
7389 | theonlymir | 1324 | |
1325 | ;рисуем кнопку |
||
7469 | theonlymir | 1326 | mov bx, word[elem.winWidth] ;координата X кнопки |
1327 | sub bx, word[elem.butAppleWidth] |
||
1328 | sub bx, Otstup |
||
1329 | shl ebx, 16 |
||
1330 | add bx, word[elem.butAppleWidth] ;ширина кнопки |
||
1331 | |||
1332 | mov cx, word[elem.winHeight] ;координата Y |
||
1333 | sub cx, word[elem.butAppleHeight] |
||
1334 | sub cx, 15 |
||
1335 | shl ecx, 16 |
||
1336 | add cx, word[elem.butAppleHeight] ;высота кнопки |
||
1337 | |||
1338 | mov edx, 0x00000002 ;номер кнопки |
||
7389 | theonlymir | 1339 | mov esi, 0x00AABBCC ;цвет кнопки |
1340 | mcall 8 |
||
1341 | ;рисуем текст кнопки |
||
7469 | theonlymir | 1342 | mov bx, word[elem.winWidth] ;координата X текста |
1343 | sub bx, word[elem.butAppleWidth] |
||
1344 | sub bx, Otstup |
||
1345 | add bx, 25 |
||
1346 | sub bx, buttonTextXoffset ;!!!use size |
||
1347 | shl ebx, 16 |
||
1348 | add bx, word[elem.winHeight] ;координата Y текста |
||
1349 | sub bx, word[elem.butAppleHeight] |
||
1350 | sub bx, 15 |
||
1351 | add bx, 6 ;!!!use size |
||
1352 | |||
7389 | theonlymir | 1353 | mov ecx, 0xFFFFFF ;белый цвет текста |
7469 | theonlymir | 1354 | call setNewSizeForText |
7389 | theonlymir | 1355 | mov edx, buttonText |
7448 | theonlymir | 1356 | mov esi, buttonTextSize ;размер текста в символах |
7395 | theonlymir | 1357 | mcall 4 |
7389 | theonlymir | 1358 | |
7436 | theonlymir | 1359 | ;рисуем ещё 4 кнопки для диалогового окна выбора файла |
1360 | ;номера 4,5,6 и 7 |
||
7448 | theonlymir | 1361 | buttonH = 14 |
7436 | theonlymir | 1362 | buttonW = 30 |
7469 | theonlymir | 1363 | |
1364 | |||
7436 | theonlymir | 1365 | ;левый верхний угол |
7469 | theonlymir | 1366 | mov ebx, Otstup ;координата X |
1367 | shl ebx, 16 |
||
1368 | add bx, word[elem.butDialWidth] ;ширина кнопки |
||
1369 | |||
1370 | ;mov ecx, 85 ;координата Y 36+3*9+2*3+ 5 +9+2 |
||
1371 | ;BaseY+4*(word[elem.textHeight]+word[elem.textDelta])+2 |
||
1372 | mov cx, word[elem.textHeight] |
||
1373 | add cx, word[elem.textDelta] |
||
1374 | shl cx, 2 |
||
1375 | add cx, BaseY+2 |
||
1376 | shl ecx, 16 |
||
1377 | add cx, word[elem.butDialHeight] ;высота кнопки |
||
1378 | |||
7436 | theonlymir | 1379 | mov edx, 0x00000004 ;номер кнопки |
1380 | mov esi, 0x00AABBCC ;цвет кнопки |
||
1381 | mcall 8 |
||
7469 | theonlymir | 1382 | |
7436 | theonlymir | 1383 | ;левый нижний угол |
7469 | theonlymir | 1384 | mov ebx, Otstup ;координата X |
1385 | shl ebx, 16 |
||
1386 | add bx, word[elem.butDialWidth] ;ширина кнопки |
||
1387 | ;mov ecx, 120 ;координата Y |
||
1388 | mov cx, word[elem.textHeight] |
||
1389 | add cx, word[elem.textDelta] |
||
1390 | shl cx, 2 |
||
1391 | sub cx, word[elem.textHeight] |
||
1392 | add cx, BaseY |
||
1393 | add cx, word[elem.textHeight] |
||
1394 | add cx, 6 |
||
1395 | add cx, word[elem.butDialHeight] |
||
1396 | add cx, word[elem.textHeight] |
||
1397 | add cx, word[elem.textHeight] |
||
1398 | |||
1399 | shl ecx, 16 |
||
1400 | add cx, word[elem.butDialHeight] ;высота кнопки |
||
1401 | |||
7436 | theonlymir | 1402 | mov edx, 0x00000005 ;номер кнопки |
1403 | mov esi, 0x00AABBCC ;цвет кнопки |
||
1404 | mcall 8 |
||
7469 | theonlymir | 1405 | |
7436 | theonlymir | 1406 | ;правый верхний угол |
7469 | theonlymir | 1407 | ;mov ebx, (WindowsWidth-Otstup-buttonW)*65536 + buttonW ;координата X, ширина кнопки |
1408 | mov bx, word[elem.winWidth] ;координата X |
||
1409 | sub bx, Otstup |
||
1410 | sub bx, word[elem.butDialWidth] |
||
1411 | |||
1412 | shl ebx, 16 |
||
1413 | add bx, word[elem.butDialWidth] ;ширина кнопки |
||
1414 | |||
1415 | ;mov ecx, 85 ;координата Y 36+3*9+2*3+ 5 +9+2 |
||
1416 | ;BaseY+4*(word[elem.textHeight]+word[elem.textDelta])+2 |
||
1417 | mov cx, word[elem.textHeight] |
||
1418 | add cx, word[elem.textDelta] |
||
1419 | shl cx, 2 |
||
1420 | add cx, BaseY+2 |
||
1421 | shl ecx, 16 |
||
1422 | add cx, word[elem.butDialHeight] ;высота кнопки |
||
1423 | |||
7436 | theonlymir | 1424 | mov edx, 0x00000006 ;номер кнопки |
1425 | mov esi, 0x00AABBCC ;цвет кнопки |
||
1426 | mcall 8 |
||
7469 | theonlymir | 1427 | |
1428 | |||
1429 | |||
1430 | |||
7436 | theonlymir | 1431 | ;правый нижний угол |
7469 | theonlymir | 1432 | mov bx, word[elem.winWidth] ;координата X |
1433 | sub bx, Otstup |
||
1434 | sub bx, word[elem.butDialWidth] |
||
1435 | shl ebx, 16 |
||
1436 | add bx, word[elem.butDialWidth] ;ширина кнопки |
||
1437 | |||
1438 | mov cx, word[elem.textHeight] ;координата Y |
||
1439 | add cx, word[elem.textDelta] |
||
1440 | shl cx, 2 |
||
1441 | sub cx, word[elem.textHeight] |
||
1442 | add cx, BaseY |
||
1443 | add cx, word[elem.textHeight] |
||
1444 | add cx, 6 |
||
1445 | add cx, word[elem.butDialHeight] |
||
1446 | add cx, word[elem.textHeight] |
||
1447 | add cx, word[elem.textHeight] |
||
1448 | shl ecx, 16 |
||
1449 | add cx, word[elem.butDialHeight] ;высота кнопки |
||
1450 | |||
7436 | theonlymir | 1451 | mov edx, 0x00000007 ;номер кнопки |
1452 | mov esi, 0x00AABBCC ;цвет кнопки |
||
1453 | mcall 8 |
||
1454 | |||
1455 | ;рисуем тексты для этих 4 кнопок |
||
1456 | mov ecx, 0xFFFFFF ;белый цвет текста |
||
7469 | theonlymir | 1457 | call setNewSizeForText |
7436 | theonlymir | 1458 | mov edx, commonButtonText ;строка текста |
1459 | mov esi, commonButtonTextSize ;размер текста в символах |
||
1460 | ;координаты текста (x, y) |
||
1461 | deltaCommonTextX = 7 |
||
1462 | deltaCommonTextY = 2 |
||
7469 | theonlymir | 1463 | ;mov ebx, (Otstup+deltaCommonTextX) * 65536 + (85 + deltaCommonTextY) |
1464 | mov ebx, Otstup+deltaCommonTextX |
||
1465 | shl ebx, 16 |
||
1466 | mov bx, word[elem.textHeight] |
||
1467 | add bx, word[elem.textDelta] |
||
1468 | shl bx, 2 |
||
1469 | add bx, BaseY+2 |
||
1470 | add bx, deltaCommonTextY |
||
1471 | |||
7436 | theonlymir | 1472 | mcall 4 |
7469 | theonlymir | 1473 | |
1474 | ; |
||
1475 | ;mov ebx, (Otstup+deltaCommonTextX) * 65536 + (120 + deltaCommonTextY) |
||
1476 | mov ebx, Otstup+deltaCommonTextX |
||
1477 | shl ebx, 16 |
||
1478 | mov bx, word[elem.textHeight] ;координата Y |
||
1479 | add bx, word[elem.textDelta] |
||
1480 | shl bx, 2 |
||
1481 | sub bx, word[elem.textHeight] |
||
1482 | add bx, BaseY |
||
1483 | add bx, word[elem.textHeight] |
||
1484 | add bx, 6 |
||
1485 | add bx, word[elem.butDialHeight] |
||
1486 | add bx, word[elem.textHeight] |
||
1487 | add bx, word[elem.textHeight] |
||
1488 | add bx, deltaCommonTextY |
||
1489 | |||
7436 | theonlymir | 1490 | mcall 4 |
7469 | theonlymir | 1491 | |
1492 | |||
1493 | ;mov ebx, (WindowsWidth-Otstup-buttonW+deltaCommonTextX) * 65536 + (85 + deltaCommonTextY) |
||
1494 | mov bx, word[elem.winWidth] ;координата X |
||
1495 | sub bx, Otstup |
||
1496 | sub bx, word[elem.butDialWidth] |
||
1497 | add bx, deltaCommonTextX |
||
1498 | shl ebx, 16 |
||
1499 | mov bx, word[elem.textHeight] |
||
1500 | add bx, word[elem.textDelta] |
||
1501 | shl bx, 2 |
||
1502 | add bx, BaseY+2 |
||
1503 | add bx, deltaCommonTextY |
||
1504 | |||
7436 | theonlymir | 1505 | mcall 4 |
7469 | theonlymir | 1506 | |
1507 | ;mov ebx, (WindowsWidth-Otstup-buttonW+deltaCommonTextX) * 65536 + (120 + deltaCommonTextY) |
||
1508 | mov bx, word[elem.winWidth] ;координата X |
||
1509 | sub bx, Otstup |
||
1510 | sub bx, word[elem.butDialWidth] |
||
1511 | add bx, deltaCommonTextX |
||
1512 | shl ebx, 16 |
||
1513 | mov bx, word[elem.textHeight] ;координата Y |
||
1514 | add bx, word[elem.textDelta] |
||
1515 | shl bx, 2 |
||
1516 | sub bx, word[elem.textHeight] |
||
1517 | add bx, BaseY |
||
1518 | add bx, word[elem.textHeight] |
||
1519 | add bx, 6 |
||
1520 | add bx, word[elem.butDialHeight] |
||
1521 | add bx, word[elem.textHeight] |
||
1522 | add bx, word[elem.textHeight] |
||
1523 | add bx, deltaCommonTextY |
||
1524 | |||
7436 | theonlymir | 1525 | mcall 4 |
1526 | |||
7443 | theonlymir | 1527 | ;delete mode button, if it exist |
1528 | mov edx, 0x80000008 |
||
1529 | mcall 8 |
||
1530 | ;draw button Mode |
||
7469 | theonlymir | 1531 | buttonModeX = 30 |
1532 | buttonModeY = 160 |
||
7443 | theonlymir | 1533 | buttonModeWidth = 221 |
7469 | theonlymir | 1534 | buttonModeHeight = 14 |
1535 | buttonModeTextYoffset = 3 |
||
7443 | theonlymir | 1536 | buttonModeTextXoffset = 5 |
7469 | theonlymir | 1537 | ;mov ebx, buttonModeX*65536 + buttonModeWidth ;X + Width |
1538 | mov ebx, Otstup |
||
1539 | shl ebx, 16 |
||
1540 | add bx, word[elem.butModeWidth] |
||
1541 | |||
1542 | mov cx, word[elem.butModeY] ;buttonModeY;*65536 + buttonModeHeight ;Y + Height |
||
1543 | shl ecx, 16 |
||
1544 | mov cx, word[elem.butDialHeight] |
||
1545 | |||
7448 | theonlymir | 1546 | mov edx, 0x00000008 ;button id |
1547 | mov esi, 0x00FFFFFF ;color button |
||
7443 | theonlymir | 1548 | mcall 8 |
7469 | theonlymir | 1549 | |
1550 | ;mov ebx, (buttonModeX+2+buttonModeWidth-20)*65536 + (20-2) ;X + Width |
||
1551 | mov ebx, Otstup+2 |
||
1552 | add bx, word[elem.butModeWidth] |
||
1553 | sub bx, 20 |
||
1554 | shl ebx, 16 |
||
1555 | add bx, 20-2 |
||
1556 | |||
1557 | ; mov ecx, (buttonModeY+1)*65536 + buttonModeHeight-2 ;Y + Height |
||
1558 | mov cx, word[elem.butModeY] |
||
1559 | inc ecx |
||
1560 | shl ecx, 16 |
||
1561 | mov cx, word[elem.butDialHeight] |
||
1562 | sub cx, 2 |
||
1563 | |||
7448 | theonlymir | 1564 | mov edx, 0xAABBCC |
1565 | mcall 13 |
||
7443 | theonlymir | 1566 | ;draw text for button Mode |
7469 | theonlymir | 1567 | mov ebx, (Otstup+buttonModeTextXoffset) * 65536 ;(x, y) |
1568 | mov bx, word[elem.butModeY] |
||
1569 | add bx, buttonModeTextYoffset |
||
7448 | theonlymir | 1570 | mov ecx, 0x000000 |
7469 | theonlymir | 1571 | call setNewSizeForText |
1572 | and ecx, 0x7FFFFFFF |
||
7443 | theonlymir | 1573 | call setTextModeMenu |
7469 | theonlymir | 1574 | mov esi, valueModeMenuSize |
1575 | cmp byte[sizeStyle], 'x' |
||
1576 | jne @f |
||
1577 | mov esi, 25 ;valueModeMenuSize -3 ;режим жеста по клавише ак |
||
1578 | @@: |
||
7443 | theonlymir | 1579 | mcall 4 |
7469 | theonlymir | 1580 | |
1581 | mov ebx, (Otstup-12) |
||
1582 | add bx, word[elem.butModeWidth] |
||
1583 | shl ebx, 16 |
||
1584 | mov bx, word[elem.butModeY] |
||
1585 | add bx, buttonModeTextYoffset |
||
1586 | |||
1587 | mov ecx, 0x80FFFFFF ;80 |
||
1588 | call setNewSizeForText |
||
1589 | and ecx, 0x7FFFFFFF |
||
1590 | ;or ecx, 0x80000000 |
||
1591 | |||
7448 | theonlymir | 1592 | mov edx, symbolDownArrow |
7469 | theonlymir | 1593 | mov esi, 1 |
7448 | theonlymir | 1594 | mcall 4 |
7443 | theonlymir | 1595 | |
7459 | theonlymir | 1596 | ;кнопка выбора горячей клавиши |
7469 | theonlymir | 1597 | buttonHotKeyX = 270 |
7459 | theonlymir | 1598 | buttonHotKeyWidth = 90 |
1599 | mov edx, 0x80000009 ;удаляем |
||
1600 | mcall 8 |
||
1601 | cmp byte[mode], 49 ;рисуем выбор клавиши, только если mode > 1 |
||
1602 | jbe @f |
||
1603 | ;рисуем новую |
||
1604 | push eax ebx ecx edx esi |
||
7469 | theonlymir | 1605 | ; mov ebx, buttonHotKeyX*65536 + buttonHotKeyWidth ;X + Width |
1606 | mov ebx, Otstup |
||
1607 | add bx, word[elem.butModeWidth] |
||
1608 | add bx, word[elem.butAppleHeight] |
||
1609 | shl ebx, 16 |
||
1610 | mov bx, word[elem.winWidth] ;buttonHotKeyWidth |
||
1611 | sub bx, word[elem.butModeWidth] |
||
1612 | sub bx, Otstup |
||
1613 | sub bx, word[elem.butAppleHeight] ;Otstup |
||
1614 | shr bx, 1 |
||
1615 | sub bx, Otstup |
||
1616 | ; mov ecx, buttonModeY*65536 + buttonModeHeight ;Y + Height |
||
1617 | mov cx, word[elem.butModeY] |
||
1618 | shl ecx, 16 |
||
1619 | mov cx, word[elem.butDialHeight] |
||
1620 | |||
7459 | theonlymir | 1621 | mov edx, 0x00000009 ;button id |
1622 | mov esi, 0x00FFFFFF ;color button |
||
1623 | mcall 8 |
||
1624 | pop esi edx ecx ebx eax |
||
1625 | ;текст подсказки для горячей клавиши |
||
7469 | theonlymir | 1626 | ;mov ebx, (buttonHotKeyX+buttonModeTextXoffset) * 65536 + (buttonModeY+buttonModeTextYoffset) ;(x, y) |
1627 | mov ebx, Otstup |
||
1628 | add bx, word[elem.butModeWidth] |
||
1629 | add bx, word[elem.butAppleHeight] |
||
1630 | add bx, buttonModeTextYoffset |
||
1631 | shl ebx, 16 |
||
1632 | mov bx, word[elem.butModeY] |
||
1633 | add bx, buttonModeTextYoffset |
||
1634 | |||
1635 | ; xor ecx, ecx |
||
1636 | ; mov ch, byte[mysize] |
||
1637 | ; shl ecx, 16 |
||
1638 | ; add ecx, 0x80224466 |
||
1639 | mov ecx, 0x224466 |
||
1640 | call setNewSizeForText |
||
1641 | ;and ecx, 0x7FFFFFFF |
||
1642 | or ecx, 0x80000000 |
||
1643 | |||
7459 | theonlymir | 1644 | call setTextForHotKey |
1645 | mov esi, valueModeMenuSize |
||
1646 | mcall 4 |
||
1647 | ;заголовок |
||
1648 | push eax ebx ecx edx edi esi |
||
7469 | theonlymir | 1649 | ;mov ebx, buttonHotKeyX * 65536 + (buttonModeY-11) |
1650 | mov ebx, Otstup ;buttonHotKeyX ;Otstup |
||
1651 | add bx, word[elem.butModeWidth] |
||
1652 | add bx, word[elem.butAppleHeight] |
||
1653 | shl ebx, 16 |
||
1654 | add bx, word[elem.butModeY] |
||
1655 | sub bx, 2 |
||
1656 | sub bx, word[elem.textHeight] |
||
1657 | |||
1658 | ; xor ecx, ecx |
||
1659 | ; mov ch, byte[mysize] |
||
1660 | ; shl ecx, 16 |
||
1661 | ; add ecx, 0x80224466 |
||
1662 | mov ecx, 0x224466 |
||
1663 | call setNewSizeForText |
||
1664 | ;and ecx, 0x7FFFFFFF |
||
1665 | or ecx, 0x80000000 |
||
1666 | |||
7459 | theonlymir | 1667 | mov edx, hkCaption |
1668 | mov esi, 3 |
||
1669 | mcall 4 |
||
1670 | pop esi edi edx ecx ebx eax |
||
1671 | @@: |
||
1672 | |||
1673 | ;отображаем настройку радиуса действия жеста, только если выбран режим 3 |
||
1674 | cmp byte[mode], 51 |
||
1675 | jne @f |
||
1676 | ;заголовок |
||
1677 | push eax ebx ecx edx edi esi |
||
7469 | theonlymir | 1678 | xor ebx, ebx |
1679 | mov bx, word[elem.winWidth] |
||
1680 | sub bx, Otstup |
||
1681 | sub ebx, dword[editRadius.width] |
||
1682 | shl ebx, 16 |
||
1683 | add bx, word[elem.butModeY] |
||
1684 | sub bx, 2 |
||
1685 | sub bx, word[elem.textHeight] |
||
1686 | |||
1687 | ; mov ecx, 0 |
||
1688 | ; mov ch, byte[mysize] |
||
1689 | ; shl ecx, 16 |
||
1690 | ; add ecx, 0x80224466 |
||
1691 | |||
1692 | mov ecx, 0x224466 |
||
1693 | call setNewSizeForText |
||
1694 | ;and ecx, 0x7FFFFFFF |
||
1695 | or ecx, 0x80000000 |
||
1696 | |||
1697 | ;mov ecx, 0x80224466 |
||
7459 | theonlymir | 1698 | mov edx, radiusCaption |
1699 | mov esi, 3 |
||
1700 | mcall 4 |
||
1701 | pop esi edi edx ecx ebx eax |
||
7469 | theonlymir | 1702 | |
1703 | |||
1704 | xor eax, eax |
||
1705 | mov ax, word[elem.winWidth] |
||
1706 | sub ax, Otstup |
||
1707 | sub eax, dword[editRadius.width] |
||
1708 | mov dword[editRadius.left], eax |
||
1709 | mov ax, word[elem.butModeY] |
||
1710 | mov dword[editRadius.top], eax |
||
1711 | |||
7459 | theonlymir | 1712 | invoke edit_box_draw, editRadius |
1713 | @@: |
||
1714 | |||
7389 | theonlymir | 1715 | call draw_super_text |
1716 | |||
7408 | theonlymir | 1717 | LineLength = 62 |
7469 | theonlymir | 1718 | mov ebx, 40 * 65536 + BaseY ; draw info text with function 4 (x, y) |
7459 | theonlymir | 1719 | |
7469 | theonlymir | 1720 | mov ecx, 0x224466 |
1721 | call setNewSizeForText |
||
1722 | and ecx, 0x7FFFFFFF |
||
7459 | theonlymir | 1723 | |
7389 | theonlymir | 1724 | mov edx, text |
1725 | mov esi, LineLength |
||
1726 | mov eax, 4 |
||
1727 | |||
1728 | .newline: ; text from the DATA AREA |
||
1729 | mcall |
||
7469 | theonlymir | 1730 | add bx, word[elem.textHeight] ;9*n+3 ;12 |
1731 | add bx, word[elem.textDelta] |
||
1732 | |||
7389 | theonlymir | 1733 | add edx, LineLength |
1734 | cmp byte[edx], 0 |
||
1735 | jne .newline |
||
1736 | |||
1737 | mov eax, 12 ; function 12:tell os about windowdraw |
||
1738 | mov ebx, 2 ; 2, end of draw |
||
1739 | mcall |
||
1740 | |||
1741 | ret |
||
1742 | |||
7469 | theonlymir | 1743 | |
1744 | setNewSizeForText: |
||
1745 | push ebx |
||
1746 | mov ebx, ecx |
||
1747 | cmp byte[sizeStyle], 'x' |
||
1748 | je .x |
||
1749 | mov ecx, 0 |
||
1750 | mov ch, byte[mysize] |
||
1751 | shl ecx, 16 |
||
1752 | jmp @f |
||
1753 | .x: |
||
1754 | mov ecx,[sc.work_text] |
||
1755 | or ecx,0x90000000 |
||
1756 | @@: |
||
1757 | add ecx, ebx |
||
1758 | pop ebx |
||
1759 | ret |
||
1760 | |||
7459 | theonlymir | 1761 | hkSymbol: db 0, 0 |
7389 | theonlymir | 1762 | |
7459 | theonlymir | 1763 | setTextForHotKey: |
1764 | push eax |
||
1765 | mov al, byte[hkSymbol] |
||
1766 | cmp al, 0 |
||
1767 | jne @f |
||
1768 | mov edx, hkHint |
||
1769 | mov dword[hkSize], 5 ;значение по умолчанию SPACE ;shift |
||
1770 | jmp setTextForHotKey.end |
||
1771 | @@: |
||
1772 | cmp al, 1 |
||
1773 | jne @f |
||
1774 | mov edx, hkAlt |
||
1775 | mov dword[hkSize], 3 |
||
1776 | jmp setTextForHotKey.end |
||
1777 | @@: |
||
1778 | cmp al, 2 |
||
1779 | jne @f |
||
1780 | mov edx, hkShift |
||
1781 | mov dword[hkSize], 5 |
||
1782 | jmp setTextForHotKey.end |
||
1783 | @@: |
||
1784 | cmp al, 3 |
||
1785 | jne @f |
||
1786 | mov edx, hkCtrl |
||
1787 | mov dword[hkSize], 4 |
||
1788 | jmp setTextForHotKey.end |
||
1789 | @@: |
||
1790 | cmp al, 32 |
||
1791 | jne @f |
||
1792 | mov edx, hkSpace |
||
1793 | mov dword[hkSize], 5 |
||
1794 | jmp setTextForHotKey.end |
||
1795 | @@: |
||
1796 | cmp al, 96 ;'`' |
||
1797 | je setTextForHotKey.symb |
||
1798 | cmp al, 126 ;'~' |
||
1799 | je setTextForHotKey.symb |
||
1800 | cmp al, 48 ;'0' |
||
1801 | jb @f |
||
1802 | cmp al, 57 ;'9' |
||
1803 | ja @f |
||
1804 | .symb: |
||
1805 | mov edx, hkSymbol |
||
1806 | mov dword[hkSize], 1 |
||
1807 | jmp setTextForHotKey.end |
||
1808 | @@: |
||
1809 | cmp al, 97 ;'a' |
||
1810 | jb @f |
||
1811 | cmp al, 122 ;'z' |
||
1812 | ja @f |
||
1813 | ;jmp setTextForHotKey.symb |
||
1814 | mov edx, hkSymbol |
||
1815 | mov dword[hkSize], 1 |
||
1816 | jmp setTextForHotKey.end |
||
1817 | @@: |
||
1818 | cmp al, 65 ;'A' |
||
1819 | jb @f |
||
1820 | cmp al, 90 ;'Z' |
||
1821 | ja @f |
||
1822 | ;jmp setTextForHotKey.symb |
||
1823 | mov edx, hkSymbol |
||
1824 | mov dword[hkSize], 1 |
||
1825 | jmp setTextForHotKey.end |
||
1826 | @@: |
||
1827 | mov word[hkSymbol], 0 ;если же попало что-то неизвестное, то сотрём его |
||
1828 | mov edx, hkHint |
||
1829 | mov dword[hkSize], 5 ;shift or space - значение по умолчанию |
||
1830 | .end: |
||
1831 | pop eax |
||
1832 | ret |
||
1833 | |||
1834 | |||
7443 | theonlymir | 1835 | setTextModeMenu: |
1836 | cmp byte[mode], 48 |
||
1837 | jne @f |
||
1838 | mov edx, valueModeMenu0 |
||
1839 | ret |
||
1840 | @@: |
||
1841 | cmp byte[mode], 49 |
||
1842 | jne @f |
||
1843 | mov edx, valueModeMenu1 |
||
1844 | ret |
||
1845 | @@: |
||
1846 | cmp byte[mode], 50 |
||
1847 | jne @f |
||
1848 | mov edx, valueModeMenu2 |
||
1849 | ret |
||
1850 | @@: |
||
1851 | cmp byte[mode], 51 |
||
1852 | jne @f |
||
1853 | mov edx, valueModeMenu3 |
||
1854 | ret |
||
1855 | @@: |
||
1856 | mov edx, valueModeMenu1 |
||
1857 | ret |
||
7389 | theonlymir | 1858 | |
7395 | theonlymir | 1859 | |
7459 | theonlymir | 1860 | |
1861 | |||
1862 | saveKey: |
||
1863 | cmp word[hkSymbol], 0 |
||
1864 | je .default |
||
1865 | cmp byte[hkSymbol], 1 |
||
1866 | je .alt |
||
1867 | cmp byte[hkSymbol], 2 |
||
1868 | je .shift |
||
1869 | cmp byte[hkSymbol], 3 |
||
1870 | je .ctrl |
||
1871 | cmp byte[hkSymbol], 32 |
||
1872 | je .space |
||
1873 | .other: |
||
1874 | mov esi, hkSymbol |
||
1875 | mov byte[esi+1], 0 |
||
1876 | mov dword[hkSize], 1 |
||
1877 | jmp .end |
||
1878 | .space: |
||
1879 | mov esi, hkSpace |
||
1880 | mov dword[hkSize], 5 |
||
1881 | jmp .end |
||
1882 | .ctrl: |
||
1883 | mov esi, hkCtrl |
||
1884 | mov dword[hkSize], 4 |
||
1885 | jmp .end |
||
1886 | .alt: |
||
1887 | mov esi, hkAlt |
||
1888 | mov dword[hkSize], 3 |
||
1889 | jmp .end |
||
1890 | .default: |
||
1891 | .shift: |
||
1892 | mov esi, hkShift |
||
1893 | mov dword[hkSize], 5 |
||
1894 | .end: |
||
1895 | mov ebx, hkSize ;указатель на dword[hkSize] |
||
1896 | call copyParam |
||
1897 | ret |
||
1898 | |||
1899 | |||
1900 | |||
1901 | |||
1902 | |||
7402 | theonlymir | 1903 | align 16 |
1904 | @IMPORT: |
||
1905 | |||
1906 | library box_lib, 'box_lib.obj' |
||
1907 | |||
1908 | import box_lib,\ |
||
1909 | edit_box_draw, 'edit_box',\ |
||
1910 | edit_box_key, 'edit_box_key',\ |
||
1911 | edit_box_mouse, 'edit_box_mouse',\ |
||
1912 | init_checkbox, 'init_checkbox2',\ |
||
1913 | check_box_draw, 'check_box_draw2',\ |
||
1914 | check_box_mouse, 'check_box_mouse2',\ |
||
1915 | option_box_draw, 'option_box_draw',\ |
||
1916 | option_box_mouse, 'option_box_mouse' |
||
1917 | |||
7436 | theonlymir | 1918 | commonButtonText db '...', 0 ;текст для кнопок вызова OpenDial |
1919 | commonButtonTextSize = 3 |
||
7402 | theonlymir | 1920 | |
7395 | theonlymir | 1921 | if lang eq ru ;если язык сборки русский |
1922 | |||
1923 | text db "Љ®дЁЈга в®а Hot Angles ®вўҐз Ґв § бва®©Єг ЄвЁўле гЈ«®ў. " |
||
7469 | theonlymir | 1924 | db "Ќ бвன⥠Ї а ¬Ґвал Ї®¤ бҐЎп Ё«Ё ®вЄ«озЁвҐ нвг ®ЇжЁо. ", 0 |
1925 | ; db " ", 0 |
||
7395 | theonlymir | 1926 | hed: |
1927 | title db "Љ®дЁЈга в®а гвЁ«Ёвл Hot Angles", 0 |
||
1928 | buttonText db "ЏаЁ¬ҐЁвм", 0 |
||
1929 | buttonTextSize = 9 |
||
1930 | buttonTextXoffset = 12 |
||
1931 | |||
7402 | theonlymir | 1932 | ch_text db '‚Є«озЁвм/ ЄвЁўЁа®ў вм "Hot Angles"', 0 |
7395 | theonlymir | 1933 | |
1934 | superText: |
||
1935 | .lu db 'Љ®¬ ¤ «Ґў®Ј® ўҐа奣® гЈ« : ', 0 |
||
1936 | .ld db 'Љ®¬ ¤ «Ґў®Ј® Ё¦ҐЈ® гЈ« : ', 0 |
||
1937 | .ru db 'Љ®¬ ¤ Їа ў®Ј® ўҐа奣® гЈ« :', 0 |
||
1938 | .rd db 'Љ®¬ ¤ Їа ў®Ј® Ё¦ҐЈ® гЈ« : ', 0 |
||
1939 | superTextSize = 30 |
||
1940 | |||
7443 | theonlymir | 1941 | valueModeMenuSize = 32 |
1942 | ModeMenu db 'ђҐ¦Ё¬ а Ў®вл:',0 |
||
1943 | valueModeMenu0 db '®вЄ«о祮 ',0 |
||
1944 | valueModeMenu1 db 'Є« ббЁзҐбЄЁ© ०Ё¬ ',0 |
||
1945 | valueModeMenu2 db '०Ё¬ Ј®ап祩 Є« ўЁиЁ ',0 |
||
1946 | valueModeMenu3 db '०Ё¬ ¦Ґбв Ї® Є« ўЁиҐ ЄвЁў жЁЁ',0 |
||
1947 | |||
7448 | theonlymir | 1948 | head_f_i: |
1949 | head_f_l db '‘Ёб⥬ п ®иЁЎЄ ',0 |
||
1950 | err_message_found_lib0 db 'ЌҐ ©¤Ґ ЎЁЎ«Ё®вҐЄ ',39,'proc_lib.obj',39,0 |
||
1951 | err_message_import0 db 'ЋиЁЎЄ ЇаЁ Ё¬Ї®а⥠ЎЁЎ«Ё®вҐЄЁ ',39,'proc_lib.obj',39,0 |
||
1952 | err_message_found_lib1 db 'ЌҐ ©¤Ґ ЎЁЎ«Ё®вҐЄ ',39,'kmenu.obj',39,0 |
||
1953 | err_message_import1 db 'ЋиЁЎЄ ЇаЁ Ё¬Ї®а⥠ЎЁЎ«Ё®вҐЄЁ ',39,'kmenu',39,0 |
||
1954 | |||
7459 | theonlymir | 1955 | hkCaption: db 'Љ« ўЁи :',0 |
1956 | radiusCaption: db 'ђ ¤Ёгб:',0 |
||
1957 | |||
7395 | theonlymir | 1958 | else ;иначе английский текст |
1959 | |||
1960 | text db "This is a Hot Angles Configurator. " |
||
7469 | theonlymir | 1961 | db "Set the parameters bellow for yourself or disable this option.", 0 |
1962 | ; db " ", 0 |
||
7395 | theonlymir | 1963 | hed: |
1964 | title db "Hot Angles Configurator", 0 |
||
1965 | buttonText db "Apply", 0 |
||
1966 | buttonTextSize = 5 |
||
1967 | buttonTextXoffset = 0 |
||
1968 | |||
7402 | theonlymir | 1969 | ch_text db 'Activate "Hot Angles"',0 ;сопровождающий текст для чек бокса |
7389 | theonlymir | 1970 | |
1971 | superText: |
||
7395 | theonlymir | 1972 | .lu db 'Left up angle command: ', 0 |
1973 | .ld db 'Left down angle command: ', 0 |
||
1974 | .ru db 'Right up angle command: ', 0 |
||
7389 | theonlymir | 1975 | .rd db 'Right down angle command:', 0 |
7395 | theonlymir | 1976 | superTextSize = 25 |
7389 | theonlymir | 1977 | |
7443 | theonlymir | 1978 | valueModeMenuSize = 32 |
1979 | ModeMenu db 'Mode:',0 |
||
1980 | valueModeMenu0 db 'disabled ',0 |
||
1981 | valueModeMenu1 db 'classic mode ',0 |
||
1982 | valueModeMenu2 db 'hot key mode ',0 |
||
1983 | valueModeMenu3 db 'activation key gesture mode ',0 |
||
1984 | |||
7448 | theonlymir | 1985 | head_f_i: |
1986 | head_f_l db 'System error',0 |
||
1987 | err_message_found_lib0 db 'Could not find library ',39,'proc_lib.obj',39,0 |
||
1988 | err_message_import0 db 'Error importing library ',39,'proc_lib.obj',39,0 |
||
1989 | err_message_found_lib1 db 'Could not find library ',39,'kmenu.obj',39,0 |
||
1990 | err_message_import1 db 'Error importing library ',39,'kmenu',39,0 |
||
1991 | |||
7459 | theonlymir | 1992 | hkCaption: db 'Key:',0 |
1993 | radiusCaption: db 'Radius:',0 |
||
1994 | |||
7395 | theonlymir | 1995 | end if |
1996 | |||
7459 | theonlymir | 1997 | hkAlt: db 'Alt',0 |
1998 | hkShift: db 'Shift',0 |
||
1999 | hkCtrl: db 'Ctrl',0 |
||
2000 | hkSpace: db 'Space',0 |
||
2001 | hkHint: db '?',0 |
||
2002 | hkSize: rd 1 ;размер строки с именем клавиши |
||
7395 | theonlymir | 2003 | |
7389 | theonlymir | 2004 | draw_super_text: |
2005 | push eax ebx ecx edx edi esi |
||
7459 | theonlymir | 2006 | |
7469 | theonlymir | 2007 | ; mov ecx, 0 |
2008 | ; mov ch, byte[mysize] |
||
2009 | ; shl ecx, 16 |
||
2010 | ; add ecx, 0x224466 |
||
2011 | mov ecx, 0x224466 |
||
2012 | call setNewSizeForText |
||
2013 | ;and ecx, 0x7FFFFFFF |
||
2014 | or ecx, 0x80000000 |
||
7459 | theonlymir | 2015 | |
7469 | theonlymir | 2016 | ;mov ebx, Otstup * 65536 + 74 ; draw info text with function 4 (x, y) |
2017 | mov bx, Otstup |
||
2018 | shl ebx, 16 |
||
2019 | mov bx, word[elem.textHeight] |
||
2020 | add bx, word[elem.textDelta] |
||
2021 | shl bx, 2 |
||
2022 | sub bx, word[elem.textHeight] |
||
2023 | add bx, BaseY |
||
2024 | |||
7459 | theonlymir | 2025 | ;mov ecx, 0x224466 |
7389 | theonlymir | 2026 | mov eax, superText.lu |
2027 | mov edx, eax |
||
7408 | theonlymir | 2028 | mov esi, superTextSize |
7389 | theonlymir | 2029 | mcall 4 |
2030 | |||
7469 | theonlymir | 2031 | ;mov ebx, Otstup * 65536 + 109 ;9+2+14+(9+1) |
2032 | add bx, word[elem.textHeight] |
||
2033 | add bx, 4;3 |
||
2034 | add bx, word[elem.butDialHeight] |
||
2035 | add bx, word[elem.textHeight] |
||
2036 | |||
7389 | theonlymir | 2037 | mov edx, superText.ld |
7408 | theonlymir | 2038 | mov esi, superTextSize |
7389 | theonlymir | 2039 | mcall 4 |
2040 | |||
7469 | theonlymir | 2041 | ;mov ebx, 240 * 65536 + 74 |
2042 | mov bx, word[elem.winWidth] |
||
2043 | sub bx, word[elem.butDialWidth] |
||
2044 | sub bx, word[elem.editCommandWidth] |
||
2045 | sub bx, Otstup |
||
2046 | shl ebx, 16 |
||
2047 | mov bx, word[elem.textHeight] |
||
2048 | add bx, word[elem.textDelta] |
||
2049 | shl bx, 2 |
||
2050 | sub bx, word[elem.textHeight] |
||
2051 | add bx, BaseY |
||
2052 | |||
7389 | theonlymir | 2053 | mov edx, superText.ru |
7408 | theonlymir | 2054 | mov esi, superTextSize |
7389 | theonlymir | 2055 | mcall 4 |
2056 | |||
7469 | theonlymir | 2057 | ;mov ebx, 240 * 65536 + 109 |
2058 | add bx, word[elem.textHeight] |
||
2059 | add bx, 4;3;2 |
||
2060 | add bx, word[elem.butDialHeight] |
||
2061 | add bx, word[elem.textHeight] |
||
2062 | |||
7389 | theonlymir | 2063 | mov edx, superText.rd |
7408 | theonlymir | 2064 | mov esi, superTextSize |
7389 | theonlymir | 2065 | mcall 4 |
2066 | |||
7469 | theonlymir | 2067 | ;mov ebx, Otstup * 65536 + (buttonModeY-11) |
2068 | mov ebx, Otstup |
||
2069 | shl ebx, 16 |
||
2070 | add bx, word[elem.butModeY] |
||
2071 | sub bx, 2 |
||
2072 | sub bx, word[elem.textHeight] |
||
2073 | |||
7443 | theonlymir | 2074 | or ecx, 0x80000000 |
2075 | mov edx, ModeMenu |
||
2076 | mov esi, 3 |
||
2077 | mcall 4 |
||
2078 | |||
7389 | theonlymir | 2079 | pop esi edi edx ecx ebx eax |
2080 | ret |
||
2081 | |||
7436 | theonlymir | 2082 | editID db 0 |
2083 | initEBX: |
||
2084 | cmp byte[editID], 4 |
||
2085 | jne @f |
||
2086 | mov ebx, dataBuffer.1 |
||
2087 | ret |
||
2088 | @@: |
||
2089 | cmp byte[editID], 5 |
||
2090 | jne @f |
||
2091 | mov ebx, dataBuffer.2 |
||
2092 | ret |
||
2093 | @@: |
||
2094 | cmp byte[editID], 6 |
||
2095 | jne @f |
||
2096 | mov ebx, dataBuffer.3 |
||
2097 | ret |
||
2098 | @@: |
||
2099 | cmp byte[editID], 7 |
||
2100 | jne @f |
||
2101 | mov ebx, dataBuffer.4 |
||
2102 | ret |
||
2103 | @@: |
||
2104 | ret |
||
2105 | setRESULT: |
||
2106 | cmp byte[editID], 4 |
||
2107 | jne @f |
||
2108 | mov dword[dataBuffer.size1], ecx |
||
2109 | mov dword[editLU.size], ecx |
||
2110 | mov dword[editLU.pos], ecx |
||
2111 | ret |
||
2112 | @@: |
||
2113 | cmp byte[editID], 5 |
||
2114 | jne @f |
||
2115 | mov dword[dataBuffer.size2], ecx |
||
2116 | mov dword[editLD.size], ecx |
||
2117 | mov dword[editLD.pos], ecx |
||
2118 | ret |
||
2119 | @@: |
||
2120 | cmp byte[editID], 6 |
||
2121 | jne @f |
||
2122 | mov dword[dataBuffer.size3], ecx |
||
2123 | mov dword[editRU.size], ecx |
||
2124 | mov dword[editRU.pos], ecx |
||
2125 | ret |
||
2126 | @@: |
||
2127 | cmp byte[editID], 7 |
||
2128 | jne @f |
||
2129 | mov dword[dataBuffer.size4], ecx |
||
2130 | mov dword[editRD.size], ecx |
||
2131 | mov dword[editRD.pos], ecx |
||
2132 | ret |
||
2133 | @@: |
||
2134 | ret |
||
2135 | copyPath: |
||
2136 | push eax ebx ecx edx ;copy file name path |
||
2137 | mov eax, openfile_path ;dword[OpenDialog_data.openfile_path] |
||
2138 | call initEBX ;mov ebx, dataBuffer.1 ;.data |
||
2139 | mov ecx, 0 |
||
2140 | @@: |
||
2141 | mov dl, byte[eax] |
||
2142 | cmp dl, 0 ;byte[eax], 0 |
||
2143 | je @f |
||
2144 | mov byte[ebx], dl |
||
2145 | inc eax |
||
2146 | inc ebx |
||
2147 | inc ecx |
||
2148 | jmp @b |
||
2149 | @@: |
||
2150 | mov byte[ebx], 0 |
||
2151 | call setRESULT |
||
2152 | pop edx ecx ebx eax |
||
2153 | ret |
||
7389 | theonlymir | 2154 | |
7436 | theonlymir | 2155 | |
7459 | theonlymir | 2156 | IntToStr: ;in esi - строка; eсx - число |
2157 | push eax ecx edx esi |
||
2158 | cmp ecx, 0 |
||
2159 | jne @f |
||
2160 | mov byte[esi], 48 ; '0' |
||
2161 | inc esi |
||
2162 | jmp .end |
||
2163 | @@: |
||
2164 | mov eax, ecx |
||
2165 | mov ecx, 10 |
||
2166 | .next: |
||
2167 | mov edx, 0 |
||
2168 | div ecx |
||
2169 | add edx, 48 |
||
2170 | |||
2171 | mov byte[esi], dl |
||
2172 | |||
2173 | inc esi |
||
2174 | cmp eax, 0 |
||
2175 | je .end |
||
2176 | jmp .next |
||
2177 | .end: |
||
2178 | mov byte[esi], 0 ;кладём завершающий ноль |
||
2179 | pop esi edx ecx eax |
||
2180 | call reverseString ;делаем реверс строки |
||
2181 | ret |
||
2182 | |||
2183 | ;вход: esi - указатель на строку |
||
2184 | reverseString: |
||
2185 | push eax esi edi |
||
2186 | |||
2187 | mov al, byte[esi] ;если строка пустая то выходим реверс делать не надо |
||
2188 | cmp al, 0 |
||
2189 | je reverseString.end |
||
2190 | |||
2191 | mov edi, esi ;иначе найдём позицию последнего символа строки и положим её в edi |
||
2192 | .go_last_symbol: |
||
2193 | mov al, byte[edi+1] |
||
2194 | cmp al, 0 |
||
2195 | je @f |
||
2196 | |||
2197 | inc edi |
||
2198 | jmp reverseString.go_last_symbol |
||
2199 | @@: |
||
2200 | push ebx |
||
2201 | .rev: |
||
2202 | cmp esi, edi |
||
2203 | jae @f |
||
2204 | |||
2205 | ;меняем местами символы в цикле |
||
2206 | mov al, byte[edi] |
||
2207 | mov bl, byte[esi] |
||
2208 | mov byte[edi], bl |
||
2209 | mov byte[esi], al |
||
2210 | |||
2211 | inc esi |
||
2212 | dec edi |
||
2213 | jmp reverseString.rev |
||
2214 | @@: |
||
2215 | pop ebx |
||
2216 | .end: |
||
2217 | pop edi esi eax |
||
2218 | ret |
||
2219 | |||
2220 | |||
2221 | |||
7436 | theonlymir | 2222 | align 4 |
2223 | but_open_dlg: |
||
2224 | pushad |
||
2225 | copy_path open_dialog_name,communication_area_default_path,file_name,0 |
||
2226 | mov [OpenDialog_data.type],0 |
||
2227 | stdcall[OpenDialog_Start], OpenDialog_data |
||
2228 | cmp [OpenDialog_data.status],2 |
||
2229 | je @f |
||
2230 | cmp [OpenDialog_data.status],0 ;пользователь нажал Cancel? |
||
2231 | je .end_open |
||
2232 | ;код при удачном открытии диалога |
||
2233 | call copyPath |
||
2234 | jmp .end_open |
||
2235 | @@: |
||
2236 | ;код при не удачном открытии диалога |
||
2237 | ;... |
||
2238 | .end_open: |
||
2239 | popad |
||
2240 | ret |
||
2241 | |||
7448 | theonlymir | 2242 | ;данные для диалога открытия файлов |
7436 | theonlymir | 2243 | align 4 |
2244 | OpenDialog_data: |
||
2245 | .type dd 0 ;0 - открыть, 1 - сохранить, 2 - выбрать директорию |
||
2246 | .procinfo dd procinfo |
||
2247 | .com_area_name dd communication_area_name ;+8 |
||
7443 | theonlymir | 2248 | .com_area dd 0 ;+12 |
7436 | theonlymir | 2249 | .opendir_path dd plugin_path ;+16 |
2250 | .dir_default_path dd default_dir ;+20 |
||
7443 | theonlymir | 2251 | .start_path dd file_name ;+24 путь к диалогу открытия файлов |
7436 | theonlymir | 2252 | .draw_window dd draw_window ;+28 |
7443 | theonlymir | 2253 | .status dd 0 ;+32 |
7436 | theonlymir | 2254 | .openfile_path dd openfile_path ;+36 путь к открываемому файлу |
2255 | .filename_area dd filename_area ;+40 |
||
2256 | .filter_area dd Filter |
||
2257 | .x: |
||
2258 | .x_size dw 420 ;+48 ; Window X size |
||
7443 | theonlymir | 2259 | .x_start dw 10 ;+50 ; Window X position |
7436 | theonlymir | 2260 | .y: |
2261 | .y_size dw 320 ;+52 ; Window y size |
||
7443 | theonlymir | 2262 | .y_start dw 10 ;+54 ; Window Y position |
7436 | theonlymir | 2263 | |
2264 | default_dir db '/rd/1',0 ;директория по умолчанию |
||
2265 | communication_area_name: db 'FFFFFFFF_open_dialog',0 |
||
2266 | open_dialog_name: db 'opendial',0 |
||
2267 | communication_area_default_path: db '/rd/1/File managers/',0 |
||
2268 | |||
2269 | Filter: |
||
2270 | dd Filter.end - Filter.1 |
||
2271 | .1: |
||
2272 | ;db 'KEX',0 |
||
2273 | .end: |
||
2274 | db 0 |
||
7443 | theonlymir | 2275 | |
2276 | mode db 49 ;'1' |
||
2277 | modeMenu dd 0 |
||
2278 | coordModeMenu: |
||
2279 | .x dw 100 |
||
2280 | .y dw 200 |
||
2281 | |||
2282 | |||
7436 | theonlymir | 2283 | align 4 |
2284 | proclib_import: ;описание экспортируемых функций |
||
2285 | OpenDialog_Init dd aOpenDialog_Init |
||
2286 | OpenDialog_Start dd aOpenDialog_Start |
||
2287 | dd 0,0 |
||
2288 | aOpenDialog_Init db 'OpenDialog_init',0 |
||
2289 | aOpenDialog_Start db 'OpenDialog_start',0 |
||
2290 | |||
2291 | system_dir0 db '/sys/lib/' |
||
2292 | lib0_name db 'proc_lib.obj',0 |
||
7443 | theonlymir | 2293 | lib1_name db 'kmenu.obj',0 |
2294 | |||
7448 | theonlymir | 2295 | symbolDownArrow db 25,0 |
2296 | |||
7436 | theonlymir | 2297 | ;library structures |
2298 | l_libs_start: |
||
7443 | theonlymir | 2299 | 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 |
2300 | lib1 l_libs lib1_name, sys_path, file_name, system_dir0, err_message_found_lib1, head_f_l, import_libkmenu,err_message_import1,head_f_i |
||
7436 | theonlymir | 2301 | load_lib_end: |
2302 | |||
7448 | theonlymir | 2303 | |
7402 | theonlymir | 2304 | edMaxSize = 510 ;теперь с новым компонентом можно и 511 указать |
7389 | theonlymir | 2305 | edMax = 0 ;max, size, pos |
2306 | |||
7402 | theonlymir | 2307 | align 4 |
7436 | theonlymir | 2308 | editLU edit_box 180-buttonW,Otstup+buttonW,85, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.1, mouse_dd, 0, edMax, edMax ;ed_focus |
2309 | editLD edit_box 180-buttonW,Otstup+buttonW,120, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.2, mouse_dd, 0, edMax, edMax |
||
2310 | editRU edit_box 180-buttonW,240,85, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.3, mouse_dd, 0, edMax, edMax |
||
2311 | editRD edit_box 180-buttonW,240,120, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.4, mouse_dd, 0, edMax, edMax |
||
7459 | theonlymir | 2312 | editRadius edit_box 40,(buttonHotKeyX + buttonHotKeyWidth + 20),buttonModeY, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, 4, radiusBuffer.data, mouse_dd, ed_figure_only, edMax, edMax |
7389 | theonlymir | 2313 | |
7443 | theonlymir | 2314 | align 4 |
2315 | import_libkmenu: |
||
2316 | kmenu_init dd akmenu_init |
||
2317 | kmainmenu_draw dd akmainmenu_draw |
||
2318 | kmainmenu_dispatch_cursorevent dd akmainmenu_dispatch_cursorevent |
||
2319 | ksubmenu_new dd aksubmenu_new |
||
2320 | ksubmenu_delete dd aksubmenu_delete |
||
2321 | ksubmenu_draw dd aksubmenu_draw |
||
2322 | ksubmenu_add dd aksubmenu_add |
||
2323 | kmenuitem_new dd akmenuitem_new |
||
2324 | kmenuitem_delete dd akmenuitem_delete |
||
2325 | kmenuitem_draw dd akmenuitem_draw |
||
2326 | dd 0,0 |
||
2327 | akmenu_init db 'kmenu_init',0 |
||
2328 | akmainmenu_draw db 'kmainmenu_draw',0 |
||
2329 | akmainmenu_dispatch_cursorevent db 'kmainmenu_dispatch_cursorevent',0 |
||
2330 | aksubmenu_new db 'ksubmenu_new',0 |
||
2331 | aksubmenu_delete db 'ksubmenu_delete',0 |
||
2332 | aksubmenu_draw db 'ksubmenu_draw',0 |
||
2333 | aksubmenu_add db 'ksubmenu_add',0 |
||
2334 | akmenuitem_new db 'kmenuitem_new',0 |
||
2335 | akmenuitem_delete db 'kmenuitem_delete',0 |
||
2336 | akmenuitem_draw db 'kmenuitem_draw',0 |
||
2337 | |||
7436 | theonlymir | 2338 | sc system_colors |
7459 | theonlymir | 2339 | mouse_dd rd 1 |
7436 | theonlymir | 2340 | |
7459 | theonlymir | 2341 | sizeStyle: rb 1 ;размер текста и остальных элементов окна |
2342 | mysize: rb 1 ;rd 1 |
||
2343 | radiusBuffer: ;буфер для поля радиуса жеста |
||
2344 | .data: rb 6 |
||
2345 | .size: rd 1 |
||
2346 | radiusBufferEnd: |
||
2347 | |||
7443 | theonlymir | 2348 | button_press rd 0 ;for kmenu |
2349 | |||
2350 | sys_path: rb 4096 |
||
2351 | file_name: rb 4096 |
||
2352 | plugin_path: rb 4096 |
||
2353 | openfile_path: rb 4096 |
||
2354 | filename_area: rb 256 |
||
2355 | rb 1024 |
||
2356 | procinfo process_information |
||
2357 | pi rb 1024 |
||
2358 | |||
7459 | theonlymir | 2359 | keyscan: rb 1 |
2360 | keystr: |
||
2361 | .data: rb 4 ;строка со значением сканкода активационной клавиши |
||
2362 | .size: rd 1 ;размер содержимого строки без последнего нуля |
||
7443 | theonlymir | 2363 | |
7389 | theonlymir | 2364 | dataBuffer: |
2365 | .1: rb 512 |
||
2366 | .2: rb 512 |
||
2367 | .3: rb 512 |
||
2368 | .4: rb 512 |
||
2369 | .size1: rd 1 |
||
2370 | .size2: rd 1 |
||
2371 | .size3: rd 1 |
||
2372 | .size4: rd 1 |
||
7448 | theonlymir | 2373 | ;255+255+2 = 512 |
7389 | theonlymir | 2374 | ;два запасных байта необходимы для того что бы не пепереписать следующией байты, в конце буфера 0 |
2375 | dataBufferEnd: |
||
2376 | |||
2377 | |||
2378 | I_END: |
||
7469 | theonlymir | 2379 | rb 256 ;1024 ;4096 |
2380 | align 4 ;16 |
||
7389 | theonlymir | 2381 | STACKTOP: |
2382 | |||
2383 | MEM: |