Subversion Repositories Kolibri OS

Rev

Rev 1929 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1689 art_zh 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2010. All rights reserved.      ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
8
$Revision: 1532$
9
 
10
include 'mousepointer.inc'
11
 
12
;==============================================================================
13
;///// public functions ///////////////////////////////////////////////////////
14
;==============================================================================
15
 
1859 art_zh 16
mouse.LEFT_BUTTON_FLAG	 = 0001b
1689 art_zh 17
mouse.RIGHT_BUTTON_FLAG  = 0010b
18
mouse.MIDDLE_BUTTON_FLAG = 0100b
19
 
20
mouse.BUTTONS_MASK = \
21
  mouse.LEFT_BUTTON_FLAG or \
22
  mouse.RIGHT_BUTTON_FLAG or \
23
  mouse.MIDDLE_BUTTON_FLAG
24
 
25
mouse.WINDOW_RESIZE_N_FLAG = 000001b
26
mouse.WINDOW_RESIZE_W_FLAG = 000010b
27
mouse.WINDOW_RESIZE_S_FLAG = 000100b
28
mouse.WINDOW_RESIZE_E_FLAG = 001000b
1859 art_zh 29
mouse.WINDOW_MOVE_FLAG	   = 010000b
1689 art_zh 30
 
31
mouse.WINDOW_RESIZE_SW_FLAG = \
32
  mouse.WINDOW_RESIZE_S_FLAG or \
33
  mouse.WINDOW_RESIZE_W_FLAG
34
mouse.WINDOW_RESIZE_SE_FLAG = \
35
  mouse.WINDOW_RESIZE_S_FLAG or \
36
  mouse.WINDOW_RESIZE_E_FLAG
37
 
38
align 4
39
;------------------------------------------------------------------------------
40
mouse_check_events: ;//////////////////////////////////////////////////////////
41
;------------------------------------------------------------------------------
42
;? Check if mouse buttons state or cursor position has changed and call
43
;? appropriate handlers
44
;------------------------------------------------------------------------------
1859 art_zh 45
	push	eax ebx
1689 art_zh 46
 
1859 art_zh 47
	mov	al, [BTN_DOWN]
48
	mov	bl, [mouse.state.buttons]
49
	and	al, mouse.BUTTONS_MASK
50
	mov	cl, al
51
	xchg	cl, [mouse.state.buttons]
52
	xor	bl, al
53
	push	eax ebx
1689 art_zh 54
 
1859 art_zh 55
	; did any mouse button changed its state?
56
	or	bl, bl
57
	jz	.check_position
1689 art_zh 58
 
1859 art_zh 59
	; yes it did, is that the first button of all pressed down?
60
	or	cl, cl
61
	jnz	.check_buttons_released
1689 art_zh 62
 
1859 art_zh 63
	; yes it is, activate window user is pointing at, if needed
64
	call	mouse._.activate_sys_window_under_cursor
1689 art_zh 65
 
1859 art_zh 66
	; NOTE: this code wouldn't be necessary if we knew window did
67
	;       already redraw itself after call above
68
	or	eax, eax
69
	jz	@f
1689 art_zh 70
 
1859 art_zh 71
	and	[mouse.state.buttons], 0
72
	jmp	.exit
1689 art_zh 73
 
1859 art_zh 74
	; is there any system button under cursor?
75
    @@: call	mouse._.find_sys_button_under_cursor
76
	or	eax, eax
77
	jz	.check_buttons_released
1689 art_zh 78
 
1859 art_zh 79
	; yes there is, activate it and exit
80
	mov	[mouse.active_sys_button.pbid], eax
81
	mov	[mouse.active_sys_button.coord], ebx
82
	mov	cl, [mouse.state.buttons]
83
	mov	[mouse.active_sys_button.buttons], cl
84
	call	sys_button_activate_handler
85
	jmp	.exit
1689 art_zh 86
 
87
  .check_buttons_released:
1859 art_zh 88
	cmp	[mouse.state.buttons], 0
89
	jnz	.buttons_changed
1689 art_zh 90
 
1859 art_zh 91
	; did we press some button earlier?
92
	cmp	[mouse.active_sys_button.pbid], 0
93
	je	.buttons_changed
1689 art_zh 94
 
1859 art_zh 95
	; yes we did, deactivate it
96
	xor	eax, eax
97
	xchg	eax, [mouse.active_sys_button.pbid]
98
	mov	ebx, [mouse.active_sys_button.coord]
99
	mov	cl, [mouse.active_sys_button.buttons]
100
	push	eax ebx
101
	call	sys_button_deactivate_handler
102
	pop	edx ecx
1689 art_zh 103
 
1859 art_zh 104
	; is the button under cursor the one we deactivated?
105
	call	mouse._.find_sys_button_under_cursor
106
	cmp	eax, ecx
107
	jne	.exit
108
	cmp	ebx, edx
109
	jne	.exit
1689 art_zh 110
 
1859 art_zh 111
	; yes it is, perform associated action
112
	mov	cl, [mouse.active_sys_button.buttons]
113
	call	sys_button_perform_handler
114
	jmp	.exit
1689 art_zh 115
 
116
  .buttons_changed:
1859 art_zh 117
	test	byte[esp], mouse.LEFT_BUTTON_FLAG
118
	jz	@f
119
	mov	eax, [esp + 4]
120
	call	.call_left_button_handler
1689 art_zh 121
 
1859 art_zh 122
    @@: test	byte[esp], mouse.RIGHT_BUTTON_FLAG
123
	jz	@f
124
	mov	eax, [esp + 4]
125
	call	.call_right_button_handler
1689 art_zh 126
 
1859 art_zh 127
    @@: test	byte[esp], mouse.MIDDLE_BUTTON_FLAG
128
	jz	.check_position
129
	mov	eax, [esp + 4]
130
	call	.call_middle_button_handler
1689 art_zh 131
 
132
  .check_position:
1859 art_zh 133
	movzx	eax, word[MOUSE_X]
134
	movzx	ebx, word[MOUSE_Y]
135
	cmp	eax, [mouse.state.pos.x]
136
	jne	.position_changed
137
	cmp	ebx, [mouse.state.pos.y]
138
	je	.exit
1689 art_zh 139
 
140
  .position_changed:
1859 art_zh 141
	xchg	eax, [mouse.state.pos.x]
142
	xchg	ebx, [mouse.state.pos.y]
1689 art_zh 143
 
1859 art_zh 144
	call	mouse._.move_handler
1689 art_zh 145
 
146
  .exit:
1859 art_zh 147
	add	esp, 8
148
	pop	ebx eax
149
	ret
1689 art_zh 150
 
151
  .call_left_button_handler:
1859 art_zh 152
	test	eax, mouse.LEFT_BUTTON_FLAG
153
	jnz	mouse._.left_button_press_handler
154
	jmp	mouse._.left_button_release_handler
1689 art_zh 155
 
156
  .call_right_button_handler:
1859 art_zh 157
	test	eax, mouse.RIGHT_BUTTON_FLAG
158
	jnz	mouse._.right_button_press_handler
159
	jmp	mouse._.right_button_release_handler
1689 art_zh 160
 
161
  .call_middle_button_handler:
1859 art_zh 162
	test	eax, mouse.MIDDLE_BUTTON_FLAG
163
	jnz	mouse._.middle_button_press_handler
164
	jmp	mouse._.middle_button_release_handler
1689 art_zh 165
 
166
;==============================================================================
167
;///// private functions //////////////////////////////////////////////////////
168
;==============================================================================
169
 
170
uglobal
171
  mouse.state:
172
    .pos     POINT
173
    .buttons db ?
174
 
175
  ; NOTE: since there's no unique and lifetime-constant button identifiers,
176
  ;       we're using two dwords to identify each of them:
177
  ;       * pbid - process slot (high 8 bits) and button id (low 24 bits) pack
178
  ;       * coord - left (high 16 bits) and top (low 16 bits) coordinates pack
179
  align 4
180
  mouse.active_sys_button:
181
    .pbid    dd ?
182
    .coord   dd ?
183
    .buttons db ?
184
 
185
  align 4
186
  mouse.active_sys_window:
1859 art_zh 187
    .pslot	dd ?
188
    .old_box	BOX
189
    .new_box	BOX
190
    .delta	POINT
1689 art_zh 191
    .last_ticks dd ?
1859 art_zh 192
    .action	db ?
1689 art_zh 193
endg
194
 
195
align 4
196
;------------------------------------------------------------------------------
197
mouse._.left_button_press_handler: ;///////////////////////////////////////////
198
;------------------------------------------------------------------------------
199
;? Called when left mouse button has been pressed down
200
;------------------------------------------------------------------------------
1859 art_zh 201
	test	[mouse.state.buttons], not mouse.LEFT_BUTTON_FLAG
202
	jnz	.exit
1689 art_zh 203
 
1859 art_zh 204
	call	mouse._.find_sys_window_under_cursor
205
	call	mouse._.check_sys_window_actions
206
	mov	[mouse.active_sys_window.action], al
207
	or	eax, eax
208
	jz	.exit
1689 art_zh 209
 
1859 art_zh 210
	xchg	eax, edx
211
	test	dl, mouse.WINDOW_MOVE_FLAG
212
	jz	@f
1689 art_zh 213
 
1859 art_zh 214
	mov	eax, [timer_ticks]
215
	mov	ebx, eax
216
	xchg	ebx, [mouse.active_sys_window.last_ticks]
217
	sub	eax, ebx
218
	cmp	eax, 50
219
	jg	@f
1689 art_zh 220
 
1859 art_zh 221
	mov	[mouse.active_sys_window.last_ticks], 0
222
	call	sys_window_maximize_handler
223
	jmp	.exit
1689 art_zh 224
 
1859 art_zh 225
    @@: test	[edi + WDATA.fl_wstate], WSTATE_MAXIMIZED
226
	jnz	.exit
227
	mov	[mouse.active_sys_window.pslot], esi
228
	lea	eax, [edi + WDATA.box]
229
	mov	ebx, mouse.active_sys_window.old_box
230
	mov	ecx, BOX.sizeof
231
	call	memmove
232
	mov	ebx, mouse.active_sys_window.new_box
233
	call	memmove
234
	test	edx, mouse.WINDOW_MOVE_FLAG
235
	jz	@f
1689 art_zh 236
 
1859 art_zh 237
	call	.calculate_n_delta
238
	call	.calculate_w_delta
239
	jmp	.call_window_handler
1689 art_zh 240
 
1859 art_zh 241
    @@: test	dl, mouse.WINDOW_RESIZE_W_FLAG
242
	jz	@f
243
	call	.calculate_w_delta
1689 art_zh 244
 
1859 art_zh 245
    @@: test	dl, mouse.WINDOW_RESIZE_S_FLAG
246
	jz	@f
247
	call	.calculate_s_delta
1689 art_zh 248
 
1859 art_zh 249
    @@: test	dl, mouse.WINDOW_RESIZE_E_FLAG
250
	jz	.call_window_handler
251
	call	.calculate_e_delta
1689 art_zh 252
 
253
  .call_window_handler:
1859 art_zh 254
	mov	eax, mouse.active_sys_window.old_box
255
	call	sys_window_start_moving_handler
1689 art_zh 256
 
257
  .exit:
1859 art_zh 258
	ret
1689 art_zh 259
 
260
  .calculate_n_delta:
1859 art_zh 261
	mov	eax, [mouse.state.pos.y]
262
	sub	eax, [mouse.active_sys_window.old_box.top]
263
	mov	[mouse.active_sys_window.delta.y], eax
264
	ret
1689 art_zh 265
 
266
  .calculate_w_delta:
1859 art_zh 267
	mov	eax, [mouse.state.pos.x]
268
	sub	eax, [mouse.active_sys_window.old_box.left]
269
	mov	[mouse.active_sys_window.delta.x], eax
270
	ret
1689 art_zh 271
 
272
  .calculate_s_delta:
1859 art_zh 273
	mov	eax, [mouse.active_sys_window.old_box.top]
274
	add	eax, [mouse.active_sys_window.old_box.height]
275
	sub	eax, [mouse.state.pos.y]
276
	mov	[mouse.active_sys_window.delta.y], eax
277
	ret
1689 art_zh 278
 
279
  .calculate_e_delta:
1859 art_zh 280
	mov	eax, [mouse.active_sys_window.old_box.left]
281
	add	eax, [mouse.active_sys_window.old_box.width]
282
	sub	eax, [mouse.state.pos.x]
283
	mov	[mouse.active_sys_window.delta.x], eax
284
	ret
1689 art_zh 285
 
286
align 4
287
;------------------------------------------------------------------------------
288
mouse._.left_button_release_handler: ;/////////////////////////////////////////
289
;------------------------------------------------------------------------------
290
;? Called when left mouse button has been released
291
;------------------------------------------------------------------------------
1859 art_zh 292
	xor	esi, esi
293
	xchg	esi, [mouse.active_sys_window.pslot]
294
	or	esi, esi
295
	jz	.exit
1689 art_zh 296
 
1859 art_zh 297
	mov	eax, esi
298
	shl	eax, 5
299
	add	eax, window_data + WDATA.box
300
	mov	ebx, mouse.active_sys_window.old_box
301
	mov	ecx, BOX.sizeof
302
	call	memmove
1689 art_zh 303
 
1859 art_zh 304
	mov	eax, mouse.active_sys_window.old_box
305
	mov	ebx, mouse.active_sys_window.new_box
306
	call	sys_window_end_moving_handler
1689 art_zh 307
 
308
  .exit:
1859 art_zh 309
	ret
1689 art_zh 310
 
311
align 4
312
;------------------------------------------------------------------------------
313
mouse._.right_button_press_handler: ;//////////////////////////////////////////
314
;------------------------------------------------------------------------------
315
;? Called when right mouse button has been pressed down
316
;------------------------------------------------------------------------------
1859 art_zh 317
	test	[mouse.state.buttons], not mouse.RIGHT_BUTTON_FLAG
318
	jnz	.exit
1689 art_zh 319
 
1859 art_zh 320
	call	mouse._.find_sys_window_under_cursor
321
	call	mouse._.check_sys_window_actions
322
	test	al, mouse.WINDOW_MOVE_FLAG
323
	jz	.exit
1689 art_zh 324
 
1859 art_zh 325
	call	sys_window_rollup_handler
1689 art_zh 326
 
327
  .exit:
1859 art_zh 328
	ret
1689 art_zh 329
 
330
align 4
331
;------------------------------------------------------------------------------
332
mouse._.right_button_release_handler: ;////////////////////////////////////////
333
;------------------------------------------------------------------------------
334
;? Called when right mouse button has been released
335
;------------------------------------------------------------------------------
1859 art_zh 336
	ret
1689 art_zh 337
 
338
align 4
339
;------------------------------------------------------------------------------
340
mouse._.middle_button_press_handler: ;/////////////////////////////////////////
341
;------------------------------------------------------------------------------
342
;? Called when middle mouse button has been pressed down
343
;------------------------------------------------------------------------------
1859 art_zh 344
	ret
1689 art_zh 345
 
346
align 4
347
;------------------------------------------------------------------------------
348
mouse._.middle_button_release_handler: ;///////////////////////////////////////
349
;------------------------------------------------------------------------------
350
;? Called when middle mouse button has been released
351
;------------------------------------------------------------------------------
1859 art_zh 352
	ret
1689 art_zh 353
 
354
align 4
355
;------------------------------------------------------------------------------
356
mouse._.move_handler: ;////////////////////////////////////////////////////////
357
;------------------------------------------------------------------------------
358
;? Called when cursor has been moved
359
;------------------------------------------------------------------------------
360
;> eax = old x coord
361
;> ebx = old y coord
362
;------------------------------------------------------------------------------
1859 art_zh 363
	cmp	[mouse.active_sys_button.pbid], 0
364
	jnz	.exit
1689 art_zh 365
 
1859 art_zh 366
	mov	esi, [mouse.active_sys_window.pslot]
367
	or	esi, esi
368
	jz	.exit
1689 art_zh 369
 
1859 art_zh 370
	mov	eax, mouse.active_sys_window.new_box
371
	mov	ebx, mouse.active_sys_window.old_box
372
	mov	ecx, BOX.sizeof
373
	call	memmove
1689 art_zh 374
 
1859 art_zh 375
	mov	dl, [mouse.active_sys_window.action]
376
	test	dl, mouse.WINDOW_MOVE_FLAG
377
	jz	.check_resize_w
1689 art_zh 378
 
1859 art_zh 379
	mov	eax, [mouse.state.pos.x]
380
	sub	eax, [mouse.active_sys_window.delta.x]
381
	mov	[mouse.active_sys_window.new_box.left], eax
382
	mov	eax, [mouse.state.pos.y]
383
	sub	eax, [mouse.active_sys_window.delta.y]
2014 art_zh 384
	mov	[mouse.active_sys_window.new_box.top],	eax
1689 art_zh 385
 
1859 art_zh 386
	mov	eax, [mouse.active_sys_window.new_box.left]
387
	or	eax, eax
388
	jge	@f
389
	xor	eax, eax
390
	mov	[mouse.active_sys_window.new_box.left], eax
391
    @@: add	eax, [mouse.active_sys_window.new_box.width]
392
	cmp	eax, [Screen_Max_X]
393
	jl	@f
394
	sub	eax, [Screen_Max_X]
395
	sub	[mouse.active_sys_window.new_box.left], eax
396
    @@: mov	eax, [mouse.active_sys_window.new_box.top]
397
	or	eax, eax
398
	jge	@f
399
	xor	eax, eax
400
	mov	[mouse.active_sys_window.new_box.top], eax
401
    @@: add	eax, [mouse.active_sys_window.new_box.height]
402
	cmp	eax, [Screen_Max_Y]
403
	jle	.call_window_handler
404
	sub	eax, [Screen_Max_Y]
405
	sub	[mouse.active_sys_window.new_box.top], eax
406
	jmp	.call_window_handler
1689 art_zh 407
 
408
  .check_resize_w:
1859 art_zh 409
	test	dl, mouse.WINDOW_RESIZE_W_FLAG
410
	jz	.check_resize_s
1689 art_zh 411
 
1859 art_zh 412
	mov	eax, [mouse.state.pos.x]
413
	sub	eax, [mouse.active_sys_window.delta.x]
414
	mov	[mouse.active_sys_window.new_box.left], eax
415
	sub	eax, [mouse.active_sys_window.old_box.left]
416
	sub	[mouse.active_sys_window.new_box.width], eax
1689 art_zh 417
 
1859 art_zh 418
	mov	eax, [mouse.active_sys_window.new_box.width]
419
	sub	eax, 128
420
	jge	@f
421
	add	[mouse.active_sys_window.new_box.left], eax
422
	mov	[mouse.active_sys_window.new_box.width], 128
423
    @@: mov	eax, [mouse.active_sys_window.new_box.left]
424
	or	eax, eax
425
	jge	.check_resize_s
426
	add	[mouse.active_sys_window.new_box.width], eax
427
	xor	eax, eax
428
	mov	[mouse.active_sys_window.new_box.left], eax
1689 art_zh 429
 
430
  .check_resize_s:
1859 art_zh 431
	test	dl, mouse.WINDOW_RESIZE_S_FLAG
432
	jz	.check_resize_e
1689 art_zh 433
 
1859 art_zh 434
	mov	eax, [mouse.state.pos.y]
435
	add	eax, [mouse.active_sys_window.delta.y]
436
	sub	eax, [mouse.active_sys_window.old_box.top]
437
	mov	[mouse.active_sys_window.new_box.height], eax
1689 art_zh 438
 
1859 art_zh 439
	push	eax
440
	mov	edi, esi
441
	shl	edi, 5
442
	add	edi, window_data
443
	call	window._.get_rolledup_height
444
	mov	ecx, eax
445
	pop	eax
446
	mov	eax, [mouse.active_sys_window.new_box.height]
447
	cmp	eax, ecx
448
	jge	@f
449
	mov	eax, ecx
450
	mov	[mouse.active_sys_window.new_box.height], eax
451
    @@: add	eax, [mouse.active_sys_window.new_box.top]
452
	cmp	eax, [Screen_Max_Y]
453
	jle	.check_resize_e
454
	sub	eax, [Screen_Max_Y]
455
	neg	eax
456
	add	[mouse.active_sys_window.new_box.height], eax
457
	mov	ecx, [Screen_Max_Y]
458
	cmp	ecx, eax
459
	jge	.check_resize_e
460
	mov	[mouse.active_sys_window.new_box.height], ecx
1689 art_zh 461
 
462
  .check_resize_e:
1859 art_zh 463
	test	dl, mouse.WINDOW_RESIZE_E_FLAG
464
	jz	.call_window_handler
1689 art_zh 465
 
1859 art_zh 466
	mov	eax, [mouse.state.pos.x]
467
	add	eax, [mouse.active_sys_window.delta.x]
468
	sub	eax, [mouse.active_sys_window.old_box.left]
469
	mov	[mouse.active_sys_window.new_box.width], eax
1689 art_zh 470
 
1859 art_zh 471
	mov	eax, [mouse.active_sys_window.new_box.width]
472
	cmp	eax, 128
473
	jge	@f
474
	mov	eax, 128
475
	mov	[mouse.active_sys_window.new_box.width], eax
476
    @@: add	eax, [mouse.active_sys_window.new_box.left]
477
	cmp	eax, [Screen_Max_X]
478
	jle	.call_window_handler
479
	sub	eax, [Screen_Max_X]
480
	neg	eax
481
	add	[mouse.active_sys_window.new_box.width], eax
482
	mov	ecx, [Screen_Max_X]
483
	cmp	ecx, eax
484
	jge	.call_window_handler
485
	mov	[mouse.active_sys_window.new_box.width], ecx
1689 art_zh 486
 
487
  .call_window_handler:
1859 art_zh 488
	mov	eax, mouse.active_sys_window.old_box
489
	mov	ebx, mouse.active_sys_window.new_box
1689 art_zh 490
 
1859 art_zh 491
	push	esi
492
	mov	esi, mouse.active_sys_window.old_box
493
	mov	edi, mouse.active_sys_window.new_box
494
	mov	ecx, BOX.sizeof / 4
495
	repe
496
	cmpsd
497
	pop	esi
498
	je	.exit
1689 art_zh 499
 
1859 art_zh 500
	mov	[mouse.active_sys_window.last_ticks], 0
501
	call	sys_window_moving_handler
1689 art_zh 502
 
503
  .exit:
1859 art_zh 504
	ret
1689 art_zh 505
 
506
align 4
507
;------------------------------------------------------------------------------
508
mouse._.find_sys_window_under_cursor: ;////////////////////////////////////////
509
;------------------------------------------------------------------------------
510
;? Find system window object which is currently visible on screen and has
511
;? mouse cursor within its bounds
512
;------------------------------------------------------------------------------
513
;< esi = process slot
514
;< edi = pointer to WDATA struct
515
;------------------------------------------------------------------------------
2014 art_zh 516
	mov	esi, [Screen_Max_X]
517
	inc	esi
518
	imul	esi, [mouse.state.pos.y]
519
	add	esi, [_WinMapAddress]
520
	add	esi, [mouse.state.pos.x]
1859 art_zh 521
	movzx	esi, byte[esi]
522
	mov	edi, esi
523
	shl	edi, 5
524
	add	edi, window_data
525
	ret
1689 art_zh 526
 
527
align 4
528
;------------------------------------------------------------------------------
529
mouse._.activate_sys_window_under_cursor: ;////////////////////////////////////
530
;------------------------------------------------------------------------------
531
;? 
532
;------------------------------------------------------------------------------
1859 art_zh 533
	; activate and redraw window under cursor (if necessary)
534
	call	mouse._.find_sys_window_under_cursor
535
	movzx	esi, word[WIN_STACK + esi * 2]
536
	lea	esi, [WIN_POS + esi * 2]
537
	jmp	waredraw
1689 art_zh 538
 
539
align 4
540
;------------------------------------------------------------------------------
541
mouse._.find_sys_button_under_cursor: ;////////////////////////////////////////
542
;------------------------------------------------------------------------------
543
;? Find system button object which is currently visible on screen and has
544
;? mouse cursor within its bounds
545
;------------------------------------------------------------------------------
546
;< eax = pack[8(process slot), 24(button id)] or 0
547
;< ebx = pack[16(button x coord), 16(button y coord)]
548
;------------------------------------------------------------------------------
1859 art_zh 549
	push	ecx edx esi edi
1689 art_zh 550
 
1859 art_zh 551
	call	mouse._.find_sys_window_under_cursor
552
	mov	edx, esi
1689 art_zh 553
 
1859 art_zh 554
	; check if any process button contains cursor
555
	mov	eax, [BTN_ADDR]
556
	mov	ecx, [eax]
557
	imul	esi, ecx, SYS_BUTTON.sizeof
558
	add	esi, eax
559
	inc	ecx
560
	add	esi, SYS_BUTTON.sizeof
1689 art_zh 561
 
562
  .next_button:
1859 art_zh 563
	dec	ecx
564
	jz	.not_found
1689 art_zh 565
 
1859 art_zh 566
	add	esi, -SYS_BUTTON.sizeof
1689 art_zh 567
 
1859 art_zh 568
	; does it belong to our process?
569
	cmp	dx, [esi + SYS_BUTTON.pslot]
570
	jne	.next_button
1689 art_zh 571
 
1859 art_zh 572
	; does it contain cursor coordinates?
573
	mov	eax, [mouse.state.pos.x]
574
	sub	eax, [edi + WDATA.box.left]
575
	sub	ax, [esi + SYS_BUTTON.left]
576
	jl	.next_button
577
	sub	ax, [esi + SYS_BUTTON.width]
578
	jge	.next_button
579
	mov	eax, [mouse.state.pos.y]
580
	sub	eax, [edi + WDATA.box.top]
581
	sub	ax, [esi + SYS_BUTTON.top]
582
	jl	.next_button
583
	sub	ax, [esi + SYS_BUTTON.height]
584
	jge	.next_button
1689 art_zh 585
 
1859 art_zh 586
	; okay, return it
587
	shl	edx, 24
588
	mov	eax, dword[esi + SYS_BUTTON.id_hi - 2]
589
	mov	ax, [esi + SYS_BUTTON.id_lo]
590
	and	eax, 0x0ffffff
591
	or	eax, edx
592
	mov	ebx, dword[esi + SYS_BUTTON.left - 2]
593
	mov	bx, [esi + SYS_BUTTON.top]
594
	jmp	.exit
1689 art_zh 595
 
596
  .not_found:
1859 art_zh 597
	xor	eax, eax
598
	xor	ebx, ebx
1689 art_zh 599
 
600
  .exit:
1859 art_zh 601
	pop	edi esi edx ecx
602
	ret
1689 art_zh 603
 
604
align 4
605
;------------------------------------------------------------------------------
606
mouse._.check_sys_window_actions: ;////////////////////////////////////////////
607
;------------------------------------------------------------------------------
608
;? 
609
;------------------------------------------------------------------------------
610
;< eax = action flags or 0
611
;------------------------------------------------------------------------------
1859 art_zh 612
	; is window movable?
613
	test	byte[edi + WDATA.cl_titlebar + 3], 0x01
614
	jnz	.no_action
1689 art_zh 615
 
1859 art_zh 616
	mov	eax, [mouse.state.pos.x]
617
	mov	ebx, [mouse.state.pos.y]
618
	sub	eax, [edi + WDATA.box.left]
619
	sub	ebx, [edi + WDATA.box.top]
1689 art_zh 620
 
1859 art_zh 621
	; is there a window titlebar under cursor?
622
	push	eax
623
	call	window._.get_titlebar_height
624
	cmp	ebx, eax
625
	pop	eax
626
	jl	.move_action
1689 art_zh 627
 
1859 art_zh 628
	; no there isn't, can it be resized then?
629
	mov	dl, [edi + WDATA.fl_wstyle]
630
	and	dl, 0x0f
631
	; NOTE: dangerous optimization, revise if window types changed;
632
	;       this currently implies only types 2 and 3 could be resized
633
	test	dl, 2
634
	jz	.no_action
1689 art_zh 635
 
1859 art_zh 636
	mov	ecx, [edi + WDATA.box.width]
637
	add	ecx, -window.BORDER_SIZE
638
	mov	edx, [edi + WDATA.box.height]
639
	add	edx, -window.BORDER_SIZE
1689 art_zh 640
 
1859 art_zh 641
	; is it rolled up?
642
	test	[edi + WDATA.fl_wstate], WSTATE_ROLLEDUP
643
	jnz	.resize_w_or_e_action
1689 art_zh 644
 
1859 art_zh 645
	cmp	eax, window.BORDER_SIZE
646
	jl	.resize_w_action
647
	cmp	eax, ecx
648
	jg	.resize_e_action
649
	cmp	ebx, edx
650
	jle	.no_action
1689 art_zh 651
 
652
  .resize_s_action:
1859 art_zh 653
	cmp	eax, window.BORDER_SIZE + 10
654
	jl	.resize_sw_action
655
	add	ecx, -10
656
	cmp	eax, ecx
657
	jge	.resize_se_action
658
	mov	eax, mouse.WINDOW_RESIZE_S_FLAG
659
	jmp	.exit
1689 art_zh 660
 
661
  .resize_w_or_e_action:
1859 art_zh 662
	cmp	eax, window.BORDER_SIZE + 10
663
	jl	.resize_w_action.direct
664
	add	ecx, -10
665
	cmp	eax, ecx
666
	jg	.resize_e_action.direct
667
	jmp	.no_action
1689 art_zh 668
 
669
  .resize_w_action:
1859 art_zh 670
	add	edx, -10
671
	cmp	ebx, edx
672
	jge	.resize_sw_action
1689 art_zh 673
  .resize_w_action.direct:
1859 art_zh 674
	mov	eax, mouse.WINDOW_RESIZE_W_FLAG
675
	jmp	.exit
1689 art_zh 676
 
677
  .resize_e_action:
1859 art_zh 678
	add	edx, -10
679
	cmp	ebx, edx
680
	jge	.resize_se_action
1689 art_zh 681
  .resize_e_action.direct:
1859 art_zh 682
	mov	eax, mouse.WINDOW_RESIZE_E_FLAG
683
	jmp	.exit
1689 art_zh 684
 
685
  .resize_sw_action:
1859 art_zh 686
	mov	eax, mouse.WINDOW_RESIZE_SW_FLAG
687
	jmp	.exit
1689 art_zh 688
 
689
  .resize_se_action:
1859 art_zh 690
	mov	eax, mouse.WINDOW_RESIZE_SE_FLAG
691
	jmp	.exit
1689 art_zh 692
 
693
  .move_action:
1859 art_zh 694
	mov	eax, mouse.WINDOW_MOVE_FLAG
695
	jmp	.exit
1689 art_zh 696
 
697
  .no_action:
1859 art_zh 698
	xor	eax, eax
1689 art_zh 699
 
700
  .exit:
1859 art_zh 701
	ret
1710 art_zh 702
 
2014 art_zh 703
;diff16 "mouse code end ",0,$
1859 art_zh 704
diff10 "mouse code size",mouse_check_events,$