Subversion Repositories Kolibri OS

Rev

Rev 7436 | Rev 7448 | 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
7443 theonlymir 5
; Version 0.3.6: Oct 9, 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
 
7443 theonlymir 72
    ;invoke  init_checkbox, ch1
7402 theonlymir 73
 
7389 theonlymir 74
    mov  eax,40          ;установить маску для ожидаемых событий
75
    mov  ebx,0x27        ;система будет реагировать только на сообщение о перерисовке, нажата кнопка, определённая ранее, событие от мыши (что-то случилось - нажатие на кнопку мыши или перемещение; сбрасывается при прочтении)
76
    mcall
77
 
7436 theonlymir 78
    load_libraries l_libs_start,load_lib_end ;загрузка библиотек(и)
79
    ;mcall 48,3,sc,sizeof.system_colors ;получить системные цвета
80
    stdcall [OpenDialog_Init],OpenDialog_data ;подготовка диалога
81
 
7443 theonlymir 82
    ;mode menu
83
    stdcall [kmenu_init], sc    ;kmenu initialisation
84
    stdcall [ksubmenu_new]
85
    mov [modeMenu], eax
86
    stdcall [kmenuitem_new], KMENUITEM_NORMAL, valueModeMenu0, 110
87
    stdcall [ksubmenu_add], [modeMenu], eax
88
    stdcall [kmenuitem_new], KMENUITEM_NORMAL, valueModeMenu1, 111
89
    stdcall [ksubmenu_add], [modeMenu], eax
90
    stdcall [kmenuitem_new], KMENUITEM_NORMAL, valueModeMenu2, 112
91
    stdcall [ksubmenu_add], [modeMenu], eax
92
    stdcall [kmenuitem_new], KMENUITEM_NORMAL, valueModeMenu3, 113
93
    stdcall [ksubmenu_add], [modeMenu], eax
94
        stdcall [kmenuitem_new], KMENUITEM_SUBMENU, valueModeMenu1, [modeMenu]
95
 
7389 theonlymir 96
    call  loadConfig     ;загружаем конфигурацию из файла, если нет - то выставляем параметры по умолчанию
97
    call  draw_window    ;отрисовать окно приложения
98
 
99
; Обработка цикла событий
100
event_wait:
101
    mov     eax, 10      ; function 10 : wait until event
102
    mcall                ; event type is returned in eax
103
 
104
    cmp     eax, 1       ; Event redraw request ?
105
    je      red          ; Expl.: there has been activity on screen and
106
                         ; parts of the applications has to be redrawn.
107
 
108
    cmp     eax, 2       ; Event key in buffer ?
109
    je      key          ; Expl.: User has pressed a key while the
110
                         ; app is at the top of the window stack.
111
 
112
    cmp     eax, 3       ; Event button in buffer ?
113
    je      button       ; Expl.: User has pressed one of the
114
                         ; applications buttons.
115
 
7408 theonlymir 116
    invoke  edit_box_mouse, editLU   ;проверка событий мыши для editBox'ов
7402 theonlymir 117
    invoke  edit_box_mouse, editLD
118
    invoke  edit_box_mouse, editRU
119
    invoke  edit_box_mouse, editRD
7443 theonlymir 120
    ;invoke  check_box_mouse, ch1     ;проверка чек бокса
121
    ;stdcall [kmainmenu_dispatch_cursorevent], [modeMenu] ;проверка мыши для комбобокса
7402 theonlymir 122
 
7389 theonlymir 123
    jmp     event_wait
124
 
125
 
126
red:                     ;обработка события перерисовки окна
127
   call    draw_window
128
   jmp     event_wait
129
 
130
key:                                    ; Keypress event handler
131
        mov     eax, 2                  ; The key is returned in ah. The key must be
132
        mcall                           ; read and cleared from the system queue.
7408 theonlymir 133
 
7402 theonlymir 134
        invoke  edit_box_key, editLU
135
        invoke  edit_box_key, editLD
136
        invoke  edit_box_key, editRU
137
        invoke  edit_box_key, editRD
7389 theonlymir 138
        jmp     event_wait              ; Just read the key, ignore it and jump to event_wait.
139
 
140
button:                                 ; Buttonpress event handler
141
    mov     eax,17                  ; The button number defined in window_draw
142
    mcall                           ; is returned to ah.
143
 
144
    cmp     ah,1                    ; button id=1 ?
145
    jne     noclose
7402 theonlymir 146
exit:
7389 theonlymir 147
    mov     eax,-1                  ; Function -1 : close this program
148
    mcall
149
noclose:
150
    cmp  ah, 2         ;кнопка "Применить"
7436 theonlymir 151
    jne  @f ;butend
7389 theonlymir 152
    call applyButton   ;вызов нашего обработчика нажатия кнопки
7436 theonlymir 153
    jmp event_wait
154
@@:
155
    cmp ah, 4
156
    jne @f
157
    mov byte[editID], 4
158
    call but_open_dlg
159
    jmp  event_wait
160
@@:
161
    cmp ah, 5
162
    jne @f
163
    mov byte[editID], 5
164
    call but_open_dlg
165
    jmp  event_wait
166
@@:
167
    cmp ah, 6
168
    jne @f
169
    mov byte[editID], 6
170
    call but_open_dlg
171
    jmp  event_wait
172
@@:
173
    cmp ah, 7
174
    jne @f
175
    mov byte[editID], 7
176
    call but_open_dlg
177
    jmp  event_wait
178
@@:
7443 theonlymir 179
    cmp ah, 8
180
    jne @f
181
    push eax ebx ecx
182
    mcall 9, pi, -1 ;get window coord
183
 
184
                mov eax, dword[pi+34]
185
                add eax, buttonModeX ;+ 5
186
                mov word[coordModeMenu.x], ax
187
 
188
                mov eax, dword[pi+38]
189
                add eax, buttonModeY + 17 ;20 ;42
190
                mov word[coordModeMenu.y], ax
191
 
192
                stdcall [ksubmenu_draw], [modeMenu], coordModeMenu
193
    pop ecx ebx eax
194
    jmp  event_wait
195
@@:
196
    cmp ah, 110
197
    jne @f
198
    mov byte[mode], 48 ;'0'
199
    jmp  event_wait
200
@@:
201
    cmp ah, 111
202
    jne @f
203
    mov byte[mode], 49 ;'1'
204
    jmp  event_wait
205
@@:
206
    cmp ah, 112
207
    jne @f
208
    mov byte[mode], 50 ;'2'
209
    jmp  event_wait
210
@@:
211
    cmp ah, 113
212
    jne @f
213
    mov byte[mode], 51 ;'3'
214
    jmp  event_wait
215
@@:
7389 theonlymir 216
butend:
217
    jmp  event_wait    ;this is for ignored events, useful at development
218
 
219
 
220
 
221
;имя конфигурационного файла
222
fileName: db 'SETTINGS/HOTANGLES.CFG', 0
223
 
224
;структура для создания/перезаписи файла
225
createFile:
226
  .func     dd 2    ;номер подфункции
227
  .re       dd 0, 0 ;зарезервировано
228
  .size     dd 0    ;сколько байт писать
229
  .data_adr dd 0    ;указатель на данные
230
  .path     db 0
231
  .path_adr dd fileName    ;путь
232
 
233
;строка параметров по умолчанию и её размер
234
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
235
defaultDataSize = 48+19
236
 
237
 
238
copyParam:  ;копирует параметр(команду запуска) в буфер (см. дальше)
239
   push esi ebx ecx
240
   mov ecx, dword[ebx] ;читаем размер строки
7412 theonlymir 241
 
242
   cmp ecx, 0          ;пуста ли строка?
243
   jne copyParam.copy  ;если нет, то переходим к копированию содержимого строки (к  циклу)
244
 
245
   mov byte[eax], '-'  ;если же пусто, то заменяем символом минус '-'
246
   inc eax
247
   ;jmp copyParam.copyEnd ;и выходим
248
   ;далее в начале цикла произойдёт сравнение и выход
249
 
7389 theonlymir 250
.copy:  ;копируем символы
251
   cmp ecx, 0
252
   je copyParam.copyEnd
253
   mov bl, byte[esi]
254
   mov byte[eax], bl
255
   dec ecx
256
   inc eax
257
   inc esi
258
   jmp copyParam.copy
259
.copyEnd:
260
   pop ecx ebx esi
261
   ret
262
 
263
 
264
addPerenos:  ;добавляет перенос строки в буфер
265
   mov byte[eax], 13
266
   inc eax
267
   mov byte[eax], 10
268
   inc eax
269
   ret
270
 
271
;обработчик кнопки "Применить"
272
applyButton:
273
    push eax ebx ecx
274
        ;mov dword[createFile.data_adr], defaultDataForConfig
275
        ;mov dword[createFile.size], defaultDataSize
276
 
277
        ;вычислим размер файла конфигурации в байтах
278
        mov ecx, 5*2+1 ;1 байт на состояние активности и 5 пар переносов строк (символы 13, 10)
7408 theonlymir 279
        add ecx, dword[editLU.size] ;плюс размер каждой строки в байтах
280
        add ecx, dword[editLD.size]
281
        add ecx, dword[editRU.size]
7389 theonlymir 282
        add ecx, dword[editRD.size] ;dataBuffer.size4]
7412 theonlymir 283
 
284
        ;если заданы пустые строки, то мы автоматически добавляем знак минус, значит размер +1 байт
285
        cmp dword[editLU.size], 0
286
        jne @f
287
        inc ecx
288
@@:
289
        cmp dword[editLD.size], 0
290
        jne @f
291
        inc ecx
292
@@:
293
        cmp dword[editRU.size], 0
294
        jne @f
295
        inc ecx
296
@@:
297
        cmp dword[editRD.size], 0
298
        jne @f
299
        inc ecx
300
@@:
301
 
7389 theonlymir 302
        ;теперь размер файла конфигурации в ecx
303
        mov dword[createFile.size], ecx ;положим размер байт в структуру создания/перезаписи файла
304
        mcall 68, 12, ecx ;выделяем блок памяти под буфер содержимого
305
        mov dword[createFile.data_adr], eax ;сохраняем адрес буфера в структуру
306
 
307
        ;заполним буфер содержимого:
7436 theonlymir 308
        ;cmp byte[mode], 0
309
        ;jne @f
310
        ;@@:
311
        ;
7443 theonlymir 312
 
313
        push ebx    ;сохраняем выбранный режим
314
        mov bl, byte[mode]
315
        mov byte[eax], bl
316
        pop ebx
317
 
318
;;        mov byte[eax], 48;'0' ;110; 'n' ;по умолчанию флаг снят
319
;;        cmp word[ch1.flags], 110b ;ch_flag_en and ch_flag_middle ;выставлен checkBox или нет?
320
;;        jne applyButton.no
321
;;        mov byte[eax], 49;'1' ;121 ;иначе кладём 'y'
322
;;.no:
7389 theonlymir 323
        inc eax
324
        call addPerenos
325
 
326
        push esi ebx
327
        call UpdateEditsSizes ;обновить размеры текста в edit'ах
328
 
7408 theonlymir 329
        mov esi, dataBuffer.1     ;editLU.text
7389 theonlymir 330
        mov ebx, dataBuffer.size1 ;editLU.size
331
        call copyParam
332
        call addPerenos     ;добавляем перенос строки
333
 
7408 theonlymir 334
        mov esi, dataBuffer.2
335
        mov ebx, dataBuffer.size2
7389 theonlymir 336
        call copyParam
337
        call addPerenos     ;добавляем перенос строки
338
 
339
        mov esi, dataBuffer.3
340
        mov ebx, dataBuffer.size3
341
        call copyParam
342
        call addPerenos     ;добавляем перенос строки
343
 
344
        mov esi, dataBuffer.4
345
        mov ebx, dataBuffer.size4
346
        call copyParam
347
        call addPerenos     ;добавляем перенос строки
348
 
349
        pop ebx esi
350
 
351
 
352
    mov ebx, createFile
353
    mcall 70
354
        cmp eax, 0
355
        je .end
356
        ;иначе здесь нужно вывести окно с ошибкой !!!
357
.end:
358
        mcall 68, 13, dword[createFile.data_adr]  ;освобождаем память под буфер
7412 theonlymir 359
        call finishHotAnglesApp ;завершаем работу всех копий сервиса @HOTANGLES
360
        call loadConfig         ;перезагружаем файл конфига
361
        call draw_window        ;перерисовываем окно
362
        call startHotAnglesApp  ;перезапускаем @HOTANGLES
7389 theonlymir 363
        pop ecx ebx eax
364
    ret
365
 
366
 
367
 
368
 
369
 
370
 
371
compareBytes2:
372
   push edi esi ecx ebx
373
   xor eax, eax
374
   mov ecx, 10  ;max размер строк 11
375
@@:
376
   mov bl, byte[edi]
377
   cmp bl, byte[esi]
378
   jne compareBytes.no
379
   inc edi
380
   inc esi
381
   cmp ecx, 0
382
   je @f
383
   dec ecx
384
   jmp @b
385
.no:
386
   mov eax, 1
387
@@:
388
   pop ebx ecx esi edi
389
   ret
390
 
391
 
7412 theonlymir 392
finishHotAnglesApp:
7389 theonlymir 393
   ;находим все копии приложения по имени и завершаем их
394
   push eax ebx ecx esi edi
395
   ;указатели, которые никогда не меняются:
396
   mov esi, startAppData.file_name       ;первая строка - искомое имя приложения
397
   mov edi, buf            ;вторая строка - имя текущего слота
398
   add edi, 10
399
 
400
   mov ecx, 1
401
@@:
402
   mcall 9, buf, ecx              ;получаем данные очередного слота
403
   mov dword[slotMax], eax
404
 
405
   call compareBytes2 ;сравниваем имя
406
   cmp eax, 0
7412 theonlymir 407
   jne finishHotAnglesApp.next   ;если не совпало, то переходим на следующий слот
7389 theonlymir 408
 
409
   ;push eax ebx ecx
410
   mcall 18, 2, ecx               ;иначе завершаем слот
411
   ;pop ecx ebx eax
412
 
413
.next:
414
   inc  ecx
415
   cmp ecx, dword[slotMax]
416
   ja @f
417
   jmp @b
418
@@:
419
   pop edi esi ecx ebx eax
7412 theonlymir 420
   ret
7389 theonlymir 421
 
7412 theonlymir 422
startHotAnglesApp:
7389 theonlymir 423
   ;запускаем приложение заново
424
   push eax ebx
425
   mcall 70, startAppData
426
   cmp eax, 0
427
   ja @f       ;если eax>0, то успешно запущено
428
   ;!!! иначе тут печатаем ошибку
429
@@:
430
   pop ebx eax
431
   ret
432
 
433
startAppData:
434
    .subfunction dd   7
435
    .flags       dd   0
436
    .param       dd   0
437
    .rezerv      dd   0, 0
438
    .full_name   db   '/rd/1/'
439
    .file_name   db   '@HOTANGLES', 0
440
    ;db 0
441
    ;.name: dd HotAnglesAppName
442
;HotAnglesAppName db '@HOTANGLES', 0
443
 
444
 
445
UpdateEditsSizes:
446
   push eax
447
   mov eax, dword[editLU.size]
448
   mov dword[dataBuffer.size1], eax
449
 
450
   mov eax, dword[editLD.size]
451
   mov dword[dataBuffer.size2], eax
452
 
453
   mov eax, dword[editRU.size]
454
   mov dword[dataBuffer.size3], eax
455
 
456
   mov eax, dword[editRD.size]
457
   mov dword[dataBuffer.size4], eax
458
 
459
   pop eax
460
   ret
461
 
462
fileAdr dd 0
463
 
464
loadConfig:
465
   push eax ebx ecx edx
466
   mcall 68, 27, fileName   ;загружаем конфигурационный файл в ОЗУ
467
   mov dword[fileAdr], eax  ;сохраняем адрес блока памяти файла
468
   cmp eax, 0
469
   je loadConfig.default       ;если файла конфигурации нет, то ставим настройки по умолчанию
470
   ;иначе данные загружены в ОЗУ, размер в edx
471
   cmp edx, 0               ;если файл пуст, в нём нет данных, то ставим настройки по умолчанию
472
   je loadConfig.default
473
.start:
474
   add edx, eax             ;кладём в edx - адрес конца конфиг.данных
475
 
476
.chStart:
7443 theonlymir 477
 
478
   push ebx
479
   mov bl, byte[eax]
480
   cmp bl, 48          ; если значение выходит за допустимые пределы, то проверяем на 'n' (для совместимости)
481
   jb loadConfig.checkN
482
   cmp bl, 51
483
   ja loadConfig.checkN
484
 
485
   mov byte[mode], bl  ;иначе устанавливаем этот режим как есть
486
   jmp loadConfig.modeEnd   ;и идём дальше
487
.checkN:
488
   cmp bl, 'n'             ;если n - то режим "отключено"
489
   jne @f
490
   mov byte[mode], 48 ;'0'
491
   jmp loadConfig.modeEnd
7436 theonlymir 492
@@:
7443 theonlymir 493
   mov byte[mode], 49 ;'1' иначе по умолчанию включён классический режим работы
494
.modeEnd:
495
   pop ebx
496
 
497
;;   cmp byte[eax], 49;'1' ;121 ;'y'  ;выставляем checkBox - параметр активности приложения
498
;;   jne @f ;loadConfig.no
499
;;.yes:
500
;;   mov word[ch1.flags], 110b ;ch_flag_en and ch_flag_middle
501
;;   jmp loadConfig.chEnd
502
;;@@:
503
;;   cmp byte[eax], 50;'2' ;второй режим активирован
504
;;   je loadConfig.yes
505
;;.no:
506
;;   mov word[ch1.flags], 100b ;ch_flag_middle
507
;;.chEnd:
7389 theonlymir 508
   ;jmp loadConfig.end   ;команда для удобства отладки и поиска ошибок
509
 
510
   ;копируем содержимое строк в буфер
511
   push edi esi ecx ebx eax
512
   ;инициализируем указатели на адреса буфера строки и её размера
7408 theonlymir 513
   mov edi, dataBuffer.1
514
   mov esi, dataBuffer.size1
7389 theonlymir 515
   ;ecx - счётчик байт в строке
516
.block:
517
   xor ecx, ecx ;обнуляем счётчик
518
   inc eax
519
   cmp byte[eax], 10         ;если очередной код символа 10 или 13, то пропускаем символы
7408 theonlymir 520
   je loadConfig.block       ;до первого отличного от них
7389 theonlymir 521
   cmp byte[eax], 13
7408 theonlymir 522
   je loadConfig.block
7389 theonlymir 523
 
524
   ; символ отличен от переноса строки и возврата каретки - начинаем копировать отсюда в буфер
525
   mov bl, byte[eax]
526
   mov byte[edi], bl
527
   inc edi
528
   inc eax
529
   inc ecx ;увеличиваем счётчик символов в строке
530
 
531
   ;идём до конца этой строки: пока не встретим очередной 10, 13, 0 или file end
532
.while:     ;и копируем всё в буфер
533
   cmp eax, edx           ;проверяем закончился ли файл, а конца строки не было !!!
534
   ja loadConfig.ura
535
   cmp byte[eax], 10
536
   je loadConfig.ura
537
   cmp byte[eax], 0
538
   je loadConfig.ura
539
   cmp byte[eax], 13
540
   je loadConfig.ura
541
 
542
   mov bl, byte[eax]
543
   mov byte[edi], bl
544
   inc edi
545
   inc eax
546
   inc ecx
547
   cmp ecx, 511
548
   jae loadConfig.ura
549
   jmp loadConfig.while
550
.ura:
551
   mov byte[edi], 0      ;кладём завершающий 0 в строку
552
   mov dword[esi], ecx   ;сохраняем размер строки
553
   add esi, 4            ;переходим на размер следующего буфера
554
   sub edi, ecx          ;переходим на следующий буфер
555
   add edi, 512
7408 theonlymir 556
   ;xor ecx, ecx          ;обнуляем размер строки
7389 theonlymir 557
 
558
   cmp edi, dataBuffer.size1 ;если это был последний буфер (и мы вышли за адреса размеров буферов), то выходим
559
   jb loadConfig.block
560
 
561
   pop eax ebx ecx esi edi
562
 
563
   jmp loadConfig.end
564
.default:
565
   mov eax, defaultDataForConfig
566
   mov edx, defaultDataSize
567
   jmp loadConfig.start
568
.end:
569
   mov ecx, dword[fileAdr]    ;если файл был загружен, то
570
   cmp ecx, 0
571
   je @f
572
   mcall 68, 13, ecx  ;выгружаем файл из памяти
573
@@:
574
   call updateParams ;применяем настройки каждого буфера
575
   pop edx ecx ebx eax
576
   ret
577
 
578
 
579
updateParams: ;max, size, pos
580
   push eax
581
   mov eax, dword[dataBuffer.size1]
582
   mov dword[editLU.size], eax
583
   mov dword[editLU.pos], eax
584
 
585
   mov eax, dword[dataBuffer.size2]
586
   mov dword[editLD.size], eax
587
   mov dword[editLD.pos], eax
588
 
589
   mov eax, dword[dataBuffer.size3]
590
   mov dword[editRU.size], eax
591
   mov dword[editRU.pos], eax
592
 
593
   mov eax, dword[dataBuffer.size4]
594
   mov dword[editRD.size], eax
595
   mov dword[editRD.pos], eax
596
   pop eax
597
   ret
598
 
599
 
600
 
7408 theonlymir 601
selfName db 'HACONFIG', 0
602
selfNameSize = 8 ;до 11 byte
7389 theonlymir 603
;
604
compareBytes:
605
   push edi esi ecx ebx
606
   mov eax, 0 ;xor eax, eax
7408 theonlymir 607
   mov ecx, selfNameSize    ;max размер строк 11
7389 theonlymir 608
@@:
609
   mov bl, byte[edi]
610
   cmp bl, byte[esi]
611
   jne compareBytes.no
612
   inc edi
613
   inc esi
614
   cmp ecx, 0
615
   je @f
616
   dec ecx
617
   jmp @b
618
.no:
619
   mov eax, 1
620
@@:
621
   pop ebx ecx esi edi
622
   ret
623
;
624
slotMax dd 0
625
selfPID dd 0
626
buf db 1024 dup(0)
627
copyKill:
628
   push eax ebx ecx esi edi
629
 
630
   ;сперва прочтём свою информацию
631
   mcall 9, buf, -1
632
   mov eax, dword[buf+30]
633
   mov dword[selfPID], eax
634
 
635
   ;указатели, которые никогда не меняются:
636
   mov esi, selfName       ;первая строка - имя текущего приложения
637
   mov edi, buf            ;вторая строка - имя текущего слота
638
   add edi, 10
639
 
640
   mov ecx, 1
641
@@:
642
   mcall 9, buf, ecx
643
   mov dword[slotMax], eax
644
 
645
   ;если это мы сами, то пропускаем проверку
646
   mov eax, dword[buf+30]
647
   cmp eax, dword[selfPID]
648
   je copyKill.propusk
649
 
650
   call compareBytes   ;сравниваем 11 байт строк, результат в eax
651
 
652
   cmp eax, 0
653
   je copyKill.selfKill
654
 
655
.propusk:
656
   inc ecx
657
   cmp ecx, dword[slotMax]
658
   ja @f
659
   jmp @b
660
 
661
.selfKill:
662
   pop edi esi ecx ebx eax
663
   mcall -1
664
   ret
665
@@:
666
   pop edi esi ecx ebx eax
667
   ret
668
 
669
 WindowsWidth  = 450
670
 WindowsHeight = 195
671
coord:      ;координаты окна приложения
672
 .y dw 0
673
 .x dw 0
674
 
675
draw_window:
676
        ;удаляем кнопку, если есть
677
        mov edx, 0x80000002
678
        mcall 8
679
 
7436 theonlymir 680
        ;удаляем ещё 4 кнопки если они есть
681
        mov edx, 0x80000004
682
        mcall 8
683
        mov edx, 0x80000005
684
        mcall 8
685
        mov edx, 0x80000006
686
        mcall 8
687
        mov edx, 0x80000007
688
        mcall 8
689
 
7389 theonlymir 690
        mov     eax, 12                 ; function 12: tell os about windowdraw
691
        mov     ebx, 1                  ; 1, start of draw
692
        mcall
693
 
694
        ;отобразим окно по центру экрана для этого:
695
        mcall 14 ;получим размеры экрана
696
        mov dword[coord], eax       ;положим размеры экрана в координаты
697
        shr word[coord.x], 1        ;вернее положим их половину
698
        shr word[coord.y], 1
699
 
700
        ;вычисляем координаты окна, чтобы окно было по середине экрана
701
        sub word[coord.x], WindowsWidth/2
702
        sub word[coord.y], WindowsHeight/2
703
 
704
        mov     eax, 0                  ; function 0 : define and draw window
7408 theonlymir 705
        mov     ebx, 0                  ; [x start] *65536 + [x size]
7389 theonlymir 706
        mov bx, word[coord.x]
707
        shl  ebx, 16
708
        mov bx, WindowsWidth
709
 
710
        mov ecx, 0
7408 theonlymir 711
        mov     cx, word[coord.y]       ; [y start] *65536 + [y size]
7389 theonlymir 712
        shl ecx, 16
713
        mov cx, WindowsHeight
714
 
715
        mov     edx, 0x14ffffff         ; color of work area RRGGBB
716
                                        ; 0x02000000 = window type 4 (fixed size, skinned window)
717
        mov     esi, 0x808899ff         ; color of grab bar  RRGGBB
718
                                        ; 0x80000000 = color glide
719
        mov     edi, title
720
        mcall
721
 
7402 theonlymir 722
        invoke  edit_box_draw, editLU  ;рисование edit box'ов
723
        invoke  edit_box_draw, editLD
724
        invoke  edit_box_draw, editRU
725
        invoke  edit_box_draw, editRD
726
 
7443 theonlymir 727
        ;invoke  check_box_draw, ch1    ;рисование чекбоксов
7389 theonlymir 728
 
729
        ;рисуем кнопку
730
        mov ebx, (WindowsWidth-80-Otstup)*65536 + 80 ;координата X, ширина кнопки
731
        mov ecx, 160*65536 + 20   ;координата Y, высота кнопки
732
        mov edx, 0x00000002 ;2    ;номер кнопки
733
        mov esi, 0x00AABBCC       ;цвет кнопки
734
        mcall 8
735
        ;рисуем текст кнопки
7395 theonlymir 736
        mov     ebx, (WindowsWidth-80-Otstup+25-buttonTextXoffset) * 65536 + 166    ;координаты текста (x, y)
7389 theonlymir 737
        mov     ecx, 0xFFFFFF     ;белый цвет текста
738
        mov     edx, buttonText
7395 theonlymir 739
        mov     esi, buttonTextSize ;5            ;размер текста в символах
740
        mcall 4
7389 theonlymir 741
 
7436 theonlymir 742
        ;рисуем ещё 4 кнопки для диалогового окна выбора файла
743
        ;номера 4,5,6 и 7
744
        buttonH = 14 ;20
745
        buttonW = 30
746
        ;левый верхний угол
747
        mov ebx, Otstup*65536 + buttonW ;координата X, ширина кнопки
748
        mov ecx, 85*65536 + buttonH   ;координата Y, высота кнопки
749
        mov edx, 0x00000004       ;номер кнопки
750
        mov esi, 0x00AABBCC       ;цвет кнопки
751
        mcall 8
752
        ;левый нижний угол
753
        mov ebx, Otstup*65536 + buttonW ;координата X, ширина кнопки
754
        mov ecx, 120*65536 + buttonH   ;координата Y, высота кнопки
755
        mov edx, 0x00000005       ;номер кнопки
756
        mov esi, 0x00AABBCC       ;цвет кнопки
757
        mcall 8
758
        ;правый верхний угол
759
        mov ebx, (WindowsWidth-Otstup-buttonW)*65536 + buttonW ;координата X, ширина кнопки
760
        mov ecx, 85*65536 + buttonH   ;координата Y, высота кнопки
761
        mov edx, 0x00000006       ;номер кнопки
762
        mov esi, 0x00AABBCC       ;цвет кнопки
763
        mcall 8
764
        ;правый нижний угол
765
        mov ebx, (WindowsWidth-Otstup-buttonW)*65536 + buttonW ;координата X, ширина кнопки
766
        mov ecx, 120*65536 + buttonH   ;координата Y, высота кнопки
767
        mov edx, 0x00000007       ;номер кнопки
768
        mov esi, 0x00AABBCC       ;цвет кнопки
769
        mcall 8
770
 
771
        ;рисуем тексты для этих 4 кнопок
772
        mov     ecx, 0xFFFFFF              ;белый цвет текста
773
        mov     edx, commonButtonText      ;строка текста
774
        mov     esi, commonButtonTextSize  ;размер текста в символах
775
        ;координаты текста (x, y)
776
        deltaCommonTextX = 7
777
        deltaCommonTextY = 2
778
        mov     ebx, (Otstup+deltaCommonTextX) * 65536 + (85 + deltaCommonTextY)
779
        mcall 4
780
        mov     ebx, (Otstup+deltaCommonTextX) * 65536 + (120 + deltaCommonTextY)
781
        mcall 4
782
        mov     ebx, (WindowsWidth-Otstup-buttonW+deltaCommonTextX) * 65536 + (85 + deltaCommonTextY)
783
        mcall 4
784
        mov     ebx, (WindowsWidth-Otstup-buttonW+deltaCommonTextX) * 65536 + (120 + deltaCommonTextY)
785
        mcall 4
786
 
787
 
7443 theonlymir 788
        ;delete mode button, if it exist
789
        mov edx, 0x80000008
790
        mcall 8
791
        ;draw button Mode
792
        buttonModeX = 30 ;433
793
        buttonModeY = 160 ;50
794
        buttonModeWidth = 221
795
        buttonModeHeight = 20
796
        buttonModeTextXoffset = 5
797
        mov ebx, buttonModeX*65536 + buttonModeWidth  ;X + Width
798
        mov ecx, buttonModeY*65536 + buttonModeHeight   ;Y + Height
799
        mov edx, 0x00000008       ;button id
800
        mov esi, 0x00AABBCC       ;color button
801
        mcall 8
802
        ;draw text for button Mode
803
        mov     ebx, (buttonModeX+buttonModeTextXoffset) * 65536 + (buttonModeY+6)    ;(x, y)
804
        mov     ecx, 0xFFFFFF
805
        call setTextModeMenu
806
        mov     esi, valueModeMenuSize
807
        mcall 4
808
 
809
 
7389 theonlymir 810
        call draw_super_text
811
 
7408 theonlymir 812
        LineLength = 62
7389 theonlymir 813
        mov     ebx, 40 * 65536 + 36    ; draw info text with function 4 (x, y)
814
        mov     ecx, 0x224466
815
        mov     edx, text
816
        mov     esi, LineLength
817
        mov     eax, 4
818
 
819
  .newline:                             ; text from the DATA AREA
820
        mcall
821
        add     ebx, 12
822
        add     edx, LineLength
823
        cmp     byte[edx], 0
824
        jne     .newline
825
 
826
        mov     eax, 12                 ; function 12:tell os about windowdraw
827
        mov     ebx, 2                  ; 2, end of draw
828
        mcall
829
 
830
        ret
831
 
832
 
7443 theonlymir 833
setTextModeMenu:
834
   cmp byte[mode], 48
835
   jne @f
836
        mov edx, valueModeMenu0
837
        ret
838
@@:
839
   cmp byte[mode], 49
840
   jne @f
841
        mov edx, valueModeMenu1
842
        ret
843
@@:
844
   cmp byte[mode], 50
845
   jne @f
846
        mov edx, valueModeMenu2
847
        ret
848
@@:
849
   cmp byte[mode], 51
850
   jne @f
851
        mov edx, valueModeMenu3
852
        ret
853
@@:
854
   mov edx, valueModeMenu1
855
   ret
7389 theonlymir 856
 
7395 theonlymir 857
 
7402 theonlymir 858
align 16
859
@IMPORT:
860
 
861
library box_lib, 'box_lib.obj'
862
 
863
import  box_lib,\
864
        edit_box_draw,          'edit_box',\
865
        edit_box_key,           'edit_box_key',\
866
        edit_box_mouse,         'edit_box_mouse',\
867
        init_checkbox,          'init_checkbox2',\
868
        check_box_draw,         'check_box_draw2',\
869
        check_box_mouse,        'check_box_mouse2',\
870
        option_box_draw,        'option_box_draw',\
871
        option_box_mouse,       'option_box_mouse'
872
 
873
 
7408 theonlymir 874
;DATA данные check_box использует системные цвета
7402 theonlymir 875
 
876
;координаты (x,y) = (30, 160) размер чекбокса 12, цвет текста 0x224466
7443 theonlymir 877
;ch1     check_box2 30 shl 16 + 12, 160 shl 16 + 12, 6, 0xFFFFFFFF, 0xAABBCC, 0x224466, ch_text, 110b ; ch_flag_en and ch_flag_middle
7395 theonlymir 878
 
7436 theonlymir 879
commonButtonText db '...', 0  ;текст для кнопок вызова OpenDial
880
commonButtonTextSize = 3
7402 theonlymir 881
 
7395 theonlymir 882
if lang eq ru  ;если язык сборки русский
883
 
884
text    db  "Љ®­дЁЈга в®а Hot Angles ®вўҐз Ґв §  ­ бва®©Єг  ЄвЁў­ле гЈ«®ў. "
885
        db  "Ќ бвன⥠Ї а ¬Ґвал Ї®¤ бҐЎп Ё«Ё ®вЄ«озЁвҐ нвг ®ЇжЁо.         "
886
        db  "                                                              ", 0
887
 hed:
888
title   db  "Љ®­дЁЈга в®а гвЁ«Ёвл Hot Angles", 0
889
buttonText db "ЏаЁ¬Ґ­Ёвм", 0
890
buttonTextSize = 9
891
buttonTextXoffset = 12
892
 
7402 theonlymir 893
ch_text db '‚Є«озЁвм/ ЄвЁўЁа®ў вм "Hot Angles"', 0
7395 theonlymir 894
 
895
superText:
896
  .lu db 'Љ®¬ ­¤  «Ґў®Ј® ўҐае­ҐЈ® гЈ« : ', 0
897
  .ld db 'Љ®¬ ­¤  «Ґў®Ј® ­Ё¦­ҐЈ® гЈ« :  ', 0
898
  .ru db 'Љ®¬ ­¤  Їа ў®Ј® ўҐае­ҐЈ® гЈ« :', 0
899
  .rd db 'Љ®¬ ­¤  Їа ў®Ј® ­Ё¦­ҐЈ® гЈ« : ', 0
900
superTextSize = 30
901
 
7443 theonlymir 902
valueModeMenuSize = 32
903
ModeMenu  db 'ђҐ¦Ё¬ а Ў®вл:',0
904
valueModeMenu0  db '®вЄ«о祭®                       ',0
905
valueModeMenu1  db 'Є« ббЁзҐбЄЁ© ०Ё¬              ',0
906
valueModeMenu2  db '०Ё¬ Ј®ап祩 Є« ўЁиЁ           ',0
907
valueModeMenu3  db '०Ё¬ ¦Ґбв  Ї® Є« ўЁиҐ  ЄвЁў жЁЁ',0
908
 
7395 theonlymir 909
else  ;иначе английский текст
910
 
911
text    db  "This is a Hot Angles Configurator.                            "
912
        db  "Set the parameters bellow for yourself or disable this option."
913
        db  "                                                              ", 0
914
 hed:
915
title   db  "Hot Angles Configurator", 0
916
buttonText db "Apply", 0
917
buttonTextSize = 5
918
buttonTextXoffset = 0
919
 
7402 theonlymir 920
ch_text db 'Activate "Hot Angles"',0       ;сопровождающий текст для чек бокса
7389 theonlymir 921
 
922
superText:
7395 theonlymir 923
  .lu db 'Left up angle command:   ', 0
924
  .ld db 'Left down angle command: ', 0
925
  .ru db 'Right up angle command:  ', 0
7389 theonlymir 926
  .rd db 'Right down angle command:', 0
7395 theonlymir 927
superTextSize = 25
7389 theonlymir 928
 
7443 theonlymir 929
valueModeMenuSize = 32
930
ModeMenu  db 'Mode:',0
931
valueModeMenu0  db 'disabled                        ',0
932
valueModeMenu1  db 'classic mode                    ',0
933
valueModeMenu2  db 'hot key mode                    ',0
934
valueModeMenu3  db 'activation key gesture mode     ',0
935
 
7395 theonlymir 936
end if
937
 
938
 
7389 theonlymir 939
draw_super_text:
940
   push eax ebx ecx edx edi esi
941
   mov     ebx, Otstup * 65536 + 74    ; draw info text with function 4 (x, y)
942
   mov     ecx, 0x224466
943
   mov eax, superText.lu
944
   mov     edx, eax
7408 theonlymir 945
   mov     esi, superTextSize
7389 theonlymir 946
   mcall 4
947
 
948
   mov     ebx, Otstup * 65536 + 109
949
   mov     edx, superText.ld
7408 theonlymir 950
   mov     esi, superTextSize
7389 theonlymir 951
   mcall 4
952
 
953
   mov     ebx, 240 * 65536 + 74
954
   mov     edx, superText.ru
7408 theonlymir 955
   mov     esi, superTextSize
7389 theonlymir 956
   mcall 4
957
 
958
   mov     ebx, 240 * 65536 + 109
959
   mov     edx, superText.rd
7408 theonlymir 960
   mov     esi, superTextSize
7389 theonlymir 961
   mcall 4
962
 
7443 theonlymir 963
   mov     ebx, Otstup * 65536 + (buttonModeY-11)
964
   or ecx, 0x80000000
965
   mov     edx, ModeMenu
966
   mov     esi, 3
967
   mcall 4
968
 
7389 theonlymir 969
   pop esi edi edx ecx ebx eax
970
   ret
971
 
7436 theonlymir 972
;![
973
editID db 0
974
initEBX:
975
   cmp byte[editID], 4
976
   jne @f
977
   mov ebx, dataBuffer.1
978
   ret
979
@@:
980
   cmp byte[editID], 5
981
   jne @f
982
   mov ebx, dataBuffer.2
983
   ret
984
@@:
985
   cmp byte[editID], 6
986
   jne @f
987
   mov ebx, dataBuffer.3
988
   ret
989
@@:
990
   cmp byte[editID], 7
991
   jne @f
992
   mov ebx, dataBuffer.4
993
   ret
994
@@:
995
   ret
996
setRESULT:
997
   cmp byte[editID], 4
998
   jne @f
999
   mov dword[dataBuffer.size1], ecx
1000
   mov dword[editLU.size], ecx
1001
   mov dword[editLU.pos], ecx
1002
   ret
1003
@@:
1004
   cmp byte[editID], 5
1005
   jne @f
1006
   mov dword[dataBuffer.size2], ecx
1007
   mov dword[editLD.size], ecx
1008
   mov dword[editLD.pos], ecx
1009
   ret
1010
@@:
1011
   cmp byte[editID], 6
1012
   jne @f
1013
   mov dword[dataBuffer.size3], ecx
1014
   mov dword[editRU.size], ecx
1015
   mov dword[editRU.pos], ecx
1016
   ret
1017
@@:
1018
   cmp byte[editID], 7
1019
   jne @f
1020
   mov dword[dataBuffer.size4], ecx
1021
   mov dword[editRD.size], ecx
1022
   mov dword[editRD.pos], ecx
1023
   ret
1024
@@:
1025
   ret
1026
copyPath:
1027
   push eax ebx ecx edx ;copy file name path
1028
        mov eax, openfile_path ;dword[OpenDialog_data.openfile_path]
1029
        call initEBX ;mov ebx, dataBuffer.1 ;.data
1030
        mov ecx, 0
1031
      @@:
1032
        mov dl, byte[eax]
1033
        cmp dl, 0 ;byte[eax], 0
1034
        je @f
1035
        mov byte[ebx], dl
1036
        inc eax
1037
        inc ebx
1038
        inc ecx
1039
        jmp @b
1040
      @@:
1041
        mov byte[ebx], 0
1042
        call setRESULT
1043
   pop edx ecx ebx eax
1044
   ret
7389 theonlymir 1045
 
7436 theonlymir 1046
 
1047
align 4
1048
but_open_dlg:
1049
        pushad
1050
        copy_path open_dialog_name,communication_area_default_path,file_name,0
1051
        mov [OpenDialog_data.type],0
1052
        stdcall[OpenDialog_Start], OpenDialog_data
1053
        cmp [OpenDialog_data.status],2
1054
        je @f
1055
        cmp [OpenDialog_data.status],0 ;пользователь нажал Cancel?
1056
        je .end_open
1057
                ;код при удачном открытии диалога
1058
                call copyPath
1059
                jmp .end_open
1060
        @@:
1061
                ;код при не удачном открытии диалога
1062
                ;...
1063
        .end_open:
1064
        popad
1065
        ret
1066
 
1067
;дынные для диалога открытия файлов
1068
align 4
1069
OpenDialog_data:
1070
.type                   dd 0 ;0 - открыть, 1 - сохранить, 2 - выбрать директорию
1071
.procinfo               dd procinfo
1072
.com_area_name          dd communication_area_name ;+8
7443 theonlymir 1073
.com_area               dd 0           ;+12
7436 theonlymir 1074
.opendir_path           dd plugin_path ;+16
1075
.dir_default_path       dd default_dir ;+20
7443 theonlymir 1076
.start_path             dd file_name   ;+24 путь к диалогу открытия файлов
7436 theonlymir 1077
.draw_window            dd draw_window ;+28
7443 theonlymir 1078
.status                 dd 0           ;+32
7436 theonlymir 1079
.openfile_path          dd openfile_path ;+36 путь к открываемому файлу
1080
.filename_area          dd filename_area ;+40
1081
.filter_area            dd Filter
1082
.x:
1083
.x_size                 dw 420 ;+48 ; Window X size
7443 theonlymir 1084
.x_start                dw 10  ;+50 ; Window X position
7436 theonlymir 1085
.y:
1086
.y_size                 dw 320 ;+52 ; Window y size
7443 theonlymir 1087
.y_start                dw 10  ;+54 ; Window Y position
7436 theonlymir 1088
 
1089
default_dir db '/rd/1',0 ;директория по умолчанию
1090
communication_area_name: db 'FFFFFFFF_open_dialog',0
1091
open_dialog_name:  db 'opendial',0
1092
communication_area_default_path: db '/rd/1/File managers/',0
1093
 
1094
Filter:
1095
dd Filter.end - Filter.1
1096
.1:
1097
;db 'KEX',0
1098
.end:
1099
db 0
7443 theonlymir 1100
 
1101
mode db 49 ;'1'
1102
modeMenu dd 0
1103
coordModeMenu:
1104
  .x dw 100
1105
  .y dw 200
1106
 
1107
 
7436 theonlymir 1108
align 4
1109
proclib_import: ;описание экспортируемых функций
1110
        OpenDialog_Init dd aOpenDialog_Init
1111
        OpenDialog_Start dd aOpenDialog_Start
1112
dd 0,0
1113
        aOpenDialog_Init db 'OpenDialog_init',0
1114
        aOpenDialog_Start db 'OpenDialog_start',0
1115
 
1116
head_f_i:
1117
        head_f_l  db 'Системная ошибка',0
1118
        err_message_found_lib0 db 'Не найдена библиотека ',39,'proc_lib.obj',39,0
1119
        err_message_import0 db 'Ошибка при импорте библиотеки ',39,'proc_lib.obj',39,0
7443 theonlymir 1120
        err_message_found_lib1 db 'Не найдена библиотека ',39,'kmenu.obj',39,0    ;'ЌҐ ­ ©¤Ґ­  ЎЁЎ«Ё®вҐЄ  '
1121
        err_message_import1 db 'Ошибка при импорте библиотеки ',39,'kmenu',39,0   ;'ЋиЁЎЄ  ЇаЁ Ё¬Ї®а⥠ЎЁЎ«Ё®вҐЄЁ '
7436 theonlymir 1122
 
1123
system_dir0 db '/sys/lib/'
1124
lib0_name db 'proc_lib.obj',0
7443 theonlymir 1125
lib1_name db 'kmenu.obj',0
1126
 
7436 theonlymir 1127
;library structures
1128
l_libs_start:
7443 theonlymir 1129
    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
1130
    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 1131
load_lib_end:
1132
;!]
1133
 
7402 theonlymir 1134
edMaxSize = 510 ;теперь с новым компонентом можно и 511 указать
7389 theonlymir 1135
edMax = 0 ;max, size, pos
1136
 
7402 theonlymir 1137
align 4
7436 theonlymir 1138
editLU   edit_box 180-buttonW,Otstup+buttonW,85, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.1, mouse_dd, 0, edMax, edMax  ;ed_focus
1139
editLD   edit_box 180-buttonW,Otstup+buttonW,120, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.2, mouse_dd, 0, edMax, edMax
1140
editRU   edit_box 180-buttonW,240,85, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.3, mouse_dd, 0, edMax, edMax
1141
editRD   edit_box 180-buttonW,240,120, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.4, mouse_dd, 0, edMax, edMax
7389 theonlymir 1142
 
7443 theonlymir 1143
align 4
1144
import_libkmenu:
1145
        kmenu_init      dd akmenu_init
1146
        kmainmenu_draw  dd akmainmenu_draw
1147
        kmainmenu_dispatch_cursorevent dd akmainmenu_dispatch_cursorevent
1148
        ksubmenu_new    dd aksubmenu_new
1149
        ksubmenu_delete dd aksubmenu_delete
1150
        ksubmenu_draw   dd aksubmenu_draw
1151
        ksubmenu_add    dd aksubmenu_add
1152
        kmenuitem_new   dd akmenuitem_new
1153
        kmenuitem_delete dd akmenuitem_delete
1154
        kmenuitem_draw  dd akmenuitem_draw
1155
dd 0,0
1156
        akmenu_init     db 'kmenu_init',0
1157
        akmainmenu_draw db 'kmainmenu_draw',0
1158
        akmainmenu_dispatch_cursorevent db 'kmainmenu_dispatch_cursorevent',0
1159
        aksubmenu_new   db 'ksubmenu_new',0
1160
        aksubmenu_delete db 'ksubmenu_delete',0
1161
        aksubmenu_draw  db 'ksubmenu_draw',0
1162
        aksubmenu_add   db 'ksubmenu_add',0
1163
        akmenuitem_new  db 'kmenuitem_new',0
1164
        akmenuitem_delete db 'kmenuitem_delete',0
1165
        akmenuitem_draw  db 'kmenuitem_draw',0
1166
 
7436 theonlymir 1167
mouse_dd  dd ?
1168
sc  system_colors
1169
 
7443 theonlymir 1170
button_press  rd 0     ;for kmenu
1171
 
1172
sys_path:      rb 4096
1173
file_name:     rb 4096
1174
plugin_path:   rb 4096
1175
openfile_path: rb 4096
1176
filename_area: rb 256
1177
rb 1024
1178
procinfo process_information
1179
pi rb 1024
1180
 
1181
 
7389 theonlymir 1182
dataBuffer:
1183
.1: rb 512
1184
.2: rb 512
1185
.3: rb 512
1186
.4: rb 512
1187
.size1: rd 1
1188
.size2: rd 1
1189
.size3: rd 1
1190
.size4: rd 1
1191
;255+255+2
1192
;два запасных байта необходимы для того что бы не пепереписать следующией байты, в конце буфера 0
1193
dataBufferEnd:
1194
 
1195
 
1196
I_END:
1197
        rb 4096
1198
align 16
1199
STACKTOP:
1200
 
1201
MEM: