Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1334 mikedld 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
6035 pathoswith 3
;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;;
1334 mikedld 4
;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa      ;;
5
;; Distributed under terms of the GNU General Public License    ;;
6
;;                                                              ;;
7
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8
 
9
$Revision: 8926 $
10
 
1391 mikedld 11
button.MAX_BUTTONS = 4095
12
 
2384 hidnplayr 13
struct  SYS_BUTTON
14
        pslot           dw ?
15
        id_lo           dw ?
16
        left            dw ?
17
        width           dw ?
18
        top             dw ?
19
        height          dw ?
20
        id_hi           dw ?
21
                        dw ?
22
ends
1334 mikedld 23
 
6031 pathoswith 24
;---------------------------------------------------------------
25
syscall_button: ;////////////// system function 8 //////////////
26
;---------------------------------------------------------------
1362 mikedld 27
;? Define/undefine GUI button object
6031 pathoswith 28
;---------------------------------------------------------------
1362 mikedld 29
;; Define button:
30
;> ebx = pack[16(x), 16(width)]
31
;> ecx = pack[16(y), 16(height)]
32
;> edx = pack[8(flags), 24(button identifier)]
33
;>       flags bits:
34
;>          7 (31) = 0
35
;>          6 (30) = don't draw button
36
;>          5 (29) = don't draw button frame when pressed
37
;> esi = button color
6031 pathoswith 38
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1362 mikedld 39
;; Undefine button:
40
;> edx = pack[8(flags), 24(button identifier)]
41
;>       flags bits:
42
;>          7 (31) = 1
6031 pathoswith 43
;---------------------------------------------------------------
1334 mikedld 44
        ; do we actually need to undefine the button?
45
        test    edx, 0x80000000
46
        jnz     .remove_button
47
 
48
        ; do we have free button slots available?
49
        mov     edi, [BTN_ADDR]
50
        mov     eax, [edi]
1391 mikedld 51
        cmp     eax, button.MAX_BUTTONS
1334 mikedld 52
        jge     .exit
53
 
54
        ; does it have positive size? (otherwise it doesn't have sense)
55
        or      bx, bx
56
        jle     .exit
57
        or      cx, cx
58
        jle     .exit
59
 
60
        ; make coordinates clientbox-relative
61
        push    eax
62
        mov     eax, [current_slot]
63
        rol     ebx, 16
64
        add     bx, word[eax + APPDATA.wnd_clientbox.left]
65
        rol     ebx, 16
66
        rol     ecx, 16
67
        add     cx, word[eax + APPDATA.wnd_clientbox.top]
68
        rol     ecx, 16
69
        pop     eax
70
 
71
        ; basic checks passed, define the button
72
        inc     eax
73
        mov     [edi], ax
74
        shl     eax, 4
75
        add     edi, eax
6031 pathoswith 76
; NOTE: this code doesn't rely on SYS_BUTTON struct,
77
; please revise it, if you change something.
8869 rgimad 78
        mov     ax, word [current_slot_idx]
1334 mikedld 79
        stosw
80
        mov     ax, dx
81
        stosw               ; button id number: bits 0-15
82
        mov     eax, ebx
83
        rol     eax, 16
84
        stosd               ; x start | x size
85
        mov     eax, ecx
86
        rol     eax, 16
87
        stosd               ; y start | y size
88
        mov     eax, edx
89
        shr     eax, 16
90
        stosw               ; button id number: bits 16-31
91
 
92
        ; do we also need to draw the button?
93
        test    edx, 0x40000000
94
        jnz     .exit
95
 
6032 pathoswith 96
        and     esi, 0xFFFFFF
6031 pathoswith 97
        xor     edi, edi
98
        push    ebx ecx esi
6032 pathoswith 99
        dec     cx
100
        dec     cx
6031 pathoswith 101
        cmp     [buttontype], 1
102
        jnz     .draw
6032 pathoswith 103
        cmp     cx, 65
6031 pathoswith 104
        jnc     .draw
5185 mario79 105
 
6031 pathoswith 106
        ; calculate gradient data
107
        mov     eax, esi
108
        shl     eax, 8
109
        mov     edx, 3
110
.calculate:
111
        rol     eax, 8
112
        shl     al, 1
113
        jnc     @f
114
        neg     al
115
        jnz     @f
6032 pathoswith 116
        mov     al, 64
6031 pathoswith 117
@@:
6032 pathoswith 118
        cmp     al, 65
119
        jc      @f
120
        mov     al, 64
6031 pathoswith 121
@@:
122
        div     cl
123
        shl     ax, 8
124
        dec     edx
125
        jnz     .calculate
126
        mov     dl, cl
127
        dec     edx
128
        shr     edx, 1
129
        shr     eax, 8
130
        mov     edi, eax
131
        mul     edx
132
        add     esi, eax
5185 mario79 133
 
6031 pathoswith 134
.draw:  ; calculate window-relative coordinates
135
        movzx   ebp, cx
136
        dec     ebp
5185 mario79 137
        shr     ebx, 16
138
        shr     ecx, 16
139
        mov     eax, [TASK_BASE]
140
        add     ebx, [eax - twdw + WDATA.box.left]
141
        add     ecx, [eax - twdw + WDATA.box.top]
142
        mov     eax, ebx
5580 leency 143
        inc     eax
6031 pathoswith 144
        mov     edx, ebx
145
        add     dx, [esp+8]
146
        dec     edx
5185 mario79 147
        mov     ebx, ecx
1334 mikedld 148
        mov     ecx, esi
6031 pathoswith 149
        shr     ecx, 1
6032 pathoswith 150
        and     cx, 7F7Fh
6031 pathoswith 151
        push    esi
152
        mov     esi, edi
5185 mario79 153
        xor     edi, edi
6031 pathoswith 154
        call    hline   ; top border
155
        inc     ebx
6032 pathoswith 156
        or      ecx, 808080h
157
        call    hline   ; top light line
6031 pathoswith 158
        pop     ecx
6032 pathoswith 159
        inc     ebx
6031 pathoswith 160
.next_line:
161
        call    hline   ; button body
162
        inc     ebx
163
        sub     ecx, esi
164
        dec     ebp
1334 mikedld 165
        jnz     .next_line
6032 pathoswith 166
        shr     ecx, 2
167
        and     cx, 3F3Fh
168
        mov     ebp, ecx
169
        shl     ecx, 1
170
        add     ecx, ebp
171
        call    hline   ; bottom dark line
172
        inc     ebx
173
        sub     ecx, ebp
6031 pathoswith 174
        call    hline   ; bottom border
175
        pop     ecx
176
        shr     ecx, 1
177
        inc     edx
5185 mario79 178
        push    edx
179
        mov     edx, ebx
6031 pathoswith 180
        sub     bx, [esp+4]
6032 pathoswith 181
        dec     edx
182
        inc     ebx
183
        cmp     [buttontype], 0
6031 pathoswith 184
        jnz     @f
185
        dec     edx
6032 pathoswith 186
        or      ecx, 808080h
187
        call    vline   ; left light line
188
        inc     edx
6031 pathoswith 189
@@:
6032 pathoswith 190
        and     ecx, 7F7F7Fh
191
        dec     eax
6031 pathoswith 192
        call    vline   ; left border
193
        pop     eax
194
        call    vline   ; right border
6032 pathoswith 195
        cmp     [buttontype], 0
196
        jnz     @f
197
        mov     ebp, ecx
198
        shr     ecx, 1
199
        and     cx, 7F7Fh
200
        add     ecx, ebp
201
        dec     eax
202
        inc     ebx
8926 leency 203
        dec     edx     ; avoid lines overflow
6032 pathoswith 204
        call    vline   ; right dark line
205
@@:
5185 mario79 206
        pop     ecx ebx
6031 pathoswith 207
.exit:
1334 mikedld 208
        ret
209
 
210
; FIXME: mutex needed
6031 pathoswith 211
.remove_button:
1334 mikedld 212
        and     edx, 0x00ffffff
213
        mov     edi, [BTN_ADDR]
214
        mov     ebx, [edi]
215
        inc     ebx
2384 hidnplayr 216
        imul    esi, ebx, sizeof.SYS_BUTTON
1334 mikedld 217
        add     esi, edi
218
        xor     ecx, ecx
2384 hidnplayr 219
        add     ecx, -sizeof.SYS_BUTTON
220
        add     esi, sizeof.SYS_BUTTON
1334 mikedld 221
 
6031 pathoswith 222
.next_button:
1334 mikedld 223
        dec     ebx
224
        jz      .exit
225
 
2384 hidnplayr 226
        add     ecx, sizeof.SYS_BUTTON
227
        add     esi, -sizeof.SYS_BUTTON
1334 mikedld 228
 
229
        ; does it belong to our process?
8869 rgimad 230
        mov     ax, word [current_slot_idx]
1334 mikedld 231
        cmp     ax, [esi + SYS_BUTTON.pslot]
232
        jne     .next_button
233
 
234
        ; does the identifier match?
235
        mov     eax, dword[esi + SYS_BUTTON.id_hi - 2]
236
        mov     ax, [esi + SYS_BUTTON.id_lo]
237
        and     eax, 0x00ffffff
238
        cmp     edx, eax
239
        jne     .next_button
240
 
241
        ; okay, undefine it
1341 mikedld 242
        push    ebx
1334 mikedld 243
        mov     ebx, esi
2384 hidnplayr 244
        lea     eax, [esi + sizeof.SYS_BUTTON]
1334 mikedld 245
        call    memmove
246
        dec     dword[edi]
2384 hidnplayr 247
        add     ecx, -sizeof.SYS_BUTTON
1341 mikedld 248
        pop     ebx
1334 mikedld 249
        jmp     .next_button
250
 
6031 pathoswith 251
;---------------------------------------------------------------
252
sys_button_activate_handler:
253
sys_button_deactivate_handler:
254
;---------------------------------------------------------------
1391 mikedld 255
;> eax = pack[8(process slot), 24(button id)]
256
;> ebx = pack[16(button x coord), 16(button y coord)]
257
;> cl = mouse button mask this system button was pressed with
6031 pathoswith 258
;---------------------------------------------------------------
259
; find system button by specified process slot, id and coordinates
1391 mikedld 260
        push    ecx edx esi edi
261
        mov     edx, eax
262
        shr     edx, 24
263
        and     eax, 0x0ffffff
264
        mov     edi, [BTN_ADDR]
265
        mov     ecx, [edi]
2384 hidnplayr 266
        imul    esi, ecx, sizeof.SYS_BUTTON
1391 mikedld 267
        add     esi, edi
268
        inc     ecx
2384 hidnplayr 269
        add     esi, sizeof.SYS_BUTTON
6031 pathoswith 270
.next_button:
1391 mikedld 271
        dec     ecx
6031 pathoswith 272
        jz      .popexit
2384 hidnplayr 273
        add     esi, -sizeof.SYS_BUTTON
1334 mikedld 274
 
1391 mikedld 275
        ; does it belong to our process?
276
        cmp     dx, [esi + SYS_BUTTON.pslot]
277
        jne     .next_button
1334 mikedld 278
 
1391 mikedld 279
        ; does id match?
280
        mov     edi, dword[esi + SYS_BUTTON.id_hi - 2]
281
        mov     di, [esi + SYS_BUTTON.id_lo]
282
        and     edi, 0x0ffffff
283
        cmp     eax, edi
284
        jne     .next_button
1334 mikedld 285
 
1391 mikedld 286
        ; does coordinates match?
287
        mov     edi, dword[esi + SYS_BUTTON.left - 2]
288
        mov     di, [esi + SYS_BUTTON.top]
289
        cmp     ebx, edi
290
        jne     .next_button
1334 mikedld 291
 
1391 mikedld 292
        mov     eax, esi
293
        pop     edi esi edx ecx
6031 pathoswith 294
        mov     ebx, dword[eax + SYS_BUTTON.id_hi - 2]
1334 mikedld 295
 
6031 pathoswith 296
        ; display button border on press?
6044 pathoswith 297
        bt      ebx, 29
298
        jc      .exit
1334 mikedld 299
 
6031 pathoswith 300
        ; invert system button border
1334 mikedld 301
        pushad
6031 pathoswith 302
        mov     esi, eax
6044 pathoswith 303
        mov     edi, ebx
1362 mikedld 304
        movzx   ecx, [esi + SYS_BUTTON.pslot]
305
        shl     ecx, 5
306
        add     ecx, window_data
307
        mov     eax, dword[esi + SYS_BUTTON.left]
308
        mov     ebx, dword[esi + SYS_BUTTON.top]
309
        add     eax, [ecx + WDATA.box.left]
310
        add     ebx, [ecx + WDATA.box.top]
6035 pathoswith 311
        mov     ecx, eax
312
        mov     edx, ebx
6044 pathoswith 313
        bt      edi, 30
314
        jc      @f
6035 pathoswith 315
        inc     ax
316
        inc     bx
6044 pathoswith 317
        dec     cx
318
        dec     dx
319
@@:
1362 mikedld 320
        rol     eax, 16
321
        rol     ebx, 16
6035 pathoswith 322
        add     ax, cx
323
        add     bx, dx
324
        mov     esi, 1000000h
325
        call    draw_rectangle.forced
1362 mikedld 326
        popad
6031 pathoswith 327
.exit:
328
        ret
329
.popexit:
330
        pop     edi esi edx ecx
331
        ret
5185 mario79 332
 
6031 pathoswith 333
;---------------------------------------------------------------
334
sys_button_perform_handler:
335
;---------------------------------------------------------------
336
;> eax = pack[8(process slot), 24(button id)]
337
;> ebx = pack[16(button x coord), 16(button y coord)]
338
;> cl = mouse button mask this system button was pressed with
339
;---------------------------------------------------------------
340
        shl     eax, 8
341
        mov     al, cl
342
        movzx   ebx, byte[BTN_COUNT]
343
        mov     [BTN_BUFF + ebx * 4], eax
344
        inc     bl
345
        mov     [BTN_COUNT], bl
1334 mikedld 346
        ret