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 |
||
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: |