Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
335 lines (283 loc) · 9.82 KB

SDL_wimppoll.c

File metadata and controls

335 lines (283 loc) · 9.82 KB
 
1
2
/*
SDL - Simple DirectMedia Layer
Jan 4, 2004
Jan 4, 2004
3
Copyright (C) 1997-2004 Sam Lantinga
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Sam Lantinga
Feb 1, 2006
Feb 1, 2006
20
slouken@libsdl.org
Feb 21, 2006
Feb 21, 2006
22
#include "SDL_config.h"
Feb 12, 2005
Feb 12, 2005
25
File added by Alan Buckley (alan_baa@hotmail.com) for RISC OS compatability
26
27
28
29
30
31
32
27 March 2003
Implements Pumping of events and WIMP polling
*/
#include "SDL.h"
#include "SDL_syswm.h"
Feb 16, 2006
Feb 16, 2006
33
34
#include "../../events/SDL_sysevents.h"
#include "../../events/SDL_events_c.h"
35
36
#include "SDL_riscosvideo.h"
#include "SDL_riscosevents_c.h"
Feb 12, 2005
Feb 12, 2005
37
#include "SDL_riscosmouse_c.h"
Feb 22, 2006
Feb 22, 2006
38
#include "../../timer/SDL_timer_c.h"
39
40
41
42
43
44
45
46
47
#include "memory.h"
#include "stdlib.h"
#include "ctype.h"
#include "kernel.h"
#include "swis.h"
#include "unixlib/os.h"
Feb 16, 2006
Feb 16, 2006
48
#if !SDL_THREADS_DISABLED
Sep 17, 2004
Sep 17, 2004
49
50
51
#include <pthread.h>
#endif
52
/* Local functions */
May 29, 2006
May 29, 2006
53
54
void WIMP_Poll(_THIS, int waitTime);
void WIMP_SetFocus(int win);
55
56
/* SDL_riscossprite functions */
May 29, 2006
May 29, 2006
57
58
59
void WIMP_PlotSprite(_THIS, int x, int y);
void WIMP_ModeChanged(_THIS);
void WIMP_PaletteChanged(_THIS);
May 29, 2006
May 29, 2006
62
63
extern void WIMP_PollMouse(_THIS);
extern void RISCOS_PollKeyboard();
Feb 16, 2006
Feb 16, 2006
65
#if SDL_THREADS_DISABLED
66
/* Timer running function */
May 29, 2006
May 29, 2006
67
extern void RISCOS_CheckTimer();
Sep 17, 2004
Sep 17, 2004
68
69
70
71
#else
extern int riscos_using_threads;
#endif
72
/* Mouse cursor handling */
May 29, 2006
May 29, 2006
73
74
extern void WIMP_ReshowCursor(_THIS);
extern void WIMP_RestoreWimpCursor();
75
76
77
int hasFocus = 0;
int mouseInWindow = 0;
May 28, 2006
May 28, 2006
78
79
80
81
/* Flag to ensure window is correct size after a mode change */
static int resizeOnOpen = 0;
May 28, 2006
May 28, 2006
82
void
May 29, 2006
May 29, 2006
83
WIMP_PumpEvents(_THIS)
May 29, 2006
May 29, 2006
85
WIMP_Poll(this, 0);
May 28, 2006
May 28, 2006
86
if (hasFocus)
May 29, 2006
May 29, 2006
87
RISCOS_PollKeyboard();
May 28, 2006
May 28, 2006
88
if (mouseInWindow)
May 29, 2006
May 29, 2006
89
WIMP_PollMouse(this);
Feb 16, 2006
Feb 16, 2006
90
#if SDL_THREADS_DISABLED
May 28, 2006
May 28, 2006
91
if (SDL_timer_running)
May 29, 2006
May 29, 2006
92
RISCOS_CheckTimer();
Sep 17, 2004
Sep 17, 2004
93
#endif
May 28, 2006
May 28, 2006
97
void
May 29, 2006
May 29, 2006
98
WIMP_Poll(_THIS, int waitTime)
May 28, 2006
May 28, 2006
100
101
102
103
104
105
106
107
108
109
110
111
_kernel_swi_regs regs;
int message[64];
unsigned int code;
int pollMask = 0;
int doPoll = 1;
int sysEvent;
int sdlWindow = this->hidden->window_handle;
if (this->PumpEvents != WIMP_PumpEvents)
return;
if (waitTime > 0) {
May 29, 2006
May 29, 2006
112
_kernel_swi(OS_ReadMonotonicTime, &regs, &regs);
May 28, 2006
May 28, 2006
113
waitTime += regs.r[0];
May 28, 2006
May 28, 2006
116
while (doPoll) {
Feb 16, 2006
Feb 16, 2006
117
#if !SDL_THREADS_DISABLED
May 28, 2006
May 28, 2006
118
119
/* Stop thread callbacks while program is paged out */
if (riscos_using_threads)
May 29, 2006
May 29, 2006
120
__pthread_stop_ticker();
Sep 17, 2004
Sep 17, 2004
121
122
#endif
May 28, 2006
May 28, 2006
123
124
125
126
127
128
if (waitTime <= 0) {
regs.r[0] = pollMask; /* Poll Mask */
/* For no wait time mask out null event so we wait until something happens */
if (waitTime < 0)
regs.r[0] |= 1;
regs.r[1] = (int) message;
May 29, 2006
May 29, 2006
129
_kernel_swi(Wimp_Poll, &regs, &regs);
May 28, 2006
May 28, 2006
130
131
132
133
} else {
regs.r[0] = pollMask;
regs.r[1] = (int) message;
regs.r[2] = waitTime;
May 29, 2006
May 29, 2006
134
_kernel_swi(Wimp_PollIdle, &regs, &regs);
May 28, 2006
May 28, 2006
135
136
137
138
139
140
141
142
143
144
145
146
147
}
/* Flag to specify if we post a SDL_SysWMEvent */
sysEvent = 0;
code = (unsigned int) regs.r[0];
switch (code) {
case 0: /* Null Event - drop out for standard processing */
doPoll = 0;
break;
case 1: /* Redraw window */
May 29, 2006
May 29, 2006
148
_kernel_swi(Wimp_RedrawWindow, &regs, &regs);
May 28, 2006
May 28, 2006
149
150
if (message[0] == sdlWindow) {
while (regs.r[0]) {
May 29, 2006
May 29, 2006
151
152
WIMP_PlotSprite(this, message[1], message[2]);
_kernel_swi(Wimp_GetRectangle, &regs, &regs);
May 28, 2006
May 28, 2006
153
154
155
156
}
} else {
/* TODO: Currently we just eat them - we may need to pass them on */
while (regs.r[0]) {
May 29, 2006
May 29, 2006
157
_kernel_swi(Wimp_GetRectangle, &regs, &regs);
May 28, 2006
May 28, 2006
158
159
160
161
162
163
164
165
166
167
168
169
170
}
}
break;
case 2: /* Open window */
if (resizeOnOpen && message[0] == sdlWindow) {
/* Ensure window is correct size */
resizeOnOpen = 0;
message[3] =
message[1] + (this->screen->w << this->hidden->xeig);
message[4] =
message[2] + (this->screen->h << this->hidden->yeig);
}
May 29, 2006
May 29, 2006
171
_kernel_swi(Wimp_OpenWindow, &regs, &regs);
May 28, 2006
May 28, 2006
172
173
174
175
176
177
178
179
180
181
break;
case 3: /* Close window */
if (message[0] == sdlWindow) {
/* Documentation makes it looks as if the following line is correct:
** if (SDL_PrivateQuit() == 1) _kernel_swi(Wimp_CloseWindow, &regs, &regs);
** However some programs don't process this message and so sit there invisibly
** in the background so I just post the quit message and hope the application
** does the correct thing.
*/
May 29, 2006
May 29, 2006
182
SDL_PrivateQuit();
May 28, 2006
May 28, 2006
183
184
185
186
187
188
189
190
191
192
} else
sysEvent = 1;
doPoll = 0;
break;
case 4: /* Pointer_Leaving_Window */
if (message[0] == sdlWindow) {
mouseInWindow = 0;
//TODO: Lose buttons / dragging
/* Reset to default pointer */
May 29, 2006
May 29, 2006
193
194
WIMP_RestoreWimpCursor();
SDL_PrivateAppActive(0, SDL_APPMOUSEFOCUS);
May 28, 2006
May 28, 2006
195
196
197
198
199
200
201
} else
sysEvent = 1;
break;
case 5: /* Pointer_Entering_Window */
if (message[0] == sdlWindow) {
mouseInWindow = 1;
May 29, 2006
May 29, 2006
202
203
WIMP_ReshowCursor(this);
SDL_PrivateAppActive(1, SDL_APPMOUSEFOCUS);
May 28, 2006
May 28, 2006
204
205
206
207
208
209
210
211
} else
sysEvent = 1;
break;
case 6: /* Mouse_Click */
if (hasFocus == 0) {
/* First click gives focus if it's not a menu */
/* we only count non-menu clicks on a window that has the focus */
May 29, 2006
May 29, 2006
212
WIMP_SetFocus(message[3]);
May 28, 2006
May 28, 2006
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
} else
doPoll = 0; // So PollMouse gets a chance to pick it up
break;
case 7: /* User_Drag_Box - Used for mouse release */
//TODO: May need to implement this in the future
sysEvent = 1;
break;
case 8: /* Keypressed */
doPoll = 0; /* PollKeyboard should pick it up */
if (message[0] != sdlWindow)
sysEvent = 1;
/*TODO: May want to always pass F12 etc to the wimp
{
regs.r[0] = message[6];
_kernel_swi(Wimp_ProcessKey, &regs, &regs);
}
*/
break;
case 11: /* Lose Caret */
hasFocus = 0;
if (message[0] == sdlWindow)
May 29, 2006
May 29, 2006
237
SDL_PrivateAppActive(0, SDL_APPINPUTFOCUS);
May 28, 2006
May 28, 2006
238
239
240
241
242
243
244
else
sysEvent = 1;
break;
case 12: /* Gain Caret */
hasFocus = 1;
if (message[0] == sdlWindow)
May 29, 2006
May 29, 2006
245
SDL_PrivateAppActive(1, SDL_APPINPUTFOCUS);
May 28, 2006
May 28, 2006
246
247
248
249
250
251
252
253
254
255
256
else
sysEvent = 1;
break;
case 17:
case 18:
sysEvent = 1; /* All messages are passed on */
switch (message[4]) {
case 0: /* Quit Event */
/* No choice - have to quit */
May 29, 2006
May 29, 2006
257
258
SDL_Quit();
exit(0);
May 28, 2006
May 28, 2006
259
260
261
break;
case 8: /* Pre Quit */
May 29, 2006
May 29, 2006
262
SDL_PrivateQuit();
May 28, 2006
May 28, 2006
263
264
265
break;
case 0x400c1: /* Mode change */
May 29, 2006
May 29, 2006
266
WIMP_ModeChanged(this);
May 28, 2006
May 28, 2006
267
268
269
270
resizeOnOpen = 1;
break;
case 9: /* Palette changed */
May 29, 2006
May 29, 2006
271
WIMP_PaletteChanged(this);
May 28, 2006
May 28, 2006
272
273
274
275
276
277
278
279
break;
}
break;
default:
/* Pass unknown events on */
sysEvent = 1;
break;
May 28, 2006
May 28, 2006
282
283
284
if (sysEvent) {
SDL_SysWMmsg wmmsg;
May 29, 2006
May 29, 2006
285
SDL_VERSION(&wmmsg.version);
May 28, 2006
May 28, 2006
286
wmmsg.eventCode = code;
May 29, 2006
May 29, 2006
287
SDL_memcpy(wmmsg.pollBlock, message, 64 * sizeof(int));
May 28, 2006
May 28, 2006
288
289
/* Fall out of polling loop if message is successfully posted */
May 29, 2006
May 29, 2006
290
if (SDL_PrivateSysWMEvent(&wmmsg))
May 28, 2006
May 28, 2006
291
292
doPoll = 0;
}
Feb 16, 2006
Feb 16, 2006
293
#if !SDL_THREADS_DISABLED
May 28, 2006
May 28, 2006
294
295
296
297
if (riscos_using_threads) {
/* Restart ticker here so other thread can not interfere
with the Redraw processing */
if (riscos_using_threads)
May 29, 2006
May 29, 2006
298
__pthread_start_ticker();
May 28, 2006
May 28, 2006
299
/* Give other threads a better chance of running */
May 29, 2006
May 29, 2006
300
pthread_yield();
May 28, 2006
May 28, 2006
301
}
Sep 17, 2004
Sep 17, 2004
302
#endif
303
304
305
306
}
}
/* Set focus to specified window */
May 28, 2006
May 28, 2006
307
void
May 29, 2006
May 29, 2006
308
WIMP_SetFocus(int win)
May 28, 2006
May 28, 2006
310
_kernel_swi_regs regs;
May 28, 2006
May 28, 2006
312
313
314
315
316
317
regs.r[0] = win;
regs.r[1] = -1; /* Icon handle */
regs.r[2] = 0; /* X-offset we just put it at position 0 */
regs.r[3] = 0; /* Y-offset as above */
regs.r[4] = 1 << 25; /* Caret is invisible */
regs.r[5] = 0; /* index into string */
May 29, 2006
May 29, 2006
319
_kernel_swi(Wimp_SetCaretPosition, &regs, &regs);
320
321
322
}
/** Run background task while in a sleep command */
May 28, 2006
May 28, 2006
323
void
May 29, 2006
May 29, 2006
324
RISCOS_BackgroundTasks(void)
May 28, 2006
May 28, 2006
326
if (current_video && current_video->hidden->window_handle) {
May 29, 2006
May 29, 2006
327
WIMP_Poll(current_video, 0);
May 28, 2006
May 28, 2006
328
}
Feb 16, 2006
Feb 16, 2006
329
#if SDL_THREADS_DISABLED
May 28, 2006
May 28, 2006
330
if (SDL_timer_running)
May 29, 2006
May 29, 2006
331
RISCOS_CheckTimer();
Sep 17, 2004
Sep 17, 2004
332
#endif
May 28, 2006
May 28, 2006
334
335
/* vi: set ts=4 sw=4 expandtab: */