Subversion Repositories Kolibri OS

Rev

Rev 6009 | Rev 6032 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 6009 Rev 6031
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;;
4
;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa      ;;
4
;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa      ;;
5
;; Distributed under terms of the GNU General Public License    ;;
5
;; Distributed under terms of the GNU General Public License    ;;
6
;;                                                              ;;
6
;;                                                              ;;
7
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8
 
8
 
9
$Revision: 6009 $
-
 
10
 
-
 
11
;==============================================================================
-
 
12
;///// public functions ///////////////////////////////////////////////////////
-
 
13
;==============================================================================
9
$Revision: 6031 $
14
 
10
 
15
button.MAX_BUTTONS = 4095
11
button.MAX_BUTTONS = 4095
16
 
12
 
17
struct  SYS_BUTTON
13
struct  SYS_BUTTON
18
        pslot           dw ?
14
        pslot           dw ?
19
        id_lo           dw ?
15
        id_lo           dw ?
20
        left            dw ?
16
        left            dw ?
21
        width           dw ?
17
        width           dw ?
22
        top             dw ?
18
        top             dw ?
23
        height          dw ?
19
        height          dw ?
24
        id_hi           dw ?
20
        id_hi           dw ?
25
                        dw ?
21
                        dw ?
26
ends
22
ends
27
 
-
 
28
align 4
23
 
29
;------------------------------------------------------------------------------
24
;---------------------------------------------------------------
30
syscall_button: ;///// system function 8 //////////////////////////////////////
25
syscall_button: ;////////////// system function 8 //////////////
31
;------------------------------------------------------------------------------
26
;---------------------------------------------------------------
32
;? Define/undefine GUI button object
27
;? Define/undefine GUI button object
33
;------------------------------------------------------------------------------
28
;---------------------------------------------------------------
34
;; Define button:
29
;; Define button:
35
;> ebx = pack[16(x), 16(width)]
30
;> ebx = pack[16(x), 16(width)]
36
;> ecx = pack[16(y), 16(height)]
31
;> ecx = pack[16(y), 16(height)]
37
;> edx = pack[8(flags), 24(button identifier)]
32
;> edx = pack[8(flags), 24(button identifier)]
38
;>       flags bits:
33
;>       flags bits:
39
;>          7 (31) = 0
34
;>          7 (31) = 0
40
;>          6 (30) = don't draw button
35
;>          6 (30) = don't draw button
41
;>          5 (29) = don't draw button frame when pressed
36
;>          5 (29) = don't draw button frame when pressed
42
;> esi = button color
37
;> esi = button color
43
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
38
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
44
;; Undefine button:
39
;; Undefine button:
45
;> edx = pack[8(flags), 24(button identifier)]
40
;> edx = pack[8(flags), 24(button identifier)]
46
;>       flags bits:
41
;>       flags bits:
47
;>          7 (31) = 1
42
;>          7 (31) = 1
48
;------------------------------------------------------------------------------
43
;---------------------------------------------------------------
49
        ; do we actually need to undefine the button?
44
        ; do we actually need to undefine the button?
50
        test    edx, 0x80000000
45
        test    edx, 0x80000000
51
        jnz     .remove_button
46
        jnz     .remove_button
52
 
47
 
53
        ; do we have free button slots available?
48
        ; do we have free button slots available?
54
        mov     edi, [BTN_ADDR]
49
        mov     edi, [BTN_ADDR]
55
        mov     eax, [edi]
50
        mov     eax, [edi]
56
        cmp     eax, button.MAX_BUTTONS
51
        cmp     eax, button.MAX_BUTTONS
57
        jge     .exit
52
        jge     .exit
58
 
53
 
59
        ; does it have positive size? (otherwise it doesn't have sense)
54
        ; does it have positive size? (otherwise it doesn't have sense)
60
        or      bx, bx
55
        or      bx, bx
61
        jle     .exit
56
        jle     .exit
62
        or      cx, cx
57
        or      cx, cx
63
        jle     .exit
58
        jle     .exit
64
 
59
 
65
        ; make coordinates clientbox-relative
60
        ; make coordinates clientbox-relative
66
        push    eax
61
        push    eax
67
        mov     eax, [current_slot]
62
        mov     eax, [current_slot]
68
        rol     ebx, 16
63
        rol     ebx, 16
69
        add     bx, word[eax + APPDATA.wnd_clientbox.left]
64
        add     bx, word[eax + APPDATA.wnd_clientbox.left]
70
        rol     ebx, 16
65
        rol     ebx, 16
71
        rol     ecx, 16
66
        rol     ecx, 16
72
        add     cx, word[eax + APPDATA.wnd_clientbox.top]
67
        add     cx, word[eax + APPDATA.wnd_clientbox.top]
73
        rol     ecx, 16
68
        rol     ecx, 16
74
        pop     eax
69
        pop     eax
75
 
70
 
76
        ; basic checks passed, define the button
71
        ; basic checks passed, define the button
77
        push    ebx ecx edx
-
 
78
        inc     eax
72
        inc     eax
79
        mov     [edi], ax
73
        mov     [edi], ax
80
        shl     eax, 4
74
        shl     eax, 4
81
        add     edi, eax
75
        add     edi, eax
82
        ; NOTE: this code doesn't rely on SYS_BUTTON struct, please revise it
76
; NOTE: this code doesn't rely on SYS_BUTTON struct,
83
        ;       if you change something
77
; please revise it, if you change something.
84
        mov     ax, [CURRENT_TASK]
78
        mov     ax, [CURRENT_TASK]
85
        stosw
79
        stosw
86
        mov     ax, dx
80
        mov     ax, dx
87
        stosw               ; button id number: bits 0-15
81
        stosw               ; button id number: bits 0-15
88
        mov     eax, ebx
82
        mov     eax, ebx
89
        rol     eax, 16
83
        rol     eax, 16
90
        stosd               ; x start | x size
84
        stosd               ; x start | x size
91
        mov     eax, ecx
85
        mov     eax, ecx
92
        rol     eax, 16
86
        rol     eax, 16
93
        stosd               ; y start | y size
87
        stosd               ; y start | y size
94
        mov     eax, edx
88
        mov     eax, edx
95
        shr     eax, 16
89
        shr     eax, 16
96
        stosw               ; button id number: bits 16-31
90
        stosw               ; button id number: bits 16-31
97
        pop     edx ecx ebx
-
 
98
 
91
 
99
        ; do we also need to draw the button?
92
        ; do we also need to draw the button?
100
        test    edx, 0x40000000
93
        test    edx, 0x40000000
101
        jnz     .exit
94
        jnz     .exit
102
 
-
 
103
        ; draw button body
-
 
104
 
-
 
105
        pushad
-
 
106
 
-
 
107
        ; calculate window-relative coordinates
-
 
108
        movzx   edi, cx
95
 
109
        shr     ebx, 16
96
        xor     edi, edi
110
        shr     ecx, 16
97
        push    ebx ecx esi
111
        mov     eax, [TASK_BASE]
-
 
112
        add     ebx, [eax - twdw + WDATA.box.left]
-
 
113
        add     ecx, [eax - twdw + WDATA.box.top]
-
 
114
        mov     eax, ebx
98
        cmp     [buttontype], 1
115
        inc     eax
99
        jnz     .draw
116
        shl     eax, 16
-
 
117
        mov     ax, bx
-
 
118
        add     ax, word[esp + 16]
100
        cmp     cx, 129
119
        dec     ax
-
 
120
        mov     ebx, ecx
-
 
121
        shl     ebx, 16
-
 
122
        mov     bx, cx
-
 
123
 
-
 
124
        ; calculate initial color
-
 
125
        mov     ecx, esi
-
 
126
        cmp     [buttontype], 0
-
 
127
        je      @f
-
 
128
        call    button._.incecx2
101
        jnc     .draw
-
 
102
 
-
 
103
        ; calculate gradient data
-
 
104
        mov     eax, esi
-
 
105
        shl     eax, 8
-
 
106
        mov     edx, 3
-
 
107
.calculate:
-
 
108
        rol     eax, 8
-
 
109
        shl     al, 1
-
 
110
        jnc     @f
-
 
111
        neg     al
129
 
112
        jnz     @f
-
 
113
        mov     al, 128
130
        ; set button height counter
114
@@:
-
 
115
        jns     @f
-
 
116
        mov     al, 128
131
    @@:
117
@@:
132
        mov     edx, edi
118
        div     cl
133
        add     ebx, 0x00010001
-
 
134
        dec     edx
-
 
135
 
-
 
136
  .next_line:
-
 
137
        call    button._.button_dececx
119
        shl     ax, 8
138
        push    edi
-
 
139
        xor     edi, edi
-
 
140
;        call    [draw_line]
120
        dec     edx
141
        call    __sys_draw_line
-
 
142
        pop     edi
121
        jnz     .calculate
143
        add     ebx, 0x00010001
122
        mov     dl, cl
144
        dec     edx
-
 
145
        jnz     .next_line
123
        dec     edx
146
 
-
 
147
        popad
124
        shr     edx, 1
148
 
-
 
149
        ; draw button frame
125
        shr     eax, 8
-
 
126
        mov     edi, eax
150
 
127
        mul     edx
151
        push    ebx ecx
128
        add     esi, eax
-
 
129
 
-
 
130
.draw:  ; calculate window-relative coordinates
152
 
131
        movzx   ebp, cx
153
        ; calculate window-relative coordinates
132
        dec     ebp
154
        shr     ebx, 16
133
        shr     ebx, 16
155
        shr     ecx, 16
134
        shr     ecx, 16
156
        mov     eax, [TASK_BASE]
135
        mov     eax, [TASK_BASE]
157
        add     ebx, [eax - twdw + WDATA.box.left]
136
        add     ebx, [eax - twdw + WDATA.box.left]
158
        add     ecx, [eax - twdw + WDATA.box.top]
137
        add     ecx, [eax - twdw + WDATA.box.top]
159
 
-
 
160
        ; top border
-
 
161
        mov     eax, ebx
138
        mov     eax, ebx
162
        shl     eax, 16
139
        inc     eax
163
        mov     ax, bx
140
        mov     edx, ebx
164
        add     ax, [esp + 4]
141
        add     dx, [esp+8]
-
 
142
        dec     edx
165
        mov     ebx, ecx
143
        mov     ebx, ecx
166
        shl     ebx, 16
-
 
167
        mov     bx, cx
-
 
168
        push    ebx
-
 
169
        xor     edi, edi
-
 
170
        mov     ecx, esi
144
        mov     ecx, esi
-
 
145
        shr     ecx, 1
-
 
146
        btr     ecx, 7
171
        ; call    button._.incecx
147
        btr     ecx, 15
-
 
148
        push    esi
172
;        call    [draw_line]
149
        mov     esi, edi
173
        call    __sys_draw_line
150
        xor     edi, edi
174
 
-
 
175
        ; light line under top border
151
        call    hline   ; top border
176
        add     ebx, 0x00010001 
152
        inc     ebx
177
        mov     ecx, esi
153
        pop     ecx
-
 
154
.next_line:
178
        call    button._.incecx
155
        call    hline   ; button body
179
        call    __sys_draw_line
156
        inc     ebx
180
        sub     ebx, 0x00010001
157
        sub     ecx, esi
181
        ; bottom border
158
        dec     ebp
182
        movzx   edx, word[esp + 4 + 0]
159
        jnz     .next_line
183
        add     ebx, edx
160
        shr     ecx, 1
184
        shl     edx, 16
161
        btr     ecx, 7
185
        add     ebx, edx
162
        btr     ecx, 15
186
        mov     ecx, esi
163
        call    hline   ; bottom border
187
        call    button._.dececx
164
        pop     ecx
188
;        call    [draw_line]
165
        shr     ecx, 1
189
        call    __sys_draw_line
166
        btr     ecx, 7
190
 
-
 
191
        ; left border
167
        btr     ecx, 15
192
        pop     ebx
168
        inc     edx
193
        push    edx
169
        push    edx
194
        mov     edx, eax
-
 
195
        shr     edx, 16
-
 
196
        mov     ax, dx
-
 
197
        mov     edx, ebx
170
        mov     edx, ebx
198
        shr     edx, 16
171
        sub     bx, [esp+4]
199
        mov     bx, dx
172
        dec     eax
200
        add     bx, [esp + 4 + 0]
173
        cmp     [buttontype], 1
201
        pop     edx
174
        jnz     @f
202
        mov     ecx, esi
175
        dec     edx
203
        call    button._.dececx ; button._.incecx
-
 
204
;        call    [draw_line]
-
 
205
        dec     ebx
176
        inc     ebx
206
        call    __sys_draw_line
-
 
207
 
177
@@:
208
        ; right border
-
 
209
        mov     dx, [esp + 4]
178
        call    vline   ; left border
210
        add     ax, dx
-
 
211
        shl     edx, 16
-
 
212
        add     eax, edx
-
 
213
        add     ebx, 0x00010000
-
 
214
        mov     ecx, esi
179
        pop     eax
215
        call    button._.dececx
-
 
216
;        call    [draw_line]
-
 
217
        call    __sys_draw_line
180
        call    vline   ; right border
218
 
-
 
219
        pop     ecx ebx
181
        pop     ecx ebx
220
 
-
 
221
  .exit:
182
.exit:
222
        ret
183
        ret
223
 
184
 
224
; FIXME: mutex needed
185
; FIXME: mutex needed
225
syscall_button.remove_button:
186
.remove_button:
226
        and     edx, 0x00ffffff
187
        and     edx, 0x00ffffff
227
        mov     edi, [BTN_ADDR]
188
        mov     edi, [BTN_ADDR]
228
        mov     ebx, [edi]
189
        mov     ebx, [edi]
229
        inc     ebx
190
        inc     ebx
230
        imul    esi, ebx, sizeof.SYS_BUTTON
191
        imul    esi, ebx, sizeof.SYS_BUTTON
231
        add     esi, edi
192
        add     esi, edi
232
        xor     ecx, ecx
193
        xor     ecx, ecx
233
        add     ecx, -sizeof.SYS_BUTTON
194
        add     ecx, -sizeof.SYS_BUTTON
234
        add     esi, sizeof.SYS_BUTTON
195
        add     esi, sizeof.SYS_BUTTON
235
 
196
 
236
  .next_button:
197
.next_button:
237
        dec     ebx
198
        dec     ebx
238
        jz      .exit
199
        jz      .exit
239
 
200
 
240
        add     ecx, sizeof.SYS_BUTTON
201
        add     ecx, sizeof.SYS_BUTTON
241
        add     esi, -sizeof.SYS_BUTTON
202
        add     esi, -sizeof.SYS_BUTTON
242
 
203
 
243
        ; does it belong to our process?
204
        ; does it belong to our process?
244
        mov     ax, [CURRENT_TASK]
205
        mov     ax, [CURRENT_TASK]
245
        cmp     ax, [esi + SYS_BUTTON.pslot]
206
        cmp     ax, [esi + SYS_BUTTON.pslot]
246
        jne     .next_button
207
        jne     .next_button
247
 
208
 
248
        ; does the identifier match?
209
        ; does the identifier match?
249
        mov     eax, dword[esi + SYS_BUTTON.id_hi - 2]
210
        mov     eax, dword[esi + SYS_BUTTON.id_hi - 2]
250
        mov     ax, [esi + SYS_BUTTON.id_lo]
211
        mov     ax, [esi + SYS_BUTTON.id_lo]
251
        and     eax, 0x00ffffff
212
        and     eax, 0x00ffffff
252
        cmp     edx, eax
213
        cmp     edx, eax
253
        jne     .next_button
214
        jne     .next_button
254
 
215
 
255
        ; okay, undefine it
216
        ; okay, undefine it
256
        push    ebx
217
        push    ebx
257
        mov     ebx, esi
218
        mov     ebx, esi
258
        lea     eax, [esi + sizeof.SYS_BUTTON]
219
        lea     eax, [esi + sizeof.SYS_BUTTON]
259
        call    memmove
220
        call    memmove
260
        dec     dword[edi]
221
        dec     dword[edi]
261
        add     ecx, -sizeof.SYS_BUTTON
222
        add     ecx, -sizeof.SYS_BUTTON
262
        pop     ebx
223
        pop     ebx
263
        jmp     .next_button
224
        jmp     .next_button
264
 
-
 
265
  .exit:
-
 
266
        ret
-
 
267
 
-
 
268
align 4
225
 
269
;------------------------------------------------------------------------------
226
;---------------------------------------------------------------
270
sys_button_activate_handler: ;/////////////////////////////////////////////////
-
 
271
;------------------------------------------------------------------------------
227
sys_button_activate_handler:
272
;? 
228
sys_button_deactivate_handler:
273
;------------------------------------------------------------------------------
229
;---------------------------------------------------------------
274
;> eax = pack[8(process slot), 24(button id)]
230
;> eax = pack[8(process slot), 24(button id)]
275
;> ebx = pack[16(button x coord), 16(button y coord)]
231
;> ebx = pack[16(button x coord), 16(button y coord)]
276
;> cl = mouse button mask this system button was pressed with
232
;> cl = mouse button mask this system button was pressed with
277
;------------------------------------------------------------------------------
-
 
278
        call    button._.find_button
-
 
279
        or      eax, eax
-
 
280
        jz      .exit
-
 
281
 
-
 
282
        mov     ebx, dword[eax + SYS_BUTTON.id_hi - 2]
-
 
283
        call    button._.negative_button
-
 
284
 
-
 
285
  .exit:
-
 
286
        ret
-
 
287
 
-
 
288
align 4
-
 
289
;------------------------------------------------------------------------------
-
 
290
sys_button_deactivate_handler: ;///////////////////////////////////////////////
-
 
291
;------------------------------------------------------------------------------
-
 
292
;? 
-
 
293
;------------------------------------------------------------------------------
-
 
294
;> eax = pack[8(process slot), 24(button id)]
-
 
295
;> ebx = pack[16(button x coord), 16(button y coord)]
-
 
296
;> cl = mouse button mask this system button was pressed with
-
 
297
;------------------------------------------------------------------------------
-
 
298
        call    button._.find_button
-
 
299
        or      eax, eax
-
 
300
        jz      .exit
-
 
301
 
-
 
302
        mov     ebx, dword[eax + SYS_BUTTON.id_hi - 2]
-
 
303
        call    button._.negative_button
-
 
304
 
-
 
305
  .exit:
-
 
306
        ret
-
 
307
 
-
 
308
align 4
-
 
309
;------------------------------------------------------------------------------
-
 
310
sys_button_perform_handler: ;//////////////////////////////////////////////////
-
 
311
;------------------------------------------------------------------------------
-
 
312
;? 
-
 
313
;------------------------------------------------------------------------------
-
 
314
;> eax = pack[8(process slot), 24(button id)]
-
 
315
;> ebx = pack[16(button x coord), 16(button y coord)]
-
 
316
;> cl = mouse button mask this system button was pressed with
-
 
317
;------------------------------------------------------------------------------
-
 
318
        shl     eax, 8
-
 
319
        mov     al, cl
-
 
320
        movzx   ebx, byte[BTN_COUNT]
-
 
321
        mov     [BTN_BUFF + ebx * 4], eax
-
 
322
        inc     bl
-
 
323
        mov     [BTN_COUNT], bl
-
 
324
        ret
-
 
325
 
-
 
326
;==============================================================================
-
 
327
;///// private functions //////////////////////////////////////////////////////
-
 
328
;==============================================================================
-
 
329
 
-
 
330
;------------------------------------------------------------------------------
-
 
331
button._.find_button: ;////////////////////////////////////////////////////////
-
 
332
;------------------------------------------------------------------------------
233
;---------------------------------------------------------------
333
;? Find system button by specified process slot, id and coordinates
234
; find system button by specified process slot, id and coordinates
334
;------------------------------------------------------------------------------
-
 
335
;> eax = pack[8(process slot), 24(button id)] or 0
-
 
336
;> ebx = pack[16(button x coord), 16(button y coord)]
-
 
337
;------------------------------------------------------------------------------
-
 
338
;< eax = pointer to SYS_BUTTON struct or 0
-
 
339
;------------------------------------------------------------------------------
-
 
340
        push    ecx edx esi edi
235
        push    ecx edx esi edi
341
 
-
 
342
        mov     edx, eax
236
        mov     edx, eax
343
        shr     edx, 24
237
        shr     edx, 24
344
        and     eax, 0x0ffffff
238
        and     eax, 0x0ffffff
345
 
-
 
346
        mov     edi, [BTN_ADDR]
239
        mov     edi, [BTN_ADDR]
347
        mov     ecx, [edi]
240
        mov     ecx, [edi]
348
        imul    esi, ecx, sizeof.SYS_BUTTON
241
        imul    esi, ecx, sizeof.SYS_BUTTON
349
        add     esi, edi
242
        add     esi, edi
350
        inc     ecx
243
        inc     ecx
351
        add     esi, sizeof.SYS_BUTTON
244
        add     esi, sizeof.SYS_BUTTON
352
 
-
 
353
  .next_button:
245
.next_button:
354
        dec     ecx
246
        dec     ecx
355
        jz      .not_found
247
        jz      .popexit
356
 
-
 
357
        add     esi, -sizeof.SYS_BUTTON
248
        add     esi, -sizeof.SYS_BUTTON
358
 
249
 
359
        ; does it belong to our process?
250
        ; does it belong to our process?
360
        cmp     dx, [esi + SYS_BUTTON.pslot]
251
        cmp     dx, [esi + SYS_BUTTON.pslot]
361
        jne     .next_button
252
        jne     .next_button
362
 
253
 
363
        ; does id match?
254
        ; does id match?
364
        mov     edi, dword[esi + SYS_BUTTON.id_hi - 2]
255
        mov     edi, dword[esi + SYS_BUTTON.id_hi - 2]
365
        mov     di, [esi + SYS_BUTTON.id_lo]
256
        mov     di, [esi + SYS_BUTTON.id_lo]
366
        and     edi, 0x0ffffff
257
        and     edi, 0x0ffffff
367
        cmp     eax, edi
258
        cmp     eax, edi
368
        jne     .next_button
259
        jne     .next_button
369
 
260
 
370
        ; does coordinates match?
261
        ; does coordinates match?
371
        mov     edi, dword[esi + SYS_BUTTON.left - 2]
262
        mov     edi, dword[esi + SYS_BUTTON.left - 2]
372
        mov     di, [esi + SYS_BUTTON.top]
263
        mov     di, [esi + SYS_BUTTON.top]
373
        cmp     ebx, edi
264
        cmp     ebx, edi
374
        jne     .next_button
265
        jne     .next_button
375
 
-
 
376
        ; okay, return it
266
 
377
        mov     eax, esi
-
 
378
        jmp     .exit
-
 
379
 
-
 
380
  .not_found:
-
 
381
        xor     eax, eax
-
 
382
 
-
 
383
  .exit:
267
        mov     eax, esi
384
        pop     edi esi edx ecx
-
 
385
        ret
-
 
386
 
-
 
387
;------------------------------------------------------------------------------
-
 
388
button._.dececx: ;/////////////////////////////////////////////////////////////
-
 
389
;------------------------------------------------------------------------------
-
 
390
;? 
-
 
391
;------------------------------------------------------------------------------
-
 
392
        sub     cl, 0x20
-
 
393
        jnc     @f
-
 
394
        xor     cl, cl
-
 
395
    @@:
-
 
396
        sub     ch, 0x20
-
 
397
        jnc     @f
-
 
398
        xor     ch, ch
-
 
399
    @@:
-
 
400
        rol     ecx, 16
-
 
401
        sub     cl, 0x20
-
 
402
        jnc     @f
-
 
403
        xor     cl, cl
-
 
404
    @@:
-
 
405
        rol     ecx, 16
-
 
406
        ret
-
 
407
 
-
 
408
;------------------------------------------------------------------------------
-
 
409
button._.incecx: ;/////////////////////////////////////////////////////////////
-
 
410
;------------------------------------------------------------------------------
-
 
411
;? 
-
 
412
;------------------------------------------------------------------------------
-
 
413
        add     cl, 0x20
-
 
414
        jnc     @f
-
 
415
        or      cl, -1
-
 
416
    @@:
-
 
417
        add     ch, 0x20
-
 
418
        jnc     @f
-
 
419
        or      ch, -1
-
 
420
    @@:
-
 
421
        rol     ecx, 16
-
 
422
        add     cl, 0x20
-
 
423
        jnc     @f
-
 
424
        or      cl, -1
-
 
425
    @@:
-
 
426
        rol     ecx, 16
-
 
427
        ret
-
 
428
 
-
 
429
;------------------------------------------------------------------------------
-
 
430
button._.incecx2: ;////////////////////////////////////////////////////////////
-
 
431
;------------------------------------------------------------------------------
-
 
432
;? 
-
 
433
;------------------------------------------------------------------------------
-
 
434
        add     cl, 0x14
-
 
435
        jnc     @f
-
 
436
        or      cl, -1
-
 
437
    @@:
-
 
438
        add     ch, 0x14
-
 
439
        jnc     @f
-
 
440
        or      ch, -1
-
 
441
    @@:
-
 
442
        rol     ecx, 16
-
 
443
        add     cl, 0x14
-
 
444
        jnc     @f
-
 
445
        or      cl, -1
-
 
446
    @@:
-
 
447
        rol     ecx, 16
-
 
448
        ret
-
 
449
 
-
 
450
;------------------------------------------------------------------------------
-
 
451
button._.button_dececx: ;//////////////////////////////////////////////////////
-
 
452
;------------------------------------------------------------------------------
-
 
453
;? 
-
 
454
;------------------------------------------------------------------------------
268
        pop     edi esi edx ecx
455
        cmp     [buttontype], 1
-
 
456
        jne     .finish
-
 
457
 
-
 
458
        push    eax
-
 
459
        mov     al, 1
-
 
460
        cmp     edi, 20
-
 
461
        jg      @f
-
 
462
        mov     al, 2
-
 
463
 
-
 
464
    @@:
-
 
465
        sub     cl, al
-
 
466
        jnc     @f
-
 
467
        xor     cl, cl
-
 
468
    @@:
-
 
469
        sub     ch, al
-
 
470
        jnc     @f
-
 
471
        xor     ch, ch
-
 
472
    @@:
-
 
473
        rol     ecx, 16
-
 
474
        sub     cl, al
-
 
475
        jnc     @f
-
 
476
        xor     cl, cl
-
 
477
    @@:
-
 
478
        rol     ecx, 16
-
 
479
 
-
 
480
        pop     eax
-
 
481
 
-
 
482
  .finish:
-
 
483
        ret
-
 
484
 
-
 
485
;------------------------------------------------------------------------------
-
 
486
button._.negative_button: ;////////////////////////////////////////////////////
-
 
487
;------------------------------------------------------------------------------
-
 
488
;? Invert system button border
269
        mov     ebx, dword[eax + SYS_BUTTON.id_hi - 2]
489
;------------------------------------------------------------------------------
270
 
490
        ; if requested, do not display button border on press.
271
        ; display button border on press?
491
        test    ebx, 0x20000000
272
        test    ebx, 0x20000000
492
        jnz     .exit
273
        jnz     .exit
-
 
274
 
493
 
275
        ; invert system button border
494
        pushad
-
 
495
 
276
        pushad
496
        xchg    esi, eax
-
 
497
 
277
        mov     esi, eax
498
        movzx   ecx, [esi + SYS_BUTTON.pslot]
278
        movzx   ecx, [esi + SYS_BUTTON.pslot]
499
        shl     ecx, 5
279
        shl     ecx, 5
500
        add     ecx, window_data
280
        add     ecx, window_data
501
 
-
 
502
        mov     eax, dword[esi + SYS_BUTTON.left]
281
        mov     eax, dword[esi + SYS_BUTTON.left]
503
        mov     ebx, dword[esi + SYS_BUTTON.top]
282
        mov     ebx, dword[esi + SYS_BUTTON.top]
504
        add     eax, [ecx + WDATA.box.left]
283
        add     eax, [ecx + WDATA.box.left]
505
        add     ebx, [ecx + WDATA.box.top]
284
        add     ebx, [ecx + WDATA.box.top]
506
        push    eax ebx
-
 
507
        pop     edx ecx
-
 
508
        rol     eax, 16
285
        rol     eax, 16
509
        rol     ebx, 16
286
        rol     ebx, 16
-
 
287
        push    eax ebx
510
        add     ax, cx
288
        shr     eax, 16
511
        add     bx, dx
289
        shr     ebx, 16
512
 
-
 
-
 
290
        mov     edx, eax
-
 
291
        add     dx, [esp+4]
-
 
292
        dec     edx
-
 
293
        inc     eax
513
        mov     esi, 0x01000000
294
        mov     ecx, 1000000h
-
 
295
        xor     edi, edi
-
 
296
        inc     edi
-
 
297
        call    hline
-
 
298
        add     bx, [esp]
-
 
299
        call    hline
-
 
300
        inc     edx
-
 
301
        push    edx
-
 
302
        mov     edx, ebx
-
 
303
        sub     bx, [esp+4]
-
 
304
        dec     eax
514
        call    draw_rectangle.forced
305
        cmp     [buttontype], 1
-
 
306
        jnz     @f
-
 
307
        dec     edx
-
 
308
        inc     ebx
515
 
309
@@:
-
 
310
        call    vline
-
 
311
        pop     eax
-
 
312
        call    vline
-
 
313
        pop     eax eax
516
        popad
314
        popad
517
 
-
 
518
  .exit:
315
.exit:
519
        ret
316
        ret
-
 
317
.popexit:
-
 
318
        pop     edi esi edx ecx
-
 
319
        ret
-
 
320
 
-
 
321
;---------------------------------------------------------------
-
 
322
sys_button_perform_handler:
-
 
323
;---------------------------------------------------------------
-
 
324
;> eax = pack[8(process slot), 24(button id)]
-
 
325
;> ebx = pack[16(button x coord), 16(button y coord)]
-
 
326
;> cl = mouse button mask this system button was pressed with
-
 
327
;---------------------------------------------------------------
-
 
328
        shl     eax, 8
-
 
329
        mov     al, cl
-
 
330
        movzx   ebx, byte[BTN_COUNT]
-
 
331
        mov     [BTN_BUFF + ebx * 4], eax
-
 
332
        inc     bl
-
 
333
        mov     [BTN_COUNT], bl
-
 
334
        ret