Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
425 victor 1
$Revision: 431 $
431 serge 2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3
;;                                                              ;;
4
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
5
;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa      ;;
6
;; Distributed under terms of the GNU General Public License    ;;
7
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8
 
1 ha 9
max_buttons=4095
10
dececx:
11
    push edx
12
    push ecx
13
 
38 halyavin 14
    mov  edx,2
15
  .loop:
1 ha 16
 
38 halyavin 17
    cmp   byte [esp+edx],0x20
18
    jae   @f
1 ha 19
    mov   [esp+edx],byte 0x20
20
   @@:
21
    sub   [esp+edx],byte 0x20
22
 
38 halyavin 23
    dec  edx
24
    jns  .loop
1 ha 25
 
26
    pop  ecx
27
    pop  edx
28
    ret
379 serge 29
 
38 halyavin 30
incecx:
31
    push edx
32
    push ecx
379 serge 33
 
38 halyavin 34
    mov  edx,2
35
  .loop:
379 serge 36
 
38 halyavin 37
    cmp  byte [esp+edx],0xdf
38
    jbe  @f
39
    mov  [esp+edx],byte 0xdf
40
   @@:
41
    add  [esp+edx],byte 0x20
379 serge 42
 
38 halyavin 43
    dec  edx
44
    jns  .loop
45
    pop  ecx
46
    pop  edx
47
    ret
379 serge 48
 
38 halyavin 49
incecx2:
50
    push edx
51
    push ecx
379 serge 52
 
38 halyavin 53
    mov  edx,2
54
  .loop:
379 serge 55
 
38 halyavin 56
    cmp  byte [esp+edx],0xeb
57
    jbe  @f
58
    mov  [esp+edx],byte 0xeb
59
   @@:
60
    add  [esp+edx],byte 0x14
379 serge 61
 
38 halyavin 62
    dec  edx
63
    jns  .loop
64
    pop  ecx
65
    pop  edx
66
    ret
1 ha 67
 
68
drawbuttonframes:
69
 
415 heavyiron 70
	push  esi
71
	push  edi
72
	push  eax
73
	push  ebx
74
	push  ecx
75
	push  edx
1 ha 76
 
415 heavyiron 77
	shr   eax,16
78
	shr   ebx,16
79
	mov   edx,[TASK_BASE]
1 ha 80
 
115 poddubny 81
		add   eax,[edx-twdw + WDATA.box.left]
82
		add   ebx,[edx-twdw + WDATA.box.top]
415 heavyiron 83
	mov   cx,ax
84
	mov   dx,bx
85
	shl   eax,16
86
	shl   ebx,16
87
	mov   ax,cx
88
	mov   bx,dx
89
	add   ax,word [esp+12]
90
	mov   esi,ebx
91
	mov   edi,0
92
	mov   ecx,[esp+0]
93
	call  incecx
94
	call  [draw_line]
1 ha 95
 
415 heavyiron 96
	movzx edx,word [esp+8]
97
	add   ebx,edx
98
	shl   edx,16
99
	add   ebx,edx
100
	mov   ecx,[esp+0]
101
	call  dececx
102
	call  [draw_line]
1 ha 103
 
415 heavyiron 104
	mov   ebx,esi
105
	push  edx
106
	mov   edx,eax
107
	shr   edx,16
108
	mov   ax,dx
109
	mov   edx,ebx
110
	shr   edx,16
111
	mov   bx,dx
112
	mov   dx,[esp+8+4]
113
	add   bx,dx
114
	pop   edx
115
	mov   edi,0
116
	mov   ecx,[esp+0]
117
	call  incecx
118
	call  [draw_line]
1 ha 119
 
415 heavyiron 120
	mov   esi,edx
121
	mov   dx,[esp+12]
122
	add   ax,dx
123
	shl   edx,16
124
	add   eax,edx
125
	add   ebx,1*65536
126
	mov   edx,esi
127
	mov   ecx,[esp+0]
128
	call  dececx
129
	call  [draw_line]
1 ha 130
 
415 heavyiron 131
	pop   edx
132
	pop   ecx
133
	pop   ebx
134
	pop   eax
135
	pop   edi
136
	pop   esi
1 ha 137
 
415 heavyiron 138
	ret
1 ha 139
 
140
button_dececx:
141
 
415 heavyiron 142
	cmp   [buttontype],dword 1
143
	jne   .finish
1 ha 144
;        je    bdece
145
;        ret
146
;      bdece:
415 heavyiron 147
	push  eax
148
	mov   eax,0x01
149
	cmp   edi,20
150
	jg    @f
151
	mov   eax,0x02
1 ha 152
      @@:
415 heavyiron 153
	test  ecx,0xff
154
	jz    @f
155
	sub   ecx,eax
1 ha 156
      @@:
415 heavyiron 157
	shl   eax,8
158
	test  ecx,0xff00
159
	jz    @f
160
	sub   ecx,eax
1 ha 161
      @@:
415 heavyiron 162
	shl   eax,8
163
	test  ecx,0xff0000
164
	jz    @f
165
	sub   ecx,eax
1 ha 166
      @@:
415 heavyiron 167
	pop    eax
1 ha 168
      .finish:
415 heavyiron 169
	ret
1 ha 170
 
171
 
172
sys_button:
173
 
415 heavyiron 174
	push	edi
175
	mov	edi,[CURRENT_TASK]
176
	shl	edi,8
177
	rol	eax,16
178
	add	ax,word[edi+SLOT_BASE+APPDATA.wnd_clientbox.left]
179
	rol	eax,16
180
	rol	ebx,16
181
	add	bx,word[edi+SLOT_BASE+APPDATA.wnd_clientbox.top]
182
	rol	ebx,16
183
	pop	edi
114 mikedld 184
  .forced:
185
 
415 heavyiron 186
	test  ecx,0x80000000
187
	jnz   remove_button
1 ha 188
 
415 heavyiron 189
	push  esi
190
	push  edi
191
	push  eax ; 
192
	push  ebx ; 
193
	push  ecx ; 
194
	push  edx
1 ha 195
 
415 heavyiron 196
	or    ax,ax
197
	jle   noaddbutt
198
	or    bx,bx
199
	jle   noaddbutt
54 mikedld 200
 
415 heavyiron 201
	test  ecx,0x40000000
202
	jnz   button_no_draw
1 ha 203
 
415 heavyiron 204
	pushad			     ; button body
205
	push  ebx
206
	shr   eax,16
207
	shr   ebx,16
208
	mov   edx,[TASK_BASE]
209
	mov   esi,[edx-twdw + WDATA.box.left]
210
	mov   edi,[edx-twdw + WDATA.box.top]
211
	add   eax,esi
212
	add   ebx,edi
213
	mov   cx,ax
214
	mov   dx,bx
215
	shl   eax,16
216
	shl   ebx,16
217
	mov   ax,cx
218
	mov   bx,dx
219
	movzx ecx,word [4+32+esp+12]
220
	add   eax,ecx
221
	mov   ecx,[4+32+esp+0]
222
	cmp   [buttontype],dword 0
223
	je    @f
224
	call  incecx2
1 ha 225
       @@:
415 heavyiron 226
	movzx edi,word [esp]
1 ha 227
 
415 heavyiron 228
	pop   edx
229
	and   edx, 0xFFFF
102 poddubny 230
 
1 ha 231
     .newline:
415 heavyiron 232
	call  button_dececx
233
	push  edi
234
	xor   edi, edi
235
	call  [draw_line]
236
	pop   edi
237
	add   ebx,1*65536+1   ; [ y start | y end ]
238
	dec   edx
239
	jnz   .newline
240
	popad
1 ha 241
 
415 heavyiron 242
	call  drawbuttonframes
1 ha 243
 
244
      button_no_draw:
245
 
415 heavyiron 246
	and   ecx,0xffff
1 ha 247
 
415 heavyiron 248
	mov   edi,[BTN_ADDR]
249
	movzx eax,word [edi]
250
	cmp   eax,max_buttons
251
	jge   noaddbutt
252
	inc   eax
253
	mov   [edi],ax
1 ha 254
 
415 heavyiron 255
	shl   eax,4
256
	add   eax,edi
1 ha 257
 
415 heavyiron 258
	mov   bx,[CURRENT_TASK]
259
	mov   [eax],bx
1 ha 260
 
415 heavyiron 261
	add   eax,2	    ; save button id number
262
	mov   ebx,[esp+4]
263
	mov   [eax],bx	    ; bits 0-15
264
	shr   ebx,16
265
	mov   [eax-2+0xc],bx; bits 16-31
266
	add   eax,2	    ; x start
267
	mov   bx,[esp+12+2]
268
	mov   [eax],bx
269
	add   eax,2	    ; x size
270
	mov   bx,[esp+12+0]
271
	mov   [eax],bx
272
	add   eax,2	    ; y start
273
	mov   bx,[esp+8+2]
274
	mov   [eax],bx
275
	add   eax,2	    ; y size
276
	mov   bx,[esp+8+0]
277
	mov   [eax],bx
1 ha 278
 
279
     noaddbutt:
280
 
415 heavyiron 281
	pop   edx
282
	pop   ecx
283
	pop   ebx
284
	pop   eax
285
	pop   edi
286
	pop   esi
1 ha 287
 
415 heavyiron 288
	ret
1 ha 289
 
290
 
291
remove_button:
292
 
293
    and  ecx,0x7fffffff
294
 
295
  rnewba2:
296
 
381 serge 297
    mov   edi,[BTN_ADDR]
1 ha 298
    mov   eax,edi
299
    movzx ebx,word [edi]
300
    inc   bx
301
 
302
  rnewba:
303
 
304
    dec   bx
415 heavyiron 305
    jz	  rnmba
1 ha 306
 
307
    add   eax,0x10
308
 
379 serge 309
    mov   dx,[CURRENT_TASK]
1 ha 310
    cmp   dx,[eax]
311
    jnz   rnewba
312
 
313
    cmp   cx,[eax+2]
314
    jnz   rnewba
315
 
316
    pushad
317
    mov   ecx,ebx
318
    inc   ecx
319
    shl   ecx,4
320
    mov   ebx,eax
321
    add   eax,0x10
322
    call  memmove
323
    dec   dword [edi]
324
    popad
325
 
326
    jmp   rnewba2
327
 
328
  rnmba:
329
 
330
    ret
331
 
332
find_pressed_button_frames:
333
 
415 heavyiron 334
	pushad
1 ha 335
 
415 heavyiron 336
	movzx ebx,word [eax+0]
337
	shl   ebx,5
338
	add   ebx,window_data
115 poddubny 339
		mov   ecx, [ebx+ WDATA.box.left]     ; window x start
415 heavyiron 340
	movzx edx,word [eax+4]	   ; button x start
341
	add   ecx,edx
342
	push  ecx
1 ha 343
 
415 heavyiron 344
		mov   dx,[eax+6]		 ; button x size
345
	add   cx,dx
346
	mov   esi,ecx
347
	inc   esi
348
		mov   ecx, [ebx+WDATA.box.top]	 ; window y start
349
		mov   dx,[eax+8]		 ; button y start
350
	add   ecx,edx
351
	mov   ebx,ecx
352
		mov   dx,[eax+10]		 ; button y size
353
	add   dx,cx
354
	inc   dx
1 ha 355
 
415 heavyiron 356
	pop   eax
1 ha 357
 
415 heavyiron 358
	; eax x beginning
359
	; ebx y beginning
360
	; esi x end
361
	; edx y end
362
	; ecx color
1 ha 363
 
415 heavyiron 364
	mov   [pressed_button_eax],eax
365
	mov   [pressed_button_ebx],ebx
366
	mov   [pressed_button_ecx],ecx
367
	mov   [pressed_button_edx],edx
368
	mov   [pressed_button_esi],esi
1 ha 369
 
415 heavyiron 370
	popad
371
	ret
1 ha 372
 
373
uglobal
374
  pressed_button_eax  dd  0
375
  pressed_button_ebx  dd  0
376
  pressed_button_ecx  dd  0
377
  pressed_button_edx  dd  0
378
  pressed_button_esi  dd  0
379
endg
380
 
381
; negative button image
382
 
383
negativebutton:
415 heavyiron 384
	; If requested, do not display button
385
	; boarder on press.
386
	test  ebx,0x20000000
387
	jz    draw_negative_button
388
	ret
1 ha 389
      draw_negative_button:
390
 
415 heavyiron 391
	pushad
1 ha 392
 
415 heavyiron 393
	mov   eax,[pressed_button_eax]
394
	mov   ebx,[pressed_button_ebx]
395
	mov   ecx,[pressed_button_ecx]
396
	mov   edx,[pressed_button_edx]
397
	mov   esi,[pressed_button_esi]
398
	mov   ecx,0x01000000
1 ha 399
 
415 heavyiron 400
	dec   edx
401
	push  edx
402
	inc   edx
403
	dec   esi
404
	push  esi
405
	inc   esi
1 ha 406
 
415 heavyiron 407
	push  eax
408
	push  ebx
409
	push  ecx
410
	push  edx
411
	push  edi
1 ha 412
 
415 heavyiron 413
	call  [disable_mouse]
1 ha 414
 
415
      bdbnewline:
415 heavyiron 416
	mov   edi,1    ; force
417
	cmp   eax,[esp+16]
418
	jz    bneg
419
	cmp   eax,[esp+20]
420
	jz    bneg
421
	cmp   ebx,[esp+12]
422
	jz    bneg
423
	cmp   ebx,[esp+24]
424
	jnz   nbneg
1 ha 425
;        jz    bneg
426
;        jmp   nbneg
427
 
428
      bneg:
429
 
415 heavyiron 430
	;;;call  [disable_mouse]
431
	call  [putpixel]
1 ha 432
 
433
      nbneg:
434
 
415 heavyiron 435
	inc   eax
436
	cmp   eax,esi
437
	jnz   bdbnewline
438
	mov   eax,[esp+16]
439
	inc   ebx
440
	cmp   ebx,edx
441
	jnz   bdbnewline
1 ha 442
 
415 heavyiron 443
	add   esp,28
1 ha 444
 
415 heavyiron 445
	popad
1 ha 446
 
415 heavyiron 447
	ret
1 ha 448
 
449
; check buttons
450
 
451
 
452
; 0000 word process number
453
; 0002 word button id number : bits 0-15
454
; 0004 word x start
455
; 0006 word x size
456
; 0008 word y start
457
; 000A word y size
458
; 000C word button id number : bits 16-31
459
;
460
; button table in 0x10 increments
461
;
462
; first at 0x10
463
 
464
 
465
checkbuttons:
466
 
381 serge 467
    cmp   [BTN_DOWN],byte 0    ; mouse buttons pressed
1 ha 468
    jnz   @f
415 heavyiron 469
;..................................... start 1/5 : modified by vhanla .............................
470
    mov [bPressedMouseXY_B],0
471
;..................................... end 1/5 : modified by vhanla .............................
1 ha 472
    ret
473
  @@:
474
    pushad
475
 
476
    xor    esi, esi
381 serge 477
    mov    edi, [BTN_ADDR]
1 ha 478
    movzx  edx, word [edi]
479
    test   edx, edx
480
    jne    @f
481
    popad
482
    ret
483
 
484
  @@:
415 heavyiron 485
;..................................... start 2/5 : modified by vhanla .............................
486
  ;here i catch the coordinates when the mouse's button is clicked
487
   push ax
488
   cmp [bPressedMouseXY_B],0;FALSE
489
   jnz @f
490
   mov [bPressedMouseXY_B],1;TRUE - it was already clicked
491
   mov ax,[MOUSE_X]
492
   mov [mx],ax
493
   mov ax,[MOUSE_Y]
494
   mov [my],ax
495
   @@:
496
   pop	ax
497
   ;and it is only refreshed after the mouse's button release
498
;..................................... end 2/5 : modified by vhanla .............................
1 ha 499
 
500
    push  esi
501
    inc   edx
502
    push  edx
503
 
504
  buttonnewcheck:
505
 
506
    pop   edx
507
    pop   esi
508
    inc   esi
509
    cmp   edx,esi
510
    jge   bch
511
 
415 heavyiron 512
    popad		  ; no button pressed
1 ha 513
    ret
514
 
515
  bch:
516
 
517
    push  esi
518
    push  edx
519
    mov   eax,esi
520
    shl   eax,4
521
    add   eax,edi
522
 
523
    ; check that button is at top of windowing stack
524
 
525
    movzx ebx,word [eax]
380 serge 526
    movzx ecx,word [WIN_STACK + ebx * 2]
379 serge 527
    cmp   ecx,[TASK_COUNT]
1 ha 528
    jne   buttonnewcheck
529
 
530
    ; check that button start is inside window x/y end
531
 
532
    movzx ebx,word [eax+0]
533
    shl   ebx,5
41 mikedld 534
 
415 heavyiron 535
	test	[ebx+window_data+WDATA.fl_wstate],WSTATE_MINIMIZED
536
	jnz	buttonnewcheck
41 mikedld 537
 
1 ha 538
;    add   ebx,window_data
539
;    mov   ecx,[window_data+ebx+8]          ; window end X
540
    movzx edx,word [eax+4]     ; button start X
115 poddubny 541
    cmp   edx, [window_data+ebx+WDATA.box.width] ;ecx
1 ha 542
    jge   buttonnewcheck
543
 
544
;    mov   ecx,[window_data+ebx+12]         ; window end Y
545
    movzx edx, word [eax+8]    ; button start Y
115 poddubny 546
    cmp   edx, [window_data+ebx+WDATA.box.height] ;ecx
1 ha 547
    jge   buttonnewcheck
548
 
549
    ; check coordinates
415 heavyiron 550
			       ; mouse x >= button x ?
1 ha 551
    movzx ebx,word [eax+0]
552
    shl   ebx,5
553
    add   ebx,window_data
115 poddubny 554
	mov   ecx, [ebx+WDATA.box.left]     ; window x start
1 ha 555
    movzx edx,word [eax+4]     ; button x start
556
    add   edx,ecx
415 heavyiron 557
;..................................... start 3/5 : modified by vhanla .............................
558
    mov   cx,[mx]   ;mov cx,[MOUSE_X]
559
;..................................... end 3/5 : modified by vhanla .............................
1 ha 560
    cmp   edx,ecx
415 heavyiron 561
    jg	  buttonnewcheck
1 ha 562
 
563
    movzx ebx,word [eax+6]     ; button x size
564
    add   edx,ebx
565
    cmp   ecx,edx
415 heavyiron 566
    jg	  buttonnewcheck
1 ha 567
 
415 heavyiron 568
			       ; mouse y >= button y ?
1 ha 569
    movzx ebx,word [eax+0]
570
    shl   ebx,5
571
    add   ebx,window_data
415 heavyiron 572
	mov   ecx, [ebx+WDATA.box.top]	   ; window y start
1 ha 573
    movzx edx,word [eax+8]     ; button y start
574
    add   edx,ecx
415 heavyiron 575
;..................................... start 4/5 : modified by vhanla .............................
576
    mov   cx,[my]  ;mov cx,[MOUSE_Y]
577
;..................................... start 4/5 : modified by vhanla .............................
1 ha 578
    cmp   edx,ecx
415 heavyiron 579
    jg	  buttonnewcheck
1 ha 580
 
581
    movzx ebx,word [eax+10]    ; button y size
582
    add   edx,ebx
583
    cmp   ecx,edx
415 heavyiron 584
    jg	  buttonnewcheck
1 ha 585
 
586
    ; mouse on button
587
 
588
    pop   edx
589
    pop   esi
590
 
415 heavyiron 591
    mov   bx,[eax+0xc]	   ; button id : bits 16-31
1 ha 592
    shl   ebx,16
415 heavyiron 593
    mov   bx,[eax+2]	   ; button id : bits 00-16
1 ha 594
    push  ebx
595
 
381 serge 596
    mov   [MOUSE_DOWN],byte 1  ; no mouse down checks
1 ha 597
    call find_pressed_button_frames
598
    call negativebutton
599
 
600
    pushad
601
  cbwaitmouseup:
602
 
603
    call  checkidle
604
 
605
    call  [draw_pointer]
606
 
607
    pushad
608
    call  stack_handler
609
    popad
610
 
381 serge 611
    cmp   [BTN_DOWN],byte 0  ; mouse buttons pressed ?
1 ha 612
    jnz   cbwaitmouseup
613
    popad
614
 
615
    call  negativebutton
381 serge 616
    mov   [MOUSE_BACKGROUND],byte 0  ; no mouse background
617
    mov   [DONT_DRAW_MOUSE],byte 0  ; draw mouse
415 heavyiron 618
;..................................... start 5/5 : modified by vhanla .............................
28 mario79 619
    ; check coordinates
415 heavyiron 620
    jmp @f
621
    mx dw 0x0 ; keeps the x mouse's position when it was clicked
622
    my dw 0x0 ; keeps the y mouse's position when it was clicked
623
    bPressedMouseXY_B db 0x0
624
    @@:
28 mario79 625
 
33 mario79 626
   pusha
627
  ; mouse x >= button x ?
628
   movzx ebx,word [eax+0]
415 heavyiron 629
   shl	 ebx,5
630
   add	 ebx,window_data
631
   mov	 ecx, [ebx+WDATA.box.left]    ; window x start
33 mario79 632
   movzx edx,word [eax+4]    ; button x start
415 heavyiron 633
   add	 edx,ecx
634
   mov	 cx,[MOUSE_X]
635
   cmp	 edx,ecx
636
   jg	no_on_button ;if we release the pointer out of the button area
28 mario79 637
 
33 mario79 638
   movzx ebx,word [eax+6]    ; button x size
415 heavyiron 639
   add	 edx,ebx
640
   cmp	 ecx,edx
641
   jg	no_on_button
28 mario79 642
 
415 heavyiron 643
	; mouse y >= button y ?
33 mario79 644
   movzx ebx,word [eax+0]
415 heavyiron 645
   shl	 ebx,5
646
   add	 ebx,window_data
647
   mov	 ecx, [ebx+WDATA.box.top]    ; window y start
33 mario79 648
   movzx edx,word [eax+8]    ; button y start
415 heavyiron 649
   add	 edx,ecx
650
   mov	 cx,[MOUSE_Y]
651
   cmp	 edx,ecx
652
   jg	no_on_button
28 mario79 653
 
33 mario79 654
   movzx ebx,word [eax+10]   ; button y size
415 heavyiron 655
   add	 edx,ebx
656
   cmp	 ecx,edx
657
   jg	no_on_button
33 mario79 658
   popa
415 heavyiron 659
   mov	 [BTN_COUNT],byte 1 ; no of buttons in buffer
660
   pop	 ebx
661
   mov	 [BTN_BUFF],ebx   ; lets put the button id in buffer
33 mario79 662
   push  ebx
663
   pusha
664
   jmp yes_on_button
28 mario79 665
no_on_button:
415 heavyiron 666
   mov	 [BTN_COUNT],byte 0 ; no of buttons in buffer
28 mario79 667
yes_on_button:
415 heavyiron 668
   mov	 [MOUSE_DOWN],byte 0 ; mouse down -> do not draw
33 mario79 669
   popa
670
   pop ebx
671
   popa
672
   ret
673
 
415 heavyiron 674
;..................................... end 5/5 : modified by vhanla ................................