Subversion Repositories Kolibri OS

Rev

Rev 1376 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1376 Rev 2382
Line 3... Line 3...
3
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
4
;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa      ;;
4
;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa      ;;
5
;; Distributed under terms of the GNU General Public License    ;;
5
;; Distributed under terms of the GNU General Public License    ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 7... Line 7...
7
 
7
 
-
 
8
$Revision: 2382 $
-
 
9
 
-
 
10
WINDOW_MOVE_AND_RESIZE_FLAGS = \
-
 
11
  mouse.WINDOW_RESIZE_N_FLAG + \
-
 
12
  mouse.WINDOW_RESIZE_W_FLAG + \
-
 
13
  mouse.WINDOW_RESIZE_S_FLAG + \
-
 
14
  mouse.WINDOW_RESIZE_E_FLAG + \
Line 8... Line 15...
8
$Revision: 1376 $
15
  mouse.WINDOW_MOVE_FLAG
9
 
16
 
10
uglobal
17
uglobal
11
align 4
18
align 4
Line 23... Line 30...
23
        jz      .fail
30
        jz      .fail
24
      ; eax - current event, ebx - previos event below
31
      ; eax - current event, ebx - previos event below
25
        mov     ecx,EV_SPACE         ; current - in allocated space
32
        mov     ecx, EV_SPACE        ; current - in allocated space
26
        mov     ebx,FreeEvents       ; previos - íà÷àëî ñïèñêà
33
        mov     ebx, FreeEvents      ; previos - íà÷àëî ñïèñêà
27
        push    ebx                  ; îíî æå è êîíåö ïîòîì áóäåò
34
        push    ebx                  ; îíî æå è êîíåö ïîòîì áóäåò
-
 
35
  @@:
28
  @@:   mov     [ebx+EVENT.fd],eax
36
        mov     [ebx+EVENT.fd], eax
29
        mov     [eax+EVENT.bk],ebx
37
        mov     [eax+EVENT.bk], ebx
30
        mov     ebx,eax              ; previos <- current
38
        mov     ebx, eax             ; previos <- current
31
        add     eax,EVENT.size       ; new current
39
        add     eax, EVENT.size      ; new current
32
        loop    @b
40
        loop    @b
33
        pop     eax                  ; âîò îíî êîíöîì è ñòàëî
41
        pop     eax                  ; âîò îíî êîíöîì è ñòàëî
34
        mov     [ebx+EVENT.fd],eax
42
        mov     [ebx+EVENT.fd], eax
35
        mov     [eax+EVENT.bk],ebx
43
        mov     [eax+EVENT.bk], ebx
-
 
44
.fail:
36
.fail:  ret
45
        ret
Line 37... Line 46...
37
 
46
 
38
EVENT_WATCHED    equ 0x10000000 ;áèò 28
47
EVENT_WATCHED    equ 0x10000000 ;áèò 28
39
EVENT_SIGNALED   equ 0x20000000 ;áèò 29
48
EVENT_SIGNALED   equ 0x20000000 ;áèò 29
40
MANUAL_RESET     equ 0x40000000 ;áèò 30
49
MANUAL_RESET     equ 0x40000000 ;áèò 30
Line 78... Line 87...
78
        jne     @f  ; not empty ???
87
        jne     @f  ; not empty ???
79
        pushad
88
        pushad
80
        call    init_events
89
        call    init_events
81
        popad
90
        popad
82
        jz      RemoveEventTo.break ; POPF+RET
91
        jz      RemoveEventTo.break ; POPF+RET
-
 
92
  @@:
83
  @@:   mov     eax,[eax+EVENT.fd]
93
        mov     eax, [eax+EVENT.fd]
84
        mov     [eax+EVENT.magic],'EVNT'
94
        mov     [eax+EVENT.magic], 'EVNT'
85
        mov     [eax+EVENT.destroy],destroy_event.internal
95
        mov     [eax+EVENT.destroy], destroy_event.internal
86
        mov     [eax+EVENT.state],ecx
96
        mov     [eax+EVENT.state], ecx
87
        mov     [eax+EVENT.pid],edx
97
        mov     [eax+EVENT.pid], edx
88
        inc     [event_uid]
98
        inc     [event_uid]
Line 106... Line 116...
106
        mov     [ecx+EVENT.bk],eax   ; NewRight.bk=Self
116
        mov     [ecx+EVENT.bk], eax  ; NewRight.bk=Self
107
        xchg    ebx,[eax+EVENT.bk]   ; Self.bk=NewLeft,   ebx=OldLeft
117
        xchg    ebx, [eax+EVENT.bk]  ; Self.bk=NewLeft,   ebx=OldLeft
108
        xchg    ecx,[eax+EVENT.fd]   ; Self.fd=NewRight,  ecx=OldRight
118
        xchg    ecx, [eax+EVENT.fd]  ; Self.fd=NewRight,  ecx=OldRight
109
        mov     [ebx+EVENT.fd],ecx   ; OldLeft.fd=OldRight
119
        mov     [ebx+EVENT.fd], ecx  ; OldLeft.fd=OldRight
110
        mov     [ecx+EVENT.bk],ebx   ; OldRight.bk=OldLeft
120
        mov     [ecx+EVENT.bk], ebx  ; OldRight.bk=OldLeft
-
 
121
.break:
111
.break: popfd
122
        popfd
112
        ret
123
        ret
Line 113... Line 124...
113
 
124
 
114
align 4
125
align 4
115
NotDummyTest:                                      ;; INTERNAL use (not returned for fail !!!)
126
NotDummyTest:                                      ;; INTERNAL use (not returned for fail !!!)
Line 204... Line 215...
204
;   ebx - uid (for Dummy testing)
215
;   ebx - uid (for Dummy testing)
205
        cmp     [eax+EVENT.magic],'EVNT'
216
        cmp     [eax+EVENT.magic], 'EVNT'
206
        jne     @f
217
        jne     @f
207
        cmp     [eax+EVENT.id],ebx
218
        cmp     [eax+EVENT.id], ebx
208
        je      .ret
219
        je      .ret
-
 
220
  @@:
209
  @@:   pop     eax
221
        pop     eax
210
        xor     eax,eax
222
        xor     eax, eax
-
 
223
.ret:
211
.ret:   ret
224
        ret
Line 212... Line 225...
212
 
225
 
213
 
226
 
214
align 4
227
align 4
Line 245... Line 258...
245
        Mov     [esi+APPDATA.wait_begin],eax,[timer_ticks]
258
        Mov     [esi+APPDATA.wait_begin],eax,[timer_ticks]
246
        mov     eax,[TASK_BASE]
259
        mov     eax, [TASK_BASE]
247
        mov     [eax+TASKDATA.state], 5
260
        mov     [eax+TASKDATA.state], 5
248
        call    change_task
261
        call    change_task
249
        mov     eax,[esi+APPDATA.wait_param]
262
        mov     eax, [esi+APPDATA.wait_param]
-
 
263
  @@:
250
  @@:   ret
264
        ret
Line 251... Line 265...
251
 
265
 
252
align 4
266
align 4
253
wait_event:                                        ;; EXPORT use
267
wait_event:                                        ;; EXPORT use
254
;info:
268
;info:
Line 337... Line 351...
337
;   eax - àäðåñ îáúåêòà EVENT (=0 => fail)
351
;   eax - àäðåñ îáúåêòà EVENT (=0 => fail)
338
        add     ebx,APP_EV_OFFSET
352
        add     ebx, APP_EV_OFFSET
339
        mov     eax,[ebx+APPOBJ.bk]  ; âûáèðàåì ñ êîíöà, ïî ïðèíöèïó FIFO
353
        mov     eax, [ebx+APPOBJ.bk] ; âûáèðàåì ñ êîíöà, ïî ïðèíöèïó FIFO
340
        cmp     eax,ebx  ; empty ???
354
        cmp     eax, ebx ; empty ???
341
        je      get_event_alone.ret0
355
        je      get_event_alone.ret0
-
 
356
.ret:
342
.ret:   ret
357
        ret
Line 343... Line 358...
343
 
358
 
344
align 4
359
align 4
345
get_event_alone:
360
get_event_alone:
346
;info:
361
;info:
Line 355... Line 370...
355
;   eax - àäðåñ îáúåêòà EVENT (=0 => fail)
370
;   eax - àäðåñ îáúåêòà EVENT (=0 => fail)
356
        mov     eax,[ebx+APPDATA.wait_param]
371
        mov     eax, [ebx+APPDATA.wait_param]
357
        test    byte[eax+EVENT.state+3], EVENT_SIGNALED shr 24
372
        test    byte[eax+EVENT.state+3], EVENT_SIGNALED shr 24
358
        jnz     .ret
373
        jnz     .ret
359
        or      byte[eax+EVENT.state+3], EVENT_WATCHED shr 24
374
        or      byte[eax+EVENT.state+3], EVENT_WATCHED shr 24
-
 
375
.ret0:
360
.ret0:  xor     eax,eax ; NO event!!!
376
        xor     eax, eax; NO event!!!
-
 
377
.ret:
361
.ret:   ret
378
        ret
Line 362... Line 379...
362
 
379
 
363
align 4
380
align 4
364
sys_sendwindowmsg:                                 ;; f72
381
sys_sendwindowmsg:                                 ;; f72
365
        dec     ebx
382
        dec     ebx
366
        jnz     .ret ;subfunction==1 ?
383
        jnz     .ret ;subfunction==1 ?
367
       ;pushfd  ;à íàôèãà?
384
       ;pushfd  ;à íàôèãà?
368
        cli
385
        cli
369
        sub     ecx,2
386
        sub     ecx, 2
-
 
387
        je      .sendkey
370
        je      .sendkey
388
        dec     ecx
371
        loop    .retf
389
        jnz     .retf
372
.sendbtn:
390
.sendbtn:
373
        cmp     byte[BTN_COUNT],1
391
        cmp     byte[BTN_COUNT], 1
374
        jae     .result ;overflow
392
        jae     .result ;overflow
-
 
393
        inc     byte[BTN_COUNT]
375
        inc     byte[BTN_COUNT]
394
        shl     edx, 8
376
        mov     [BTN_BUFF],edx
395
        mov     [BTN_BUFF], edx
377
        jmp     .result
396
        jmp     .result
378
.sendkey:
397
.sendkey:
379
        movzx   eax,byte[KEY_COUNT]
398
        movzx   eax, byte[KEY_COUNT]
Line 382... Line 401...
382
        inc     byte[KEY_COUNT]
401
        inc     byte[KEY_COUNT]
383
        mov     [KEY_COUNT+1+eax],dl
402
        mov     [KEY_COUNT+1+eax], dl
384
.result:
403
.result:
385
        setae   byte[esp+32] ;ñ÷èòàåì, ÷òî èñõîäíî: dword[esp+32]==72
404
        setae   byte[esp+32] ;ñ÷èòàåì, ÷òî èñõîäíî: dword[esp+32]==72
386
.retf: ;popfd
405
.retf: ;popfd
-
 
406
.ret:
387
.ret:   ret
407
        ret
Line 388... Line 408...
388
 
408
 
389
align 4
409
align 4
390
sys_getevent:                                      ;; f11
410
sys_getevent:                                      ;; f11
391
        mov     ebx,[current_slot] ;ïîêà ýòî âîïðîñ, ÷åãî êóäû ñóâàòü..........
411
        mov     ebx, [current_slot];ïîêà ýòî âîïðîñ, ÷åãî êóäû ñóâàòü..........
Line 424... Line 444...
424
.loop: ; ïîêà íå èñ÷åðïàåì âñå áèòû ìàñêè
444
.loop: ; ïîêà íå èñ÷åðïàåì âñå áèòû ìàñêè
425
        bsr     eax,ecx        ; íàõîäèì íåíóëåâîé áèò ìàñêè (31 -> 0)
445
        bsr     eax, ecx       ; íàõîäèì íåíóëåâîé áèò ìàñêè (31 -> 0)
426
        jz      .no_events     ; èñ÷åðïàëè âñå áèòû ìàñêè, íî íè÷åãî íå íàøëè ???
446
        jz      .no_events     ; èñ÷åðïàëè âñå áèòû ìàñêè, íî íè÷åãî íå íàøëè ???
427
        btr     ecx,eax        ; ñáðàñûâàåì ïðîâåðÿåìûé áèò ìàñêè
447
        btr     ecx, eax       ; ñáðàñûâàåì ïðîâåðÿåìûé áèò ìàñêè
428
       ; ïåðåõîäèì íà îáðàáîò÷èê ýòîãî (eax) áèòà
448
       ; ïåðåõîäèì íà îáðàáîò÷èê ýòîãî (eax) áèòà
429
        cmp     eax,16
-
 
430
        jae     .IRQ           ; eax=[16..31]=retvals, events irq0..irq15
-
 
431
        cmp     eax,9
449
        cmp     eax, 9
432
        jae     .loop          ; eax=[9..15], ignored
450
        jae     .loop          ; eax=[9..31], ignored
433
        cmp     eax,3
451
        cmp     eax, 3
434
        je      .loop          ; eax=3, ignored
452
        je      .loop          ; eax=3, ignored
435
        ja      .FlagAutoReset ; eax=[4..8], retvals=eax+1
453
        ja      .FlagAutoReset ; eax=[4..8], retvals=eax+1
436
        cmp     eax,1
454
        cmp     eax, 1
437
        jae     .BtKy          ; eax=[1,2],  retvals=eax+1
455
        jae     .BtKy          ; eax=[1,2],  retvals=eax+1
Line 440... Line 458...
440
        jne     .result
458
        jne     .result
441
        jmp     .loop
459
        jmp     .loop
442
  .no_events:
460
  .no_events:
443
        xor     eax,eax
461
        xor     eax, eax
444
        ret
462
        ret
445
.IRQ:
463
 
446
;TODO: ñäåëàòü òàê æå, êàê è äëÿ FlagAutoReset (BgrRedraw,Mouse,IPC,Stack,Debug)
-
 
447
        mov     edx,[irq_owner+eax*4-64] ; eax==16+irq
-
 
448
        cmp     edx,[edi+TASKDATA.pid]
-
 
449
        jne     .loop
-
 
450
        mov     edx,eax
-
 
451
        shl     edx,12
-
 
452
        cmp     dword[IRQ_SAVE+edx-0x10000],0 ; edx==(16+irq)*0x1000
-
 
453
        je      .loop          ; empty ???
-
 
454
        ret     ; retval = eax
-
 
455
.FlagAutoReset: ; retvals: BgrRedraw=5, Mouse=6, IPC=7, Stack=8, Debug=9
464
.FlagAutoReset: ; retvals: BgrRedraw=5, Mouse=6, IPC=7, Stack=8, Debug=9
-
 
465
        cmp     eax, 5; Mouse 5+1=6
-
 
466
        jne     @f
-
 
467
        push    eax
-
 
468
; If the window is captured and moved by the user, then no mouse events!!!
-
 
469
        mov     al, [mouse.active_sys_window.action]
-
 
470
        and     al, WINDOW_MOVE_AND_RESIZE_FLAGS
-
 
471
        test    al, al
-
 
472
        pop     eax
-
 
473
        jnz     .loop
-
 
474
@@:
456
        btr     [ebx+APPDATA.event_mask],eax
475
        btr     [ebx+APPDATA.event_mask], eax
457
        jnc     .loop
476
        jnc     .loop
458
  .result:      ; retval = eax+1
477
  .result:      ; retval = eax+1
459
        inc     eax
478
        inc     eax
460
        ret
479
        ret
Line 465... Line 484...
465
.Buttons:                      ; eax=2, retval Buttons=3
484
.Buttons:                      ; eax=2, retval Buttons=3
466
        cmp     byte[BTN_COUNT],0
485
        cmp     byte[BTN_COUNT], 0
467
        je      .loop          ; empty ???
486
        je      .loop          ; empty ???
468
        cmp     edx,[TASK_COUNT]
487
        cmp     edx, [TASK_COUNT]
469
        jne     .loop          ; not Top ???
488
        jne     .loop          ; not Top ???
-
 
489
        mov     edx, [BTN_BUFF]
-
 
490
        shr     edx, 8
470
        cmp     dword[BTN_BUFF],0xFFFF ;-ID for Minimize-Button of Form
491
        cmp     edx, 0xFFFF    ;-ID for Minimize-Button of Form
471
        jne     .result
492
        jne     .result
472
        mov     [window_minimize],1
493
        mov     [window_minimize], 1
473
        dec     byte[BTN_COUNT]
494
        dec     byte[BTN_COUNT]
474
        jmp     .loop
495
        jmp     .loop
475
.Keys:    ; eax==1
496
.Keys:    ; eax==1
476
        cmp     edx,[TASK_COUNT]
497
        cmp     edx, [TASK_COUNT]
477
        jne     @f             ; not Top ???
498
        jne     @f             ; not Top ???
478
        cmp     [KEY_COUNT],al ; al==1
499
        cmp     [KEY_COUNT], al; al==1
479
        jae     .result        ; not empty ???
500
        jae     .result        ; not empty ???
-
 
501
  @@:
480
  @@:   mov     edx, hotkey_buffer
502
        mov     edx, hotkey_buffer
-
 
503
  @@:
481
  @@:   cmp     [edx],bh       ; bh - slot for testing
504
        cmp     [edx], bh      ; bh - slot for testing
482
        je      .result
505
        je      .result
483
        add     edx,8
506
        add     edx, 8
484
        cmp     edx, hotkey_buffer+120*8
507
        cmp     edx, hotkey_buffer+120*8
485
        jb      @b
508
        jb      @b
486
        jmp     .loop
509
        jmp     .loop