Subversion Repositories Kolibri OS

Rev

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