Subversion Repositories Kolibri OS

Rev

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