Subversion Repositories Kolibri OS

Rev

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

Rev 2508 Rev 2513
Line 3... Line 3...
3
;; Copyright (C) KolibriOS team 2004-2012. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2012. 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
 
Line 8... Line 8...
8
$Revision: 2508 $
8
$Revision: 2513 $
9
 
9
 
10
WINDOW_MOVE_AND_RESIZE_FLAGS = \
10
WINDOW_MOVE_AND_RESIZE_FLAGS = \
11
  mouse.WINDOW_RESIZE_N_FLAG + \
11
  mouse.WINDOW_RESIZE_N_FLAG + \
Line 21... Line 21...
21
  event_uid     dd 0
21
  event_uid     dd 0
22
endg
22
endg
23
EV_SPACE   = 512
23
EV_SPACE   = 512
24
FreeEvents = event_start-EVENT.fd    ; "âèðòóàëüíûé" event, èñïîëüçóþòñÿ òîëüêî ïîëÿ:
24
FreeEvents = event_start-EVENT.fd    ; "âèðòóàëüíûé" event, èñïîëüçóþòñÿ òîëüêî ïîëÿ:
25
                                     ;  FreeEvents.fd=event_start è FreeEvents.bk=event_end
25
                                     ;  FreeEvents.fd=event_start è FreeEvents.bk=event_end
-
 
26
;-----------------------------------------------------------------------------
26
align 4
27
align 4
27
init_events:                                       ;; used from kernel.asm
28
init_events:                                       ;; used from kernel.asm
28
        stdcall kernel_alloc, EV_SPACE*sizeof.EVENT
29
        stdcall kernel_alloc, EV_SPACE*sizeof.EVENT
29
        or      eax, eax
30
        or      eax, eax
30
        jz      .fail
31
        jz      .fail
31
      ; eax - current event, ebx - previos event below
32
      ; eax - current event, ebx - previos event below
32
        mov     ecx, EV_SPACE        ; current - in allocated space
33
        mov     ecx, EV_SPACE        ; current - in allocated space
33
        mov     ebx, FreeEvents      ; previos - íà÷àëî ñïèñêà
34
        mov     ebx, FreeEvents      ; previos - íà÷àëî ñïèñêà
34
        push    ebx                  ; îíî æå è êîíåö ïîòîì áóäåò
35
        push    ebx                  ; îíî æå è êîíåö ïîòîì áóäåò
-
 
36
;--------------------------------------
-
 
37
align 4
35
  @@:
38
@@:
36
        mov     [ebx+EVENT.fd], eax
39
        mov     [ebx+EVENT.fd], eax
37
        mov     [eax+EVENT.bk], ebx
40
        mov     [eax+EVENT.bk], ebx
38
        mov     ebx, eax             ; previos <- current
41
        mov     ebx, eax             ; previos <- current
39
        add     eax, sizeof.EVENT    ; new current
42
        add     eax, sizeof.EVENT    ; new current
40
        loop    @b
43
        loop    @b
41
        pop     eax                  ; âîò îíî êîíöîì è ñòàëî
44
        pop     eax                  ; âîò îíî êîíöîì è ñòàëî
42
        mov     [ebx+EVENT.fd], eax
45
        mov     [ebx+EVENT.fd], eax
43
        mov     [eax+EVENT.bk], ebx
46
        mov     [eax+EVENT.bk], ebx
-
 
47
;--------------------------------------
-
 
48
align 4
44
.fail:
49
.fail:
45
        ret
50
        ret
46
 
-
 
-
 
51
;-----------------------------------------------------------------------------
47
EVENT_WATCHED    equ 0x10000000 ;áèò 28
52
EVENT_WATCHED    equ 0x10000000 ;áèò 28
48
EVENT_SIGNALED   equ 0x20000000 ;áèò 29
53
EVENT_SIGNALED   equ 0x20000000 ;áèò 29
49
MANUAL_RESET     equ 0x40000000 ;áèò 30
54
MANUAL_RESET     equ 0x40000000 ;áèò 30
50
MANUAL_DESTROY   equ 0x80000000 ;áèò 31
55
MANUAL_DESTROY   equ 0x80000000 ;áèò 31
51
 
-
 
-
 
56
;-----------------------------------------------------------------------------
52
align 4
57
align 4
53
create_event:                                      ;; EXPORT use
58
create_event:                                      ;; EXPORT use
54
;info:
59
;info:
55
;   Ïåðåíîñèì EVENT èç ñïèñêà FreeEvents â ñïèñîê ObjList òåêóùåãî ñëîòà
60
;   Ïåðåíîñèì EVENT èç ñïèñêà FreeEvents â ñïèñîê ObjList òåêóùåãî ñëîòà
56
;   EVENT.state óñòàíàâëèâàåì èç ecx, EVENT.code êîñâåííî èç esi (åñëè esi<>0)
61
;   EVENT.state óñòàíàâëèâàåì èç ecx, EVENT.code êîñâåííî èç esi (åñëè esi<>0)
Line 65... Line 70...
65
        add     ebx, APP_OBJ_OFFSET
70
        add     ebx, APP_OBJ_OFFSET
66
        mov     edx, [TASK_BASE]
71
        mov     edx, [TASK_BASE]
67
        mov     edx, [edx+TASKDATA.pid]
72
        mov     edx, [edx+TASKDATA.pid]
68
        pushfd
73
        pushfd
69
        cli
74
        cli
-
 
75
;--------------------------------------
70
 
76
align 4
71
set_event:                                         ;; INTERNAL use !!! don't use for Call
77
set_event:                                         ;; INTERNAL use !!! don't use for Call
72
;info:
78
;info:
73
;   Áåðåì íîâûé event èç FreeEvents, çàïîëíÿåì åãî ïîëÿ, êàê óêàçàíî â ecx,edx,esi
79
;   Áåðåì íîâûé event èç FreeEvents, çàïîëíÿåì åãî ïîëÿ, êàê óêàçàíî â ecx,edx,esi
74
;   è óñòàíàâëèâàåì â ñïèñîê, óêàçàííûé â ebx.
80
;   è óñòàíàâëèâàåì â ñïèñîê, óêàçàííûé â ebx.
75
;   Âîçâðàùàåì ñàì event (â eax), è åãî uid (â edx)
81
;   Âîçâðàùàåì ñàì event (â eax), è åãî uid (â edx)
Line 87... Line 93...
87
        jne     @f  ; not empty ???
93
        jne     @f  ; not empty ???
88
        pushad
94
        pushad
89
        call    init_events
95
        call    init_events
90
        popad
96
        popad
91
        jz      RemoveEventTo.break ; POPF+RET
97
        jz      RemoveEventTo.break ; POPF+RET
-
 
98
;--------------------------------------
-
 
99
align 4
92
  @@:
100
@@:
93
        mov     eax, [eax+EVENT.fd]
101
        mov     eax, [eax+EVENT.fd]
94
        mov     [eax+EVENT.magic], 'EVNT'
102
        mov     [eax+EVENT.magic], 'EVNT'
95
        mov     [eax+EVENT.destroy], destroy_event.internal
103
        mov     [eax+EVENT.destroy], destroy_event.internal
96
        mov     [eax+EVENT.state], ecx
104
        mov     [eax+EVENT.state], ecx
Line 101... Line 109...
101
        jz      RemoveEventTo
109
        jz      RemoveEventTo
102
        lea     edi, [eax+EVENT.code]
110
        lea     edi, [eax+EVENT.code]
103
        mov     ecx, (sizeof.EVENT -EVENT.code)/4
111
        mov     ecx, (sizeof.EVENT -EVENT.code)/4
104
        cld
112
        cld
105
        rep movsd
113
        rep movsd
-
 
114
;--------------------------------------
106
 
115
align 4
107
RemoveEventTo:                                     ;; INTERNAL use !!! don't use for Call
116
RemoveEventTo:                                     ;; INTERNAL use !!! don't use for Call
108
;param:
117
;param:
109
;   eax - óêàçàòåëü íà event, ÊÎÒÎÐÛÉ âñòàâëÿåì
118
;   eax - óêàçàòåëü íà event, ÊÎÒÎÐÛÉ âñòàâëÿåì
110
;   ebx - óêàçàòåëü íà event, ÏÎÑËÅ êîòîðîãî âñòàâëÿåì
119
;   ebx - óêàçàòåëü íà event, ÏÎÑËÅ êîòîðîãî âñòàâëÿåì
111
;scratched: ebx,ecx
120
;scratched: ebx,ecx
Line 116... Line 125...
116
        mov     [ecx+EVENT.bk], eax  ; NewRight.bk=Self
125
        mov     [ecx+EVENT.bk], eax  ; NewRight.bk=Self
117
        xchg    ebx, [eax+EVENT.bk]  ; Self.bk=NewLeft,   ebx=OldLeft
126
        xchg    ebx, [eax+EVENT.bk]  ; Self.bk=NewLeft,   ebx=OldLeft
118
        xchg    ecx, [eax+EVENT.fd]  ; Self.fd=NewRight,  ecx=OldRight
127
        xchg    ecx, [eax+EVENT.fd]  ; Self.fd=NewRight,  ecx=OldRight
119
        mov     [ebx+EVENT.fd], ecx  ; OldLeft.fd=OldRight
128
        mov     [ebx+EVENT.fd], ecx  ; OldLeft.fd=OldRight
120
        mov     [ecx+EVENT.bk], ebx  ; OldRight.bk=OldLeft
129
        mov     [ecx+EVENT.bk], ebx  ; OldRight.bk=OldLeft
-
 
130
;--------------------------------------
-
 
131
align 4
121
.break:
132
.break:
122
        popfd
133
        popfd
123
        ret
134
        ret
124
 
-
 
-
 
135
;-----------------------------------------------------------------------------
125
align 4
136
align 4
126
NotDummyTest:                                      ;; INTERNAL use (not returned for fail !!!)
137
NotDummyTest:                                      ;; INTERNAL use (not returned for fail !!!)
127
        pop     edi
138
        pop     edi
128
        call    DummyTest ; not returned for fail !!!
139
        call    DummyTest ; not returned for fail !!!
129
        mov     ebx, eax
140
        mov     ebx, eax
130
        mov     eax, [ebx+EVENT.pid]
141
        mov     eax, [ebx+EVENT.pid]
131
        push    edi
142
        push    edi
-
 
143
;--------------------------------------
-
 
144
align 4
132
.small: ; êðèâî êàê-òî...
145
.small: ; êðèâî êàê-òî...
133
        pop     edi
146
        pop     edi
134
        pushfd
147
        pushfd
135
        cli
148
        cli
136
        call    pid_to_slot ; saved all registers (eax - retval)
149
        call    pid_to_slot ; saved all registers (eax - retval)
137
        shl     eax, 8
150
        shl     eax, 8
138
        jz      RemoveEventTo.break ; POPF+RET
151
        jz      RemoveEventTo.break ; POPF+RET
139
        jmp     edi ; øòàòíûé âîçâðàò
152
        jmp     edi ; øòàòíûé âîçâðàò
140
 
-
 
-
 
153
;-----------------------------------------------------------------------------
141
align 4
154
align 4
142
raise_event:                                       ;; EXPORT use
155
raise_event:                                       ;; EXPORT use
143
;info:
156
;info:
144
;   Óñòàíàâëèâàåì äàííûå EVENT.code
157
;   Óñòàíàâëèâàåì äàííûå EVENT.code
145
;   Åñëè òàì ôëàã EVENT_SIGNALED óæå àêòèâåí - áîëüøå íè÷åãî
158
;   Åñëè òàì ôëàã EVENT_SIGNALED óæå àêòèâåí - áîëüøå íè÷åãî
Line 156... Line 169...
156
        jz      @f
169
        jz      @f
157
        lea     edi, [ebx+EVENT.code]
170
        lea     edi, [ebx+EVENT.code]
158
        mov     ecx, (sizeof.EVENT -EVENT.code)/4
171
        mov     ecx, (sizeof.EVENT -EVENT.code)/4
159
        cld
172
        cld
160
        rep movsd
173
        rep movsd
-
 
174
;--------------------------------------
-
 
175
align 4
161
  @@:
176
@@:
162
        test    byte[ebx+EVENT.state+3], EVENT_SIGNALED shr 24
177
        test    byte[ebx+EVENT.state+3], EVENT_SIGNALED shr 24
163
        jnz     RemoveEventTo.break  ; POPF+RET
178
        jnz     RemoveEventTo.break  ; POPF+RET
164
        bt      edx, 28 ;EVENT_WATCHED
179
        bt      edx, 28 ;EVENT_WATCHED
165
        jnc     @f
180
        jnc     @f
166
        test    byte[ebx+EVENT.state+3], EVENT_WATCHED shr 24
181
        test    byte[ebx+EVENT.state+3], EVENT_WATCHED shr 24
167
        jz      RemoveEventTo.break  ; POPF+RET
182
        jz      RemoveEventTo.break  ; POPF+RET
-
 
183
;--------------------------------------
-
 
184
align 4
168
  @@:
185
@@:
169
        or      byte[ebx+EVENT.state+3], EVENT_SIGNALED shr 24
186
        or      byte[ebx+EVENT.state+3], EVENT_SIGNALED shr 24
170
        add     eax, SLOT_BASE+APP_EV_OFFSET
187
        add     eax, SLOT_BASE+APP_EV_OFFSET
171
        xchg    eax, ebx
188
        xchg    eax, ebx
172
        jmp     RemoveEventTo
189
        jmp     RemoveEventTo
173
 
-
 
-
 
190
;-----------------------------------------------------------------------------
174
align 4
191
align 4
175
clear_event:                                       ;; EXPORT use
192
clear_event:                                       ;; EXPORT use
176
;info:
193
;info:
177
;
194
;
178
;param:
195
;param:
Line 182... Line 199...
182
        call    NotDummyTest ; not returned for fail !!!
199
        call    NotDummyTest ; not returned for fail !!!
183
        add     eax, SLOT_BASE+APP_OBJ_OFFSET
200
        add     eax, SLOT_BASE+APP_OBJ_OFFSET
184
        and     byte[ebx+EVENT.state+3], not((EVENT_SIGNALED+EVENT_WATCHED)shr 24)
201
        and     byte[ebx+EVENT.state+3], not((EVENT_SIGNALED+EVENT_WATCHED)shr 24)
185
        xchg    eax, ebx
202
        xchg    eax, ebx
186
        jmp     RemoveEventTo
203
        jmp     RemoveEventTo
187
 
-
 
-
 
204
;-----------------------------------------------------------------------------
188
align 4
205
align 4
189
send_event:                                        ;; EXPORT use
206
send_event:                                        ;; EXPORT use
190
;info:
207
;info:
191
;   Ñîçäàåò íîâûé EVENT (âûòàñêèâàåò èç ñïèñêà FreeEvents) â ñïèñêå EventList
208
;   Ñîçäàåò íîâûé EVENT (âûòàñêèâàåò èç ñïèñêà FreeEvents) â ñïèñêå EventList
192
;   öåëåâîãî ñëîòà (eax=pid), ñ äàííûìè èç esi êîñâåííî, è state=EVENT_SIGNALED
209
;   öåëåâîãî ñëîòà (eax=pid), ñ äàííûìè èç esi êîñâåííî, è state=EVENT_SIGNALED
Line 205... Line 222...
205
        mov     edx, eax
222
        mov     edx, eax
206
        call    NotDummyTest.small ; not returned for fail !!!
223
        call    NotDummyTest.small ; not returned for fail !!!
207
        lea     ebx, [eax+SLOT_BASE+APP_EV_OFFSET]
224
        lea     ebx, [eax+SLOT_BASE+APP_EV_OFFSET]
208
        mov     ecx, EVENT_SIGNALED
225
        mov     ecx, EVENT_SIGNALED
209
        jmp     set_event
226
        jmp     set_event
210
 
-
 
-
 
227
;-----------------------------------------------------------------------------
211
align 4
228
align 4
212
DummyTest:                                         ;; INTERNAL use (not returned for fail !!!)
229
DummyTest:                                         ;; INTERNAL use (not returned for fail !!!)
213
;param:
230
;param:
214
;   eax - event
231
;   eax - event
215
;   ebx - uid (for Dummy testing)
232
;   ebx - uid (for Dummy testing)
216
        cmp     [eax+EVENT.magic], 'EVNT'
233
        cmp     [eax+EVENT.magic], 'EVNT'
217
        jne     @f
234
        jne     @f
218
        cmp     [eax+EVENT.id], ebx
235
        cmp     [eax+EVENT.id], ebx
219
        je      .ret
236
        je      .ret
-
 
237
;--------------------------------------
-
 
238
align 4
220
  @@:
239
@@:
221
        pop     eax
240
        pop     eax
222
        xor     eax, eax
241
        xor     eax, eax
-
 
242
;--------------------------------------
-
 
243
align 4
223
.ret:
244
.ret:
224
        ret
245
        ret
225
 
-
 
226
 
-
 
-
 
246
;-----------------------------------------------------------------------------
227
align 4
247
align 4
228
Wait_events:
248
Wait_events:
229
        or      ebx, -1; infinite timeout
249
        or      ebx, -1; infinite timeout
-
 
250
;--------------------------------------
-
 
251
align 4
230
Wait_events_ex:
252
Wait_events_ex:
231
;info:
253
;info:
232
;   Îæèäàíèå "àáñòðàêòíîãî" ñîáûòèÿ ÷åðåç ïåðåâîä ñëîòà â 5-þ ïîçèöèþ.
254
;   Îæèäàíèå "àáñòðàêòíîãî" ñîáûòèÿ ÷åðåç ïåðåâîä ñëîòà â 5-þ ïîçèöèþ.
233
;   Àáñòðàêòíîñòü çàêëþ÷åíà â òîì, ÷òî ôàêò ñîáûòèÿ îïðåäåëÿåòñÿ ôóíêöèåé APPDATA.wait_test,
255
;   Àáñòðàêòíîñòü çàêëþ÷åíà â òîì, ÷òî ôàêò ñîáûòèÿ îïðåäåëÿåòñÿ ôóíêöèåé APPDATA.wait_test,
234
;   êîòîðàÿ çàäàåòñÿ êëèåíòîì è ìîæåò áûòü ôàêòè÷åñêè ëþáîé.
256
;   êîòîðàÿ çàäàåòñÿ êëèåíòîì è ìîæåò áûòü ôàêòè÷åñêè ëþáîé.
Line 258... Line 280...
258
        Mov     [esi+APPDATA.wait_begin],eax,[timer_ticks]
280
        Mov     [esi+APPDATA.wait_begin],eax,[timer_ticks]
259
        mov     eax, [TASK_BASE]
281
        mov     eax, [TASK_BASE]
260
        mov     [eax+TASKDATA.state], 5
282
        mov     [eax+TASKDATA.state], 5
261
        call    change_task
283
        call    change_task
262
        mov     eax, [esi+APPDATA.wait_param]
284
        mov     eax, [esi+APPDATA.wait_param]
-
 
285
;--------------------------------------
-
 
286
align 4
263
  @@:
287
@@:
264
        ret
288
        ret
265
 
-
 
-
 
289
;-----------------------------------------------------------------------------
266
align 4
290
align 4
267
wait_event:                                        ;; EXPORT use
291
wait_event:                                        ;; EXPORT use
268
;info:
292
;info:
269
;   Îæèäàíèå ôëàãà EVENT_SIGNALED â ñîâåðøåííî êîíêðåòíîì Event
293
;   Îæèäàíèå ôëàãà EVENT_SIGNALED â ñîâåðøåííî êîíêðåòíîì Event
270
;   (óñòàíàâëèâàåìîãî, íàäî ïîëàãàòü, ÷åðåç raise_event)
294
;   (óñòàíàâëèâàåìîãî, íàäî ïîëàãàòü, ÷åðåç raise_event)
Line 279... Line 303...
279
        call    DummyTest
303
        call    DummyTest
280
        mov     ecx, eax             ; wait_param
304
        mov     ecx, eax             ; wait_param
281
        mov     edx, get_event_alone ; wait_test
305
        mov     edx, get_event_alone ; wait_test
282
        call    Wait_events          ; timeout ignored
306
        call    Wait_events          ; timeout ignored
283
        jmp     wait_finish
307
        jmp     wait_finish
284
 
-
 
-
 
308
;-----------------------------------------------------------------------------
285
align 4
309
align 4
286
get_event_ex:                                      ;; f68:14
310
get_event_ex:                                      ;; f68:14
287
;info:
311
;info:
288
;   Îæèäàíèå ëþáîãî ñîáûòèÿ â î÷åðåäè EventList òåêóùåãî ñëîòà
312
;   Îæèäàíèå ëþáîãî ñîáûòèÿ â î÷åðåäè EventList òåêóùåãî ñëîòà
289
;   Äàííûå ñîáûòèÿ code - êîïèðóþòñÿ â ïàìÿòü ïðèëîæåíèÿ (êîñâåííî ïî edi)
313
;   Äàííûå ñîáûòèÿ code - êîïèðóþòñÿ â ïàìÿòü ïðèëîæåíèÿ (êîñâåííî ïî edi)
Line 301... Line 325...
301
        lea     esi, [eax+EVENT.code]
325
        lea     esi, [eax+EVENT.code]
302
        mov     ecx, (sizeof.EVENT-EVENT.code)/4
326
        mov     ecx, (sizeof.EVENT-EVENT.code)/4
303
        cld
327
        cld
304
        rep movsd
328
        rep movsd
305
        mov     byte[edi-(sizeof.EVENT-EVENT.code)+2], cl;clear priority field
329
        mov     byte[edi-(sizeof.EVENT-EVENT.code)+2], cl;clear priority field
-
 
330
;--------------------------------------
-
 
331
align 4
306
wait_finish:
332
wait_finish:
307
        test    byte[eax+EVENT.state+3], MANUAL_RESET shr 24
333
        test    byte[eax+EVENT.state+3], MANUAL_RESET shr 24
308
        jnz     get_event_queue.ret  ; RET
334
        jnz     get_event_queue.ret  ; RET
309
        and     byte[eax+EVENT.state+3], not((EVENT_SIGNALED+EVENT_WATCHED)shr 24)
335
        and     byte[eax+EVENT.state+3], not((EVENT_SIGNALED+EVENT_WATCHED)shr 24)
310
        test    byte[eax+EVENT.state+3], MANUAL_DESTROY shr 24
336
        test    byte[eax+EVENT.state+3], MANUAL_DESTROY shr 24
Line 312... Line 338...
312
        mov     ebx, [current_slot]
338
        mov     ebx, [current_slot]
313
        add     ebx, APP_OBJ_OFFSET
339
        add     ebx, APP_OBJ_OFFSET
314
        pushfd
340
        pushfd
315
        cli
341
        cli
316
        jmp     RemoveEventTo
342
        jmp     RemoveEventTo
317
 
-
 
-
 
343
;-----------------------------------------------------------------------------
318
align 4
344
align 4
319
destroy_event:                                     ;; EXPORT use
345
destroy_event:                                     ;; EXPORT use
320
;info:
346
;info:
321
;   Ïåðåíîñèì EVENT â ñïèñîê FreeEvents, ÷èñòèì ïîëÿ magic,destroy,pid,id
347
;   Ïåðåíîñèì EVENT â ñïèñîê FreeEvents, ÷èñòèì ïîëÿ magic,destroy,pid,id
322
;param:
348
;param:
Line 324... Line 350...
324
;   ebx - uid (for Dummy testing)
350
;   ebx - uid (for Dummy testing)
325
;retval:
351
;retval:
326
;   eax - àäðåñ îáúåêòà EVENT (=0 => fail)
352
;   eax - àäðåñ îáúåêòà EVENT (=0 => fail)
327
;scratched: ebx,ecx
353
;scratched: ebx,ecx
328
        call    DummyTest ; not returned for fail !!!
354
        call    DummyTest ; not returned for fail !!!
-
 
355
;--------------------------------------
-
 
356
align 4
329
.internal:
357
.internal:
330
        xor     ecx, ecx  ; clear common header
358
        xor     ecx, ecx  ; clear common header
331
        pushfd
359
        pushfd
332
        cli
360
        cli
333
        mov     [eax+EVENT.magic], ecx
361
        mov     [eax+EVENT.magic], ecx
334
        mov     [eax+EVENT.destroy], ecx
362
        mov     [eax+EVENT.destroy], ecx
335
        mov     [eax+EVENT.pid], ecx
363
        mov     [eax+EVENT.pid], ecx
336
        mov     [eax+EVENT.id], ecx
364
        mov     [eax+EVENT.id], ecx
337
        mov     ebx, FreeEvents
365
        mov     ebx, FreeEvents
338
        jmp     RemoveEventTo
366
        jmp     RemoveEventTo
339
 
-
 
-
 
367
;-----------------------------------------------------------------------------
340
align 4
368
align 4
341
get_event_queue:
369
get_event_queue:
342
;info:
370
;info:
343
;   êëèåíòñêàÿ ô-ÿ òåñòèðîâàíèÿ äëÿ get_event_ex
371
;   êëèåíòñêàÿ ô-ÿ òåñòèðîâàíèÿ äëÿ get_event_ex
344
;warning:
372
;warning:
Line 351... Line 379...
351
;   eax - àäðåñ îáúåêòà EVENT (=0 => fail)
379
;   eax - àäðåñ îáúåêòà EVENT (=0 => fail)
352
        add     ebx, APP_EV_OFFSET
380
        add     ebx, APP_EV_OFFSET
353
        mov     eax, [ebx+APPOBJ.bk] ; âûáèðàåì ñ êîíöà, ïî ïðèíöèïó FIFO
381
        mov     eax, [ebx+APPOBJ.bk] ; âûáèðàåì ñ êîíöà, ïî ïðèíöèïó FIFO
354
        cmp     eax, ebx ; empty ???
382
        cmp     eax, ebx ; empty ???
355
        je      get_event_alone.ret0
383
        je      get_event_alone.ret0
-
 
384
;--------------------------------------
-
 
385
align 4
356
.ret:
386
.ret:
357
        ret
387
        ret
358
 
-
 
-
 
388
;-----------------------------------------------------------------------------
359
align 4
389
align 4
360
get_event_alone:
390
get_event_alone:
361
;info:
391
;info:
362
;   êëèåíòñêàÿ ô-ÿ òåñòèðîâàíèÿ äëÿ wait_event
392
;   êëèåíòñêàÿ ô-ÿ òåñòèðîâàíèÿ äëÿ wait_event
363
;warning:
393
;warning:
Line 370... Line 400...
370
;   eax - àäðåñ îáúåêòà EVENT (=0 => fail)
400
;   eax - àäðåñ îáúåêòà EVENT (=0 => fail)
371
        mov     eax, [ebx+APPDATA.wait_param]
401
        mov     eax, [ebx+APPDATA.wait_param]
372
        test    byte[eax+EVENT.state+3], EVENT_SIGNALED shr 24
402
        test    byte[eax+EVENT.state+3], EVENT_SIGNALED shr 24
373
        jnz     .ret
403
        jnz     .ret
374
        or      byte[eax+EVENT.state+3], EVENT_WATCHED shr 24
404
        or      byte[eax+EVENT.state+3], EVENT_WATCHED shr 24
-
 
405
;--------------------------------------
-
 
406
align 4
375
.ret0:
407
.ret0:
376
        xor     eax, eax; NO event!!!
408
        xor     eax, eax; NO event!!!
-
 
409
;--------------------------------------
-
 
410
align 4
377
.ret:
411
.ret:
378
        ret
412
        ret
379
 
-
 
-
 
413
;-----------------------------------------------------------------------------
380
align 4
414
align 4
381
sys_sendwindowmsg:                                 ;; f72
415
sys_sendwindowmsg:                                 ;; f72
382
        dec     ebx
416
        dec     ebx
383
        jnz     .ret ;subfunction==1 ?
417
        jnz     .ret ;subfunction==1 ?
384
        pushfd
418
        pushfd
385
        cli
419
        cli
386
        sub     ecx, 2
420
        sub     ecx, 2
387
        je      .sendkey
421
        je      .sendkey
388
        dec     ecx
422
        dec     ecx
389
        jnz     .retf
423
        jnz     .retf
-
 
424
;--------------------------------------
-
 
425
align 4
390
.sendbtn:
426
.sendbtn:
391
        cmp     byte[BTN_COUNT], 1
427
        cmp     byte[BTN_COUNT], 1
392
        jae     .result ;overflow
428
        jae     .result ;overflow
393
        inc     byte[BTN_COUNT]
429
        inc     byte[BTN_COUNT]
394
        shl     edx, 8
430
        shl     edx, 8
395
        mov     [BTN_BUFF], edx
431
        mov     [BTN_BUFF], edx
396
        jmp     .result
432
        jmp     .result
-
 
433
;--------------------------------------
-
 
434
align 4
397
.sendkey:
435
.sendkey:
398
        movzx   eax, byte[KEY_COUNT]
436
        movzx   eax, byte[KEY_COUNT]
399
        cmp     al, 120
437
        cmp     al, 120
400
        jae     .result ;overflow
438
        jae     .result ;overflow
401
        inc     byte[KEY_COUNT]
439
        inc     byte[KEY_COUNT]
402
        mov     [KEY_COUNT+1+eax], dl
440
        mov     [KEY_COUNT+1+eax], dl
-
 
441
;--------------------------------------
-
 
442
align 4
403
.result:
443
.result:
404
        setae   byte[esp+32] ;ñ÷èòàåì, ÷òî èñõîäíî: dword[esp+32]==72
444
        setae   byte[esp+32] ;ñ÷èòàåì, ÷òî èñõîäíî: dword[esp+32]==72
-
 
445
;--------------------------------------
-
 
446
align 4
405
.retf:
447
.retf:
406
        popfd
448
        popfd
-
 
449
;--------------------------------------
-
 
450
align 4
407
.ret:
451
.ret:
408
        ret
452
        ret
409
 
-
 
-
 
453
;-----------------------------------------------------------------------------
410
align 4
454
align 4
411
sys_getevent:                                      ;; f11
455
sys_getevent:                                      ;; f11
412
        mov     ebx, [current_slot];ïîêà ýòî âîïðîñ, ÷åãî êóäû ñóâàòü..........
456
        mov     ebx, [current_slot];ïîêà ýòî âîïðîñ, ÷åãî êóäû ñóâàòü..........
413
        pushfd  ; ýòî ñëåäñòâèå îáùåé êîíöåïöèè: ïóñòü ô-ÿ òåñòèðîâàíèÿ èìååò
457
        pushfd  ; ýòî ñëåäñòâèå îáùåé êîíöåïöèè: ïóñòü ô-ÿ òåñòèðîâàíèÿ èìååò
414
        cli     ; ïðàâî ðàññ÷èòûâàòü íà çàêðûòûå ïðåðûâàíèÿ, êàê ïðè âûçîâå èç shed
458
        cli     ; ïðàâî ðàññ÷èòûâàòü íà çàêðûòûå ïðåðûâàíèÿ, êàê ïðè âûçîâå èç shed
415
        call    get_event_for_app
459
        call    get_event_for_app
416
        popfd
460
        popfd
417
        mov     [esp+32], eax
461
        mov     [esp+32], eax
418
        ret
462
        ret
419
 
-
 
-
 
463
;-----------------------------------------------------------------------------
420
align 4
464
align 4
421
sys_waitforevent:                                  ;; f10
465
sys_waitforevent:                                  ;; f10
422
        or      ebx, -1; infinite timeout
466
        or      ebx, -1; infinite timeout
-
 
467
;--------------------------------------
-
 
468
align 4
423
sys_wait_event_timeout:                            ;; f23
469
sys_wait_event_timeout:                            ;; f23
424
        mov     edx, get_event_for_app; wait_test
470
        mov     edx, get_event_for_app; wait_test
425
        call    Wait_events_ex        ; ebx - timeout
471
        call    Wait_events_ex        ; ebx - timeout
426
        mov     [esp+32], eax
472
        mov     [esp+32], eax
427
        ret
473
        ret
428
 
-
 
-
 
474
;-----------------------------------------------------------------------------
429
align 4
475
align 4
430
get_event_for_app:                                 ;; used from f10,f11,f23
476
get_event_for_app:                                 ;; used from f10,f11,f23
431
;info:
477
;info:
432
;   êëèåíòñêàÿ ô-ÿ òåñòèðîâàíèÿ äëÿ ïðèëîæåíèé (f10,f23)
478
;   êëèåíòñêàÿ ô-ÿ òåñòèðîâàíèÿ äëÿ ïðèëîæåíèé (f10,f23)
433
;warning:
479
;warning:
Line 441... Line 487...
441
        movzx   edi, bh               ; bh  is assumed as [CURRENT_TASK]
487
        movzx   edi, bh               ; bh  is assumed as [CURRENT_TASK]
442
        shl     edi, 5
488
        shl     edi, 5
443
        add     edi, CURRENT_TASK     ; edi is assumed as [TASK_BASE]
489
        add     edi, CURRENT_TASK     ; edi is assumed as [TASK_BASE]
444
        mov     ecx, [edi+TASKDATA.event_mask]
490
        mov     ecx, [edi+TASKDATA.event_mask]
445
        and     ecx, 0x7FFFFFFF
491
        and     ecx, 0x7FFFFFFF
-
 
492
;--------------------------------------
-
 
493
align 4
446
.loop: ; ïîêà íå èñ÷åðïàåì âñå áèòû ìàñêè
494
.loop: ; ïîêà íå èñ÷åðïàåì âñå áèòû ìàñêè
447
        bsr     eax, ecx       ; íàõîäèì íåíóëåâîé áèò ìàñêè (31 -> 0)
495
        bsr     eax, ecx       ; íàõîäèì íåíóëåâîé áèò ìàñêè (31 -> 0)
448
        jz      .no_events     ; èñ÷åðïàëè âñå áèòû ìàñêè, íî íè÷åãî íå íàøëè ???
496
        jz      .no_events     ; èñ÷åðïàëè âñå áèòû ìàñêè, íî íè÷åãî íå íàøëè ???
449
        btr     ecx, eax       ; ñáðàñûâàåì ïðîâåðÿåìûé áèò ìàñêè
497
        btr     ecx, eax       ; ñáðàñûâàåì ïðîâåðÿåìûé áèò ìàñêè
450
       ; ïåðåõîäèì íà îáðàáîò÷èê ýòîãî (eax) áèòà
498
       ; ïåðåõîäèì íà îáðàáîò÷èê ýòîãî (eax) áèòà
Line 453... Line 501...
453
        cmp     eax, 3
501
        cmp     eax, 3
454
        je      .loop          ; eax=3, ignored
502
        je      .loop          ; eax=3, ignored
455
        ja      .FlagAutoReset ; eax=[4..8], retvals=eax+1
503
        ja      .FlagAutoReset ; eax=[4..8], retvals=eax+1
456
        cmp     eax, 1
504
        cmp     eax, 1
457
        jae     .BtKy          ; eax=[1,2],  retvals=eax+1
505
        jae     .BtKy          ; eax=[1,2],  retvals=eax+1
-
 
506
;--------------------------------------
-
 
507
align 4
458
.WndRedraw:                    ; eax=0, retval WndRedraw=1
508
.WndRedraw:                    ; eax=0, retval WndRedraw=1
459
        cmp     [edi-twdw+WDATA.fl_redraw], al;al==0
509
        cmp     [edi-twdw+WDATA.fl_redraw], al;al==0
460
        jne     .result
510
        jne     .result
461
        jmp     .loop
511
        jmp     .loop
-
 
512
;--------------------------------------
-
 
513
align 4
462
  .no_events:
514
.no_events:
463
        xor     eax, eax
515
        xor     eax, eax
464
        ret
516
        ret
-
 
517
;--------------------------------------
465
 
518
align 4
466
.FlagAutoReset: ; retvals: BgrRedraw=5, Mouse=6, IPC=7, Stack=8, Debug=9
519
.FlagAutoReset: ; retvals: BgrRedraw=5, Mouse=6, IPC=7, Stack=8, Debug=9
467
        cmp     eax, 5; Mouse 5+1=6
520
        cmp     eax, 5; Mouse 5+1=6
468
        jne     .no_mouse_check
521
        jne     .no_mouse_check
469
        push    eax
522
        push    eax
470
        mov     eax, [TASK_BASE]
523
        mov     eax, [TASK_BASE]
471
        mov     eax, [eax + TASKDATA.event_mask]
524
        mov     eax, [eax + TASKDATA.event_mask]
472
        test    eax, 0x80000000 ; bit 31: active/inactive filter f.40
525
        test    eax, 0x80000000 ; bit 31: active/inactive filter f.40
473
        jz      @f
526
        jz      @f
474
        pop     eax
527
        pop     eax
475
        jmp     .no_mouse_check
528
        jmp     .no_mouse_check
-
 
529
;--------------------------------------
-
 
530
align 4
476
@@:
531
@@:
477
; If the window is captured and moved by the user, then no mouse events!!!
532
; If the window is captured and moved by the user, then no mouse events!!!
478
        mov     al, [mouse.active_sys_window.action]
533
        mov     al, [mouse.active_sys_window.action]
479
        and     al, WINDOW_MOVE_AND_RESIZE_FLAGS
534
        and     al, WINDOW_MOVE_AND_RESIZE_FLAGS
480
        test    al, al
535
        test    al, al
481
        pop     eax
536
        pop     eax
482
        jnz     .loop
537
        jnz     .loop
-
 
538
;--------------------------------------
-
 
539
align 4
483
.no_mouse_check:
540
.no_mouse_check:
484
        btr     [ebx+APPDATA.event_mask], eax
541
        btr     [ebx+APPDATA.event_mask], eax
485
        jnc     .loop
542
        jnc     .loop
-
 
543
;--------------------------------------
-
 
544
align 4
486
  .result:      ; retval = eax+1
545
.result:      ; retval = eax+1
487
        inc     eax
546
        inc     eax
488
        ret
547
        ret
-
 
548
;--------------------------------------
-
 
549
align 4
489
  .BtKy:
550
.BtKy:
490
        movzx   edx, bh
551
        movzx   edx, bh
491
        movzx   edx, word[WIN_STACK+edx*2]
552
        movzx   edx, word[WIN_STACK+edx*2]
492
        je      .Keys          ; eax=1, retval Keys=2
553
        je      .Keys          ; eax=1, retval Keys=2
-
 
554
;--------------------------------------
-
 
555
align 4
493
.Buttons:                      ; eax=2, retval Buttons=3
556
.Buttons:                      ; eax=2, retval Buttons=3
494
        cmp     byte[BTN_COUNT], 0
557
        cmp     byte[BTN_COUNT], 0
495
        je      .loop          ; empty ???
558
        je      .loop          ; empty ???
496
        cmp     edx, [TASK_COUNT]
559
        cmp     edx, [TASK_COUNT]
497
        jne     .loop          ; not Top ???
560
        jne     .loop          ; not Top ???
Line 500... Line 563...
500
        cmp     edx, 0xFFFF    ;-ID for Minimize-Button of Form
563
        cmp     edx, 0xFFFF    ;-ID for Minimize-Button of Form
501
        jne     .result
564
        jne     .result
502
        mov     [window_minimize], 1
565
        mov     [window_minimize], 1
503
        dec     byte[BTN_COUNT]
566
        dec     byte[BTN_COUNT]
504
        jmp     .loop
567
        jmp     .loop
-
 
568
;--------------------------------------
-
 
569
align 4
505
.Keys:    ; eax==1
570
.Keys:    ; eax==1
506
        cmp     edx, [TASK_COUNT]
571
        cmp     edx, [TASK_COUNT]
507
        jne     @f             ; not Top ???
572
        jne     @f             ; not Top ???
508
        cmp     [KEY_COUNT], al; al==1
573
        cmp     [KEY_COUNT], al; al==1
509
        jae     .result        ; not empty ???
574
        jae     .result        ; not empty ???
-
 
575
;--------------------------------------
-
 
576
align 4
510
  @@:
577
@@:
511
        mov     edx, hotkey_buffer
578
        mov     edx, hotkey_buffer
-
 
579
;--------------------------------------
-
 
580
align 4
512
  @@:
581
@@:
513
        cmp     [edx], bh      ; bh - slot for testing
582
        cmp     [edx], bh      ; bh - slot for testing
514
        je      .result
583
        je      .result
515
        add     edx, 8
584
        add     edx, 8
516
        cmp     edx, hotkey_buffer+120*8
585
        cmp     edx, hotkey_buffer+120*8
517
        jb      @b
586
        jb      @b
518
        jmp     .loop
587
        jmp     .loop
519
;end.
588
;end.
-
 
589
;-----------------------------------------------------------------------------
520
590