Subversion Repositories Kolibri OS

Rev

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  nor the names of its contributors may
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: