Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
425 victor 1
$Revision: 465 $
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
465 serge 175
        mov     edi,[current_slot]
415 heavyiron 176
	rol	eax,16
465 serge 177
        add     ax,word[edi+APPDATA.wnd_clientbox.left]
415 heavyiron 178
	rol	eax,16
179
	rol	ebx,16
465 serge 180
        add     bx,word[edi+APPDATA.wnd_clientbox.top]
415 heavyiron 181
	rol	ebx,16
182
	pop	edi
465 serge 183
.forced:
114 mikedld 184
 
415 heavyiron 185
	test  ecx,0x80000000
186
	jnz   remove_button
1 ha 187
 
415 heavyiron 188
	push  esi
189
	push  edi
190
	push  eax ; 
191
	push  ebx ; 
192
	push  ecx ; 
193
	push  edx
1 ha 194
 
415 heavyiron 195
	or    ax,ax
196
	jle   noaddbutt
197
	or    bx,bx
198
	jle   noaddbutt
54 mikedld 199
 
415 heavyiron 200
	test  ecx,0x40000000
201
	jnz   button_no_draw
1 ha 202
 
415 heavyiron 203
	pushad			     ; button body
204
	push  ebx
205
	shr   eax,16
206
	shr   ebx,16
207
	mov   edx,[TASK_BASE]
208
	mov   esi,[edx-twdw + WDATA.box.left]
209
	mov   edi,[edx-twdw + WDATA.box.top]
210
	add   eax,esi
211
	add   ebx,edi
212
	mov   cx,ax
213
	mov   dx,bx
214
	shl   eax,16
215
	shl   ebx,16
216
	mov   ax,cx
217
	mov   bx,dx
218
	movzx ecx,word [4+32+esp+12]
219
	add   eax,ecx
220
	mov   ecx,[4+32+esp+0]
221
	cmp   [buttontype],dword 0
222
	je    @f
223
	call  incecx2
1 ha 224
       @@:
415 heavyiron 225
	movzx edi,word [esp]
1 ha 226
 
415 heavyiron 227
	pop   edx
228
	and   edx, 0xFFFF
102 poddubny 229
 
465 serge 230
.newline:
415 heavyiron 231
	call  button_dececx
232
	push  edi
233
	xor   edi, edi
234
	call  [draw_line]
235
	pop   edi
236
	add   ebx,1*65536+1   ; [ y start | y end ]
237
	dec   edx
238
	jnz   .newline
239
	popad
1 ha 240
 
415 heavyiron 241
	call  drawbuttonframes
1 ha 242
 
465 serge 243
button_no_draw:
1 ha 244
 
415 heavyiron 245
	and   ecx,0xffff
1 ha 246
 
415 heavyiron 247
	mov   edi,[BTN_ADDR]
248
	movzx eax,word [edi]
249
	cmp   eax,max_buttons
250
	jge   noaddbutt
251
	inc   eax
252
	mov   [edi],ax
1 ha 253
 
415 heavyiron 254
	shl   eax,4
255
	add   eax,edi
1 ha 256
 
415 heavyiron 257
	mov   bx,[CURRENT_TASK]
258
	mov   [eax],bx
1 ha 259
 
415 heavyiron 260
	add   eax,2	    ; save button id number
261
	mov   ebx,[esp+4]
262
	mov   [eax],bx	    ; bits 0-15
263
	shr   ebx,16
264
	mov   [eax-2+0xc],bx; bits 16-31
265
	add   eax,2	    ; x start
266
	mov   bx,[esp+12+2]
267
	mov   [eax],bx
268
	add   eax,2	    ; x size
269
	mov   bx,[esp+12+0]
270
	mov   [eax],bx
271
	add   eax,2	    ; y start
272
	mov   bx,[esp+8+2]
273
	mov   [eax],bx
274
	add   eax,2	    ; y size
275
	mov   bx,[esp+8+0]
276
	mov   [eax],bx
1 ha 277
 
465 serge 278
noaddbutt:
1 ha 279
 
415 heavyiron 280
	pop   edx
281
	pop   ecx
282
	pop   ebx
283
	pop   eax
284
	pop   edi
285
	pop   esi
1 ha 286
 
415 heavyiron 287
	ret
1 ha 288
 
289
 
290
remove_button:
291
 
292
    and  ecx,0x7fffffff
293
 
465 serge 294
rnewba2:
1 ha 295
 
381 serge 296
    mov   edi,[BTN_ADDR]
1 ha 297
    mov   eax,edi
298
    movzx ebx,word [edi]
299
    inc   bx
300
 
465 serge 301
rnewba:
1 ha 302
 
303
    dec   bx
415 heavyiron 304
    jz	  rnmba
1 ha 305
 
306
    add   eax,0x10
307
 
379 serge 308
    mov   dx,[CURRENT_TASK]
1 ha 309
    cmp   dx,[eax]
310
    jnz   rnewba
311
 
312
    cmp   cx,[eax+2]
313
    jnz   rnewba
314
 
315
    pushad
316
    mov   ecx,ebx
317
    inc   ecx
318
    shl   ecx,4
319
    mov   ebx,eax
320
    add   eax,0x10
321
    call  memmove
322
    dec   dword [edi]
323
    popad
324
 
325
    jmp   rnewba2
326
 
465 serge 327
rnmba:
1 ha 328
 
329
    ret
330
 
331
find_pressed_button_frames:
332
 
415 heavyiron 333
	pushad
1 ha 334
 
415 heavyiron 335
	movzx ebx,word [eax+0]
336
	shl   ebx,5
337
	add   ebx,window_data
465 serge 338
        mov   ecx, [ebx+ WDATA.box.left]     ; window x start
415 heavyiron 339
	movzx edx,word [eax+4]	   ; button x start
340
	add   ecx,edx
341
	push  ecx
1 ha 342
 
465 serge 343
        mov   dx,[eax+6]                 ; button x size
415 heavyiron 344
	add   cx,dx
345
	mov   esi,ecx
346
	inc   esi
465 serge 347
        mov   ecx, [ebx+WDATA.box.top]   ; window y start
348
        mov   dx,[eax+8]                 ; button y start
415 heavyiron 349
	add   ecx,edx
350
	mov   ebx,ecx
351
		mov   dx,[eax+10]		 ; button y size
352
	add   dx,cx
353
	inc   dx
1 ha 354
 
415 heavyiron 355
	pop   eax
1 ha 356
 
415 heavyiron 357
	; eax x beginning
358
	; ebx y beginning
359
	; esi x end
360
	; edx y end
361
	; ecx color
1 ha 362
 
415 heavyiron 363
	mov   [pressed_button_eax],eax
364
	mov   [pressed_button_ebx],ebx
365
	mov   [pressed_button_ecx],ecx
366
	mov   [pressed_button_edx],edx
367
	mov   [pressed_button_esi],esi
1 ha 368
 
415 heavyiron 369
	popad
370
	ret
1 ha 371
 
372
uglobal
373
  pressed_button_eax  dd  0
374
  pressed_button_ebx  dd  0
375
  pressed_button_ecx  dd  0
376
  pressed_button_edx  dd  0
377
  pressed_button_esi  dd  0
378
endg
379
 
380
; negative button image
381
 
382
negativebutton:
415 heavyiron 383
	; If requested, do not display button
384
	; boarder on press.
385
	test  ebx,0x20000000
386
	jz    draw_negative_button
387
	ret
1 ha 388
      draw_negative_button:
389
 
415 heavyiron 390
	pushad
1 ha 391
 
415 heavyiron 392
	mov   eax,[pressed_button_eax]
393
	mov   ebx,[pressed_button_ebx]
394
	mov   ecx,[pressed_button_ecx]
395
	mov   edx,[pressed_button_edx]
396
	mov   esi,[pressed_button_esi]
397
	mov   ecx,0x01000000
1 ha 398
 
415 heavyiron 399
	dec   edx
400
	push  edx
401
	inc   edx
402
	dec   esi
403
	push  esi
404
	inc   esi
1 ha 405
 
415 heavyiron 406
	push  eax
407
	push  ebx
408
	push  ecx
409
	push  edx
410
	push  edi
1 ha 411
 
415 heavyiron 412
	call  [disable_mouse]
1 ha 413
 
414
      bdbnewline:
415 heavyiron 415
	mov   edi,1    ; force
416
	cmp   eax,[esp+16]
417
	jz    bneg
418
	cmp   eax,[esp+20]
419
	jz    bneg
420
	cmp   ebx,[esp+12]
421
	jz    bneg
422
	cmp   ebx,[esp+24]
423
	jnz   nbneg
1 ha 424
;        jz    bneg
425
;        jmp   nbneg
426
 
427
      bneg:
428
 
415 heavyiron 429
	;;;call  [disable_mouse]
430
	call  [putpixel]
1 ha 431
 
432
      nbneg:
433
 
415 heavyiron 434
	inc   eax
435
	cmp   eax,esi
436
	jnz   bdbnewline
437
	mov   eax,[esp+16]
438
	inc   ebx
439
	cmp   ebx,edx
440
	jnz   bdbnewline
1 ha 441
 
415 heavyiron 442
	add   esp,28
1 ha 443
 
415 heavyiron 444
	popad
1 ha 445
 
415 heavyiron 446
	ret
1 ha 447
 
448
; check buttons
449
 
450
 
451
; 0000 word process number
452
; 0002 word button id number : bits 0-15
453
; 0004 word x start
454
; 0006 word x size
455
; 0008 word y start
456
; 000A word y size
457
; 000C word button id number : bits 16-31
458
;
459
; button table in 0x10 increments
460
;
461
; first at 0x10
462
 
463
 
464
checkbuttons:
465
 
381 serge 466
    cmp   [BTN_DOWN],byte 0    ; mouse buttons pressed
1 ha 467
    jnz   @f
415 heavyiron 468
;..................................... start 1/5 : modified by vhanla .............................
469
    mov [bPressedMouseXY_B],0
470
;..................................... end 1/5 : modified by vhanla .............................
1 ha 471
    ret
472
  @@:
473
    pushad
474
 
475
    xor    esi, esi
381 serge 476
    mov    edi, [BTN_ADDR]
1 ha 477
    movzx  edx, word [edi]
478
    test   edx, edx
479
    jne    @f
480
    popad
481
    ret
482
 
483
  @@:
415 heavyiron 484
;..................................... start 2/5 : modified by vhanla .............................
485
  ;here i catch the coordinates when the mouse's button is clicked
486
   push ax
487
   cmp [bPressedMouseXY_B],0;FALSE
488
   jnz @f
489
   mov [bPressedMouseXY_B],1;TRUE - it was already clicked
490
   mov ax,[MOUSE_X]
491
   mov [mx],ax
492
   mov ax,[MOUSE_Y]
493
   mov [my],ax
494
   @@:
495
   pop	ax
496
   ;and it is only refreshed after the mouse's button release
497
;..................................... end 2/5 : modified by vhanla .............................
1 ha 498
 
499
    push  esi
500
    inc   edx
501
    push  edx
502
 
503
  buttonnewcheck:
504
 
505
    pop   edx
506
    pop   esi
507
    inc   esi
508
    cmp   edx,esi
509
    jge   bch
510
 
415 heavyiron 511
    popad		  ; no button pressed
1 ha 512
    ret
513
 
514
  bch:
515
 
516
    push  esi
517
    push  edx
518
    mov   eax,esi
519
    shl   eax,4
520
    add   eax,edi
521
 
522
    ; check that button is at top of windowing stack
523
 
524
    movzx ebx,word [eax]
380 serge 525
    movzx ecx,word [WIN_STACK + ebx * 2]
379 serge 526
    cmp   ecx,[TASK_COUNT]
1 ha 527
    jne   buttonnewcheck
528
 
529
    ; check that button start is inside window x/y end
530
 
531
    movzx ebx,word [eax+0]
532
    shl   ebx,5
41 mikedld 533
 
415 heavyiron 534
	test	[ebx+window_data+WDATA.fl_wstate],WSTATE_MINIMIZED
535
	jnz	buttonnewcheck
41 mikedld 536
 
1 ha 537
;    add   ebx,window_data
538
;    mov   ecx,[window_data+ebx+8]          ; window end X
539
    movzx edx,word [eax+4]     ; button start X
115 poddubny 540
    cmp   edx, [window_data+ebx+WDATA.box.width] ;ecx
1 ha 541
    jge   buttonnewcheck
542
 
543
;    mov   ecx,[window_data+ebx+12]         ; window end Y
544
    movzx edx, word [eax+8]    ; button start Y
115 poddubny 545
    cmp   edx, [window_data+ebx+WDATA.box.height] ;ecx
1 ha 546
    jge   buttonnewcheck
547
 
548
    ; check coordinates
415 heavyiron 549
			       ; mouse x >= button x ?
1 ha 550
    movzx ebx,word [eax+0]
551
    shl   ebx,5
552
    add   ebx,window_data
115 poddubny 553
	mov   ecx, [ebx+WDATA.box.left]     ; window x start
1 ha 554
    movzx edx,word [eax+4]     ; button x start
555
    add   edx,ecx
415 heavyiron 556
;..................................... start 3/5 : modified by vhanla .............................
557
    mov   cx,[mx]   ;mov cx,[MOUSE_X]
558
;..................................... end 3/5 : modified by vhanla .............................
1 ha 559
    cmp   edx,ecx
415 heavyiron 560
    jg	  buttonnewcheck
1 ha 561
 
562
    movzx ebx,word [eax+6]     ; button x size
563
    add   edx,ebx
564
    cmp   ecx,edx
415 heavyiron 565
    jg	  buttonnewcheck
1 ha 566
 
415 heavyiron 567
			       ; mouse y >= button y ?
1 ha 568
    movzx ebx,word [eax+0]
569
    shl   ebx,5
570
    add   ebx,window_data
415 heavyiron 571
	mov   ecx, [ebx+WDATA.box.top]	   ; window y start
1 ha 572
    movzx edx,word [eax+8]     ; button y start
573
    add   edx,ecx
415 heavyiron 574
;..................................... start 4/5 : modified by vhanla .............................
575
    mov   cx,[my]  ;mov cx,[MOUSE_Y]
576
;..................................... start 4/5 : modified by vhanla .............................
1 ha 577
    cmp   edx,ecx
415 heavyiron 578
    jg	  buttonnewcheck
1 ha 579
 
580
    movzx ebx,word [eax+10]    ; button y size
581
    add   edx,ebx
582
    cmp   ecx,edx
415 heavyiron 583
    jg	  buttonnewcheck
1 ha 584
 
585
    ; mouse on button
586
 
587
    pop   edx
588
    pop   esi
589
 
415 heavyiron 590
    mov   bx,[eax+0xc]	   ; button id : bits 16-31
1 ha 591
    shl   ebx,16
415 heavyiron 592
    mov   bx,[eax+2]	   ; button id : bits 00-16
1 ha 593
    push  ebx
594
 
381 serge 595
    mov   [MOUSE_DOWN],byte 1  ; no mouse down checks
1 ha 596
    call find_pressed_button_frames
597
    call negativebutton
598
 
599
    pushad
600
  cbwaitmouseup:
601
 
602
    call  checkidle
603
 
604
    call  [draw_pointer]
605
 
606
    pushad
607
    call  stack_handler
608
    popad
609
 
381 serge 610
    cmp   [BTN_DOWN],byte 0  ; mouse buttons pressed ?
1 ha 611
    jnz   cbwaitmouseup
612
    popad
613
 
614
    call  negativebutton
381 serge 615
    mov   [MOUSE_BACKGROUND],byte 0  ; no mouse background
616
    mov   [DONT_DRAW_MOUSE],byte 0  ; draw mouse
415 heavyiron 617
;..................................... start 5/5 : modified by vhanla .............................
28 mario79 618
    ; check coordinates
415 heavyiron 619
    jmp @f
620
    mx dw 0x0 ; keeps the x mouse's position when it was clicked
621
    my dw 0x0 ; keeps the y mouse's position when it was clicked
622
    bPressedMouseXY_B db 0x0
623
    @@:
28 mario79 624
 
33 mario79 625
   pusha
626
  ; mouse x >= button x ?
627
   movzx ebx,word [eax+0]
415 heavyiron 628
   shl	 ebx,5
629
   add	 ebx,window_data
630
   mov	 ecx, [ebx+WDATA.box.left]    ; window x start
33 mario79 631
   movzx edx,word [eax+4]    ; button x start
415 heavyiron 632
   add	 edx,ecx
633
   mov	 cx,[MOUSE_X]
634
   cmp	 edx,ecx
635
   jg	no_on_button ;if we release the pointer out of the button area
28 mario79 636
 
33 mario79 637
   movzx ebx,word [eax+6]    ; button x size
415 heavyiron 638
   add	 edx,ebx
639
   cmp	 ecx,edx
640
   jg	no_on_button
28 mario79 641
 
415 heavyiron 642
	; mouse y >= button y ?
33 mario79 643
   movzx ebx,word [eax+0]
415 heavyiron 644
   shl	 ebx,5
645
   add	 ebx,window_data
646
   mov	 ecx, [ebx+WDATA.box.top]    ; window y start
33 mario79 647
   movzx edx,word [eax+8]    ; button y start
415 heavyiron 648
   add	 edx,ecx
649
   mov	 cx,[MOUSE_Y]
650
   cmp	 edx,ecx
651
   jg	no_on_button
28 mario79 652
 
33 mario79 653
   movzx ebx,word [eax+10]   ; button y size
415 heavyiron 654
   add	 edx,ebx
655
   cmp	 ecx,edx
656
   jg	no_on_button
33 mario79 657
   popa
415 heavyiron 658
   mov	 [BTN_COUNT],byte 1 ; no of buttons in buffer
659
   pop	 ebx
660
   mov	 [BTN_BUFF],ebx   ; lets put the button id in buffer
33 mario79 661
   push  ebx
662
   pusha
663
   jmp yes_on_button
28 mario79 664
no_on_button:
415 heavyiron 665
   mov	 [BTN_COUNT],byte 0 ; no of buttons in buffer
28 mario79 666
yes_on_button:
415 heavyiron 667
   mov	 [MOUSE_DOWN],byte 0 ; mouse down -> do not draw
33 mario79 668
   popa
669
   pop ebx
670
   popa
671
   ret
672
 
415 heavyiron 673
;..................................... end 5/5 : modified by vhanla ................................