Subversion Repositories Kolibri OS

Rev

Rev 3953 | Rev 4082 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
3853 GerdtR 1
if lang eq ru
2
MinRMenuW equ 18*6+10
3
else
4
MinRMenuW equ 15*6+10
5
end if
6
 
7
idbRRedrawFon equ 100
8
idbRAlign    equ 101
9
idbRFixIcons equ 102
10
idbRAdd      equ 103
11
idbRDel      equ 104
12
idbRProp     equ 105
13
 
4036 GerdtR 14
DELTA_COLOR  equ 70
15
 
3853 GerdtR 16
;---- thread for rbutton -----------------------------------------------------------------------
17
RButtonWin:
3921 mario79 18
        mcall   40,100101b      ;SetMaskMessage 100101b
4036 GerdtR 19
        mcall   48,3,sc,40
20
 
21
        mov     eax,[sc.work]     ;вычисляем цвет светлее фонового
22
        rol     eax,16
23
        add     al,DELTA_COLOR
24
        jnc     @f
25
        mov     al,0FFh
26
      @@:
27
        rol     eax,16
28
        add     al,DELTA_COLOR
29
        jnc     @f
30
        mov     al,0FFh
31
      @@:
32
        add     ah,DELTA_COLOR
33
        jnc     @f
34
        mov     ah,0FFh
35
      @@:
36
        mov     [sc.workH],eax
37
 
38
        mov     eax,[sc.work]     ;вычисляем цвет темнее фонового
39
        rol     eax,16
40
        sub     al,DELTA_COLOR
41
        jnc     @f
42
        mov     al,0FFh
43
      @@:
44
        rol     eax,16
45
        sub     al,DELTA_COLOR
46
        jnc     @f
47
        mov     al,0FFh
48
      @@:
49
        sub     ah,DELTA_COLOR
50
        jnc     @f
51
        mov     ah,0FFh
52
      @@:
53
        mov     [sc.workL],eax
54
 
55
 
56
 
3853 GerdtR 57
        stdcall GetNumIcon,[MouseX],[MouseY],-1
58
        mov     [SelIcon],eax
59
 
60
        mov     [NumUserButt],0
61
        mov     [RMenuW],0
62
        mcall   70,fiIni
63
        mcall   68,12,dword[bufIni+32]
64
        mov     [RBUser],eax
65
        stdcall [ini_enum_keys],IconIni,secRButt,GetUserBut
66
 
4036 GerdtR 67
        cmp     [SelIcon],-1
68
        jne     @f
69
        mov     [RMenuH],16*4
70
        mov     eax,[NumUserButt]
71
        shl     eax,4
72
        add     [RMenuH],ax
73
        jmp     .rbw1
74
      @@:
75
        mov     [RMenuH],16*5
76
    .rbw1:
3853 GerdtR 77
 
78
RBWRedraw:
3921 mario79 79
        mcall   12,1    ;RedrawWinBeg
3853 GerdtR 80
        mov     ebx,[MouseX]
81
        shl     ebx,16
82
        mov     bx,[RMenuW]
83
        mov     ecx,[MouseY]
84
        shl     ecx,16
85
        mov     cx,[RMenuH]
4036 GerdtR 86
        mov     edx,01000000h
3853 GerdtR 87
        mov     esi,01000000h
88
        xor     eax,eax
89
        int     40h
90
 
4036 GerdtR 91
        and     ebx,0FFFFh      ;фоновый прямоугольник
92
        inc     bx
93
        and     ecx,0FFFFh
94
        inc     cx
95
        mcall   13,,,[sc.work]
96
 
97
        cmp     [SelIcon],-1       ;если клик по иконке, то пункты пользователя не нужны
98
        jne     .NoDrawUserBut
3853 GerdtR 99
       ;-----------
100
        mov     ecx,[NumUserButt]
101
  .DrawUB:
102
        push    ecx
103
 
104
        mov     eax,[NumUserButt]
105
        sub     eax,ecx
106
        mov     edx,eax      ;button ID
4036 GerdtR 107
        or      edx,60000000h
3853 GerdtR 108
        shl     eax,4+16          ;*16*10000h
109
        mov     ecx,eax
110
        mov     cx,16
111
 
112
        xor     ebx,ebx
113
        mov     bx,[RMenuW]
4036 GerdtR 114
        mov     esi,[sc.work]
115
        mcall   8                       ;определили
3853 GerdtR 116
 
117
        mov     ebx,50000h
118
        shr     ecx,16
119
        mov     bx,cx
120
        add     bx,5
121
 
122
        mov     ecx,80000000h
123
 
124
        mov     eax,[NumUserButt]
125
        sub     eax,[esp]
126
        mov     edx,[RBUser+eax*8]
4036 GerdtR 127
        mcall   4                      ;подписали
3853 GerdtR 128
 
129
        pop     ecx
130
        loop    .DrawUB
131
 
132
       ;-----------
4036 GerdtR 133
.NoDrawUserBut:
134
                                        ;определение кнопок для иконок
3853 GerdtR 135
        xor     ebx,ebx
136
        mov     bx,[RMenuW]
137
 
4036 GerdtR 138
        xor     eax,eax
139
        cmp     [SelIcon],-1
140
        jne     @f
141
        mov     eax,[NumUserButt]
142
     @@:
143
        shl     eax,4
144
        mov     cx,ax
3853 GerdtR 145
        shl     ecx,16
146
        mov     cx,16
4036 GerdtR 147
        push    ecx                     ;отсюда рисовать кнопки (по высоте)
3853 GerdtR 148
 
149
 
4036 GerdtR 150
        mcall   8,,,60000000h or idbRRedrawFon,[sc.work]
151
        add     ecx,16*10000h
152
        mcall    ,,,60000000h or idbRAlign
153
        add     ecx,16*10000h
154
        mcall    ,,,60000000h or idbRFixIcons
155
        add     ecx,16*10000h
156
 
157
        cmp     dword[SelIcon],-1
158
        je      @f
159
 
160
        mcall    ,,,60000000h or idbRDel,
161
        add     ecx,16*10000h
162
        mcall    ,,,60000000h or idbRProp,
163
        jmp     .endRM1
164
      @@:
165
        mcall    ,,,60000000h or idbRAdd,
166
      .endRM1:
167
 
168
                                        ;подписи к кнопкам
169
        xor     eax,eax
170
        cmp     [SelIcon],-1
171
        jne     @f
172
        mov     eax,[NumUserButt]
173
      @@:
174
        shl     eax,4
3853 GerdtR 175
        mov     ebx,50000h
4036 GerdtR 176
        mov     bx,ax
177
 
178
        add     bx,5
3853 GerdtR 179
        mcall   4,,80000000h,RMenuRedrawFon
180
        add     ebx,16
181
        mcall    ,,,RMenuAlign
182
 
183
        add     ebx,16
184
        cmp     [bFixIcons],0
185
        jne     @f
186
        mov     edx,RMenuOffMoving
187
        jmp     .RBWR1
188
     @@:
189
        mov     edx,RMenuOnMoving
190
     .RBWR1:
191
        mcall
4036 GerdtR 192
        add     ebx,16
3853 GerdtR 193
 
194
        cmp     dword[SelIcon],-1
195
        je      @f
196
 
4036 GerdtR 197
        mcall    ,,,RMenuDel
3853 GerdtR 198
        add     bx,16
4036 GerdtR 199
        mcall    ,,,RMenuProp
200
        jmp     .endRM2
3853 GerdtR 201
      @@:
202
 
4036 GerdtR 203
        mcall    ,,,RMenuAdd
204
      .endRM2:
3853 GerdtR 205
 
206
        pop     ecx
3921 mario79 207
        mcall   12,2    ;RedrawWinEnd
3853 GerdtR 208
 
3921 mario79 209
        mcall   9,RBProcInfo,-1         ;GetThreadInfo RBProcInfo,-1
3853 GerdtR 210
        mcall   18,21,dword[RBProcInfo+30]
211
        m2m     dword[RBSlot],eax
212
 
213
RBWMessages:
3921 mario79 214
        mcall   10              ;WaitMessage
3853 GerdtR 215
        dec     eax
216
        jz      RBWRedraw
217
        sub     eax,2
218
        jz      RBWButton
219
        sub     eax,3
220
        jz      RBWMouse
221
        jmp     RBWMessages
222
 
223
RBWButton:
3921 mario79 224
        mcall   17              ;GetButtonPressed
3853 GerdtR 225
        shr     eax,8
226
        cmp     eax,idbRRedrawFon
227
        jz      RBRedrawFon
228
        cmp     eax,idbRAlign
229
        jz      RBAlign
230
        cmp     eax,idbRFixIcons
231
        jz      RBFixIcons
232
        cmp     eax,idbRAdd
233
        jz      RBAdd
234
        cmp     eax,idbRDel
235
        jz      RBDelete
236
        cmp     eax,idbRProp
237
        jz      RBPropeties
238
 
239
        cmp     eax,[NumUserButt]
240
        ja      @f
241
 
242
        mov     eax,[RBUser+eax*8+4]
243
        mov     dword[fiRunProg+8],0
244
        mov     dword[fiRunProg+21],eax
245
        mcall   70,fiRunProg
246
    @@:
247
        jmp     RBWExit
248
 
249
RBWMouse:
4036 GerdtR 250
        cmp     [PredItem],-1
251
        je      @f
252
        mov     eax,[PredItem]
253
        xor     ebx,ebx
254
        mov     bx,[RMenuW]
255
        mov     cx,ax
256
        shl     ecx,16
257
        mov     cx,ax
258
        mcall   38,,,[sc.work]
259
        add     ecx,00100010h
260
        mcall    ,,,[sc.work]
261
      @@:
262
        call    ClickInWin
263
        jnc     @f
264
        mcall   37,1          ;положение мыши относительно окна
265
        and     eax,0FFF0h
266
        mov     [PredItem],eax
267
        xor     ebx,ebx
268
        mov     bx,[RMenuW]
269
        mov     cx,ax
270
        shl     ecx,16
271
        mov     cx,ax
272
        mcall   38,,,[sc.workL]
273
        add     ecx,00100010h
274
        mcall    ,,,[sc.workH]
275
      @@:
276
 
277
 
3921 mario79 278
        mcall   37,2            ;GetMouseKey
3853 GerdtR 279
        test    eax,111b
280
        jz      RBWMessages
281
 
4036 GerdtR 282
        call    ClickInWin
283
        jc      RBWMessages
3853 GerdtR 284
 
285
RBWExit:
286
        mcall   68,13,[RBUser]
287
        mov     [RButtonActiv],0
3921 mario79 288
        mcall   -1      ;ExitProcess
3853 GerdtR 289
 
290
 
291
RBRedrawFon:
292
        mcall   15,3
293
        jmp     RBWExit
294
 
295
RBAlign:
296
        call    AlignIcons
297
 
298
        m2m     [PIcoDB],[BegData]
299
        stdcall [ini_enum_sections],IconIni,Ini_SavePos
300
 
301
        mov     dword[fiRunProg+8],WarningSave
302
        mov     dword[fiRunProg+21],pthNotify
303
        mcall   70,fiRunProg
304
        mov     [bNotSave],0
305
 
306
        jmp     RBRedrawFon
307
 
308
RBFixIcons:
309
        xor     dword[bFixIcons],1
310
 
311
        cmp     [bNotSave],0
312
        je      @f
313
 
314
        mov     dword[fiRunProg+8],WarningSave
315
        mov     dword[fiRunProg+21],pthNotify
316
        mcall   70,fiRunProg
317
        mov     [bNotSave],0
318
 
319
      @@:
320
        jmp     RBWExit
321
 
322
RBAdd:
3921 mario79 323
        cmp     [DlgAddActiv],1
324
        je      RBWSetActivWin
325
        mov     [DlgAddActiv],1
326
 
327
        mcall   51,1,DlgAdd,stack_dlg           ;CreateThread DlgAdd,stack_dlg
3853 GerdtR 328
        jmp     RBWExit
329
 
330
RBDelete:
331
 
332
        mov     eax,[SelIcon]
333
        mov     eax,[IconsOffs+eax*4]
334
        stdcall [ini_del_section],IconIni,eax
335
 
336
        stdcall DelIcon,[SelIcon]
337
    ;    mov     dword[fiStdIco],2
338
    ;    m2m     dword[fInfo+12],dword[SizeData]
339
    ;    mcall   70,fInfo
340
 
341
        mov     dword[fiRunProg+8],WarningSave
342
        mov     dword[fiRunProg+21],pthNotify
343
        mcall   70,fiRunProg
344
        mov     [bNotSave],0
345
 
346
        jmp     RBRedrawFon
347
 
348
RBPropeties:
3921 mario79 349
        cmp     [DlgAddActiv],1
350
        je      RBWSetActivWin
351
        mov     [DlgAddActiv],1
352
 
353
        mcall   51,1,DlgProp,stack_dlg          ;CreateThread DlgProp,stack_dlg
3853 GerdtR 354
        jmp     RBWExit
355
 
3921 mario79 356
RBWSetActivWin:
357
        mcall   18,3,[slotDlgAdd]
358
        jmp     RBWExit
3853 GerdtR 359
 
4036 GerdtR 360
proc ClickInWin        ;Carry flag = 1, если клик в окне
361
        mcall   37,0            ;GetMousePos
362
        xor     ebx,ebx
363
        mov     bx,ax           ;y
364
        shr     eax,16          ;x
3853 GerdtR 365
 
4036 GerdtR 366
        xor     ecx,ecx
367
        mov     cx,bx
368
        mov     bx,ax
369
 
370
        mcall   34
371
        cmp     eax,[RBSlot]
372
        jne     @f
373
        stc
374
        ret
375
      @@:
376
        clc
377
        ret
378
endp
379
 
380
 
3853 GerdtR 381
proc AlignIcons
382
local posX:WORD,\
383
      posY:WORD,\
384
      negatX:WORD,\
385
      negatY:WORD
386
 
387
        xor     ebx,ebx
388
 
389
        mov     ecx,[MaxNumIcon]
390
        test    ecx,ecx
391
        jnz     .AlignIco
392
        ret
393
 .AlignIco:
394
        push    ecx
395
        or      ecx,-1
396
        mov     edi,dword[IconsOffs+ebx]
397
        xor     eax,eax
398
        repne   scasb
399
        repne   scasb
400
        repne   scasb
401
        repne   scasb
402
 
403
        mov     dword[negatX],0
404
 
405
     ;-------- преобразуем координаты в положительные
406
        mov     ax,[edi+2]
407
        test    ax,8000h
408
        jz      @f
409
        neg     ax
410
        mov     word[negatX],1
411
      @@:
412
        mov     [posX],ax
413
 
414
        mov     ax,[edi]
415
        test    ax,8000h
416
        jz      @f
417
        neg     ax
418
        mov     word[negatY],1
419
      @@:
420
        mov     [posY],ax
421
 
422
      ;-----
423
        mov     ax,[posY]
424
        mov     dx,ALIGN_SIZE
425
 
426
        cmp     ax,dx
427
        jb      .AI0
428
    @@: sub     ax,dx
429
        cmp     ax,dx
430
        jae     @b
431
    .AI0:
432
 
433
        mov     dx,ax
434
        cmp     dx,ALIGN_SIZE/2
435
        jb      .AI1
436
 
437
        mov     ax,ALIGN_SIZE
438
        sub     ax,dx
439
        add     [posY],ax
440
 
441
        jmp     .AI2
442
     .AI1:
443
        sub     [posY],dx
444
     .AI2:
445
     ;-----
446
        mov     ax,[posX]
447
        mov     dx,ALIGN_SIZE
448
 
449
        cmp     ax,dx
450
        jb      .AI3
451
    @@: sub     ax,dx
452
        cmp     ax,dx
453
        jae     @b
454
    .AI3:
455
 
456
        mov     dx,ax
457
        cmp     dx,ALIGN_SIZE/2
458
        jb      .AI4
459
 
460
        mov     ax,ALIGN_SIZE
461
        sub     ax,dx
462
        add     [posX],ax
463
 
464
        jmp     .AI5
465
     .AI4:
466
        sub     [posX],dx
467
     .AI5:
468
 
469
      ;----- преобразование назад и поправка в отрицательных координат
470
        mov     ax,[posX]
471
 
472
        cmp     [negatX],1
473
        jne     @f
474
        neg     ax
475
        inc     ax
476
        jmp     .AI6
477
      @@:
478
 
479
        mov     dx,[ScreenX]
480
        shr     dx,1
481
        cmp     ax,dx
482
        jbe     .AI6
483
        sub     ax,[ScreenX]
484
      .AI6:
485
        mov     word[edi+2],ax
486
 
487
 
488
        mov     ax,[posY]
489
        cmp     [negatY],1
490
        jne     @f
491
        neg     ax
492
        inc     ax
493
        jmp     .AI7
494
      @@:
495
 
496
        mov     dx,[ScreenY]
497
        shr     dx,1
498
        cmp     ax,dx
499
        jbe     .AI7
500
        sub     ax,[ScreenY]
501
      .AI7:
502
         mov     word[edi],ax
503
 
504
       ;--------
505
 
506
 
507
 
508
        pop     ecx
509
        add     ebx,4
510
        dec     ecx
511
        jnz     .AlignIco
512
;        loop    .AlignIco
513
 
514
 
515
;        mov     dword[fInfo],2
516
;        mcall   70,fInfo
517
        ret
518
endp
519
 
520
;-------------------------------------------------------------------------------
521
proc GetUserBut stdcall,f_name,sec_name,key_name,key_value
522
        cmp     [NumUserButt],16
523
        jne     @f
524
        ret
525
     @@:
526
 
527
        push    ebx esi edi
528
 
529
        mov     edi,[key_name]           ;определяем ширину меню
530
        xor     eax,eax
531
        or      ecx,-1
532
        repne   scasb
533
        sub     edi,[key_name]
534
        mov     eax,edi
535
        shl     eax,1
536
        lea     eax,[eax*2+eax+5*2]
537
        cmp     ax,[RMenuW]
538
        jbe     @f
539
        mov     [RMenuW],ax
540
     @@:
541
        cmp     [RMenuW],MinRMenuW
542
        jae     @f
543
        mov     [RMenuW],MinRMenuW
544
     @@:
545
 
546
        mov     ebx,[NumUserButt]
547
 
548
        mov     esi,[key_name]
549
        mov     edi,[RBUser+ebx*8]
550
    @@: lodsb
551
        stosb
552
        test    al,al
553
        jnz     @b
554
 
555
;debug_newline
556
 
557
 
558
        mov     [RBUser+ebx*8+4],edi
559
        mov     esi,[key_value]
560
    @@: lodsb
561
        stosb
562
        test    al,al
563
        jnz     @b
564
 
565
        mov     [RBUser+ebx*8+8],edi
566
 
567
        inc     [NumUserButt]
568
 
569
        pop     edi esi ebx
570
        mov     eax,1
571
        ret
572
endp
573
 
574
proc Ini_SavePos stdcall,f_name,sec_name
575
        push    ebx edi esi
3921 mario79 576
 
3853 GerdtR 577
        xor     ebx,ebx
578
  .SearchSect:
579
        mov     edi,[IconsOffs+ebx*4]
580
        mov     esi,[sec_name]
581
      @@:
582
        lodsb
583
        scasb
584
        jne     @f
585
        test    al,al
586
        jnz     @b
587
 
588
        jmp     .IcoDataFound
589
      @@:
590
 
591
        inc     ebx
592
        cmp     ebx,[MaxNumIcon]
593
        jb      .SearchSect
594
 
595
        mov     eax,1
596
        pop     esi edi ebx
597
        ret
598
 
599
.IcoDataFound:
600
        or      ecx,-1
601
        repne   scasb
602
        repne   scasb
603
        repne   scasb
604
 
3921 mario79 605
;int3
3853 GerdtR 606
        movzx   eax,word[edi+2]
607
        test    eax,8000h
608
        jz      @f
609
        or      eax,0FFFF0000h
610
     @@:
611
 
612
        stdcall [ini_set_int],[f_name],[sec_name],keyX,eax
613
 
614
        movzx   eax,word[edi]
615
        test    eax,8000h
616
        jz      @f
617
        or      eax,0FFFF0000h
618
     @@:
619
 
620
        stdcall [ini_set_int],[f_name],[sec_name],keyY,eax
621
 
622
        mov     eax,1
623
        pop     esi edi ebx
624
        ret
625
endp
626