Subversion Repositories Kolibri OS

Rev

Rev 7448 | Rev 7460 | 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
7459 theonlymir 5
; Version 0.3.7: 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     ;загружаем конфигурацию из файла, если нет - то выставляем параметры по умолчанию
94
    call  draw_window    ;отрисовать окно приложения
95
 
96
; Обработка цикла событий
97
event_wait:
98
    mov     eax, 10      ; function 10 : wait until event
99
    mcall                ; event type is returned in eax
100
 
101
    cmp     eax, 1       ; Event redraw request ?
102
    je      red          ; Expl.: there has been activity on screen and
103
                         ; parts of the applications has to be redrawn.
104
 
105
    cmp     eax, 2       ; Event key in buffer ?
106
    je      key          ; Expl.: User has pressed a key while the
107
                         ; app is at the top of the window stack.
108
 
109
    cmp     eax, 3       ; Event button in buffer ?
110
    je      button       ; Expl.: User has pressed one of the
111
                         ; applications buttons.
112
 
7408 theonlymir 113
    invoke  edit_box_mouse, editLU   ;проверка событий мыши для editBox'ов
7402 theonlymir 114
    invoke  edit_box_mouse, editLD
115
    invoke  edit_box_mouse, editRU
116
    invoke  edit_box_mouse, editRD
7443 theonlymir 117
    ;stdcall [kmainmenu_dispatch_cursorevent], [modeMenu] ;проверка мыши для комбобокса
7459 theonlymir 118
    invoke  edit_box_mouse, editRadius
7402 theonlymir 119
 
7389 theonlymir 120
    jmp     event_wait
121
 
122
 
123
red:                     ;обработка события перерисовки окна
124
   call    draw_window
125
   jmp     event_wait
126
 
127
key:                                    ; Keypress event handler
128
        mov     eax, 2                  ; The key is returned in ah. The key must be
129
        mcall                           ; read and cleared from the system queue.
7408 theonlymir 130
 
7459 theonlymir 131
        ;push eax
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
        ;pop eax
138
 
139
        cmp eax, 1
140
        je event_wait ;.end ;@f
141
        cmp word[hkSymbol], 0
142
        jne event_wait ;.end ;@f
143
        cmp al, 0
144
        jne .next
145
        mov byte[hkSymbol], ah
146
 
147
        push eax ecx esi            ;сохраняем сканкод клавиши
148
        shr eax, 16
149
        mov byte[keyscan], al
150
        mov ecx, 0
151
        mov cl, al ;byte[keyscan]
152
        mov esi, keystr.data
153
        call IntToStr
154
 
155
        ;считаем полученный размер строки
156
        xor ecx, ecx
157
        mov esi, keystr.data
158
       @@:
159
        cmp byte[esi], 0
160
        je @f
161
        inc esi
162
        inc ecx
163
        ;cmp ecx, 4
164
        ;je @f
165
        jmp @b
166
       @@:
167
        ;и сохраняем его
168
        mov dword[keystr.size], ecx
169
 
170
;        cmp ecx, 3
171
;        jbe @f
172
;        mcall -1
173
;      @@:
174
 
175
        pop esi ecx eax
176
 
177
        jmp red
178
.next:
179
        ;cmp al, 2
180
        ;jne @f
181
        ;cmp ah, 0
182
        ;jne @f
183
        ;считываем управляющие клавиши
184
        ;shr eax, 16
185
        ;bt eax, 0   ;left shift
186
        ;jne @f
187
        ;mov byte[hkSymbol], 2
188
        ;jmp red
189
@@:
190
;.end:
7389 theonlymir 191
        jmp     event_wait              ; Just read the key, ignore it and jump to event_wait.
192
 
193
button:                                 ; Buttonpress event handler
194
    mov     eax,17                  ; The button number defined in window_draw
195
    mcall                           ; is returned to ah.
196
 
197
    cmp     ah,1                    ; button id=1 ?
198
    jne     noclose
7402 theonlymir 199
exit:
7389 theonlymir 200
    mov     eax,-1                  ; Function -1 : close this program
201
    mcall
202
noclose:
203
    cmp  ah, 2         ;кнопка "Применить"
7436 theonlymir 204
    jne  @f ;butend
7389 theonlymir 205
    call applyButton   ;вызов нашего обработчика нажатия кнопки
7436 theonlymir 206
    jmp event_wait
207
@@:
208
    cmp ah, 4
209
    jne @f
210
    mov byte[editID], 4
211
    call but_open_dlg
212
    jmp  event_wait
213
@@:
214
    cmp ah, 5
215
    jne @f
216
    mov byte[editID], 5
217
    call but_open_dlg
218
    jmp  event_wait
219
@@:
220
    cmp ah, 6
221
    jne @f
222
    mov byte[editID], 6
223
    call but_open_dlg
224
    jmp  event_wait
225
@@:
226
    cmp ah, 7
227
    jne @f
228
    mov byte[editID], 7
229
    call but_open_dlg
230
    jmp  event_wait
231
@@:
7443 theonlymir 232
    cmp ah, 8
233
    jne @f
234
    push eax ebx ecx
235
    mcall 9, pi, -1 ;get window coord
236
 
7459 theonlymir 237
    mov eax, dword[pi+34]
238
    add eax, buttonModeX ;+ 5
239
    mov word[coordModeMenu.x], ax
7443 theonlymir 240
 
7459 theonlymir 241
    mov eax, dword[pi+38]
242
    add eax, buttonModeY + 13 ;17
243
    mov word[coordModeMenu.y], ax
7443 theonlymir 244
 
7459 theonlymir 245
    stdcall [ksubmenu_draw], [modeMenu], coordModeMenu
7443 theonlymir 246
    pop ecx ebx eax
247
    jmp  event_wait
248
@@:
7459 theonlymir 249
    cmp ah, 9
250
    jne @f
251
    mov word[hkSymbol], 0
252
    jmp red ;event_wait
253
@@:
7443 theonlymir 254
    cmp ah, 110
255
    jne @f
256
    mov byte[mode], 48 ;'0'
257
    jmp  event_wait
258
@@:
259
    cmp ah, 111
260
    jne @f
261
    mov byte[mode], 49 ;'1'
262
    jmp  event_wait
263
@@:
264
    cmp ah, 112
265
    jne @f
266
    mov byte[mode], 50 ;'2'
267
    jmp  event_wait
268
@@:
269
    cmp ah, 113
270
    jne @f
271
    mov byte[mode], 51 ;'3'
272
    jmp  event_wait
273
@@:
7389 theonlymir 274
butend:
275
    jmp  event_wait    ;this is for ignored events, useful at development
276
 
277
 
278
 
279
;имя конфигурационного файла
280
fileName: db 'SETTINGS/HOTANGLES.CFG', 0
281
 
282
;структура для создания/перезаписи файла
283
createFile:
284
  .func     dd 2    ;номер подфункции
285
  .re       dd 0, 0 ;зарезервировано
286
  .size     dd 0    ;сколько байт писать
287
  .data_adr dd 0    ;указатель на данные
288
  .path     db 0
289
  .path_adr dd fileName    ;путь
290
 
291
;строка параметров по умолчанию и её размер
7459 theonlymir 292
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
293
defaultDataSize = 85 ;48+19+4
7389 theonlymir 294
 
295
 
296
copyParam:  ;копирует параметр(команду запуска) в буфер (см. дальше)
297
   push esi ebx ecx
298
   mov ecx, dword[ebx] ;читаем размер строки
7412 theonlymir 299
 
300
   cmp ecx, 0          ;пуста ли строка?
301
   jne copyParam.copy  ;если нет, то переходим к копированию содержимого строки (к  циклу)
302
 
303
   mov byte[eax], '-'  ;если же пусто, то заменяем символом минус '-'
304
   inc eax
305
   ;jmp copyParam.copyEnd ;и выходим
306
   ;далее в начале цикла произойдёт сравнение и выход
307
 
7389 theonlymir 308
.copy:  ;копируем символы
309
   cmp ecx, 0
310
   je copyParam.copyEnd
311
   mov bl, byte[esi]
312
   mov byte[eax], bl
313
   dec ecx
314
   inc eax
315
   inc esi
316
   jmp copyParam.copy
317
.copyEnd:
318
   pop ecx ebx esi
319
   ret
320
 
321
 
322
addPerenos:  ;добавляет перенос строки в буфер
323
   mov byte[eax], 13
324
   inc eax
325
   mov byte[eax], 10
326
   inc eax
327
   ret
328
 
329
;обработчик кнопки "Применить"
330
applyButton:
331
    push eax ebx ecx
332
        ;mov dword[createFile.data_adr], defaultDataForConfig
333
        ;mov dword[createFile.size], defaultDataSize
334
 
335
        ;вычислим размер файла конфигурации в байтах
7459 theonlymir 336
        mov ecx, 9*2+1 ;1 байт на состояние активности и 9 пар переносов строк (символы 13, 10)
7408 theonlymir 337
        add ecx, dword[editLU.size] ;плюс размер каждой строки в байтах
338
        add ecx, dword[editLD.size]
339
        add ecx, dword[editRU.size]
7389 theonlymir 340
        add ecx, dword[editRD.size] ;dataBuffer.size4]
7459 theonlymir 341
        add ecx, dword[editRadius.size]
342
        add ecx, dword[hkSize] ;размер имени активационной кнопки
343
        add ecx, dword[keystr.size] ;размер сканкода активационной кнопки
344
        inc ecx ; ещё 1 байт для хранения размера элементов
345
        ;mov ecx, 85
7412 theonlymir 346
 
7459 theonlymir 347
        cmp dword[keystr.size], 3
348
        jbe @f
349
        ;mcall -1
350
      @@:
351
 
7412 theonlymir 352
        ;если заданы пустые строки, то мы автоматически добавляем знак минус, значит размер +1 байт
353
        cmp dword[editLU.size], 0
354
        jne @f
355
        inc ecx
356
@@:
357
        cmp dword[editLD.size], 0
358
        jne @f
359
        inc ecx
360
@@:
361
        cmp dword[editRU.size], 0
362
        jne @f
363
        inc ecx
364
@@:
365
        cmp dword[editRD.size], 0
366
        jne @f
367
        inc ecx
368
@@:
369
 
7389 theonlymir 370
        ;теперь размер файла конфигурации в ecx
371
        mov dword[createFile.size], ecx ;положим размер байт в структуру создания/перезаписи файла
372
        mcall 68, 12, ecx ;выделяем блок памяти под буфер содержимого
373
        mov dword[createFile.data_adr], eax ;сохраняем адрес буфера в структуру
374
 
375
        ;заполним буфер содержимого:
7436 theonlymir 376
        ;cmp byte[mode], 0
377
        ;jne @f
378
        ;@@:
7443 theonlymir 379
 
380
        push ebx    ;сохраняем выбранный режим
381
        mov bl, byte[mode]
382
        mov byte[eax], bl
383
        pop ebx
384
 
7389 theonlymir 385
        inc eax
386
        call addPerenos
387
 
388
        push esi ebx
389
        call UpdateEditsSizes ;обновить размеры текста в edit'ах
390
 
7408 theonlymir 391
        mov esi, dataBuffer.1     ;editLU.text
7389 theonlymir 392
        mov ebx, dataBuffer.size1 ;editLU.size
393
        call copyParam
394
        call addPerenos     ;добавляем перенос строки
395
 
7408 theonlymir 396
        mov esi, dataBuffer.2
397
        mov ebx, dataBuffer.size2
7389 theonlymir 398
        call copyParam
399
        call addPerenos     ;добавляем перенос строки
400
 
401
        mov esi, dataBuffer.3
402
        mov ebx, dataBuffer.size3
403
        call copyParam
404
        call addPerenos     ;добавляем перенос строки
405
 
406
        mov esi, dataBuffer.4
407
        mov ebx, dataBuffer.size4
408
        call copyParam
409
        call addPerenos     ;добавляем перенос строки
410
 
7459 theonlymir 411
        ;сохраняем кнопку активации
412
        call saveKey
413
        call addPerenos
414
 
415
        ;сохраняем сканкод кнопки
416
        mov esi, keystr.data    ;записываем строку keystr в файл
417
        xor ebx, ebx
418
      @@:
419
        cmp byte[esi], 0
420
        je @f
421
        mov bl, byte[esi]
422
        mov byte[eax], bl
423
        inc eax
424
        inc esi
425
        cmp esi, keystr.size-1
426
        jae @f
427
        jmp @b
428
      @@:
429
        call addPerenos
430
 
431
        ;сохраняем радиус
432
        ;!!! если радиус оставлен пустым, то нужно сохранять значение по умолчанию (сейчас пишется '-')
433
        mov esi, radiusBuffer.data
434
        mov ebx, editRadius.size ;radiusBuffer.size
435
        call copyParam
436
        call addPerenos
437
 
438
        ;добавляем размер элементов
439
        push ebx    ;сохраняем выбранный режим
440
        mov bl, byte[sizeStyle]
441
        mov byte[eax], bl
442
        pop ebx
443
        inc eax
444
        call addPerenos
445
 
7389 theonlymir 446
        pop ebx esi
447
 
448
 
449
    mov ebx, createFile
450
    mcall 70
451
        cmp eax, 0
452
        je .end
453
        ;иначе здесь нужно вывести окно с ошибкой !!!
454
.end:
455
        mcall 68, 13, dword[createFile.data_adr]  ;освобождаем память под буфер
7412 theonlymir 456
        call finishHotAnglesApp ;завершаем работу всех копий сервиса @HOTANGLES
457
        call loadConfig         ;перезагружаем файл конфига
458
        call draw_window        ;перерисовываем окно
459
        call startHotAnglesApp  ;перезапускаем @HOTANGLES
7389 theonlymir 460
        pop ecx ebx eax
461
    ret
462
 
463
 
464
 
465
 
466
 
467
 
468
compareBytes2:
469
   push edi esi ecx ebx
470
   xor eax, eax
471
   mov ecx, 10  ;max размер строк 11
472
@@:
473
   mov bl, byte[edi]
474
   cmp bl, byte[esi]
475
   jne compareBytes.no
476
   inc edi
477
   inc esi
478
   cmp ecx, 0
479
   je @f
480
   dec ecx
481
   jmp @b
482
.no:
483
   mov eax, 1
484
@@:
485
   pop ebx ecx esi edi
486
   ret
487
 
488
 
7412 theonlymir 489
finishHotAnglesApp:
7389 theonlymir 490
   ;находим все копии приложения по имени и завершаем их
491
   push eax ebx ecx esi edi
492
   ;указатели, которые никогда не меняются:
493
   mov esi, startAppData.file_name       ;первая строка - искомое имя приложения
494
   mov edi, buf            ;вторая строка - имя текущего слота
495
   add edi, 10
496
 
497
   mov ecx, 1
498
@@:
499
   mcall 9, buf, ecx              ;получаем данные очередного слота
500
   mov dword[slotMax], eax
501
 
502
   call compareBytes2 ;сравниваем имя
503
   cmp eax, 0
7412 theonlymir 504
   jne finishHotAnglesApp.next   ;если не совпало, то переходим на следующий слот
7389 theonlymir 505
 
506
   mcall 18, 2, ecx               ;иначе завершаем слот
507
.next:
508
   inc  ecx
509
   cmp ecx, dword[slotMax]
510
   ja @f
511
   jmp @b
512
@@:
513
   pop edi esi ecx ebx eax
7412 theonlymir 514
   ret
7389 theonlymir 515
 
7412 theonlymir 516
startHotAnglesApp:
7389 theonlymir 517
   ;запускаем приложение заново
518
   push eax ebx
519
   mcall 70, startAppData
520
   cmp eax, 0
521
   ja @f       ;если eax>0, то успешно запущено
522
   ;!!! иначе тут печатаем ошибку
523
@@:
524
   pop ebx eax
525
   ret
526
 
527
startAppData:
528
    .subfunction dd   7
529
    .flags       dd   0
530
    .param       dd   0
531
    .rezerv      dd   0, 0
532
    .full_name   db   '/rd/1/'
533
    .file_name   db   '@HOTANGLES', 0
534
 
535
UpdateEditsSizes:
536
   push eax
537
   mov eax, dword[editLU.size]
538
   mov dword[dataBuffer.size1], eax
539
 
540
   mov eax, dword[editLD.size]
541
   mov dword[dataBuffer.size2], eax
542
 
543
   mov eax, dword[editRU.size]
544
   mov dword[dataBuffer.size3], eax
545
 
546
   mov eax, dword[editRD.size]
547
   mov dword[dataBuffer.size4], eax
548
 
7459 theonlymir 549
   mov eax, dword[editRadius.size]
550
   mov dword[radiusBuffer.size], eax
551
 
7389 theonlymir 552
   pop eax
553
   ret
554
 
555
fileAdr dd 0
556
 
557
loadConfig:
558
   push eax ebx ecx edx
559
   mcall 68, 27, fileName   ;загружаем конфигурационный файл в ОЗУ
560
   mov dword[fileAdr], eax  ;сохраняем адрес блока памяти файла
561
   cmp eax, 0
562
   je loadConfig.default       ;если файла конфигурации нет, то ставим настройки по умолчанию
563
   ;иначе данные загружены в ОЗУ, размер в edx
564
   cmp edx, 0               ;если файл пуст, в нём нет данных, то ставим настройки по умолчанию
565
   je loadConfig.default
566
.start:
567
   add edx, eax             ;кладём в edx - адрес конца конфиг.данных
568
 
569
.chStart:
7443 theonlymir 570
 
571
   push ebx
572
   mov bl, byte[eax]
573
   cmp bl, 48          ; если значение выходит за допустимые пределы, то проверяем на 'n' (для совместимости)
574
   jb loadConfig.checkN
575
   cmp bl, 51
576
   ja loadConfig.checkN
577
 
578
   mov byte[mode], bl  ;иначе устанавливаем этот режим как есть
579
   jmp loadConfig.modeEnd   ;и идём дальше
580
.checkN:
581
   cmp bl, 'n'             ;если n - то режим "отключено"
582
   jne @f
583
   mov byte[mode], 48 ;'0'
584
   jmp loadConfig.modeEnd
7436 theonlymir 585
@@:
7459 theonlymir 586
   cmp bl, 'y'             ;если y - то классический режим
587
   jne @f
588
   mov byte[mode], 49 ;'1'
589
   jmp loadConfig.modeEnd
590
@@:
591
   mov byte[mode], 48 ;'0' иначе по умолчанию отключено
592
   ;mov byte[mode], 49 ;'1' иначе по умолчанию включён классический режим работы
7443 theonlymir 593
.modeEnd:
594
   pop ebx
7389 theonlymir 595
   ;jmp loadConfig.end   ;команда для удобства отладки и поиска ошибок
596
 
597
   ;копируем содержимое строк в буфер
598
   push edi esi ecx ebx eax
599
   ;инициализируем указатели на адреса буфера строки и её размера
7408 theonlymir 600
   mov edi, dataBuffer.1
601
   mov esi, dataBuffer.size1
7389 theonlymir 602
   ;ecx - счётчик байт в строке
603
.block:
604
   xor ecx, ecx ;обнуляем счётчик
605
   inc eax
606
   cmp byte[eax], 10         ;если очередной код символа 10 или 13, то пропускаем символы
7408 theonlymir 607
   je loadConfig.block       ;до первого отличного от них
7389 theonlymir 608
   cmp byte[eax], 13
7408 theonlymir 609
   je loadConfig.block
7389 theonlymir 610
 
611
   ; символ отличен от переноса строки и возврата каретки - начинаем копировать отсюда в буфер
612
   mov bl, byte[eax]
613
   mov byte[edi], bl
614
   inc edi
615
   inc eax
616
   inc ecx ;увеличиваем счётчик символов в строке
617
 
618
   ;идём до конца этой строки: пока не встретим очередной 10, 13, 0 или file end
619
.while:     ;и копируем всё в буфер
620
   cmp eax, edx           ;проверяем закончился ли файл, а конца строки не было !!!
621
   ja loadConfig.ura
622
   cmp byte[eax], 10
623
   je loadConfig.ura
624
   cmp byte[eax], 0
625
   je loadConfig.ura
626
   cmp byte[eax], 13
627
   je loadConfig.ura
628
 
629
   mov bl, byte[eax]
630
   mov byte[edi], bl
631
   inc edi
632
   inc eax
633
   inc ecx
634
   cmp ecx, 511
635
   jae loadConfig.ura
636
   jmp loadConfig.while
637
.ura:
638
   mov byte[edi], 0      ;кладём завершающий 0 в строку
639
   mov dword[esi], ecx   ;сохраняем размер строки
640
   add esi, 4            ;переходим на размер следующего буфера
641
   sub edi, ecx          ;переходим на следующий буфер
642
   add edi, 512
7408 theonlymir 643
   ;xor ecx, ecx          ;обнуляем размер строки
7389 theonlymir 644
 
645
   cmp edi, dataBuffer.size1 ;если это был последний буфер (и мы вышли за адреса размеров буферов), то выходим
646
   jb loadConfig.block
647
 
7459 theonlymir 648
   call readOptKey        ;считываем клавишу
649
   call gotoEndString
650
 
651
   ;считываем сканкод клавиши
652
   call readScanKey
653
   call gotoEndString
654
 
655
   call readOptRadius     ;считываем значение радиуса для mode 3
656
   call gotoEndString
657
   call readOptSize       ;считываем размер элементов
658
   call gotoEndString
659
 
7389 theonlymir 660
   pop eax ebx ecx esi edi
661
 
662
   jmp loadConfig.end
663
.default:
664
   mov eax, defaultDataForConfig
665
   mov edx, defaultDataSize
666
   jmp loadConfig.start
667
.end:
668
   mov ecx, dword[fileAdr]    ;если файл был загружен, то
669
   cmp ecx, 0
670
   je @f
671
   mcall 68, 13, ecx  ;выгружаем файл из памяти
672
@@:
673
   call updateParams ;применяем настройки каждого буфера
7459 theonlymir 674
   call setMySize    ;применяем настройки размера элементов
7389 theonlymir 675
   pop edx ecx ebx eax
676
   ret
677
 
678
 
7459 theonlymir 679
setMySize:
680
   push eax
681
   ;выставляем mysize в зависимости от значения sizeStyle
682
   cmp byte[sizeStyle], '0'
683
   jb @f
684
   cmp byte[sizeStyle], '7'
685
   ja @f
686
   mov eax, 0                  ;если значение размера задано, то его и выставляем
687
   mov al, byte[sizeStyle]
688
   sub al, '0'
689
   jmp .end
690
@@:
691
   cmp byte[sizeStyle], 'a'
692
   je .auto
693
   ;cmp byte[sizeStyle], 's'
694
   ;je .system
695
.system:     ;иначе значение по умолчанию: s - системная
696
;   push ebx ecx
697
   ;!!!
698
;   mov eax, 9
699
;   mcall 48, 11   ;получаем системный размер шрифта
700
   ;eax - высота шрифта в пикселях
701
;   mov ecx, eax
702
;   push eax
703
;   mcall 48, 12, ecx  ;применяем размер шрифта
704
;   pop eax
705
;   pop ecx ebx
706
   ;temp fix -  делим на текущий размер шрифта and -1
707
;   push ebx edx
708
;   mov ebx, 9
709
   ;div ebx
710
;   pop edx ebx
711
   ;cmp eax, 0
712
   ;je .end
713
   ;dec eax
714
   mov eax, 0 ;xor eax, eax ;test temp
715
   jmp .end
716
.auto:       ;a - выставляем в зависимости от разрешения экрана
717
   ;!!!
718
   mcall 14
719
   push ebx
720
   xor ebx, ebx
721
   mov bx, ax
722
   shr eax, 16
723
   cmp ax, bx       ;получаем больший размер стороны
724
   jae .a
725
   mov ax, bx
726
.a:
727
   pop ebx
728
   cmp ax, 1919     ;размеры полученные выше от 0 и на 1 меньше
729
   jb .size0
730
   cmp ax, 2047
731
   jb .size1
732
   cmp ax, 4095
733
   jb .size2
734
   cmp ax, 8191
735
   jb .size3
736
 
737
   jmp .size4
738
 
739
.size0:
740
   mov eax, 0
741
   jmp .end
742
.size1:
743
   mov eax, 1
744
   jmp .end
745
.size2:
746
   mov eax, 2
747
   jmp .end
748
.size3:
749
   mov eax, 3
750
   jmp .end
751
.size4:
752
   mov eax, 4
753
   jmp .end
754
.size5:
755
   mov eax, 5
756
   jmp .end
757
.size6:
758
   mov eax, 6
759
   jmp .end
760
.size7:
761
   mov eax, 7
762
   jmp .end
763
 
764
;.default:
765
;   mov eax, 1
766
.end:
767
   mov byte[mysize], al ;mov dword[mysize], eax
768
   pop eax
769
   ret
770
 
771
 
772
readScanKey:
773
   ;пропускаем переносы строк в начале
774
   cmp eax, edx  ;если файл закончился, то
775
   ja .default   ;настройки по умолчанию
776
   cmp byte[eax], 10
777
   je @f
778
   cmp byte[eax], 0
779
   je @f
780
   cmp byte[eax], 13
781
   je @f
782
 
783
   push ecx ebx esi
784
   mov ecx, 0 ;xor ecx, ecx
785
   mov esi, keystr.data
786
.copy:
787
   mov bl, byte[eax]
788
   cmp bl, 0
789
   je .copyEnd
790
   cmp bl, 10
791
   je .copyEnd
792
   cmp bl, 13
793
   je .copyEnd
794
   cmp esi, keystr.size-1
795
   jae .copyEnd
796
   mov byte[esi], bl
797
   inc esi
798
   inc eax
799
   inc ecx
800
   jmp .copy
801
.copyEnd:
802
   mov byte[esi], 0
803
   mov dword[keystr.size], ecx
804
   pop esi ebx ecx
805
 
806
   jmp .end
807
@@:
808
   inc eax
809
   jmp readScanKey
810
.default:
811
   mov byte[keyscan], 57
812
   mov word[keystr.data], '57'
813
   mov byte[keystr.data+2], 0
814
   mov dword[keystr.size], 2
815
.end:
816
   ret
817
 
818
readOptKey:  ;1;3;4;5 - space or shift
819
   ;пропускаем переносы строк в начале
820
   cmp eax, edx  ;если файл закончился, то
821
   ja .default   ;настройки по умолчанию
822
   cmp byte[eax], 10
823
   je @f
824
   cmp byte[eax], 0
825
   je @f
826
   cmp byte[eax], 13
827
   je @f
828
   ;иначе читаем клавишу и выходим
829
   cmp dword[eax], 'Ctrl'
830
   jne .notCtrl
831
   mov byte[hkSymbol], 3
832
   mov dword[hkSize], 4
833
   jmp .end
834
.notCtrl:
835
   cmp dword[eax], 'Shif'
836
   jne .notShift
837
   mov byte[hkSymbol], 2
838
   mov dword[hkSize], 5
839
   jmp .end
840
.notShift:
841
   cmp dword[eax], 'Spac'
842
   jne .notSpace
843
   mov byte[hkSymbol], 32
844
   mov dword[hkSize], 5
845
   jmp .end
846
.notSpace:
847
   cmp word[eax], 'Al'
848
   jne .notAlt
849
   mov byte[hkSymbol], 1
850
   mov dword[hkSize], 3
851
   jmp .end
852
.notAlt:
853
   ;убедимся, что там 1 символ, а не строка
854
   cmp byte[eax+1], 10
855
   je .oneSymb
856
   cmp byte[eax+1], 0
857
   je .oneSymb
858
   cmp byte[eax+1], 13
859
   je .oneSymb
860
   jmp .default
861
.oneSymb:
862
   ;проверяем, что символ разрешённый  !!!
863
 
864
   ;добавляем символ как есть
865
   push ebx
866
   ;xor ebx, ebx
867
   mov bl, byte[eax]
868
   mov byte[hkSymbol], bl
869
   mov dword[hkSize], 1
870
   pop ebx
871
 
872
   jmp .end
873
@@:
874
   inc eax
875
   jmp readOptKey
876
 
877
.default:
878
   mov byte[hkSymbol], 32
879
   mov dword[hkSize], 5
880
.end:
881
   mov byte[hkSymbol+1], 0
882
   ret
883
 
884
;проходим до конца текущей строки
885
gotoEndString:
886
   cmp eax, edx  ;если файл закончился, то
887
   ja @f         ;выходим
888
   cmp byte[eax], 10
889
   je @f
890
   cmp byte[eax], 0
891
   je @f
892
   cmp byte[eax], 13
893
   je @f
894
   ;иначе переходим на следующий символ
895
   inc eax
896
   jmp gotoEndString
897
@@:
898
   ret
899
 
900
readOptRadius:
901
   ;пропускаем переносы строк в начале
902
   cmp eax, edx  ;если файл закончился, то
903
   ja .default   ;настройки по умолчанию
904
   cmp byte[eax], 10
905
   je @f
906
   cmp byte[eax], 0
907
   je @f
908
   cmp byte[eax], 13
909
   je @f
910
 
911
   ;иначе считываем значение
912
   push ebx ecx
913
   xor ecx, ecx
914
.readValue:
915
   mov bl, byte[eax]
916
   mov byte[radiusBuffer.data+ecx], bl
917
   inc ecx
918
   inc eax
919
   cmp eax, edx  ;если файл закончился, то выход
920
   ja .readEnd
921
   cmp byte[eax], 10
922
   je .readEnd
923
   cmp byte[eax], 0
924
   je .readEnd
925
   cmp byte[eax], 13
926
   je .readEnd
927
   cmp ecx, 6
928
   jae .readEnd
929
   jmp .readValue
930
.readEnd:
931
   mov byte[radiusBuffer.data+ecx], 0
932
   mov dword[radiusBuffer.size], ecx
933
   pop ecx ebx
934
 
935
   jmp .end
936
@@:
937
   inc eax
938
   jmp readOptRadius
939
.default:
940
   mov byte[radiusBuffer.data], '0'
941
   mov byte[radiusBuffer.data+1], 0
942
   mov dword[radiusBuffer.size], 1
943
.end:
944
 
945
   ret
946
 
947
 
948
readOptSize:
949
   ;пропускаем переносы строк в начале
950
   cmp eax, edx  ;если файл закончился, то
951
   ja .default   ;настройки по умолчанию
952
   cmp byte[eax], 10
953
   je @f
954
   cmp byte[eax], 0
955
   je @f
956
   cmp byte[eax], 13
957
   je @f
958
 
959
   ;проверяем, что это допустимое значение: 1-7, a, s
960
   cmp byte[eax], 'a'
961
   je .setValue
962
   cmp byte[eax], 's'
963
   je .setValue
964
   cmp byte[eax], '0'
965
   je .setValue
966
   cmp byte[eax], '1'
967
   je .setValue
968
   cmp byte[eax], '2'
969
   je .setValue
970
   cmp byte[eax], '3'
971
   je .setValue
972
   cmp byte[eax], '4'
973
   je .setValue
974
   cmp byte[eax], '5'
975
   je .setValue
976
   cmp byte[eax], '6'
977
   je .setValue
978
   cmp byte[eax], '7'
979
   je .setValue
980
 
981
   jmp .default    ;иначе ставим значение по умолчанию
982
 
983
.setValue:
984
   push ebx
985
   mov bl, byte[eax]
986
   mov byte[sizeStyle], bl
987
   pop ebx
988
 
989
   jmp .end
990
@@:
991
   inc eax
992
   jmp readOptSize
993
.default:
994
   mov byte[sizeStyle], 's'   ;системный
995
.end:
996
   ret
997
 
998
 
999
 
1000
 
7389 theonlymir 1001
updateParams: ;max, size, pos
1002
   push eax
1003
   mov eax, dword[dataBuffer.size1]
1004
   mov dword[editLU.size], eax
1005
   mov dword[editLU.pos], eax
1006
 
1007
   mov eax, dword[dataBuffer.size2]
1008
   mov dword[editLD.size], eax
1009
   mov dword[editLD.pos], eax
1010
 
1011
   mov eax, dword[dataBuffer.size3]
1012
   mov dword[editRU.size], eax
1013
   mov dword[editRU.pos], eax
1014
 
1015
   mov eax, dword[dataBuffer.size4]
1016
   mov dword[editRD.size], eax
1017
   mov dword[editRD.pos], eax
7459 theonlymir 1018
 
1019
   mov eax, dword[radiusBuffer.size]
1020
   mov dword[editRadius.size], eax
1021
   mov dword[editRadius.pos], eax
7389 theonlymir 1022
   pop eax
1023
   ret
1024
 
1025
 
1026
 
7408 theonlymir 1027
selfName db 'HACONFIG', 0
1028
selfNameSize = 8 ;до 11 byte
7389 theonlymir 1029
;
1030
compareBytes:
1031
   push edi esi ecx ebx
1032
   mov eax, 0 ;xor eax, eax
7408 theonlymir 1033
   mov ecx, selfNameSize    ;max размер строк 11
7389 theonlymir 1034
@@:
1035
   mov bl, byte[edi]
1036
   cmp bl, byte[esi]
1037
   jne compareBytes.no
1038
   inc edi
1039
   inc esi
1040
   cmp ecx, 0
1041
   je @f
1042
   dec ecx
1043
   jmp @b
1044
.no:
1045
   mov eax, 1
1046
@@:
1047
   pop ebx ecx esi edi
1048
   ret
1049
;
1050
slotMax dd 0
1051
selfPID dd 0
1052
buf db 1024 dup(0)
1053
copyKill:
1054
   push eax ebx ecx esi edi
1055
 
1056
   ;сперва прочтём свою информацию
1057
   mcall 9, buf, -1
1058
   mov eax, dword[buf+30]
1059
   mov dword[selfPID], eax
1060
 
1061
   ;указатели, которые никогда не меняются:
1062
   mov esi, selfName       ;первая строка - имя текущего приложения
1063
   mov edi, buf            ;вторая строка - имя текущего слота
1064
   add edi, 10
1065
 
1066
   mov ecx, 1
1067
@@:
1068
   mcall 9, buf, ecx
1069
   mov dword[slotMax], eax
1070
 
1071
   ;если это мы сами, то пропускаем проверку
1072
   mov eax, dword[buf+30]
1073
   cmp eax, dword[selfPID]
1074
   je copyKill.propusk
1075
 
1076
   call compareBytes   ;сравниваем 11 байт строк, результат в eax
1077
 
1078
   cmp eax, 0
1079
   je copyKill.selfKill
1080
 
1081
.propusk:
1082
   inc ecx
1083
   cmp ecx, dword[slotMax]
1084
   ja @f
1085
   jmp @b
1086
 
1087
.selfKill:
1088
   pop edi esi ecx ebx eax
1089
   mcall -1
1090
   ret
1091
@@:
1092
   pop edi esi ecx ebx eax
1093
   ret
1094
 
1095
 WindowsWidth  = 450
7459 theonlymir 1096
 WindowsHeight = 195 + 35 - 5
7389 theonlymir 1097
coord:      ;координаты окна приложения
1098
 .y dw 0
1099
 .x dw 0
1100
 
1101
draw_window:
1102
        ;удаляем кнопку, если есть
1103
        mov edx, 0x80000002
1104
        mcall 8
1105
 
7436 theonlymir 1106
        ;удаляем ещё 4 кнопки если они есть
1107
        mov edx, 0x80000004
1108
        mcall 8
1109
        mov edx, 0x80000005
1110
        mcall 8
1111
        mov edx, 0x80000006
1112
        mcall 8
1113
        mov edx, 0x80000007
1114
        mcall 8
1115
 
7389 theonlymir 1116
        mov     eax, 12                 ; function 12: tell os about windowdraw
1117
        mov     ebx, 1                  ; 1, start of draw
1118
        mcall
1119
 
1120
        ;отобразим окно по центру экрана для этого:
1121
        mcall 14 ;получим размеры экрана
1122
        mov dword[coord], eax       ;положим размеры экрана в координаты
1123
        shr word[coord.x], 1        ;вернее положим их половину
1124
        shr word[coord.y], 1
1125
 
1126
        ;вычисляем координаты окна, чтобы окно было по середине экрана
1127
        sub word[coord.x], WindowsWidth/2
1128
        sub word[coord.y], WindowsHeight/2
1129
 
1130
        mov     eax, 0                  ; function 0 : define and draw window
7408 theonlymir 1131
        mov     ebx, 0                  ; [x start] *65536 + [x size]
7389 theonlymir 1132
        mov bx, word[coord.x]
1133
        shl  ebx, 16
1134
        mov bx, WindowsWidth
1135
 
1136
        mov ecx, 0
7408 theonlymir 1137
        mov     cx, word[coord.y]       ; [y start] *65536 + [y size]
7389 theonlymir 1138
        shl ecx, 16
1139
        mov cx, WindowsHeight
1140
 
1141
        mov     edx, 0x14ffffff         ; color of work area RRGGBB
1142
                                        ; 0x02000000 = window type 4 (fixed size, skinned window)
1143
        mov     esi, 0x808899ff         ; color of grab bar  RRGGBB
1144
                                        ; 0x80000000 = color glide
1145
        mov     edi, title
1146
        mcall
1147
 
7402 theonlymir 1148
        invoke  edit_box_draw, editLU  ;рисование edit box'ов
1149
        invoke  edit_box_draw, editLD
1150
        invoke  edit_box_draw, editRU
1151
        invoke  edit_box_draw, editRD
7389 theonlymir 1152
 
1153
        ;рисуем кнопку
7459 theonlymir 1154
        buttonAppleY = WindowsHeight-35 ;160
7389 theonlymir 1155
        mov ebx, (WindowsWidth-80-Otstup)*65536 + 80 ;координата X, ширина кнопки
7459 theonlymir 1156
        mov ecx, buttonAppleY*65536 + 20   ;координата Y, высота кнопки
7389 theonlymir 1157
        mov edx, 0x00000002 ;2    ;номер кнопки
1158
        mov esi, 0x00AABBCC       ;цвет кнопки
1159
        mcall 8
1160
        ;рисуем текст кнопки
7459 theonlymir 1161
        mov     ebx, (WindowsWidth-80-Otstup+25-buttonTextXoffset) * 65536 + (buttonAppleY+6)    ;координаты текста (x, y)
7389 theonlymir 1162
        mov     ecx, 0xFFFFFF     ;белый цвет текста
1163
        mov     edx, buttonText
7448 theonlymir 1164
        mov     esi, buttonTextSize  ;размер текста в символах
7395 theonlymir 1165
        mcall 4
7389 theonlymir 1166
 
7436 theonlymir 1167
        ;рисуем ещё 4 кнопки для диалогового окна выбора файла
1168
        ;номера 4,5,6 и 7
7448 theonlymir 1169
        buttonH = 14
7436 theonlymir 1170
        buttonW = 30
1171
        ;левый верхний угол
1172
        mov ebx, Otstup*65536 + buttonW ;координата X, ширина кнопки
1173
        mov ecx, 85*65536 + buttonH   ;координата Y, высота кнопки
1174
        mov edx, 0x00000004       ;номер кнопки
1175
        mov esi, 0x00AABBCC       ;цвет кнопки
1176
        mcall 8
1177
        ;левый нижний угол
1178
        mov ebx, Otstup*65536 + buttonW ;координата X, ширина кнопки
1179
        mov ecx, 120*65536 + buttonH   ;координата Y, высота кнопки
1180
        mov edx, 0x00000005       ;номер кнопки
1181
        mov esi, 0x00AABBCC       ;цвет кнопки
1182
        mcall 8
1183
        ;правый верхний угол
1184
        mov ebx, (WindowsWidth-Otstup-buttonW)*65536 + buttonW ;координата X, ширина кнопки
1185
        mov ecx, 85*65536 + buttonH   ;координата Y, высота кнопки
1186
        mov edx, 0x00000006       ;номер кнопки
1187
        mov esi, 0x00AABBCC       ;цвет кнопки
1188
        mcall 8
1189
        ;правый нижний угол
1190
        mov ebx, (WindowsWidth-Otstup-buttonW)*65536 + buttonW ;координата X, ширина кнопки
1191
        mov ecx, 120*65536 + buttonH   ;координата Y, высота кнопки
1192
        mov edx, 0x00000007       ;номер кнопки
1193
        mov esi, 0x00AABBCC       ;цвет кнопки
1194
        mcall 8
1195
 
1196
        ;рисуем тексты для этих 4 кнопок
1197
        mov     ecx, 0xFFFFFF              ;белый цвет текста
1198
        mov     edx, commonButtonText      ;строка текста
1199
        mov     esi, commonButtonTextSize  ;размер текста в символах
1200
        ;координаты текста (x, y)
1201
        deltaCommonTextX = 7
1202
        deltaCommonTextY = 2
1203
        mov     ebx, (Otstup+deltaCommonTextX) * 65536 + (85 + deltaCommonTextY)
1204
        mcall 4
1205
        mov     ebx, (Otstup+deltaCommonTextX) * 65536 + (120 + deltaCommonTextY)
1206
        mcall 4
1207
        mov     ebx, (WindowsWidth-Otstup-buttonW+deltaCommonTextX) * 65536 + (85 + deltaCommonTextY)
1208
        mcall 4
1209
        mov     ebx, (WindowsWidth-Otstup-buttonW+deltaCommonTextX) * 65536 + (120 + deltaCommonTextY)
1210
        mcall 4
1211
 
7443 theonlymir 1212
        ;delete mode button, if it exist
1213
        mov edx, 0x80000008
1214
        mcall 8
1215
        ;draw button Mode
1216
        buttonModeX = 30 ;433
1217
        buttonModeY = 160 ;50
1218
        buttonModeWidth = 221
7459 theonlymir 1219
        buttonModeHeight = 14 ;20
1220
        buttonModeTextYoffset = 3;6
7443 theonlymir 1221
        buttonModeTextXoffset = 5
1222
        mov ebx, buttonModeX*65536 + buttonModeWidth  ;X + Width
7448 theonlymir 1223
        mov ecx, buttonModeY*65536 + buttonModeHeight ;Y + Height
1224
        mov edx, 0x00000008    ;button id
1225
        mov esi, 0x00FFFFFF    ;color button
7443 theonlymir 1226
        mcall 8
7448 theonlymir 1227
        mov ebx, (buttonModeX+2+buttonModeWidth-20)*65536 + (20-2)  ;X + Width
1228
        mov ecx, (buttonModeY+1)*65536 + buttonModeHeight-2   ;Y + Height
1229
        mov edx, 0xAABBCC
1230
        mcall 13
7443 theonlymir 1231
        ;draw text for button Mode
7459 theonlymir 1232
        mov     ebx, (buttonModeX+buttonModeTextXoffset) * 65536 + (buttonModeY+buttonModeTextYoffset)    ;(x, y)
7448 theonlymir 1233
        mov     ecx, 0x000000
7443 theonlymir 1234
        call setTextModeMenu
1235
        mov     esi, valueModeMenuSize
1236
        mcall 4
7459 theonlymir 1237
        mov     ebx, (buttonModeX+buttonModeWidth-12) * 65536 + (buttonModeY+buttonModeTextYoffset)
7448 theonlymir 1238
        mov     ecx, 0x80FFFFFF
1239
        mov     edx, symbolDownArrow
1240
        mcall 4
7443 theonlymir 1241
 
7459 theonlymir 1242
        ;кнопка выбора горячей клавиши
1243
        buttonHotKeyX = 280-10
1244
        buttonHotKeyWidth = 90
1245
        mov edx, 0x80000009    ;удаляем
1246
        mcall 8
1247
    cmp byte[mode], 49    ;рисуем выбор клавиши, только если mode > 1
1248
    jbe @f
1249
        ;рисуем новую
1250
        push eax ebx ecx edx esi
1251
        mov ebx, buttonHotKeyX*65536 + buttonHotKeyWidth  ;X + Width
1252
        mov ecx, buttonModeY*65536 + buttonModeHeight ;Y + Height
1253
        mov edx, 0x00000009    ;button id
1254
        mov esi, 0x00FFFFFF    ;color button
1255
        mcall 8
1256
        pop esi edx ecx ebx eax
1257
        ;текст подсказки для горячей клавиши
1258
        mov     ebx, (buttonHotKeyX+buttonModeTextXoffset) * 65536 + (buttonModeY+buttonModeTextYoffset)    ;(x, y)
1259
        mov     ecx, 0x80224466
1260
        call setTextForHotKey
1261
        mov     esi, valueModeMenuSize
1262
        mcall 4
1263
        ;заголовок
1264
        push eax ebx ecx edx edi esi
1265
        mov     ebx, buttonHotKeyX * 65536 + (buttonModeY-11)
1266
        mov ecx, 0x80224466
1267
        mov     edx, hkCaption
1268
        mov     esi, 3
1269
        mcall 4
1270
        pop esi edi edx ecx ebx eax
1271
    @@:
1272
 
1273
    ;отображаем настройку радиуса действия жеста, только если выбран режим 3
1274
    cmp byte[mode], 51
1275
    jne @f
1276
        ;заголовок
1277
        push eax ebx ecx edx edi esi
1278
        mov     ebx, (buttonHotKeyX + buttonHotKeyWidth + 20) * 65536 + (buttonModeY-11)
1279
        mov ecx, 0x80224466
1280
        mov     edx, radiusCaption
1281
        mov     esi, 3
1282
        mcall 4
1283
        pop esi edi edx ecx ebx eax
1284
        invoke  edit_box_draw, editRadius
1285
    @@:
1286
 
7389 theonlymir 1287
        call draw_super_text
1288
 
7408 theonlymir 1289
        LineLength = 62
7389 theonlymir 1290
        mov     ebx, 40 * 65536 + 36    ; draw info text with function 4 (x, y)
7459 theonlymir 1291
 
1292
        ;xor ecx, ecx
1293
        ;mov cl, 1 ;byte[mysize]
1294
        ;shl ecx, 24
1295
        ;add ecx, 0x224466
1296
        ;or ecx, 0x00224466  ;80224466
7389 theonlymir 1297
        mov     ecx, 0x224466
7459 theonlymir 1298
 
7389 theonlymir 1299
        mov     edx, text
1300
        mov     esi, LineLength
1301
        mov     eax, 4
1302
 
1303
  .newline:                             ; text from the DATA AREA
1304
        mcall
1305
        add     ebx, 12
1306
        add     edx, LineLength
1307
        cmp     byte[edx], 0
1308
        jne     .newline
1309
 
1310
        mov     eax, 12                 ; function 12:tell os about windowdraw
1311
        mov     ebx, 2                  ; 2, end of draw
1312
        mcall
1313
 
1314
        ret
1315
 
7459 theonlymir 1316
hkSymbol: db 0, 0
7389 theonlymir 1317
 
7459 theonlymir 1318
setTextForHotKey:
1319
   push eax
1320
   mov al, byte[hkSymbol]
1321
   cmp al, 0
1322
   jne @f
1323
      mov edx, hkHint
1324
      mov dword[hkSize], 5 ;значение по умолчанию SPACE ;shift
1325
      jmp setTextForHotKey.end
1326
@@:
1327
   cmp al, 1
1328
   jne @f
1329
      mov edx, hkAlt
1330
      mov dword[hkSize], 3
1331
      jmp setTextForHotKey.end
1332
@@:
1333
   cmp al, 2
1334
   jne @f
1335
      mov edx, hkShift
1336
      mov dword[hkSize], 5
1337
      jmp setTextForHotKey.end
1338
@@:
1339
   cmp al, 3
1340
   jne @f
1341
      mov edx, hkCtrl
1342
      mov dword[hkSize], 4
1343
      jmp setTextForHotKey.end
1344
@@:
1345
   cmp al, 32
1346
   jne @f
1347
      mov edx, hkSpace
1348
      mov dword[hkSize], 5
1349
      jmp setTextForHotKey.end
1350
@@:
1351
   cmp al, 96  ;'`'
1352
   je  setTextForHotKey.symb
1353
   cmp al, 126 ;'~'
1354
   je  setTextForHotKey.symb
1355
   cmp al, 48 ;'0'
1356
   jb @f
1357
   cmp al, 57 ;'9'
1358
   ja @f
1359
.symb:
1360
      mov edx, hkSymbol
1361
      mov dword[hkSize], 1
1362
      jmp setTextForHotKey.end
1363
@@:
1364
   cmp al, 97  ;'a'
1365
   jb @f
1366
   cmp al, 122 ;'z'
1367
   ja @f
1368
      ;jmp setTextForHotKey.symb
1369
      mov edx, hkSymbol
1370
      mov dword[hkSize], 1
1371
      jmp setTextForHotKey.end
1372
@@:
1373
   cmp al, 65  ;'A'
1374
   jb @f
1375
   cmp al, 90 ;'Z'
1376
   ja @f
1377
      ;jmp setTextForHotKey.symb
1378
      mov edx, hkSymbol
1379
      mov dword[hkSize], 1
1380
      jmp setTextForHotKey.end
1381
@@:
1382
   mov word[hkSymbol], 0     ;если же попало что-то неизвестное, то сотрём его
1383
   mov edx, hkHint
1384
   mov dword[hkSize], 5 ;shift or space -  значение по умолчанию
1385
.end:
1386
   pop eax
1387
   ret
1388
 
1389
 
7443 theonlymir 1390
setTextModeMenu:
1391
   cmp byte[mode], 48
1392
   jne @f
1393
        mov edx, valueModeMenu0
1394
        ret
1395
@@:
1396
   cmp byte[mode], 49
1397
   jne @f
1398
        mov edx, valueModeMenu1
1399
        ret
1400
@@:
1401
   cmp byte[mode], 50
1402
   jne @f
1403
        mov edx, valueModeMenu2
1404
        ret
1405
@@:
1406
   cmp byte[mode], 51
1407
   jne @f
1408
        mov edx, valueModeMenu3
1409
        ret
1410
@@:
1411
   mov edx, valueModeMenu1
1412
   ret
7389 theonlymir 1413
 
7395 theonlymir 1414
 
7459 theonlymir 1415
 
1416
 
1417
saveKey:
1418
   cmp word[hkSymbol], 0
1419
   je .default
1420
   cmp byte[hkSymbol], 1
1421
   je .alt
1422
   cmp byte[hkSymbol], 2
1423
   je .shift
1424
   cmp byte[hkSymbol], 3
1425
   je .ctrl
1426
   cmp byte[hkSymbol], 32
1427
   je .space
1428
.other:
1429
   mov esi, hkSymbol
1430
   mov byte[esi+1], 0
1431
   mov dword[hkSize], 1
1432
   jmp .end
1433
.space:
1434
   mov esi, hkSpace
1435
   mov dword[hkSize], 5
1436
   jmp .end
1437
.ctrl:
1438
   mov esi, hkCtrl
1439
   mov dword[hkSize], 4
1440
   jmp .end
1441
.alt:
1442
   mov esi, hkAlt
1443
   mov dword[hkSize], 3
1444
   jmp .end
1445
.default:
1446
.shift:
1447
   mov esi, hkShift
1448
   mov dword[hkSize], 5
1449
.end:
1450
   mov ebx, hkSize ;указатель на dword[hkSize]
1451
   call copyParam
1452
   ret
1453
 
1454
 
1455
 
1456
 
1457
 
7402 theonlymir 1458
align 16
1459
@IMPORT:
1460
 
1461
library box_lib, 'box_lib.obj'
1462
 
1463
import  box_lib,\
1464
        edit_box_draw,          'edit_box',\
1465
        edit_box_key,           'edit_box_key',\
1466
        edit_box_mouse,         'edit_box_mouse',\
1467
        init_checkbox,          'init_checkbox2',\
1468
        check_box_draw,         'check_box_draw2',\
1469
        check_box_mouse,        'check_box_mouse2',\
1470
        option_box_draw,        'option_box_draw',\
1471
        option_box_mouse,       'option_box_mouse'
1472
 
7436 theonlymir 1473
commonButtonText db '...', 0  ;текст для кнопок вызова OpenDial
1474
commonButtonTextSize = 3
7402 theonlymir 1475
 
7395 theonlymir 1476
if lang eq ru  ;если язык сборки русский
1477
 
1478
text    db  "Љ®­дЁЈга в®а Hot Angles ®вўҐз Ґв §  ­ бва®©Єг  ЄвЁў­ле гЈ«®ў. "
1479
        db  "Ќ бвன⥠Ї а ¬Ґвал Ї®¤ бҐЎп Ё«Ё ®вЄ«озЁвҐ нвг ®ЇжЁо.         "
1480
        db  "                                                              ", 0
1481
 hed:
1482
title   db  "Љ®­дЁЈга в®а гвЁ«Ёвл Hot Angles", 0
1483
buttonText db "ЏаЁ¬Ґ­Ёвм", 0
1484
buttonTextSize = 9
1485
buttonTextXoffset = 12
1486
 
7402 theonlymir 1487
ch_text db '‚Є«озЁвм/ ЄвЁўЁа®ў вм "Hot Angles"', 0
7395 theonlymir 1488
 
1489
superText:
1490
  .lu db 'Љ®¬ ­¤  «Ґў®Ј® ўҐае­ҐЈ® гЈ« : ', 0
1491
  .ld db 'Љ®¬ ­¤  «Ґў®Ј® ­Ё¦­ҐЈ® гЈ« :  ', 0
1492
  .ru db 'Љ®¬ ­¤  Їа ў®Ј® ўҐае­ҐЈ® гЈ« :', 0
1493
  .rd db 'Љ®¬ ­¤  Їа ў®Ј® ­Ё¦­ҐЈ® гЈ« : ', 0
1494
superTextSize = 30
1495
 
7443 theonlymir 1496
valueModeMenuSize = 32
1497
ModeMenu  db 'ђҐ¦Ё¬ а Ў®вл:',0
1498
valueModeMenu0  db '®вЄ«о祭®                       ',0
1499
valueModeMenu1  db 'Є« ббЁзҐбЄЁ© ०Ё¬              ',0
1500
valueModeMenu2  db '०Ё¬ Ј®ап祩 Є« ўЁиЁ           ',0
1501
valueModeMenu3  db '०Ё¬ ¦Ґбв  Ї® Є« ўЁиҐ  ЄвЁў жЁЁ',0
1502
 
7448 theonlymir 1503
head_f_i:
1504
        head_f_l  db '‘Ёб⥬­ п ®иЁЎЄ ',0
1505
        err_message_found_lib0 db 'ЌҐ ­ ©¤Ґ­  ЎЁЎ«Ё®вҐЄ  ',39,'proc_lib.obj',39,0
1506
        err_message_import0 db 'ЋиЁЎЄ  ЇаЁ Ё¬Ї®а⥠ЎЁЎ«Ё®вҐЄЁ ',39,'proc_lib.obj',39,0
1507
        err_message_found_lib1 db 'ЌҐ ­ ©¤Ґ­  ЎЁЎ«Ё®вҐЄ  ',39,'kmenu.obj',39,0
1508
        err_message_import1 db 'ЋиЁЎЄ  ЇаЁ Ё¬Ї®а⥠ЎЁЎ«Ё®вҐЄЁ ',39,'kmenu',39,0
1509
 
7459 theonlymir 1510
hkCaption: db 'Љ« ўЁи :',0
1511
;hkHint: db 'Ќ ¦¬ЁвҐ «оЎго Є« ўЁиг',0
1512
radiusCaption: db 'ђ ¤Ёгб:',0
1513
 
7395 theonlymir 1514
else  ;иначе английский текст
1515
 
1516
text    db  "This is a Hot Angles Configurator.                            "
1517
        db  "Set the parameters bellow for yourself or disable this option."
1518
        db  "                                                              ", 0
1519
 hed:
1520
title   db  "Hot Angles Configurator", 0
1521
buttonText db "Apply", 0
1522
buttonTextSize = 5
1523
buttonTextXoffset = 0
1524
 
7402 theonlymir 1525
ch_text db 'Activate "Hot Angles"',0       ;сопровождающий текст для чек бокса
7389 theonlymir 1526
 
1527
superText:
7395 theonlymir 1528
  .lu db 'Left up angle command:   ', 0
1529
  .ld db 'Left down angle command: ', 0
1530
  .ru db 'Right up angle command:  ', 0
7389 theonlymir 1531
  .rd db 'Right down angle command:', 0
7395 theonlymir 1532
superTextSize = 25
7389 theonlymir 1533
 
7443 theonlymir 1534
valueModeMenuSize = 32
1535
ModeMenu  db 'Mode:',0
1536
valueModeMenu0  db 'disabled                        ',0
1537
valueModeMenu1  db 'classic mode                    ',0
1538
valueModeMenu2  db 'hot key mode                    ',0
1539
valueModeMenu3  db 'activation key gesture mode     ',0
1540
 
7448 theonlymir 1541
head_f_i:
1542
        head_f_l  db 'System error',0
1543
        err_message_found_lib0 db 'Could not find library ',39,'proc_lib.obj',39,0
1544
        err_message_import0 db 'Error importing library ',39,'proc_lib.obj',39,0
1545
        err_message_found_lib1 db 'Could not find library ',39,'kmenu.obj',39,0
1546
        err_message_import1 db 'Error importing library ',39,'kmenu',39,0
1547
 
7459 theonlymir 1548
hkCaption: db 'Key:',0
1549
;hkHint: db 'press any key',0
1550
radiusCaption: db 'Radius:',0
1551
 
7395 theonlymir 1552
end if
1553
 
7459 theonlymir 1554
hkAlt:   db 'Alt',0
1555
hkShift: db 'Shift',0
1556
hkCtrl:  db 'Ctrl',0
1557
hkSpace: db 'Space',0
1558
hkHint: db '?',0
1559
hkSize: rd 1 ;размер строки с именем клавиши
7395 theonlymir 1560
 
7389 theonlymir 1561
draw_super_text:
1562
   push eax ebx ecx edx edi esi
7459 theonlymir 1563
 
1564
   mov ecx, 0
1565
   mov ch, byte[mysize]
1566
   shl ecx, 16
1567
   add ecx, 0x224466
1568
 
7389 theonlymir 1569
   mov     ebx, Otstup * 65536 + 74    ; draw info text with function 4 (x, y)
7459 theonlymir 1570
   ;mov     ecx, 0x224466
7389 theonlymir 1571
   mov eax, superText.lu
1572
   mov     edx, eax
7408 theonlymir 1573
   mov     esi, superTextSize
7389 theonlymir 1574
   mcall 4
1575
 
1576
   mov     ebx, Otstup * 65536 + 109
1577
   mov     edx, superText.ld
7408 theonlymir 1578
   mov     esi, superTextSize
7389 theonlymir 1579
   mcall 4
1580
 
1581
   mov     ebx, 240 * 65536 + 74
1582
   mov     edx, superText.ru
7408 theonlymir 1583
   mov     esi, superTextSize
7389 theonlymir 1584
   mcall 4
1585
 
1586
   mov     ebx, 240 * 65536 + 109
1587
   mov     edx, superText.rd
7408 theonlymir 1588
   mov     esi, superTextSize
7389 theonlymir 1589
   mcall 4
1590
 
7443 theonlymir 1591
   mov     ebx, Otstup * 65536 + (buttonModeY-11)
1592
   or ecx, 0x80000000
1593
   mov     edx, ModeMenu
1594
   mov     esi, 3
1595
   mcall 4
1596
 
7459 theonlymir 1597
;   mov     ebx, buttonHotKeyX * 65536 + (buttonModeY-11)
1598
;   or ecx, 0x80000000
1599
;   mov     edx, hkCaption
1600
;   mov     esi, 3
1601
;   mcall 4
1602
 
7389 theonlymir 1603
   pop esi edi edx ecx ebx eax
1604
   ret
1605
 
7436 theonlymir 1606
editID db 0
1607
initEBX:
1608
   cmp byte[editID], 4
1609
   jne @f
1610
   mov ebx, dataBuffer.1
1611
   ret
1612
@@:
1613
   cmp byte[editID], 5
1614
   jne @f
1615
   mov ebx, dataBuffer.2
1616
   ret
1617
@@:
1618
   cmp byte[editID], 6
1619
   jne @f
1620
   mov ebx, dataBuffer.3
1621
   ret
1622
@@:
1623
   cmp byte[editID], 7
1624
   jne @f
1625
   mov ebx, dataBuffer.4
1626
   ret
1627
@@:
1628
   ret
1629
setRESULT:
1630
   cmp byte[editID], 4
1631
   jne @f
1632
   mov dword[dataBuffer.size1], ecx
1633
   mov dword[editLU.size], ecx
1634
   mov dword[editLU.pos], ecx
1635
   ret
1636
@@:
1637
   cmp byte[editID], 5
1638
   jne @f
1639
   mov dword[dataBuffer.size2], ecx
1640
   mov dword[editLD.size], ecx
1641
   mov dword[editLD.pos], ecx
1642
   ret
1643
@@:
1644
   cmp byte[editID], 6
1645
   jne @f
1646
   mov dword[dataBuffer.size3], ecx
1647
   mov dword[editRU.size], ecx
1648
   mov dword[editRU.pos], ecx
1649
   ret
1650
@@:
1651
   cmp byte[editID], 7
1652
   jne @f
1653
   mov dword[dataBuffer.size4], ecx
1654
   mov dword[editRD.size], ecx
1655
   mov dword[editRD.pos], ecx
1656
   ret
1657
@@:
1658
   ret
1659
copyPath:
1660
   push eax ebx ecx edx ;copy file name path
1661
        mov eax, openfile_path ;dword[OpenDialog_data.openfile_path]
1662
        call initEBX ;mov ebx, dataBuffer.1 ;.data
1663
        mov ecx, 0
1664
      @@:
1665
        mov dl, byte[eax]
1666
        cmp dl, 0 ;byte[eax], 0
1667
        je @f
1668
        mov byte[ebx], dl
1669
        inc eax
1670
        inc ebx
1671
        inc ecx
1672
        jmp @b
1673
      @@:
1674
        mov byte[ebx], 0
1675
        call setRESULT
1676
   pop edx ecx ebx eax
1677
   ret
7389 theonlymir 1678
 
7436 theonlymir 1679
 
7459 theonlymir 1680
IntToStr:  ;in esi - строка; eсx - число
1681
   push eax ecx edx esi
1682
   cmp ecx, 0
1683
   jne @f
1684
   mov byte[esi], 48 ; '0'
1685
   inc esi
1686
   jmp .end
1687
@@:
1688
   mov eax, ecx
1689
   mov ecx, 10
1690
.next:
1691
   mov edx, 0
1692
   div ecx
1693
   add edx, 48
1694
 
1695
   mov byte[esi], dl
1696
 
1697
   inc esi
1698
   cmp eax, 0
1699
   je .end
1700
   jmp .next
1701
.end:
1702
   mov byte[esi], 0   ;кладём завершающий ноль
1703
   pop esi edx ecx eax
1704
   call reverseString ;делаем реверс строки
1705
   ret
1706
 
1707
;вход: esi - указатель на строку
1708
reverseString:
1709
   push eax esi edi
1710
 
1711
   mov al, byte[esi] ;если строка пустая то выходим реверс делать не надо
1712
   cmp al, 0
1713
   je reverseString.end
1714
 
1715
   mov edi, esi  ;иначе найдём позицию последнего символа строки и положим её в edi
1716
.go_last_symbol:
1717
   mov al, byte[edi+1]
1718
   cmp al, 0
1719
   je @f
1720
 
1721
   inc edi
1722
   jmp reverseString.go_last_symbol
1723
@@:
1724
   push ebx
1725
.rev:
1726
   cmp esi, edi
1727
   jae @f
1728
 
1729
   ;меняем местами символы в цикле
1730
   mov al, byte[edi]
1731
   mov bl, byte[esi]
1732
   mov byte[edi], bl
1733
   mov byte[esi], al
1734
 
1735
   inc esi
1736
   dec edi
1737
   jmp reverseString.rev
1738
@@:
1739
   pop ebx
1740
.end:
1741
   pop edi esi eax
1742
   ret
1743
 
1744
 
1745
 
7436 theonlymir 1746
align 4
1747
but_open_dlg:
1748
        pushad
1749
        copy_path open_dialog_name,communication_area_default_path,file_name,0
1750
        mov [OpenDialog_data.type],0
1751
        stdcall[OpenDialog_Start], OpenDialog_data
1752
        cmp [OpenDialog_data.status],2
1753
        je @f
1754
        cmp [OpenDialog_data.status],0 ;пользователь нажал Cancel?
1755
        je .end_open
1756
                ;код при удачном открытии диалога
1757
                call copyPath
1758
                jmp .end_open
1759
        @@:
1760
                ;код при не удачном открытии диалога
1761
                ;...
1762
        .end_open:
1763
        popad
1764
        ret
1765
 
7448 theonlymir 1766
;данные для диалога открытия файлов
7436 theonlymir 1767
align 4
1768
OpenDialog_data:
1769
.type                   dd 0 ;0 - открыть, 1 - сохранить, 2 - выбрать директорию
1770
.procinfo               dd procinfo
1771
.com_area_name          dd communication_area_name ;+8
7443 theonlymir 1772
.com_area               dd 0           ;+12
7436 theonlymir 1773
.opendir_path           dd plugin_path ;+16
1774
.dir_default_path       dd default_dir ;+20
7443 theonlymir 1775
.start_path             dd file_name   ;+24 путь к диалогу открытия файлов
7436 theonlymir 1776
.draw_window            dd draw_window ;+28
7443 theonlymir 1777
.status                 dd 0           ;+32
7436 theonlymir 1778
.openfile_path          dd openfile_path ;+36 путь к открываемому файлу
1779
.filename_area          dd filename_area ;+40
1780
.filter_area            dd Filter
1781
.x:
1782
.x_size                 dw 420 ;+48 ; Window X size
7443 theonlymir 1783
.x_start                dw 10  ;+50 ; Window X position
7436 theonlymir 1784
.y:
1785
.y_size                 dw 320 ;+52 ; Window y size
7443 theonlymir 1786
.y_start                dw 10  ;+54 ; Window Y position
7436 theonlymir 1787
 
1788
default_dir db '/rd/1',0 ;директория по умолчанию
1789
communication_area_name: db 'FFFFFFFF_open_dialog',0
1790
open_dialog_name:  db 'opendial',0
1791
communication_area_default_path: db '/rd/1/File managers/',0
1792
 
1793
Filter:
1794
dd Filter.end - Filter.1
1795
.1:
1796
;db 'KEX',0
1797
.end:
1798
db 0
7443 theonlymir 1799
 
1800
mode db 49 ;'1'
1801
modeMenu dd 0
1802
coordModeMenu:
1803
  .x dw 100
1804
  .y dw 200
1805
 
1806
 
7436 theonlymir 1807
align 4
1808
proclib_import: ;описание экспортируемых функций
1809
        OpenDialog_Init dd aOpenDialog_Init
1810
        OpenDialog_Start dd aOpenDialog_Start
1811
dd 0,0
1812
        aOpenDialog_Init db 'OpenDialog_init',0
1813
        aOpenDialog_Start db 'OpenDialog_start',0
1814
 
1815
system_dir0 db '/sys/lib/'
1816
lib0_name db 'proc_lib.obj',0
7443 theonlymir 1817
lib1_name db 'kmenu.obj',0
1818
 
7448 theonlymir 1819
symbolDownArrow db 25,0
1820
 
7436 theonlymir 1821
;library structures
1822
l_libs_start:
7443 theonlymir 1823
    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
1824
    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 1825
load_lib_end:
1826
 
7448 theonlymir 1827
 
7402 theonlymir 1828
edMaxSize = 510 ;теперь с новым компонентом можно и 511 указать
7389 theonlymir 1829
edMax = 0 ;max, size, pos
1830
 
7402 theonlymir 1831
align 4
7436 theonlymir 1832
editLU   edit_box 180-buttonW,Otstup+buttonW,85, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.1, mouse_dd, 0, edMax, edMax  ;ed_focus
1833
editLD   edit_box 180-buttonW,Otstup+buttonW,120, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.2, mouse_dd, 0, edMax, edMax
1834
editRU   edit_box 180-buttonW,240,85, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.3, mouse_dd, 0, edMax, edMax
1835
editRD   edit_box 180-buttonW,240,120, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.4, mouse_dd, 0, edMax, edMax
7459 theonlymir 1836
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 1837
 
7443 theonlymir 1838
align 4
1839
import_libkmenu:
1840
        kmenu_init      dd akmenu_init
1841
        kmainmenu_draw  dd akmainmenu_draw
1842
        kmainmenu_dispatch_cursorevent dd akmainmenu_dispatch_cursorevent
1843
        ksubmenu_new    dd aksubmenu_new
1844
        ksubmenu_delete dd aksubmenu_delete
1845
        ksubmenu_draw   dd aksubmenu_draw
1846
        ksubmenu_add    dd aksubmenu_add
1847
        kmenuitem_new   dd akmenuitem_new
1848
        kmenuitem_delete dd akmenuitem_delete
1849
        kmenuitem_draw  dd akmenuitem_draw
1850
dd 0,0
1851
        akmenu_init     db 'kmenu_init',0
1852
        akmainmenu_draw db 'kmainmenu_draw',0
1853
        akmainmenu_dispatch_cursorevent db 'kmainmenu_dispatch_cursorevent',0
1854
        aksubmenu_new   db 'ksubmenu_new',0
1855
        aksubmenu_delete db 'ksubmenu_delete',0
1856
        aksubmenu_draw  db 'ksubmenu_draw',0
1857
        aksubmenu_add   db 'ksubmenu_add',0
1858
        akmenuitem_new  db 'kmenuitem_new',0
1859
        akmenuitem_delete db 'kmenuitem_delete',0
1860
        akmenuitem_draw  db 'kmenuitem_draw',0
1861
 
7459 theonlymir 1862
;mouse_dd  dd ?
7436 theonlymir 1863
sc  system_colors
7459 theonlymir 1864
mouse_dd  rd 1
7436 theonlymir 1865
 
7459 theonlymir 1866
sizeStyle: rb 1  ;размер текста и остальных элементов окна
1867
mysize: rb 1     ;rd 1
1868
radiusBuffer:    ;буфер для поля радиуса жеста
1869
 .data: rb 6
1870
 .size: rd 1
1871
radiusBufferEnd:
1872
 
7443 theonlymir 1873
button_press  rd 0     ;for kmenu
1874
 
1875
sys_path:      rb 4096
1876
file_name:     rb 4096
1877
plugin_path:   rb 4096
1878
openfile_path: rb 4096
1879
filename_area: rb 256
1880
rb 1024
1881
procinfo process_information
1882
pi rb 1024
1883
 
7459 theonlymir 1884
keyscan: rb 1
1885
keystr:
1886
  .data: rb 4 ;строка со значением сканкода активационной клавиши
1887
  .size: rd 1 ;размер содержимого строки без последнего нуля
7443 theonlymir 1888
 
7389 theonlymir 1889
dataBuffer:
1890
.1: rb 512
1891
.2: rb 512
1892
.3: rb 512
1893
.4: rb 512
1894
.size1: rd 1
1895
.size2: rd 1
1896
.size3: rd 1
1897
.size4: rd 1
7448 theonlymir 1898
;255+255+2 = 512
7389 theonlymir 1899
;два запасных байта необходимы для того что бы не пепереписать следующией байты, в конце буфера 0
1900
dataBufferEnd:
1901
 
1902
 
1903
I_END:
1904
        rb 4096
1905
align 16
1906
STACKTOP:
1907
 
1908
MEM: