Rev 2465 | Rev 3500 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2465 | Rev 2987 | ||
---|---|---|---|
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: 2465 $ |
8 | $Revision: 2987 $ |
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 |
|
- | 447 | .retf: |
|
405 | .retf: ;popfd |
448 | popfd |
- | 449 | ;-------------------------------------- |
|
- | 450 | align 4 |
|
406 | .ret: |
451 | .ret: |
407 | ret |
452 | ret |
408 | - | ||
- | 453 | ;----------------------------------------------------------------------------- |
|
409 | align 4 |
454 | align 4 |
410 | sys_getevent: ;; f11 |
455 | sys_getevent: ;; f11 |
411 | mov ebx, [current_slot];ïîêà ýòî âîïðîñ, ÷åãî êóäû ñóâàòü.......... |
456 | mov ebx, [current_slot];ïîêà ýòî âîïðîñ, ÷åãî êóäû ñóâàòü.......... |
412 | pushfd ; ýòî ñëåäñòâèå îáùåé êîíöåïöèè: ïóñòü ô-ÿ òåñòèðîâàíèÿ èìååò |
457 | pushfd ; ýòî ñëåäñòâèå îáùåé êîíöåïöèè: ïóñòü ô-ÿ òåñòèðîâàíèÿ èìååò |
413 | cli ; ïðàâî ðàññ÷èòûâàòü íà çàêðûòûå ïðåðûâàíèÿ, êàê ïðè âûçîâå èç shed |
458 | cli ; ïðàâî ðàññ÷èòûâàòü íà çàêðûòûå ïðåðûâàíèÿ, êàê ïðè âûçîâå èç shed |
414 | call get_event_for_app |
459 | call get_event_for_app |
415 | popfd |
460 | popfd |
416 | mov [esp+32], eax |
461 | mov [esp+32], eax |
417 | ret |
462 | ret |
418 | - | ||
- | 463 | ;----------------------------------------------------------------------------- |
|
419 | align 4 |
464 | align 4 |
420 | sys_waitforevent: ;; f10 |
465 | sys_waitforevent: ;; f10 |
421 | or ebx, -1; infinite timeout |
466 | or ebx, -1; infinite timeout |
- | 467 | ;-------------------------------------- |
|
- | 468 | align 4 |
|
422 | sys_wait_event_timeout: ;; f23 |
469 | sys_wait_event_timeout: ;; f23 |
423 | mov edx, get_event_for_app; wait_test |
470 | mov edx, get_event_for_app; wait_test |
424 | call Wait_events_ex ; ebx - timeout |
471 | call Wait_events_ex ; ebx - timeout |
425 | mov [esp+32], eax |
472 | mov [esp+32], eax |
426 | ret |
473 | ret |
427 | - | ||
- | 474 | ;----------------------------------------------------------------------------- |
|
428 | align 4 |
475 | align 4 |
429 | get_event_for_app: ;; used from f10,f11,f23 |
476 | get_event_for_app: ;; used from f10,f11,f23 |
430 | ;info: |
477 | ;info: |
431 | ; êëèåíòñêàÿ ô-ÿ òåñòèðîâàíèÿ äëÿ ïðèëîæåíèé (f10,f23) |
478 | ; êëèåíòñêàÿ ô-ÿ òåñòèðîâàíèÿ äëÿ ïðèëîæåíèé (f10,f23) |
432 | ;warning: |
479 | ;warning: |
Line 440... | Line 487... | ||
440 | movzx edi, bh ; bh is assumed as [CURRENT_TASK] |
487 | movzx edi, bh ; bh is assumed as [CURRENT_TASK] |
441 | shl edi, 5 |
488 | shl edi, 5 |
442 | add edi, CURRENT_TASK ; edi is assumed as [TASK_BASE] |
489 | add edi, CURRENT_TASK ; edi is assumed as [TASK_BASE] |
443 | mov ecx, [edi+TASKDATA.event_mask] |
490 | mov ecx, [edi+TASKDATA.event_mask] |
444 | and ecx, 0x7FFFFFFF |
491 | and ecx, 0x7FFFFFFF |
- | 492 | ;-------------------------------------- |
|
- | 493 | align 4 |
|
445 | .loop: ; ïîêà íå èñ÷åðïàåì âñå áèòû ìàñêè |
494 | .loop: ; ïîêà íå èñ÷åðïàåì âñå áèòû ìàñêè |
446 | bsr eax, ecx ; íàõîäèì íåíóëåâîé áèò ìàñêè (31 -> 0) |
495 | bsr eax, ecx ; íàõîäèì íåíóëåâîé áèò ìàñêè (31 -> 0) |
447 | jz .no_events ; èñ÷åðïàëè âñå áèòû ìàñêè, íî íè÷åãî íå íàøëè ??? |
496 | jz .no_events ; èñ÷åðïàëè âñå áèòû ìàñêè, íî íè÷åãî íå íàøëè ??? |
448 | btr ecx, eax ; ñáðàñûâàåì ïðîâåðÿåìûé áèò ìàñêè |
497 | btr ecx, eax ; ñáðàñûâàåì ïðîâåðÿåìûé áèò ìàñêè |
449 | ; ïåðåõîäèì íà îáðàáîò÷èê ýòîãî (eax) áèòà |
498 | ; ïåðåõîäèì íà îáðàáîò÷èê ýòîãî (eax) áèòà |
450 | cmp eax, 9 |
499 | cmp eax, 9 |
451 | jae .loop ; eax=[9..31], ignored |
500 | jae .loop ; eax=[9..31], ignored (event 10...32) |
- | 501 | ||
452 | cmp eax, 3 |
502 | cmp eax, 3 |
453 | je .loop ; eax=3, ignored |
503 | je .loop ; eax=3, ignored (event 4) |
- | 504 | ||
- | 505 | cmp eax, 4 |
|
- | 506 | je .FlagAutoReset ; eax=4, retvals=eax+1 (event 5) |
|
- | 507 | ||
- | 508 | cmp eax, 5 |
|
- | 509 | je .mouse_check ; eax=5, retvals=eax+1 (event 6) |
|
- | 510 | ||
454 | ja .FlagAutoReset ; eax=[4..8], retvals=eax+1 |
511 | ja .FlagAutoReset ; eax=[6..8], retvals=eax+1 (event 7...9) |
- | 512 | ||
455 | cmp eax, 1 |
513 | cmp eax, 1 |
456 | jae .BtKy ; eax=[1,2], retvals=eax+1 |
514 | jae .BtKy ; eax=[1,2], retvals=eax+1 (event 2,3) |
- | 515 | ;-------------------------------------- |
|
- | 516 | align 4 |
|
457 | .WndRedraw: ; eax=0, retval WndRedraw=1 |
517 | .WndRedraw: ; eax=0, retval WndRedraw=1 |
458 | cmp [edi-twdw+WDATA.fl_redraw], al;al==0 |
518 | cmp [edi-twdw+WDATA.fl_redraw], al;al==0 |
459 | jne .result |
519 | jne .result |
460 | jmp .loop |
520 | jmp .loop |
- | 521 | ;-------------------------------------- |
|
- | 522 | align 4 |
|
461 | .no_events: |
523 | .no_events: |
462 | xor eax, eax |
524 | xor eax, eax |
463 | ret |
525 | ret |
464 | - | ||
465 | .FlagAutoReset: ; retvals: BgrRedraw=5, Mouse=6, IPC=7, Stack=8, Debug=9 |
- | |
466 | cmp eax, 5; Mouse 5+1=6 |
526 | ;-------------------------------------- |
- | 527 | align 4 |
|
467 | jne .no_mouse_check |
528 | .mouse_check: ; Mouse 5+1=6 |
468 | push eax |
529 | push eax |
469 | mov eax, [TASK_BASE] |
530 | mov eax, [TASK_BASE] |
470 | mov eax, [eax + TASKDATA.event_mask] |
531 | mov eax, [eax + TASKDATA.event_mask] |
471 | test eax, 0x80000000 ; bit 31: active/inactive filter f.40 |
532 | test eax, 0x80000000 ; bit 31: active/inactive filter f.40 |
472 | jz @f |
533 | jz @f |
473 | pop eax |
534 | pop eax |
474 | jmp .no_mouse_check |
535 | jmp .FlagAutoReset |
- | 536 | ;-------------------------------------- |
|
- | 537 | align 4 |
|
475 | @@: |
538 | @@: |
476 | ; If the window is captured and moved by the user, then no mouse events!!! |
539 | ; If the window is captured and moved by the user, then no mouse events!!! |
477 | mov al, [mouse.active_sys_window.action] |
540 | mov al, [mouse.active_sys_window.action] |
478 | and al, WINDOW_MOVE_AND_RESIZE_FLAGS |
541 | and al, WINDOW_MOVE_AND_RESIZE_FLAGS |
479 | test al, al |
542 | test al, al |
480 | pop eax |
543 | pop eax |
481 | jnz .loop |
544 | jnz .loop |
- | 545 | ;-------------------------------------- |
|
482 | .no_mouse_check: |
546 | align 4 |
- | 547 | .FlagAutoReset: ; retvals: BgrRedraw=5, IPC=7, Stack=8, Debug=9 |
|
483 | btr [ebx+APPDATA.event_mask], eax |
548 | btr [ebx+APPDATA.event_mask], eax |
484 | jnc .loop |
549 | jnc .loop |
- | 550 | ;-------------------------------------- |
|
- | 551 | align 4 |
|
485 | .result: ; retval = eax+1 |
552 | .result: ; retval = eax+1 |
486 | inc eax |
553 | inc eax |
487 | ret |
554 | ret |
- | 555 | ;-------------------------------------- |
|
- | 556 | align 4 |
|
488 | .BtKy: |
557 | .BtKy: |
489 | movzx edx, bh |
558 | movzx edx, bh |
490 | movzx edx, word[WIN_STACK+edx*2] |
559 | movzx edx, word[WIN_STACK+edx*2] |
491 | je .Keys ; eax=1, retval Keys=2 |
560 | je .Keys ; eax=1, retval Keys=2 |
- | 561 | ;-------------------------------------- |
|
- | 562 | align 4 |
|
492 | .Buttons: ; eax=2, retval Buttons=3 |
563 | .Buttons: ; eax=2, retval Buttons=3 |
493 | cmp byte[BTN_COUNT], 0 |
564 | cmp byte[BTN_COUNT], 0 |
494 | je .loop ; empty ??? |
565 | je .loop ; empty ??? |
495 | cmp edx, [TASK_COUNT] |
566 | cmp edx, [TASK_COUNT] |
496 | jne .loop ; not Top ??? |
567 | jne .loop ; not Top ??? |
Line 499... | Line 570... | ||
499 | cmp edx, 0xFFFF ;-ID for Minimize-Button of Form |
570 | cmp edx, 0xFFFF ;-ID for Minimize-Button of Form |
500 | jne .result |
571 | jne .result |
501 | mov [window_minimize], 1 |
572 | mov [window_minimize], 1 |
502 | dec byte[BTN_COUNT] |
573 | dec byte[BTN_COUNT] |
503 | jmp .loop |
574 | jmp .loop |
- | 575 | ;-------------------------------------- |
|
- | 576 | align 4 |
|
504 | .Keys: ; eax==1 |
577 | .Keys: ; eax==1 |
505 | cmp edx, [TASK_COUNT] |
578 | cmp edx, [TASK_COUNT] |
506 | jne @f ; not Top ??? |
579 | jne @f ; not Top ??? |
507 | cmp [KEY_COUNT], al; al==1 |
580 | cmp [KEY_COUNT], al; al==1 |
508 | jae .result ; not empty ??? |
581 | jae .result ; not empty ??? |
- | 582 | ;-------------------------------------- |
|
- | 583 | align 4 |
|
509 | @@: |
584 | @@: |
510 | mov edx, hotkey_buffer |
585 | mov edx, hotkey_buffer |
- | 586 | ;-------------------------------------- |
|
- | 587 | align 4 |
|
511 | @@: |
588 | @@: |
512 | cmp [edx], bh ; bh - slot for testing |
589 | cmp [edx], bh ; bh - slot for testing |
513 | je .result |
590 | je .result |
514 | add edx, 8 |
591 | add edx, 8 |
515 | cmp edx, hotkey_buffer+120*8 |
592 | cmp edx, hotkey_buffer+120*8 |
516 | jb @b |
593 | jb @b |
517 | jmp .loop |
594 | jmp .loop |
518 | ;end.>-> |
595 | ;end. |
- | 596 | ;----------------------------------------------------------------------------->-> |
|
519 | 597 |