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 |