Rev 9930 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1391 | mikedld | 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
||
9941 | Doczom | 3 | ;; Copyright (C) KolibriOS team 2010-2023. All rights reserved. ;; |
1391 | mikedld | 4 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; ;; |
||
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
7 | |||
1531 | diamond | 8 | $Revision: 9941 $ |
1391 | mikedld | 9 | |
5851 | pathoswith | 10 | ;================================ |
11 | ;/////// public functions /////// |
||
12 | ;================================ |
||
1391 | mikedld | 13 | |
14 | mouse.LEFT_BUTTON_FLAG = 0001b |
||
15 | mouse.RIGHT_BUTTON_FLAG = 0010b |
||
16 | mouse.MIDDLE_BUTTON_FLAG = 0100b |
||
17 | |||
18 | mouse.BUTTONS_MASK = \ |
||
19 | mouse.LEFT_BUTTON_FLAG or \ |
||
20 | mouse.RIGHT_BUTTON_FLAG or \ |
||
21 | mouse.MIDDLE_BUTTON_FLAG |
||
22 | |||
23 | mouse.WINDOW_RESIZE_N_FLAG = 000001b |
||
24 | mouse.WINDOW_RESIZE_W_FLAG = 000010b |
||
25 | mouse.WINDOW_RESIZE_S_FLAG = 000100b |
||
26 | mouse.WINDOW_RESIZE_E_FLAG = 001000b |
||
27 | mouse.WINDOW_MOVE_FLAG = 010000b |
||
28 | |||
29 | mouse.WINDOW_RESIZE_SW_FLAG = \ |
||
30 | mouse.WINDOW_RESIZE_S_FLAG or \ |
||
31 | mouse.WINDOW_RESIZE_W_FLAG |
||
32 | mouse.WINDOW_RESIZE_SE_FLAG = \ |
||
33 | mouse.WINDOW_RESIZE_S_FLAG or \ |
||
34 | mouse.WINDOW_RESIZE_E_FLAG |
||
35 | |||
36 | align 4 |
||
5851 | pathoswith | 37 | ;----------------------------------------------------------------- |
38 | mouse_check_events: |
||
39 | ; Check if mouse buttons state or cursor position has changed |
||
1391 | mikedld | 40 | push eax ebx |
41 | mov al, [BTN_DOWN] |
||
42 | mov bl, [mouse.state.buttons] |
||
43 | and al, mouse.BUTTONS_MASK |
||
44 | mov cl, al |
||
45 | xchg cl, [mouse.state.buttons] |
||
46 | xor bl, al |
||
47 | push eax ebx |
||
48 | |||
49 | ; did any mouse button changed its state? |
||
50 | or bl, bl |
||
51 | jz .check_position |
||
52 | |||
53 | ; yes it did, is that the first button of all pressed down? |
||
54 | or cl, cl |
||
55 | jnz .check_buttons_released |
||
56 | |||
57 | ; yes it is, activate window user is pointing at, if needed |
||
58 | call mouse._.activate_sys_window_under_cursor |
||
59 | |||
60 | ; is there any system button under cursor? |
||
2288 | clevermous | 61 | call mouse._.find_sys_button_under_cursor |
1391 | mikedld | 62 | or eax, eax |
63 | jz .check_buttons_released |
||
64 | |||
65 | ; yes there is, activate it and exit |
||
66 | mov [mouse.active_sys_button.pbid], eax |
||
67 | mov [mouse.active_sys_button.coord], ebx |
||
68 | mov cl, [mouse.state.buttons] |
||
69 | mov [mouse.active_sys_button.buttons], cl |
||
70 | call sys_button_activate_handler |
||
71 | jmp .exit |
||
72 | |||
73 | .check_buttons_released: |
||
74 | cmp [mouse.state.buttons], 0 |
||
75 | jnz .buttons_changed |
||
76 | |||
77 | ; did we press some button earlier? |
||
78 | cmp [mouse.active_sys_button.pbid], 0 |
||
79 | je .buttons_changed |
||
80 | |||
81 | ; yes we did, deactivate it |
||
82 | xor eax, eax |
||
83 | xchg eax, [mouse.active_sys_button.pbid] |
||
84 | mov ebx, [mouse.active_sys_button.coord] |
||
85 | mov cl, [mouse.active_sys_button.buttons] |
||
86 | push eax ebx |
||
87 | call sys_button_deactivate_handler |
||
88 | pop edx ecx |
||
89 | |||
90 | ; is the button under cursor the one we deactivated? |
||
91 | call mouse._.find_sys_button_under_cursor |
||
92 | cmp eax, ecx |
||
93 | jne .exit |
||
94 | cmp ebx, edx |
||
95 | jne .exit |
||
96 | |||
97 | ; yes it is, perform associated action |
||
98 | mov cl, [mouse.active_sys_button.buttons] |
||
99 | call sys_button_perform_handler |
||
100 | jmp .exit |
||
101 | |||
102 | .buttons_changed: |
||
103 | test byte[esp], mouse.LEFT_BUTTON_FLAG |
||
104 | jz @f |
||
105 | mov eax, [esp + 4] |
||
106 | call .call_left_button_handler |
||
107 | |||
2288 | clevermous | 108 | @@: |
109 | test byte[esp], mouse.RIGHT_BUTTON_FLAG |
||
1391 | mikedld | 110 | jz @f |
111 | mov eax, [esp + 4] |
||
112 | call .call_right_button_handler |
||
113 | |||
2288 | clevermous | 114 | @@: |
115 | test byte[esp], mouse.MIDDLE_BUTTON_FLAG |
||
1391 | mikedld | 116 | jz .check_position |
117 | mov eax, [esp + 4] |
||
118 | call .call_middle_button_handler |
||
119 | |||
120 | .check_position: |
||
121 | movzx eax, word[MOUSE_X] |
||
122 | movzx ebx, word[MOUSE_Y] |
||
123 | cmp eax, [mouse.state.pos.x] |
||
124 | jne .position_changed |
||
125 | cmp ebx, [mouse.state.pos.y] |
||
126 | je .exit |
||
127 | |||
128 | .position_changed: |
||
129 | xchg eax, [mouse.state.pos.x] |
||
130 | xchg ebx, [mouse.state.pos.y] |
||
131 | |||
132 | call mouse._.move_handler |
||
133 | |||
134 | .exit: |
||
135 | add esp, 8 |
||
136 | pop ebx eax |
||
137 | ret |
||
138 | |||
139 | .call_left_button_handler: |
||
140 | test eax, mouse.LEFT_BUTTON_FLAG |
||
141 | jnz mouse._.left_button_press_handler |
||
142 | jmp mouse._.left_button_release_handler |
||
143 | |||
144 | .call_right_button_handler: |
||
145 | test eax, mouse.RIGHT_BUTTON_FLAG |
||
146 | jnz mouse._.right_button_press_handler |
||
147 | jmp mouse._.right_button_release_handler |
||
148 | |||
149 | .call_middle_button_handler: |
||
150 | test eax, mouse.MIDDLE_BUTTON_FLAG |
||
151 | jnz mouse._.middle_button_press_handler |
||
152 | jmp mouse._.middle_button_release_handler |
||
153 | |||
5851 | pathoswith | 154 | ;=============================== |
155 | ;////// private functions ////// |
||
156 | ;=============================== |
||
1391 | mikedld | 157 | |
158 | uglobal |
||
159 | mouse.state: |
||
160 | .pos POINT |
||
161 | .buttons db ? |
||
162 | |||
5851 | pathoswith | 163 | ; NOTE: since there's no unique and lifetime-constant button identifiers, |
164 | ; we are using two dwords to identify each of them: |
||
165 | ; * pbid - process slot (high 8 bits) and button id (low 24 bits) pack |
||
166 | ; * coord - left (high 16 bits) and top (low 16 bits) coordinates pack |
||
1391 | mikedld | 167 | align 4 |
168 | mouse.active_sys_button: |
||
169 | .pbid dd ? |
||
170 | .coord dd ? |
||
171 | .buttons db ? |
||
172 | |||
173 | align 4 |
||
174 | mouse.active_sys_window: |
||
175 | .pslot dd ? |
||
176 | .old_box BOX |
||
177 | .new_box BOX |
||
178 | .delta POINT |
||
179 | .last_ticks dd ? |
||
180 | .action db ? |
||
181 | endg |
||
182 | |||
5870 | GerdtR | 183 | iglobal |
184 | fl_moving db 0 |
||
185 | rb 3 |
||
186 | endg |
||
187 | |||
1391 | mikedld | 188 | align 4 |
5851 | pathoswith | 189 | ;----------------------------------------------------------------- |
190 | mouse._.left_button_press_handler: |
||
191 | ; Called when left mouse button has been pressed down |
||
192 | bts word [BTN_DOWN], 8 |
||
193 | mov eax, [timer_ticks] |
||
194 | mov ebx, eax |
||
195 | xchg ebx, [mouse.active_sys_window.last_ticks] |
||
196 | sub eax, ebx |
||
197 | movzx ebx, [mouse_doubleclick_delay] |
||
198 | cmp eax, ebx |
||
199 | jg @f |
||
200 | bts dword [BTN_DOWN], 24 |
||
201 | @@: |
||
1391 | mikedld | 202 | test [mouse.state.buttons], not mouse.LEFT_BUTTON_FLAG |
203 | jnz .exit |
||
204 | |||
205 | call mouse._.find_sys_window_under_cursor |
||
206 | call mouse._.check_sys_window_actions |
||
207 | mov [mouse.active_sys_window.action], al |
||
208 | or eax, eax |
||
209 | jz .exit |
||
210 | |||
211 | xchg eax, edx |
||
212 | test dl, mouse.WINDOW_MOVE_FLAG |
||
213 | jz @f |
||
214 | |||
5851 | pathoswith | 215 | bt dword [BTN_DOWN], 24 |
216 | jnc @f |
||
1391 | mikedld | 217 | |
218 | mov [mouse.active_sys_window.last_ticks], 0 |
||
219 | call sys_window_maximize_handler |
||
220 | jmp .exit |
||
221 | |||
2288 | clevermous | 222 | @@: |
223 | test [edi + WDATA.fl_wstate], WSTATE_MAXIMIZED |
||
1391 | mikedld | 224 | jnz .exit |
225 | mov [mouse.active_sys_window.pslot], esi |
||
226 | lea eax, [edi + WDATA.box] |
||
227 | mov ebx, mouse.active_sys_window.old_box |
||
2381 | hidnplayr | 228 | mov ecx, sizeof.BOX |
1391 | mikedld | 229 | call memmove |
230 | mov ebx, mouse.active_sys_window.new_box |
||
231 | call memmove |
||
232 | test edx, mouse.WINDOW_MOVE_FLAG |
||
233 | jz @f |
||
234 | |||
235 | call .calculate_n_delta |
||
236 | call .calculate_w_delta |
||
237 | jmp .call_window_handler |
||
238 | |||
2288 | clevermous | 239 | @@: |
240 | test dl, mouse.WINDOW_RESIZE_W_FLAG |
||
1391 | mikedld | 241 | jz @f |
242 | call .calculate_w_delta |
||
243 | |||
2288 | clevermous | 244 | @@: |
245 | test dl, mouse.WINDOW_RESIZE_S_FLAG |
||
1391 | mikedld | 246 | jz @f |
247 | call .calculate_s_delta |
||
248 | |||
2288 | clevermous | 249 | @@: |
250 | test dl, mouse.WINDOW_RESIZE_E_FLAG |
||
1391 | mikedld | 251 | jz .call_window_handler |
252 | call .calculate_e_delta |
||
253 | |||
254 | .call_window_handler: |
||
255 | .exit: |
||
256 | ret |
||
257 | |||
258 | .calculate_n_delta: |
||
259 | mov eax, [mouse.state.pos.y] |
||
260 | sub eax, [mouse.active_sys_window.old_box.top] |
||
261 | mov [mouse.active_sys_window.delta.y], eax |
||
262 | ret |
||
263 | |||
264 | .calculate_w_delta: |
||
265 | mov eax, [mouse.state.pos.x] |
||
266 | sub eax, [mouse.active_sys_window.old_box.left] |
||
267 | mov [mouse.active_sys_window.delta.x], eax |
||
268 | ret |
||
269 | |||
270 | .calculate_s_delta: |
||
271 | mov eax, [mouse.active_sys_window.old_box.top] |
||
272 | add eax, [mouse.active_sys_window.old_box.height] |
||
273 | sub eax, [mouse.state.pos.y] |
||
274 | mov [mouse.active_sys_window.delta.y], eax |
||
275 | ret |
||
276 | |||
277 | .calculate_e_delta: |
||
278 | mov eax, [mouse.active_sys_window.old_box.left] |
||
279 | add eax, [mouse.active_sys_window.old_box.width] |
||
280 | sub eax, [mouse.state.pos.x] |
||
281 | mov [mouse.active_sys_window.delta.x], eax |
||
282 | ret |
||
283 | |||
284 | align 4 |
||
5851 | pathoswith | 285 | ;----------------------------------------------------------------- |
286 | mouse._.left_button_release_handler: |
||
287 | ; Called when left mouse button has been released |
||
288 | bts dword [BTN_DOWN], 16 |
||
1391 | mikedld | 289 | xor esi, esi |
290 | xchg esi, [mouse.active_sys_window.pslot] |
||
291 | or esi, esi |
||
292 | jz .exit |
||
293 | |||
294 | mov eax, esi |
||
9926 | Doczom | 295 | shl eax, BSF sizeof.WDATA |
1391 | mikedld | 296 | add eax, window_data + WDATA.box |
297 | mov ebx, mouse.active_sys_window.old_box |
||
2381 | hidnplayr | 298 | mov ecx, sizeof.BOX |
1391 | mikedld | 299 | call memmove |
300 | |||
301 | mov eax, mouse.active_sys_window.old_box |
||
302 | mov ebx, mouse.active_sys_window.new_box |
||
303 | call sys_window_end_moving_handler |
||
304 | |||
305 | .exit: |
||
2011 | mikedld | 306 | and [mouse.active_sys_window.action], 0 |
5870 | GerdtR | 307 | mov [fl_moving], 0 |
1391 | mikedld | 308 | ret |
309 | |||
5851 | pathoswith | 310 | mouse._.right_button_press_handler: |
311 | bts word [BTN_DOWN], 9 |
||
1391 | mikedld | 312 | test [mouse.state.buttons], not mouse.RIGHT_BUTTON_FLAG |
5851 | pathoswith | 313 | jnz @f |
1391 | mikedld | 314 | call mouse._.find_sys_window_under_cursor |
315 | call mouse._.check_sys_window_actions |
||
316 | test al, mouse.WINDOW_MOVE_FLAG |
||
5851 | pathoswith | 317 | jz @f |
318 | jmp sys_window_rollup_handler |
||
1391 | mikedld | 319 | |
5851 | pathoswith | 320 | mouse._.right_button_release_handler: |
321 | bts dword [BTN_DOWN], 17 |
||
322 | @@: |
||
1391 | mikedld | 323 | ret |
324 | |||
5851 | pathoswith | 325 | mouse._.middle_button_press_handler: |
326 | bts word [BTN_DOWN], 10 |
||
1391 | mikedld | 327 | ret |
328 | |||
5851 | pathoswith | 329 | mouse._.middle_button_release_handler: |
330 | bts dword [BTN_DOWN], 18 |
||
1391 | mikedld | 331 | ret |
332 | |||
333 | align 4 |
||
5851 | pathoswith | 334 | ;----------------------------------------------------------------- |
335 | mouse._.move_handler: |
||
336 | ; Called when cursor has been moved |
||
1391 | mikedld | 337 | ;> eax = old x coord |
338 | ;> ebx = old y coord |
||
9848 | rgimad | 339 | push eax ebx |
340 | |||
341 | call mouse._.find_sys_window_under_cursor |
||
342 | call mouse._.check_sys_window_actions |
||
343 | |||
9850 | rgimad | 344 | ; if now we are resizing the window, dont change the cursor |
345 | mov bl, [mouse.active_sys_window.action] |
||
346 | and bl, mouse.WINDOW_RESIZE_S_FLAG or mouse.WINDOW_RESIZE_W_FLAG or mouse.WINDOW_RESIZE_E_FLAG |
||
347 | test bl, bl |
||
348 | jnz .end1 |
||
349 | |||
9848 | rgimad | 350 | cmp al, mouse.WINDOW_RESIZE_SW_FLAG |
351 | jne .not_sw |
||
352 | ; DEBUGF 1, "RESIZE SOUTH-WEST\n" |
||
353 | |||
354 | mov eax, [def_cursor_dresize2] |
||
355 | |||
356 | jmp .set_resizing_cursor |
||
357 | .not_sw: |
||
358 | cmp al, mouse.WINDOW_RESIZE_SE_FLAG |
||
359 | jne .not_se |
||
360 | ; DEBUGF 1, "RESIZE SOUTH-EAST\n" |
||
361 | |||
362 | mov eax, [def_cursor_dresize1] |
||
363 | |||
364 | jmp .set_resizing_cursor |
||
365 | .not_se: |
||
366 | cmp al, mouse.WINDOW_RESIZE_W_FLAG |
||
367 | jne .not_w |
||
368 | ; DEBUGF 1, "RESIZE WEST\n" |
||
369 | |||
370 | mov eax, [def_cursor_hresize] |
||
371 | |||
372 | jmp .set_resizing_cursor |
||
373 | .not_w: |
||
374 | cmp al, mouse.WINDOW_RESIZE_S_FLAG |
||
375 | jne .not_s |
||
376 | ; DEBUGF 1, "RESIZE SOUTH\n" |
||
377 | |||
378 | mov eax, [def_cursor_vresize] |
||
379 | |||
380 | jmp .set_resizing_cursor |
||
381 | .not_s: |
||
382 | cmp al, mouse.WINDOW_RESIZE_E_FLAG |
||
383 | jne .not_in_resize_area |
||
384 | ; DEBUGF 1, "RESIZE EAST\n" |
||
385 | |||
386 | mov eax, [def_cursor_hresize] |
||
387 | |||
388 | .set_resizing_cursor: |
||
9850 | rgimad | 389 | ; DEBUGF 1, ".set_resizing_cursor eax = %x\n", eax |
9848 | rgimad | 390 | ; change cursor to resizing cursor |
9930 | Doczom | 391 | shl esi, BSF sizeof.WDATA |
392 | add esi, window_data |
||
9848 | rgimad | 393 | |
394 | ; if resizing cursor we need (eax) isnt set already, set it |
||
9930 | Doczom | 395 | cmp eax, [esi + WDATA.cursor] |
9848 | rgimad | 396 | je @f |
397 | |||
9850 | rgimad | 398 | ; DEBUGF 1, "changing cursor to resizing\n" |
9930 | Doczom | 399 | xchg eax, [esi + WDATA.cursor] ; set resizing cursor, prev cursor goes to eax |
9848 | rgimad | 400 | ; save previous cursor (will be restored when we'll get out of the resizing area) |
401 | ; if we change resizing cursor to resizing cursor then dont update previous cursor |
||
402 | cmp eax, [def_cursor_hresize] |
||
403 | je @f |
||
404 | cmp eax, [def_cursor_vresize] |
||
405 | je @f |
||
406 | cmp eax, [def_cursor_dresize1] |
||
407 | je @f |
||
408 | cmp eax, [def_cursor_dresize2] |
||
409 | je @f |
||
410 | |||
9930 | Doczom | 411 | mov [esi + WDATA.temp_cursor], eax ; save prev cursor |
9848 | rgimad | 412 | |
413 | @@: |
||
414 | jmp .end1 |
||
415 | .not_in_resize_area: |
||
9850 | rgimad | 416 | ; DEBUGF 1, ".not_in_resize_area\n" |
417 | |||
9930 | Doczom | 418 | shl esi, BSF sizeof.WDATA |
419 | add esi, window_data |
||
420 | mov eax, [esi + WDATA.temp_cursor] |
||
9848 | rgimad | 421 | |
422 | test eax, eax |
||
423 | jz .end1 |
||
424 | |||
425 | ; restore prev cursor |
||
9930 | Doczom | 426 | mov [esi + WDATA.temp_cursor], 0 |
427 | mov [esi + WDATA.cursor], eax |
||
9848 | rgimad | 428 | |
429 | .end1: |
||
430 | pop ebx eax |
||
431 | |||
1391 | mikedld | 432 | cmp [mouse.active_sys_button.pbid], 0 |
433 | jnz .exit |
||
434 | |||
435 | mov esi, [mouse.active_sys_window.pslot] |
||
436 | or esi, esi |
||
437 | jz .exit |
||
438 | |||
439 | mov eax, mouse.active_sys_window.new_box |
||
440 | mov ebx, mouse.active_sys_window.old_box |
||
2381 | hidnplayr | 441 | mov ecx, sizeof.BOX |
1391 | mikedld | 442 | call memmove |
443 | |||
444 | mov dl, [mouse.active_sys_window.action] |
||
445 | test dl, mouse.WINDOW_MOVE_FLAG |
||
446 | jz .check_resize_w |
||
447 | |||
448 | mov eax, [mouse.state.pos.x] |
||
449 | sub eax, [mouse.active_sys_window.delta.x] |
||
450 | mov [mouse.active_sys_window.new_box.left], eax |
||
451 | mov eax, [mouse.state.pos.y] |
||
452 | sub eax, [mouse.active_sys_window.delta.y] |
||
453 | mov [mouse.active_sys_window.new_box.top], eax |
||
454 | |||
455 | mov eax, [mouse.active_sys_window.new_box.left] |
||
456 | or eax, eax |
||
457 | jge @f |
||
458 | xor eax, eax |
||
459 | mov [mouse.active_sys_window.new_box.left], eax |
||
2288 | clevermous | 460 | @@: |
461 | add eax, [mouse.active_sys_window.new_box.width] |
||
5350 | serge | 462 | cmp eax, [_display.width] |
1391 | mikedld | 463 | jl @f |
5350 | serge | 464 | sub eax, [_display.width] |
8928 | dunkaist | 465 | inc eax |
1391 | mikedld | 466 | sub [mouse.active_sys_window.new_box.left], eax |
2288 | clevermous | 467 | @@: |
468 | mov eax, [mouse.active_sys_window.new_box.top] |
||
1391 | mikedld | 469 | or eax, eax |
470 | jge @f |
||
471 | xor eax, eax |
||
472 | mov [mouse.active_sys_window.new_box.top], eax |
||
2288 | clevermous | 473 | @@: |
474 | add eax, [mouse.active_sys_window.new_box.height] |
||
5350 | serge | 475 | cmp eax, [_display.height] |
476 | jl .call_window_handler |
||
477 | sub eax, [_display.height] |
||
8928 | dunkaist | 478 | inc eax |
1391 | mikedld | 479 | sub [mouse.active_sys_window.new_box.top], eax |
480 | jmp .call_window_handler |
||
481 | |||
482 | .check_resize_w: |
||
483 | test dl, mouse.WINDOW_RESIZE_W_FLAG |
||
484 | jz .check_resize_s |
||
485 | |||
486 | mov eax, [mouse.state.pos.x] |
||
487 | sub eax, [mouse.active_sys_window.delta.x] |
||
488 | mov [mouse.active_sys_window.new_box.left], eax |
||
489 | sub eax, [mouse.active_sys_window.old_box.left] |
||
490 | sub [mouse.active_sys_window.new_box.width], eax |
||
491 | |||
492 | mov eax, [mouse.active_sys_window.new_box.width] |
||
493 | sub eax, 127 |
||
494 | jge @f |
||
495 | add [mouse.active_sys_window.new_box.left], eax |
||
496 | mov [mouse.active_sys_window.new_box.width], 127 |
||
2288 | clevermous | 497 | @@: |
498 | mov eax, [mouse.active_sys_window.new_box.left] |
||
1391 | mikedld | 499 | or eax, eax |
500 | jge .check_resize_s |
||
501 | add [mouse.active_sys_window.new_box.width], eax |
||
502 | xor eax, eax |
||
503 | mov [mouse.active_sys_window.new_box.left], eax |
||
504 | |||
505 | .check_resize_s: |
||
506 | test dl, mouse.WINDOW_RESIZE_S_FLAG |
||
507 | jz .check_resize_e |
||
508 | |||
509 | mov eax, [mouse.state.pos.y] |
||
510 | add eax, [mouse.active_sys_window.delta.y] |
||
511 | sub eax, [mouse.active_sys_window.old_box.top] |
||
512 | mov [mouse.active_sys_window.new_box.height], eax |
||
513 | |||
514 | push eax |
||
515 | mov edi, esi |
||
9926 | Doczom | 516 | shl edi, BSF sizeof.WDATA |
1391 | mikedld | 517 | add edi, window_data |
518 | call window._.get_rolledup_height |
||
519 | mov ecx, eax |
||
520 | pop eax |
||
521 | mov eax, [mouse.active_sys_window.new_box.height] |
||
522 | cmp eax, ecx |
||
523 | jge @f |
||
524 | mov eax, ecx |
||
525 | mov [mouse.active_sys_window.new_box.height], eax |
||
2288 | clevermous | 526 | @@: |
527 | add eax, [mouse.active_sys_window.new_box.top] |
||
5350 | serge | 528 | cmp eax, [_display.height] |
529 | jl .check_resize_e |
||
530 | sub eax, [_display.height] |
||
1391 | mikedld | 531 | neg eax |
532 | add [mouse.active_sys_window.new_box.height], eax |
||
5350 | serge | 533 | mov ecx, [_display.height] |
1391 | mikedld | 534 | cmp ecx, eax |
5350 | serge | 535 | jg .check_resize_e |
1391 | mikedld | 536 | mov [mouse.active_sys_window.new_box.height], ecx |
537 | |||
538 | .check_resize_e: |
||
539 | test dl, mouse.WINDOW_RESIZE_E_FLAG |
||
540 | jz .call_window_handler |
||
541 | |||
542 | mov eax, [mouse.state.pos.x] |
||
543 | add eax, [mouse.active_sys_window.delta.x] |
||
544 | sub eax, [mouse.active_sys_window.old_box.left] |
||
545 | mov [mouse.active_sys_window.new_box.width], eax |
||
546 | |||
547 | mov eax, [mouse.active_sys_window.new_box.width] |
||
548 | cmp eax, 127 |
||
549 | jge @f |
||
550 | mov eax, 127 |
||
551 | mov [mouse.active_sys_window.new_box.width], eax |
||
2288 | clevermous | 552 | @@: |
553 | add eax, [mouse.active_sys_window.new_box.left] |
||
5350 | serge | 554 | cmp eax, [_display.width] |
555 | jl .call_window_handler |
||
556 | sub eax, [_display.width] |
||
1391 | mikedld | 557 | neg eax |
558 | add [mouse.active_sys_window.new_box.width], eax |
||
5350 | serge | 559 | mov ecx, [_display.width] |
1391 | mikedld | 560 | cmp ecx, eax |
5350 | serge | 561 | jg .call_window_handler |
1391 | mikedld | 562 | mov [mouse.active_sys_window.new_box.width], ecx |
563 | |||
564 | .call_window_handler: |
||
565 | mov eax, mouse.active_sys_window.old_box |
||
566 | mov ebx, mouse.active_sys_window.new_box |
||
567 | |||
568 | push esi |
||
569 | mov esi, mouse.active_sys_window.old_box |
||
570 | mov edi, mouse.active_sys_window.new_box |
||
2381 | hidnplayr | 571 | mov ecx, sizeof.BOX / 4 |
1391 | mikedld | 572 | repe |
573 | cmpsd |
||
574 | pop esi |
||
575 | je .exit |
||
576 | |||
5870 | GerdtR | 577 | test [fl_moving], 1 |
578 | jnz @f |
||
579 | |||
580 | mov [fl_moving], 1 |
||
581 | push edi |
||
582 | mov edi, esi |
||
9926 | Doczom | 583 | shl edi, BSF sizeof.WDATA |
5870 | GerdtR | 584 | add edi, WDATA.box + window_data |
585 | call window._.draw_negative_box |
||
586 | pop edi |
||
587 | @@: |
||
588 | |||
589 | |||
1391 | mikedld | 590 | mov [mouse.active_sys_window.last_ticks], 0 |
591 | call sys_window_moving_handler |
||
592 | |||
593 | .exit: |
||
594 | ret |
||
595 | |||
596 | align 4 |
||
5851 | pathoswith | 597 | ;----------------------------------------------------------------- |
598 | mouse._.find_sys_window_under_cursor: |
||
599 | ; Find system window object which is currently visible on screen |
||
600 | ; and has mouse cursor within its bounds |
||
1391 | mikedld | 601 | ;< esi = process slot |
602 | ;< edi = pointer to WDATA struct |
||
2446 | mario79 | 603 | mov esi, [mouse.state.pos.y] |
604 | mov esi, [d_width_calc_area + esi*4] |
||
605 | |||
5351 | serge | 606 | add esi, [_display.win_map] |
1391 | mikedld | 607 | add esi, [mouse.state.pos.x] |
608 | movzx esi, byte[esi] |
||
609 | mov edi, esi |
||
9926 | Doczom | 610 | shl edi, BSF sizeof.WDATA |
1391 | mikedld | 611 | add edi, window_data |
612 | ret |
||
613 | |||
614 | align 4 |
||
5851 | pathoswith | 615 | ;----------------------------------------------------------------- |
616 | mouse._.activate_sys_window_under_cursor: |
||
617 | ; activate and redraw window under cursor (if necessary) |
||
1391 | mikedld | 618 | call mouse._.find_sys_window_under_cursor |
619 | movzx esi, word[WIN_STACK + esi * 2] |
||
620 | lea esi, [WIN_POS + esi * 2] |
||
621 | jmp waredraw |
||
622 | |||
623 | align 4 |
||
5851 | pathoswith | 624 | ;----------------------------------------------------------------- |
625 | mouse._.find_sys_button_under_cursor: |
||
626 | ; Find system button object which is currently visible on screen |
||
627 | ; and has mouse cursor within its bounds |
||
1391 | mikedld | 628 | ;< eax = pack[8(process slot), 24(button id)] or 0 |
629 | ;< ebx = pack[16(button x coord), 16(button y coord)] |
||
630 | push ecx edx esi edi |
||
631 | |||
632 | call mouse._.find_sys_window_under_cursor |
||
633 | mov edx, esi |
||
634 | |||
635 | ; check if any process button contains cursor |
||
636 | mov eax, [BTN_ADDR] |
||
637 | mov ecx, [eax] |
||
2384 | hidnplayr | 638 | imul esi, ecx, sizeof.SYS_BUTTON |
1391 | mikedld | 639 | add esi, eax |
640 | inc ecx |
||
2384 | hidnplayr | 641 | add esi, sizeof.SYS_BUTTON |
1391 | mikedld | 642 | |
643 | .next_button: |
||
644 | dec ecx |
||
645 | jz .not_found |
||
646 | |||
2384 | hidnplayr | 647 | add esi, -sizeof.SYS_BUTTON |
1391 | mikedld | 648 | |
649 | ; does it belong to our process? |
||
650 | cmp dx, [esi + SYS_BUTTON.pslot] |
||
651 | jne .next_button |
||
652 | |||
653 | ; does it contain cursor coordinates? |
||
654 | mov eax, [mouse.state.pos.x] |
||
655 | sub eax, [edi + WDATA.box.left] |
||
656 | sub ax, [esi + SYS_BUTTON.left] |
||
657 | jl .next_button |
||
658 | sub ax, [esi + SYS_BUTTON.width] |
||
659 | jge .next_button |
||
660 | mov eax, [mouse.state.pos.y] |
||
661 | sub eax, [edi + WDATA.box.top] |
||
662 | sub ax, [esi + SYS_BUTTON.top] |
||
663 | jl .next_button |
||
664 | sub ax, [esi + SYS_BUTTON.height] |
||
665 | jge .next_button |
||
666 | |||
667 | ; okay, return it |
||
668 | shl edx, 24 |
||
669 | mov eax, dword[esi + SYS_BUTTON.id_hi - 2] |
||
670 | mov ax, [esi + SYS_BUTTON.id_lo] |
||
671 | and eax, 0x0ffffff |
||
672 | or eax, edx |
||
673 | mov ebx, dword[esi + SYS_BUTTON.left - 2] |
||
674 | mov bx, [esi + SYS_BUTTON.top] |
||
675 | jmp .exit |
||
676 | |||
677 | .not_found: |
||
678 | xor eax, eax |
||
679 | xor ebx, ebx |
||
680 | |||
681 | .exit: |
||
682 | pop edi esi edx ecx |
||
683 | ret |
||
684 | |||
685 | align 4 |
||
5851 | pathoswith | 686 | ;----------------------------------------------------------------- |
687 | mouse._.check_sys_window_actions: |
||
1391 | mikedld | 688 | ;< eax = action flags or 0 |
689 | ; is window movable? |
||
690 | test byte[edi + WDATA.cl_titlebar + 3], 0x01 |
||
691 | jnz .no_action |
||
692 | |||
693 | mov eax, [mouse.state.pos.x] |
||
694 | mov ebx, [mouse.state.pos.y] |
||
695 | sub eax, [edi + WDATA.box.left] |
||
696 | sub ebx, [edi + WDATA.box.top] |
||
697 | |||
698 | ; is there a window titlebar under cursor? |
||
699 | push eax |
||
700 | call window._.get_titlebar_height |
||
701 | cmp ebx, eax |
||
702 | pop eax |
||
703 | jl .move_action |
||
704 | |||
705 | ; no there isn't, can it be resized then? |
||
706 | mov dl, [edi + WDATA.fl_wstyle] |
||
707 | and dl, 0x0f |
||
5851 | pathoswith | 708 | ; NOTE: dangerous optimization, revise if window types changed |
709 | ; this currently implies only types 2 and 3 could be resized |
||
1391 | mikedld | 710 | test dl, 2 |
711 | jz .no_action |
||
712 | |||
713 | mov ecx, [edi + WDATA.box.width] |
||
714 | add ecx, -window.BORDER_SIZE |
||
715 | mov edx, [edi + WDATA.box.height] |
||
716 | add edx, -window.BORDER_SIZE |
||
717 | |||
718 | ; is it rolled up? |
||
719 | test [edi + WDATA.fl_wstate], WSTATE_ROLLEDUP |
||
720 | jnz .resize_w_or_e_action |
||
721 | |||
722 | cmp eax, window.BORDER_SIZE |
||
723 | jl .resize_w_action |
||
724 | cmp eax, ecx |
||
725 | jg .resize_e_action |
||
726 | cmp ebx, edx |
||
727 | jle .no_action |
||
728 | |||
729 | .resize_s_action: |
||
730 | cmp eax, window.BORDER_SIZE + 10 |
||
731 | jl .resize_sw_action |
||
732 | add ecx, -10 |
||
733 | cmp eax, ecx |
||
734 | jge .resize_se_action |
||
735 | mov eax, mouse.WINDOW_RESIZE_S_FLAG |
||
736 | jmp .exit |
||
737 | |||
738 | .resize_w_or_e_action: |
||
739 | cmp eax, window.BORDER_SIZE + 10 |
||
740 | jl .resize_w_action.direct |
||
741 | add ecx, -10 |
||
742 | cmp eax, ecx |
||
743 | jg .resize_e_action.direct |
||
744 | jmp .no_action |
||
745 | |||
746 | .resize_w_action: |
||
747 | add edx, -10 |
||
748 | cmp ebx, edx |
||
749 | jge .resize_sw_action |
||
750 | .resize_w_action.direct: |
||
751 | mov eax, mouse.WINDOW_RESIZE_W_FLAG |
||
752 | jmp .exit |
||
753 | |||
754 | .resize_e_action: |
||
755 | add edx, -10 |
||
756 | cmp ebx, edx |
||
757 | jge .resize_se_action |
||
758 | .resize_e_action.direct: |
||
759 | mov eax, mouse.WINDOW_RESIZE_E_FLAG |
||
760 | jmp .exit |
||
761 | |||
762 | .resize_sw_action: |
||
763 | mov eax, mouse.WINDOW_RESIZE_SW_FLAG |
||
764 | jmp .exit |
||
765 | |||
766 | .resize_se_action: |
||
767 | mov eax, mouse.WINDOW_RESIZE_SE_FLAG |
||
768 | jmp .exit |
||
769 | |||
770 | .move_action: |
||
771 | mov eax, mouse.WINDOW_MOVE_FLAG |
||
772 | jmp .exit |
||
773 | |||
774 | .no_action: |
||
775 | xor eax, eax |
||
776 | |||
777 | .exit: |
||
778 | ret |
||
9514 | rgimad | 779 | ;----------------------------------------------------------------------------- |
780 | |||
781 | align 4 |
||
782 | readmousepos: |
||
783 | ; eax=0 screen relative |
||
784 | ; eax=1 window relative |
||
785 | ; eax=2 buttons pressed |
||
786 | ; eax=3 buttons pressed ext |
||
787 | ; eax=4 load cursor |
||
788 | ; eax=5 set cursor |
||
789 | ; eax=6 delete cursor |
||
790 | ; eax=7 get mouse_z |
||
791 | ; eax=8 load cursor unicode |
||
792 | cmp ebx, 8 |
||
793 | ja @f |
||
794 | jmp dword[.mousefn+ebx*4] |
||
795 | |||
796 | align 4 |
||
797 | .mousefn: |
||
798 | dd .msscreen |
||
799 | dd .mswin |
||
800 | dd .msbutton |
||
801 | dd .msbuttonExt |
||
802 | dd .app_load_cursor |
||
803 | dd .app_set_cursor |
||
804 | dd .app_delete_cursor |
||
805 | dd .msz |
||
806 | dd .loadCursorUni |
||
807 | |||
808 | .msscreen: |
||
809 | mov eax, [MOUSE_X] |
||
810 | shl eax, 16 |
||
811 | mov ax, [MOUSE_Y] |
||
9831 | dunkaist | 812 | mov [esp + SYSCALL_STACK.eax], eax |
9514 | rgimad | 813 | @@: |
814 | ret |
||
815 | |||
816 | .mswin: |
||
817 | mov eax, [MOUSE_X] |
||
818 | shl eax, 16 |
||
819 | mov ax, [MOUSE_Y] |
||
9930 | Doczom | 820 | mov esi, [current_slot] |
821 | mov esi, [esi + APPDATA.window] |
||
822 | mov bx, word[esi + WDATA.box.left] |
||
9514 | rgimad | 823 | shl ebx, 16 |
9930 | Doczom | 824 | mov bx, word[esi + WDATA.box.top] |
9514 | rgimad | 825 | sub eax, ebx |
9930 | Doczom | 826 | sub ax, word[esi + WDATA.clientbox.top] |
9514 | rgimad | 827 | rol eax, 16 |
9930 | Doczom | 828 | sub ax, word[esi + WDATA.clientbox.left] |
9514 | rgimad | 829 | rol eax, 16 |
9831 | dunkaist | 830 | mov [esp + SYSCALL_STACK.eax], eax |
9514 | rgimad | 831 | ret |
832 | |||
833 | .msbutton: |
||
834 | movzx eax, byte [BTN_DOWN] |
||
9831 | dunkaist | 835 | mov [esp + SYSCALL_STACK.eax], eax |
9514 | rgimad | 836 | ret |
837 | |||
838 | .msbuttonExt: |
||
839 | mov eax, [BTN_DOWN] |
||
9831 | dunkaist | 840 | mov [esp + SYSCALL_STACK.eax], eax |
9514 | rgimad | 841 | ret |
842 | |||
843 | .app_load_cursor: |
||
844 | cmp ecx, OS_BASE |
||
845 | jae @f |
||
846 | stdcall load_cursor, ecx, edx |
||
9831 | dunkaist | 847 | mov [esp + SYSCALL_STACK.eax], eax |
9514 | rgimad | 848 | @@: |
849 | ret |
||
850 | |||
851 | .loadCursorUni: |
||
852 | cmp ecx, OS_BASE |
||
853 | jae @b |
||
854 | push ecx edx |
||
855 | stdcall kernel_alloc, maxPathLength |
||
856 | mov edi, eax |
||
857 | pop eax esi |
||
858 | push edi |
||
859 | call getFullPath |
||
860 | pop ebp |
||
861 | test eax, eax |
||
862 | jz @f |
||
863 | stdcall load_cursor, ebp, LOAD_FROM_FILE |
||
9831 | dunkaist | 864 | mov [esp + SYSCALL_STACK.eax], eax |
9514 | rgimad | 865 | @@: |
866 | stdcall kernel_free, ebp |
||
867 | ret |
||
868 | |||
869 | .app_set_cursor: |
||
870 | stdcall set_cursor, ecx |
||
9831 | dunkaist | 871 | mov [esp + SYSCALL_STACK.eax], eax |
9514 | rgimad | 872 | ret |
873 | |||
874 | .app_delete_cursor: |
||
875 | stdcall delete_cursor, ecx |
||
9831 | dunkaist | 876 | mov [esp + SYSCALL_STACK.eax], eax |
9514 | rgimad | 877 | ret |
878 | |||
879 | .msz: |
||
880 | mov edi, [thread_count] |
||
881 | movzx edi, word [WIN_POS + edi*2] |
||
882 | cmp edi, [current_slot_idx] |
||
883 | jne @f |
||
884 | mov ax, [MOUSE_SCROLL_H] |
||
885 | shl eax, 16 |
||
886 | mov ax, [MOUSE_SCROLL_V] |
||
9831 | dunkaist | 887 | mov [esp + SYSCALL_STACK.eax], eax |
9514 | rgimad | 888 | and [MOUSE_SCROLL_H], word 0 |
889 | and [MOUSE_SCROLL_V], word 0 |
||
890 | ret |
||
891 | @@: |
||
9831 | dunkaist | 892 | and [esp + SYSCALL_STACK.eax], dword 0 |
893 | ret>>>>> |