Subversion Repositories Kolibri OS

Rev

Rev 7396 | Rev 7402 | 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
7395 theonlymir 5
; Version 0.2: Sep 19, 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
 
28
;P.S. Код сырой, требуется оптимизация и доработка (см. тему форума)
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'
45
include 'editbox.inc'
46
use_edit_box
47
include 'check.inc'      ;включить файл check.inc
48
version_ch1              ;необходимый макрос для включения new версии check_box1
49
use_check_box            ;используя макросы, внести процедуры для рисования чек бокса
50
 
51
Otstup = 30
52
 
53
START:
54
    call copyKill        ;простейшая защита от запуска второй копии приложения
55
    mcall  68, 11        ;инициализация кучи
56
 
57
    mov  eax,48          ;получить системные цвета
58
    mov  ebx,3
59
    mov  ecx, sc
60
    mov  edx, sizeof.system_colors
61
    mcall
62
 
63
    mov  eax,40          ;установить маску для ожидаемых событий
64
    mov  ebx,0x27        ;система будет реагировать только на сообщение о перерисовке, нажата кнопка, определённая ранее, событие от мыши (что-то случилось - нажатие на кнопку мыши или перемещение; сбрасывается при прочтении)
65
    mcall
66
 
67
    call  loadConfig     ;загружаем конфигурацию из файла, если нет - то выставляем параметры по умолчанию
68
    call  draw_window    ;отрисовать окно приложения
69
 
70
; Обработка цикла событий
71
event_wait:
72
    mov     eax, 10      ; function 10 : wait until event
73
    mcall                ; event type is returned in eax
74
 
75
    cmp     eax, 1       ; Event redraw request ?
76
    je      red          ; Expl.: there has been activity on screen and
77
                         ; parts of the applications has to be redrawn.
78
 
79
    cmp     eax, 2       ; Event key in buffer ?
80
    je      key          ; Expl.: User has pressed a key while the
81
                         ; app is at the top of the window stack.
82
 
83
    cmp     eax, 3       ; Event button in buffer ?
84
    je      button       ; Expl.: User has pressed one of the
85
                         ; applications buttons.
86
 
87
    mouse_edit_boxes editboxes,editboxes_end
88
    mouse_check_boxes check_boxes,check_boxes_end  ;проверка чек бокса
89
    jmp     event_wait
90
 
91
 
92
red:                     ;обработка события перерисовки окна
93
   call    draw_window
94
   jmp     event_wait
95
 
96
key:                                    ; Keypress event handler
97
        mov     eax, 2                  ; The key is returned in ah. The key must be
98
        mcall                           ; read and cleared from the system queue.
99
        key_edit_boxes editboxes,editboxes_end
100
        jmp     event_wait              ; Just read the key, ignore it and jump to event_wait.
101
 
102
button:                                 ; Buttonpress event handler
103
    mov     eax,17                  ; The button number defined in window_draw
104
    mcall                           ; is returned to ah.
105
 
106
    cmp     ah,1                    ; button id=1 ?
107
    jne     noclose
108
    mov     eax,-1                  ; Function -1 : close this program
109
    mcall
110
noclose:
111
    cmp  ah, 2         ;кнопка "Применить"
112
    jne  butend
113
    call applyButton   ;вызов нашего обработчика нажатия кнопки
114
butend:
115
    jmp  event_wait    ;this is for ignored events, useful at development
116
 
117
 
118
 
119
;имя конфигурационного файла
120
fileName: db 'SETTINGS/HOTANGLES.CFG', 0
121
 
122
;структура для создания/перезаписи файла
123
createFile:
124
  .func     dd 2    ;номер подфункции
125
  .re       dd 0, 0 ;зарезервировано
126
  .size     dd 0    ;сколько байт писать
127
  .data_adr dd 0    ;указатель на данные
128
  .path     db 0
129
  .path_adr dd fileName    ;путь
130
 
131
;строка параметров по умолчанию и её размер
132
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
133
defaultDataSize = 48+19
134
 
135
 
136
copyParam:  ;копирует параметр(команду запуска) в буфер (см. дальше)
137
   push esi ebx ecx
138
   mov ecx, dword[ebx] ;читаем размер строки
139
.copy:  ;копируем символы
140
   cmp ecx, 0
141
   je copyParam.copyEnd
142
   mov bl, byte[esi]
143
   mov byte[eax], bl
144
   dec ecx
145
   inc eax
146
   inc esi
147
   jmp copyParam.copy
148
.copyEnd:
149
   pop ecx ebx esi
150
   ret
151
 
152
 
153
addPerenos:  ;добавляет перенос строки в буфер
154
   mov byte[eax], 13
155
   inc eax
156
   mov byte[eax], 10
157
   inc eax
158
   ret
159
 
160
;обработчик кнопки "Применить"
161
applyButton:
162
    push eax ebx ecx
163
        ;mov dword[createFile.data_adr], defaultDataForConfig
164
        ;mov dword[createFile.size], defaultDataSize
165
 
166
        ;вычислим размер файла конфигурации в байтах
167
        mov ecx, 5*2+1 ;1 байт на состояние активности и 5 пар переносов строк (символы 13, 10)
168
        add ecx, dword[editLU.size] ;dataBuffer.size1]      ;плюс размер каждой строки в байтах
169
        add ecx, dword[editLD.size] ;dataBuffer.size2]
170
        add ecx, dword[editRU.size] ;dataBuffer.size3]
171
        add ecx, dword[editRD.size] ;dataBuffer.size4]
172
        ;теперь размер файла конфигурации в ecx
173
        mov dword[createFile.size], ecx ;положим размер байт в структуру создания/перезаписи файла
174
        mcall 68, 12, ecx ;выделяем блок памяти под буфер содержимого
175
        mov dword[createFile.data_adr], eax ;сохраняем адрес буфера в структуру
176
 
177
        ;заполним буфер содержимого:
178
        mov byte[eax], 110; 'n' ;по умолчанию флаг снят
179
        cmp word[ch1.flags], ch_flag_en   ;выставлен checkBox или нет?
180
        jne applyButton.no
181
        mov byte[eax], 121 ;иначе кладём 'y'
182
.no:
183
        inc eax
184
        call addPerenos
185
 
186
        push esi ebx
187
        call UpdateEditsSizes ;обновить размеры текста в edit'ах
188
 
189
        mov esi, dataBuffer.1 ;editLU.text
190
        mov ebx, dataBuffer.size1 ;editLU.size
191
        call copyParam
192
        call addPerenos     ;добавляем перенос строки
193
 
194
        mov esi, dataBuffer.2 ;editLD.text
195
        mov ebx, dataBuffer.size2 ;editLD.size
196
        call copyParam
197
        call addPerenos     ;добавляем перенос строки
198
 
199
        mov esi, dataBuffer.3
200
        mov ebx, dataBuffer.size3
201
        call copyParam
202
        call addPerenos     ;добавляем перенос строки
203
 
204
        mov esi, dataBuffer.4
205
        mov ebx, dataBuffer.size4
206
        call copyParam
207
        call addPerenos     ;добавляем перенос строки
208
 
209
        pop ebx esi
210
 
211
 
212
    mov ebx, createFile
213
    mcall 70
214
        cmp eax, 0
215
        je .end
216
        ;иначе здесь нужно вывести окно с ошибкой !!!
217
.end:
218
        mcall 68, 13, dword[createFile.data_adr]  ;освобождаем память под буфер
219
        call restartHotAnglesApp ;перезапускаем @HOTANGLES
220
        pop ecx ebx eax
221
    ret
222
 
223
 
224
 
225
 
226
 
227
 
228
compareBytes2:
229
   push edi esi ecx ebx
230
   xor eax, eax
231
   mov ecx, 10  ;max размер строк 11
232
@@:
233
   mov bl, byte[edi]
234
   cmp bl, byte[esi]
235
   jne compareBytes.no
236
   inc edi
237
   inc esi
238
   cmp ecx, 0
239
   je @f
240
   dec ecx
241
   jmp @b
242
.no:
243
   mov eax, 1
244
@@:
245
   pop ebx ecx esi edi
246
   ret
247
 
248
 
249
restartHotAnglesApp:   ;!!!
250
   ;находим все копии приложения по имени и завершаем их
251
   push eax ebx ecx esi edi
252
   ;указатели, которые никогда не меняются:
253
   mov esi, startAppData.file_name       ;первая строка - искомое имя приложения
254
   mov edi, buf            ;вторая строка - имя текущего слота
255
   add edi, 10
256
 
257
   mov ecx, 1
258
@@:
259
   mcall 9, buf, ecx              ;получаем данные очередного слота
260
   mov dword[slotMax], eax
261
 
262
   call compareBytes2 ;сравниваем имя
263
   cmp eax, 0
264
   jne restartHotAnglesApp.next   ;если не совпало, то переходим на следующий слот
265
 
266
   ;push eax ebx ecx
267
   mcall 18, 2, ecx               ;иначе завершаем слот
268
   ;pop ecx ebx eax
269
 
270
.next:
271
   inc  ecx
272
   cmp ecx, dword[slotMax]
273
   ja @f
274
   jmp @b
275
@@:
276
   pop edi esi ecx ebx eax
277
 
278
   ;запускаем приложение заново
279
   push eax ebx
280
   mcall 70, startAppData
281
   cmp eax, 0
282
   ja @f       ;если eax>0, то успешно запущено
283
   ;!!! иначе тут печатаем ошибку
284
@@:
285
   pop ebx eax
286
   ret
287
 
288
startAppData:
289
    .subfunction dd   7
290
    .flags       dd   0
291
    .param       dd   0
292
    .rezerv      dd   0, 0
293
    .full_name   db   '/rd/1/'
294
    .file_name   db   '@HOTANGLES', 0
295
    ;db 0
296
    ;.name: dd HotAnglesAppName
297
;HotAnglesAppName db '@HOTANGLES', 0
298
 
299
 
300
UpdateEditsSizes:
301
   push eax
302
   mov eax, dword[editLU.size]
303
   mov dword[dataBuffer.size1], eax
304
 
305
   mov eax, dword[editLD.size]
306
   mov dword[dataBuffer.size2], eax
307
 
308
   mov eax, dword[editRU.size]
309
   mov dword[dataBuffer.size3], eax
310
 
311
   mov eax, dword[editRD.size]
312
   mov dword[dataBuffer.size4], eax
313
 
314
   pop eax
315
   ret
316
 
317
fileAdr dd 0
318
 
319
loadConfig:
320
   push eax ebx ecx edx
321
   mcall 68, 27, fileName   ;загружаем конфигурационный файл в ОЗУ
322
   mov dword[fileAdr], eax  ;сохраняем адрес блока памяти файла
323
   cmp eax, 0
324
   je loadConfig.default       ;если файла конфигурации нет, то ставим настройки по умолчанию
325
   ;иначе данные загружены в ОЗУ, размер в edx
326
   cmp edx, 0               ;если файл пуст, в нём нет данных, то ставим настройки по умолчанию
327
   je loadConfig.default
328
.start:
329
   add edx, eax             ;кладём в edx - адрес конца конфиг.данных
330
 
331
.chStart:
332
   cmp byte[eax], 121 ;'y'  ;выставляем checkBox - параметр активности приложения
333
   jne loadConfig.no
334
.yes:
335
   mov word[ch1.flags], ch_flag_en
336
   jmp loadConfig.chEnd
337
.no:
338
   mov word[ch1.flags], 0
339
.chEnd:
340
   ;jmp loadConfig.end   ;команда для удобства отладки и поиска ошибок
341
 
342
   ;копируем содержимое строк в буфер
343
   push edi esi ecx ebx eax
344
   ;инициализируем указатели на адреса буфера строки и её размера
345
   mov edi, dataBuffer.1     ;dword[dataBuffer.1]
346
   mov esi, dataBuffer.size1 ;dword[dataBuffer.size1]
347
   ;ecx - счётчик байт в строке
348
;   mov ecx, 0 ;xor ecx, ecx
349
.block:
350
   xor ecx, ecx ;обнуляем счётчик
351
   inc eax
352
   cmp byte[eax], 10         ;если очередной код символа 10 или 13, то пропускаем символы
353
   je loadConfig.block ;propusk     ;до первого отличного от них
354
   cmp byte[eax], 13
355
   je loadConfig.block ;propusk
356
 
357
   ; символ отличен от переноса строки и возврата каретки - начинаем копировать отсюда в буфер
358
   mov bl, byte[eax]
359
   mov byte[edi], bl
360
   inc edi
361
   inc eax
362
   inc ecx ;увеличиваем счётчик символов в строке
363
 
364
   ;идём до конца этой строки: пока не встретим очередной 10, 13, 0 или file end
365
.while:     ;и копируем всё в буфер
366
   cmp eax, edx           ;проверяем закончился ли файл, а конца строки не было !!!
367
   ja loadConfig.ura
368
   cmp byte[eax], 10
369
   je loadConfig.ura
370
   cmp byte[eax], 0
371
   je loadConfig.ura
372
   cmp byte[eax], 13
373
   je loadConfig.ura
374
 
375
   mov bl, byte[eax]
376
   mov byte[edi], bl
377
   inc edi
378
   inc eax
379
   inc ecx
380
   cmp ecx, 511
381
   jae loadConfig.ura
382
   jmp loadConfig.while
383
.ura:
384
   mov byte[edi], 0      ;кладём завершающий 0 в строку
385
   mov dword[esi], ecx   ;сохраняем размер строки
386
   add esi, 4            ;переходим на размер следующего буфера
387
   sub edi, ecx          ;переходим на следующий буфер
388
   add edi, 512
389
;   mov ecx, 0 ;xor ecx, ecx ;обнуляем размер строки
390
 
391
   cmp edi, dataBuffer.size1 ;если это был последний буфер (и мы вышли за адреса размеров буферов), то выходим
392
   jb loadConfig.block
393
 
394
   pop eax ebx ecx esi edi
395
 
396
   jmp loadConfig.end
397
.default:
398
   mov eax, defaultDataForConfig
399
   mov edx, defaultDataSize
400
   jmp loadConfig.start
401
.end:
402
   mov ecx, dword[fileAdr]    ;если файл был загружен, то
403
   cmp ecx, 0
404
   je @f
405
   mcall 68, 13, ecx  ;выгружаем файл из памяти
406
@@:
407
   call updateParams ;применяем настройки каждого буфера
408
   pop edx ecx ebx eax
409
   ret
410
 
411
 
412
updateParams: ;max, size, pos
413
   push eax
414
   mov eax, dword[dataBuffer.size1]
415
   mov dword[editLU.size], eax
416
   mov dword[editLU.pos], eax
417
 
418
   mov eax, dword[dataBuffer.size2]
419
   mov dword[editLD.size], eax
420
   mov dword[editLD.pos], eax
421
 
422
   mov eax, dword[dataBuffer.size3]
423
   mov dword[editRU.size], eax
424
   mov dword[editRU.pos], eax
425
 
426
   mov eax, dword[dataBuffer.size4]
427
   mov dword[editRD.size], eax
428
   mov dword[editRD.pos], eax
429
   pop eax
430
   ret
431
 
432
 
433
 
434
selfName db 'HACONFIG', 0 ;'@HOTANGLES',0
435
selfNameSize = 8;9 ;до 11 byte
436
;
437
compareBytes:
438
   push edi esi ecx ebx
439
   mov eax, 0 ;xor eax, eax
440
   mov ecx, selfNameSize ;11    ;max размер строк 11
441
@@:
442
   mov bl, byte[edi]
443
   cmp bl, byte[esi]
444
   jne compareBytes.no
445
   inc edi
446
   inc esi
447
   cmp ecx, 0
448
   je @f
449
   dec ecx
450
   jmp @b
451
.no:
452
   mov eax, 1
453
@@:
454
   pop ebx ecx esi edi
455
   ret
456
;
457
slotMax dd 0
458
selfPID dd 0
459
buf db 1024 dup(0)
460
copyKill:
461
   push eax ebx ecx esi edi
462
 
463
   ;сперва прочтём свою информацию
464
   mcall 9, buf, -1
465
   mov eax, dword[buf+30]
466
   mov dword[selfPID], eax
467
 
468
   ;указатели, которые никогда не меняются:
469
   mov esi, selfName       ;первая строка - имя текущего приложения
470
   mov edi, buf            ;вторая строка - имя текущего слота
471
   add edi, 10
472
 
473
   mov ecx, 1
474
@@:
475
   mcall 9, buf, ecx
476
   mov dword[slotMax], eax
477
 
478
   ;если это мы сами, то пропускаем проверку
479
   mov eax, dword[buf+30]
480
   cmp eax, dword[selfPID]
481
   je copyKill.propusk
482
 
483
   call compareBytes   ;сравниваем 11 байт строк, результат в eax
484
 
485
   cmp eax, 0
486
   je copyKill.selfKill
487
 
488
.propusk:
489
   inc ecx
490
   cmp ecx, dword[slotMax]
491
   ja @f
492
   jmp @b
493
 
494
.selfKill:
495
   pop edi esi ecx ebx eax
496
   mcall -1
497
   ret
498
@@:
499
   pop edi esi ecx ebx eax
500
   ret
501
 
502
 WindowsWidth  = 450
503
 WindowsHeight = 195
504
coord:      ;координаты окна приложения
505
 .y dw 0
506
 .x dw 0
507
 
508
draw_window:
509
        ;удаляем кнопку, если есть
510
        mov edx, 0x80000002
511
        mcall 8
512
 
513
        mov     eax, 12                 ; function 12: tell os about windowdraw
514
        mov     ebx, 1                  ; 1, start of draw
515
        mcall
516
 
517
        ;отобразим окно по центру экрана для этого:
518
        mcall 14 ;получим размеры экрана
519
        mov dword[coord], eax       ;положим размеры экрана в координаты
520
        shr word[coord.x], 1        ;вернее положим их половину
521
        shr word[coord.y], 1
522
 
523
        ;вычисляем координаты окна, чтобы окно было по середине экрана
524
        sub word[coord.x], WindowsWidth/2
525
        sub word[coord.y], WindowsHeight/2
526
 
527
        mov     eax, 0                  ; function 0 : define and draw window
528
        mov     ebx, 0 ;* 65536 + WindowsWidth   ; [x start] *65536 + [x size]
529
        mov bx, word[coord.x]
530
        shl  ebx, 16
531
        mov bx, WindowsWidth
532
 
533
        mov ecx, 0
534
        mov     cx, word[coord.y] ;* 65536 + WindowsHeight  ; [y start] *65536 + [y size]
535
        shl ecx, 16
536
        mov cx, WindowsHeight
537
 
538
        mov     edx, 0x14ffffff         ; color of work area RRGGBB
539
                                        ; 0x02000000 = window type 4 (fixed size, skinned window)
540
        mov     esi, 0x808899ff         ; color of grab bar  RRGGBB
541
                                        ; 0x80000000 = color glide
542
        mov     edi, title
543
        mcall
544
 
545
        draw_check_boxes check_boxes,check_boxes_end ;рисование чекбоксов
546
        draw_edit_boxes editboxes,editboxes_end      ;рисование edit box'ов
547
 
548
        ;рисуем кнопку
549
        mov ebx, (WindowsWidth-80-Otstup)*65536 + 80 ;координата X, ширина кнопки
550
        mov ecx, 160*65536 + 20   ;координата Y, высота кнопки
551
        mov edx, 0x00000002 ;2    ;номер кнопки
552
        mov esi, 0x00AABBCC       ;цвет кнопки
553
        mcall 8
554
        ;рисуем текст кнопки
7395 theonlymir 555
        mov     ebx, (WindowsWidth-80-Otstup+25-buttonTextXoffset) * 65536 + 166    ;координаты текста (x, y)
7389 theonlymir 556
        mov     ecx, 0xFFFFFF     ;белый цвет текста
557
        mov     edx, buttonText
7395 theonlymir 558
        mov     esi, buttonTextSize ;5            ;размер текста в символах
559
        mcall 4
7389 theonlymir 560
 
561
        call draw_super_text
562
 
563
        LineLength = 62 ;42
564
        mov     ebx, 40 * 65536 + 36    ; draw info text with function 4 (x, y)
565
        mov     ecx, 0x224466
566
        mov     edx, text
567
        mov     esi, LineLength
568
        mov     eax, 4
569
 
570
  .newline:                             ; text from the DATA AREA
571
        mcall
572
        add     ebx, 12
573
        add     edx, LineLength
574
        cmp     byte[edx], 0
575
        jne     .newline
576
 
577
        mov     eax, 12                 ; function 12:tell os about windowdraw
578
        mov     ebx, 2                  ; 2, end of draw
579
        mcall
580
 
581
        ret
582
 
583
 
584
 
7395 theonlymir 585
 
7389 theonlymir 586
align 4
587
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
588
;DATA данные  для check_box1 - использует системные цвета
589
;Формат данных чек бокса:
590
;   координата х, координата у, указатель на начало строки, длина строки
591
;состояние работы утилиты: активна/нет
592
check_boxes:
593
   ch1 check_box1 30,160,ch_text.1,ch_text.e1-ch_text.1,ch_flag_en
594
check_boxes_end:
595
 
7395 theonlymir 596
 
597
if lang eq ru  ;если язык сборки русский
598
 
599
text    db  "Љ®­дЁЈга в®а Hot Angles ®вўҐз Ґв §  ­ бва®©Єг  ЄвЁў­ле гЈ«®ў. "
600
        db  "Ќ бвன⥠Ї а ¬Ґвал Ї®¤ бҐЎп Ё«Ё ®вЄ«озЁвҐ нвг ®ЇжЁо.         "
601
        db  "                                                              ", 0
602
 hed:
603
title   db  "Љ®­дЁЈга в®а гвЁ«Ёвл Hot Angles", 0
604
buttonText db "ЏаЁ¬Ґ­Ёвм", 0
605
buttonTextSize = 9
606
buttonTextXoffset = 12
607
 
7389 theonlymir 608
ch_text:        ;сопровождающий текст для чек боксов
7395 theonlymir 609
.1 db '‚Є«озЁвм/ ЄвЁўЁа®ў вм "Hot Angles"'
610
.e1:
611
 
612
superText:
613
  .lu db 'Љ®¬ ­¤  «Ґў®Ј® ўҐае­ҐЈ® гЈ« : ', 0
614
  .ld db 'Љ®¬ ­¤  «Ґў®Ј® ­Ё¦­ҐЈ® гЈ« :  ', 0
615
  .ru db 'Љ®¬ ­¤  Їа ў®Ј® ўҐае­ҐЈ® гЈ« :', 0
616
  .rd db 'Љ®¬ ­¤  Їа ў®Ј® ­Ё¦­ҐЈ® гЈ« : ', 0
617
superTextSize = 30
618
 
619
else  ;иначе английский текст
620
 
621
text    db  "This is a Hot Angles Configurator.                            "
622
        db  "Set the parameters bellow for yourself or disable this option."
623
        db  "                                                              ", 0
624
 hed:
625
title   db  "Hot Angles Configurator", 0
626
buttonText db "Apply", 0
627
buttonTextSize = 5
628
buttonTextXoffset = 0
629
 
630
ch_text:        ;сопровождающий текст для чек боксов
7389 theonlymir 631
.1 db 'Activate "Hot Angles"'
632
.e1:
633
 
634
superText:
7395 theonlymir 635
  .lu db 'Left up angle command:   ', 0
636
  .ld db 'Left down angle command: ', 0
637
  .ru db 'Right up angle command:  ', 0
7389 theonlymir 638
  .rd db 'Right down angle command:', 0
7395 theonlymir 639
superTextSize = 25
7389 theonlymir 640
 
7395 theonlymir 641
end if
642
 
643
 
7389 theonlymir 644
draw_super_text:
645
   push eax ebx ecx edx edi esi
646
   mov     ebx, Otstup * 65536 + 74    ; draw info text with function 4 (x, y)
647
   mov     ecx, 0x224466
648
   mov eax, superText.lu
649
   mov     edx, eax
7395 theonlymir 650
   mov     esi, superTextSize ;22
7389 theonlymir 651
   mcall 4
652
 
653
   mov     ebx, Otstup * 65536 + 109
654
   mov     edx, superText.ld
7395 theonlymir 655
   mov     esi, superTextSize ;24
7389 theonlymir 656
   mcall 4
657
 
658
   mov     ebx, 240 * 65536 + 74
659
   mov     edx, superText.ru
7395 theonlymir 660
   mov     esi, superTextSize ;23
7389 theonlymir 661
   mcall 4
662
 
663
   mov     ebx, 240 * 65536 + 109
664
   mov     edx, superText.rd
7395 theonlymir 665
   mov     esi, superTextSize ;25
7389 theonlymir 666
   mcall 4
667
 
668
   pop esi edi edx ecx ebx eax
669
   ret
670
 
671
 
672
edMaxSize = 510
673
edMax = 0 ;max, size, pos
674
 
675
editboxes:
676
editLU edit_box 180,Otstup,85,0xffffff,0x6a9480,0,0xAABBCC,0,edMaxSize,dataBuffer.1,ed_focus,edMax,edMax
7397 leency 677
editLD edit_box 180,Otstup,120,0xffffff,0x6a9480,0,0xAABBCC,0,edMaxSize,dataBuffer.2,0,edMax,edMax
678
editRU edit_box 180,240,85,0xffffff,0x6a9480,0,0xAABBCC,0,edMaxSize,dataBuffer.3,0,edMax,edMax
679
editRD edit_box 180,240,120,0xffffff,0x6a9480,0,0xAABBCC,0,edMaxSize,dataBuffer.4,0,edMax,edMax
7389 theonlymir 680
editboxes_end:
681
 
682
data_of_code dd 0
683
mouse_flag dd 0x0
684
 
685
dataBuffer:
686
.1: rb 512
687
.2: rb 512
688
.3: rb 512
689
.4: rb 512
690
.size1: rd 1
691
.size2: rd 1
692
.size3: rd 1
693
.size4: rd 1
694
;255+255+2
695
;два запасных байта необходимы для того что бы не пепереписать следующией байты, в конце буфера 0
696
dataBufferEnd:
697
 
698
sc  system_colors
699
 
700
I_END:
701
        rb 4096
702
align 16
703
STACKTOP:
704
 
705
MEM: