Subversion Repositories Kolibri OS

Rev

Rev 8926 | Rev 9911 | 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: 9709 $
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
9709 Doczom 139
        mov     eax, [current_slot_idx]
140
        shl     eax, BSF sizeof.WDATA
141
        add     ebx, [eax + window_data + WDATA.box.left]
142
        add     ecx, [eax + window_data + WDATA.box.top]
5185 mario79 143
        mov     eax, ebx
5580 leency 144
        inc     eax
6031 pathoswith 145
        mov     edx, ebx
146
        add     dx, [esp+8]
147
        dec     edx
5185 mario79 148
        mov     ebx, ecx
1334 mikedld 149
        mov     ecx, esi
6031 pathoswith 150
        shr     ecx, 1
6032 pathoswith 151
        and     cx, 7F7Fh
6031 pathoswith 152
        push    esi
153
        mov     esi, edi
5185 mario79 154
        xor     edi, edi
6031 pathoswith 155
        call    hline   ; top border
156
        inc     ebx
6032 pathoswith 157
        or      ecx, 808080h
158
        call    hline   ; top light line
6031 pathoswith 159
        pop     ecx
6032 pathoswith 160
        inc     ebx
6031 pathoswith 161
.next_line:
162
        call    hline   ; button body
163
        inc     ebx
164
        sub     ecx, esi
165
        dec     ebp
1334 mikedld 166
        jnz     .next_line
6032 pathoswith 167
        shr     ecx, 2
168
        and     cx, 3F3Fh
169
        mov     ebp, ecx
170
        shl     ecx, 1
171
        add     ecx, ebp
172
        call    hline   ; bottom dark line
173
        inc     ebx
174
        sub     ecx, ebp
6031 pathoswith 175
        call    hline   ; bottom border
176
        pop     ecx
177
        shr     ecx, 1
178
        inc     edx
5185 mario79 179
        push    edx
180
        mov     edx, ebx
6031 pathoswith 181
        sub     bx, [esp+4]
6032 pathoswith 182
        dec     edx
183
        inc     ebx
184
        cmp     [buttontype], 0
6031 pathoswith 185
        jnz     @f
186
        dec     edx
6032 pathoswith 187
        or      ecx, 808080h
188
        call    vline   ; left light line
189
        inc     edx
6031 pathoswith 190
@@:
6032 pathoswith 191
        and     ecx, 7F7F7Fh
192
        dec     eax
6031 pathoswith 193
        call    vline   ; left border
194
        pop     eax
195
        call    vline   ; right border
6032 pathoswith 196
        cmp     [buttontype], 0
197
        jnz     @f
198
        mov     ebp, ecx
199
        shr     ecx, 1
200
        and     cx, 7F7Fh
201
        add     ecx, ebp
202
        dec     eax
203
        inc     ebx
8926 leency 204
        dec     edx     ; avoid lines overflow
6032 pathoswith 205
        call    vline   ; right dark line
206
@@:
5185 mario79 207
        pop     ecx ebx
6031 pathoswith 208
.exit:
1334 mikedld 209
        ret
210
 
211
; FIXME: mutex needed
6031 pathoswith 212
.remove_button:
1334 mikedld 213
        and     edx, 0x00ffffff
214
        mov     edi, [BTN_ADDR]
215
        mov     ebx, [edi]
216
        inc     ebx
2384 hidnplayr 217
        imul    esi, ebx, sizeof.SYS_BUTTON
1334 mikedld 218
        add     esi, edi
219
        xor     ecx, ecx
2384 hidnplayr 220
        add     ecx, -sizeof.SYS_BUTTON
221
        add     esi, sizeof.SYS_BUTTON
1334 mikedld 222
 
6031 pathoswith 223
.next_button:
1334 mikedld 224
        dec     ebx
225
        jz      .exit
226
 
2384 hidnplayr 227
        add     ecx, sizeof.SYS_BUTTON
228
        add     esi, -sizeof.SYS_BUTTON
1334 mikedld 229
 
230
        ; does it belong to our process?
8869 rgimad 231
        mov     ax, word [current_slot_idx]
1334 mikedld 232
        cmp     ax, [esi + SYS_BUTTON.pslot]
233
        jne     .next_button
234
 
235
        ; does the identifier match?
236
        mov     eax, dword[esi + SYS_BUTTON.id_hi - 2]
237
        mov     ax, [esi + SYS_BUTTON.id_lo]
238
        and     eax, 0x00ffffff
239
        cmp     edx, eax
240
        jne     .next_button
241
 
242
        ; okay, undefine it
1341 mikedld 243
        push    ebx
1334 mikedld 244
        mov     ebx, esi
2384 hidnplayr 245
        lea     eax, [esi + sizeof.SYS_BUTTON]
1334 mikedld 246
        call    memmove
247
        dec     dword[edi]
2384 hidnplayr 248
        add     ecx, -sizeof.SYS_BUTTON
1341 mikedld 249
        pop     ebx
1334 mikedld 250
        jmp     .next_button
251
 
6031 pathoswith 252
;---------------------------------------------------------------
253
sys_button_activate_handler:
254
sys_button_deactivate_handler:
255
;---------------------------------------------------------------
1391 mikedld 256
;> eax = pack[8(process slot), 24(button id)]
257
;> ebx = pack[16(button x coord), 16(button y coord)]
258
;> cl = mouse button mask this system button was pressed with
6031 pathoswith 259
;---------------------------------------------------------------
260
; find system button by specified process slot, id and coordinates
1391 mikedld 261
        push    ecx edx esi edi
262
        mov     edx, eax
263
        shr     edx, 24
264
        and     eax, 0x0ffffff
265
        mov     edi, [BTN_ADDR]
266
        mov     ecx, [edi]
2384 hidnplayr 267
        imul    esi, ecx, sizeof.SYS_BUTTON
1391 mikedld 268
        add     esi, edi
269
        inc     ecx
2384 hidnplayr 270
        add     esi, sizeof.SYS_BUTTON
6031 pathoswith 271
.next_button:
1391 mikedld 272
        dec     ecx
6031 pathoswith 273
        jz      .popexit
2384 hidnplayr 274
        add     esi, -sizeof.SYS_BUTTON
1334 mikedld 275
 
1391 mikedld 276
        ; does it belong to our process?
277
        cmp     dx, [esi + SYS_BUTTON.pslot]
278
        jne     .next_button
1334 mikedld 279
 
1391 mikedld 280
        ; does id match?
281
        mov     edi, dword[esi + SYS_BUTTON.id_hi - 2]
282
        mov     di, [esi + SYS_BUTTON.id_lo]
283
        and     edi, 0x0ffffff
284
        cmp     eax, edi
285
        jne     .next_button
1334 mikedld 286
 
1391 mikedld 287
        ; does coordinates match?
288
        mov     edi, dword[esi + SYS_BUTTON.left - 2]
289
        mov     di, [esi + SYS_BUTTON.top]
290
        cmp     ebx, edi
291
        jne     .next_button
1334 mikedld 292
 
1391 mikedld 293
        mov     eax, esi
294
        pop     edi esi edx ecx
6031 pathoswith 295
        mov     ebx, dword[eax + SYS_BUTTON.id_hi - 2]
1334 mikedld 296
 
6031 pathoswith 297
        ; display button border on press?
6044 pathoswith 298
        bt      ebx, 29
299
        jc      .exit
1334 mikedld 300
 
6031 pathoswith 301
        ; invert system button border
1334 mikedld 302
        pushad
6031 pathoswith 303
        mov     esi, eax
6044 pathoswith 304
        mov     edi, ebx
1362 mikedld 305
        movzx   ecx, [esi + SYS_BUTTON.pslot]
306
        shl     ecx, 5
307
        add     ecx, window_data
308
        mov     eax, dword[esi + SYS_BUTTON.left]
309
        mov     ebx, dword[esi + SYS_BUTTON.top]
310
        add     eax, [ecx + WDATA.box.left]
311
        add     ebx, [ecx + WDATA.box.top]
6035 pathoswith 312
        mov     ecx, eax
313
        mov     edx, ebx
6044 pathoswith 314
        bt      edi, 30
315
        jc      @f
6035 pathoswith 316
        inc     ax
317
        inc     bx
6044 pathoswith 318
        dec     cx
319
        dec     dx
320
@@:
1362 mikedld 321
        rol     eax, 16
322
        rol     ebx, 16
6035 pathoswith 323
        add     ax, cx
324
        add     bx, dx
325
        mov     esi, 1000000h
326
        call    draw_rectangle.forced
1362 mikedld 327
        popad
6031 pathoswith 328
.exit:
329
        ret
330
.popexit:
331
        pop     edi esi edx ecx
332
        ret
5185 mario79 333
 
6031 pathoswith 334
;---------------------------------------------------------------
335
sys_button_perform_handler:
336
;---------------------------------------------------------------
337
;> eax = pack[8(process slot), 24(button id)]
338
;> ebx = pack[16(button x coord), 16(button y coord)]
339
;> cl = mouse button mask this system button was pressed with
340
;---------------------------------------------------------------
341
        shl     eax, 8
342
        mov     al, cl
343
        movzx   ebx, byte[BTN_COUNT]
344
        mov     [BTN_BUFF + ebx * 4], eax
345
        inc     bl
346
        mov     [BTN_COUNT], bl
1334 mikedld 347
        ret