Mercurial > sdl-ios-xcode
comparison src/video/riscos/SDL_wimppoll.c @ 955:d74fbf56f2f6
Date: Fri, 25 Jun 2004 13:29:15 +0100
From: "alan buckley"
Subject: Modification for RISC OS version of SDL
Ive attached a zip file with the changes to this email, it contains the
following:
The file sdldiff.txt is the output from cvs diff u. .
The directory thread/riscos contains all the new files to support threading.
Readme.riscos is a new readme file to add.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Fri, 17 Sep 2004 13:20:10 +0000 |
parents | b8d311d90021 |
children | 974ba6ae0fa3 |
comparison
equal
deleted
inserted
replaced
954:3acd16ea0180 | 955:d74fbf56f2f6 |
---|---|
41 | 41 |
42 #include "kernel.h" | 42 #include "kernel.h" |
43 #include "swis.h" | 43 #include "swis.h" |
44 #include "unixlib/os.h" | 44 #include "unixlib/os.h" |
45 | 45 |
46 #ifndef DISABLE_THREADS | |
47 #include <pthread.h> | |
48 #endif | |
49 | |
46 /* Local functions */ | 50 /* Local functions */ |
47 void WIMP_Poll(_THIS, int waitTime); | 51 void WIMP_Poll(_THIS, int waitTime); |
48 void WIMP_SetFocus(int win); | 52 void WIMP_SetFocus(int win); |
49 | 53 |
50 /* SDL_riscossprite functions */ | 54 /* SDL_riscossprite functions */ |
54 | 58 |
55 | 59 |
56 extern void WIMP_PollMouse(_THIS); | 60 extern void WIMP_PollMouse(_THIS); |
57 extern void RISCOS_PollKeyboard(); | 61 extern void RISCOS_PollKeyboard(); |
58 | 62 |
63 #ifdef DISABLE_THREADS | |
59 extern void DRenderer_FillBuffers(); | 64 extern void DRenderer_FillBuffers(); |
60 | 65 |
61 /* Timer running function */ | 66 /* Timer running function */ |
62 extern void RISCOS_CheckTimer(); | 67 extern void RISCOS_CheckTimer(); |
68 | |
69 #else | |
70 extern int riscos_using_threads; | |
71 #endif | |
63 | 72 |
64 /* Mouse cursor handling */ | 73 /* Mouse cursor handling */ |
65 extern void WIMP_ReshowCursor(_THIS); | 74 extern void WIMP_ReshowCursor(_THIS); |
66 | 75 |
67 int hasFocus = 0; | 76 int hasFocus = 0; |
73 void WIMP_PumpEvents(_THIS) | 82 void WIMP_PumpEvents(_THIS) |
74 { | 83 { |
75 WIMP_Poll(this, 0); | 84 WIMP_Poll(this, 0); |
76 if (hasFocus) RISCOS_PollKeyboard(); | 85 if (hasFocus) RISCOS_PollKeyboard(); |
77 if (mouseInWindow) WIMP_PollMouse(this); | 86 if (mouseInWindow) WIMP_PollMouse(this); |
87 #ifdef DISABLE_THREADS | |
78 DRenderer_FillBuffers(); | 88 DRenderer_FillBuffers(); |
79 if (SDL_timer_running) RISCOS_CheckTimer(); | 89 if (SDL_timer_running) RISCOS_CheckTimer(); |
90 #endif | |
80 } | 91 } |
81 | 92 |
82 | 93 |
83 void WIMP_Poll(_THIS, int waitTime) | 94 void WIMP_Poll(_THIS, int waitTime) |
84 { | 95 { |
98 waitTime += regs.r[0]; | 109 waitTime += regs.r[0]; |
99 } | 110 } |
100 | 111 |
101 while (doPoll) | 112 while (doPoll) |
102 { | 113 { |
114 #ifndef DISABLE_THREADS | |
115 /* Stop thread callbacks while program is paged out */ | |
116 if (riscos_using_threads) __pthread_stop_ticker(); | |
117 #endif | |
118 | |
103 if (waitTime <= 0) | 119 if (waitTime <= 0) |
104 { | 120 { |
105 regs.r[0] = pollMask; /* Poll Mask */ | 121 regs.r[0] = pollMask; /* Poll Mask */ |
106 /* For no wait time mask out null event so we wait until something happens */ | 122 /* For no wait time mask out null event so we wait until something happens */ |
107 if (waitTime < 0) regs.r[0] |= 1; | 123 if (waitTime < 0) regs.r[0] |= 1; |
108 regs.r[1] = (int)message; | 124 regs.r[1] = (int)message; |
109 _kernel_swi(Wimp_Poll, ®s, ®s); | 125 _kernel_swi(Wimp_Poll, ®s, ®s); |
110 } else | 126 } else |
111 { | 127 { |
114 regs.r[2] = waitTime; | 130 regs.r[2] = waitTime; |
115 _kernel_swi(Wimp_PollIdle, ®s, ®s); | 131 _kernel_swi(Wimp_PollIdle, ®s, ®s); |
116 } | 132 } |
117 | 133 |
118 /* Flag to specify if we post a SDL_SysWMEvent */ | 134 /* Flag to specify if we post a SDL_SysWMEvent */ |
119 sysEvent = 0; | 135 sysEvent = 0; |
120 | 136 |
121 code = (unsigned int)regs.r[0]; | 137 code = (unsigned int)regs.r[0]; |
122 | 138 |
123 switch(code) | 139 switch(code) |
124 { | 140 { |
125 case 0: /* Null Event - drop out for standard processing*/ | 141 case 0: /* Null Event - drop out for standard processing*/ |
126 doPoll = 0; | 142 doPoll = 0; |
127 break; | 143 break; |
128 | 144 |
129 case 1: /* Redraw window */ | 145 case 1: /* Redraw window */ |
130 _kernel_swi(Wimp_RedrawWindow, ®s,®s); | 146 _kernel_swi(Wimp_RedrawWindow, ®s,®s); |
131 if (message[0] == sdlWindow) | 147 if (message[0] == sdlWindow) |
132 { | 148 { |
133 while (regs.r[0]) | 149 while (regs.r[0]) |
134 { | 150 { |
135 WIMP_PlotSprite(this, message[1], message[2]); | 151 WIMP_PlotSprite(this, message[1], message[2]); |
136 _kernel_swi(Wimp_GetRectangle, ®s, ®s); | 152 _kernel_swi(Wimp_GetRectangle, ®s, ®s); |
137 } | 153 } |
138 } else | 154 } else |
139 { | 155 { |
140 /* TODO: Currently we just eat them - we may need to pass them on */ | 156 /* TODO: Currently we just eat them - we may need to pass them on */ |
141 while (regs.r[0]) | 157 while (regs.r[0]) |
142 { | 158 { |
143 _kernel_swi(Wimp_GetRectangle, ®s, ®s); | 159 _kernel_swi(Wimp_GetRectangle, ®s, ®s); |
144 } | 160 } |
145 } | 161 } |
146 break; | 162 break; |
147 | 163 |
148 case 2: /* Open window */ | 164 case 2: /* Open window */ |
149 if ( resizeOnOpen && message[0] == sdlWindow) | 165 if ( resizeOnOpen && message[0] == sdlWindow) |
150 { | 166 { |
151 /* Ensure window is correct size */ | 167 /* Ensure window is correct size */ |
275 memcpy(wmmsg.pollBlock, message, 64 * sizeof(int)); | 291 memcpy(wmmsg.pollBlock, message, 64 * sizeof(int)); |
276 | 292 |
277 /* Fall out of polling loop if message is successfully posted */ | 293 /* Fall out of polling loop if message is successfully posted */ |
278 if (SDL_PrivateSysWMEvent(&wmmsg)) doPoll = 0; | 294 if (SDL_PrivateSysWMEvent(&wmmsg)) doPoll = 0; |
279 } | 295 } |
280 | 296 #ifndef DISABLE_THREADS |
297 if (riscos_using_threads) | |
298 { | |
299 /* Restart ticker here so other thread can not interfere | |
300 with the Redraw processing */ | |
301 if (riscos_using_threads) __pthread_start_ticker(); | |
302 /* Give other threads a better chance of running */ | |
303 pthread_yield(); | |
304 } | |
305 #endif | |
281 } | 306 } |
282 } | 307 } |
283 | 308 |
284 /* Set focus to specified window */ | 309 /* Set focus to specified window */ |
285 void WIMP_SetFocus(int win) | 310 void WIMP_SetFocus(int win) |
301 { | 326 { |
302 if (current_video && current_video->hidden->window_handle) | 327 if (current_video && current_video->hidden->window_handle) |
303 { | 328 { |
304 WIMP_Poll(current_video, 0); | 329 WIMP_Poll(current_video, 0); |
305 } | 330 } |
331 #ifdef DISABLE_THREADS | |
306 /* Keep sound buffers running */ | 332 /* Keep sound buffers running */ |
307 DRenderer_FillBuffers(); | 333 DRenderer_FillBuffers(); |
308 if (SDL_timer_running) RISCOS_CheckTimer(); | 334 if (SDL_timer_running) RISCOS_CheckTimer(); |
335 #endif | |
309 } | 336 } |