146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* 246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL - Simple DirectMedia Layer 346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Copyright (C) 1997-2004 Sam Lantinga 446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner This library is free software; you can redistribute it and/or 646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner modify it under the terms of the GNU Library General Public 746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner License as published by the Free Software Foundation; either 846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner version 2 of the License, or (at your option) any later version. 946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 1046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner This library is distributed in the hope that it will be useful, 1146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner but WITHOUT ANY WARRANTY; without even the implied warranty of 1246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Library General Public License for more details. 1446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 1546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner You should have received a copy of the GNU Library General Public 1646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner License along with this library; if not, write to the Free 1746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 1846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 1946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Sam Lantinga 2046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner slouken@libsdl.org 2146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/ 2246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_config.h" 2346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 2446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* 2546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner File added by Alan Buckley (alan_baa@hotmail.com) for RISC OS compatability 2646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 27 March 2003 2746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 2846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Implements Pumping of events and WIMP polling 2946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/ 3046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 3146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL.h" 3246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_syswm.h" 3346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "../../events/SDL_sysevents.h" 3446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "../../events/SDL_events_c.h" 3546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_riscosvideo.h" 3646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_riscosevents_c.h" 3746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_riscosmouse_c.h" 3846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "../../timer/SDL_timer_c.h" 3946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 4046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "memory.h" 4146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "stdlib.h" 4246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "ctype.h" 4346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 4446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "kernel.h" 4546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "swis.h" 4646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "unixlib/os.h" 4746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 4846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if !SDL_THREADS_DISABLED 4946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <pthread.h> 5046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 5146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 5246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Local functions */ 5346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid WIMP_Poll(_THIS, int waitTime); 5446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid WIMP_SetFocus(int win); 5546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 5646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* SDL_riscossprite functions */ 5746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid WIMP_PlotSprite(_THIS, int x, int y); 5846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid WIMP_ModeChanged(_THIS); 5946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid WIMP_PaletteChanged(_THIS); 6046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 6146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 6246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerextern void WIMP_PollMouse(_THIS); 6346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerextern void RISCOS_PollKeyboard(); 6446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 6546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if SDL_THREADS_DISABLED 6646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Timer running function */ 6746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerextern void RISCOS_CheckTimer(); 6846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#else 6946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerextern int riscos_using_threads; 7046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 7146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 7246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Mouse cursor handling */ 7346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerextern void WIMP_ReshowCursor(_THIS); 7446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerextern void WIMP_RestoreWimpCursor(); 7546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 7646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint hasFocus = 0; 7746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint mouseInWindow = 0; 7846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 7946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Flag to ensure window is correct size after a mode change */ 8046be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int resizeOnOpen = 0; 8146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 8246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid WIMP_PumpEvents(_THIS) 8346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 8446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WIMP_Poll(this, 0); 8546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (hasFocus) RISCOS_PollKeyboard(); 8646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (mouseInWindow) WIMP_PollMouse(this); 8746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if SDL_THREADS_DISABLED 8846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (SDL_timer_running) RISCOS_CheckTimer(); 8946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 9046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 9146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 9246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 9346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid WIMP_Poll(_THIS, int waitTime) 9446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 9546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _kernel_swi_regs regs; 9646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int message[64]; 9746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner unsigned int code; 9846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int pollMask = 0; 9946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int doPoll = 1; 10046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int sysEvent; 10146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int sdlWindow = this->hidden->window_handle; 10246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 10346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (this->PumpEvents != WIMP_PumpEvents) return; 10446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 10546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (waitTime > 0) 10646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 10746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _kernel_swi(OS_ReadMonotonicTime, ®s, ®s); 10846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner waitTime += regs.r[0]; 10946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 11046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 11146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while (doPoll) 11246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 11346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if !SDL_THREADS_DISABLED 11446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Stop thread callbacks while program is paged out */ 11546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (riscos_using_threads) __pthread_stop_ticker(); 11646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 11746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 11846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (waitTime <= 0) 11946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 12046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner regs.r[0] = pollMask; /* Poll Mask */ 12146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* For no wait time mask out null event so we wait until something happens */ 12246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (waitTime < 0) regs.r[0] |= 1; 12346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner regs.r[1] = (int)message; 12446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _kernel_swi(Wimp_Poll, ®s, ®s); 12546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else 12646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 12746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner regs.r[0] = pollMask; 12846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner regs.r[1] = (int)message; 12946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner regs.r[2] = waitTime; 13046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _kernel_swi(Wimp_PollIdle, ®s, ®s); 13146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 13246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 13346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Flag to specify if we post a SDL_SysWMEvent */ 13446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sysEvent = 0; 13546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 13646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner code = (unsigned int)regs.r[0]; 13746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 13846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner switch(code) 13946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 14046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 0: /* Null Event - drop out for standard processing*/ 14146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner doPoll = 0; 14246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 14346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 14446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 1: /* Redraw window */ 14546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _kernel_swi(Wimp_RedrawWindow, ®s,®s); 14646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (message[0] == sdlWindow) 14746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 14846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while (regs.r[0]) 14946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 15046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WIMP_PlotSprite(this, message[1], message[2]); 15146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _kernel_swi(Wimp_GetRectangle, ®s, ®s); 15246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 15346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else 15446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 15546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* TODO: Currently we just eat them - we may need to pass them on */ 15646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while (regs.r[0]) 15746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 15846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _kernel_swi(Wimp_GetRectangle, ®s, ®s); 15946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 16046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 16146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 16246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 16346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 2: /* Open window */ 16446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( resizeOnOpen && message[0] == sdlWindow) 16546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 16646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Ensure window is correct size */ 16746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner resizeOnOpen = 0; 16846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner message[3] = message[1] + (this->screen->w << this->hidden->xeig); 16946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner message[4] = message[2] + (this->screen->h << this->hidden->yeig); 17046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 17146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _kernel_swi(Wimp_OpenWindow, ®s, ®s); 17246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 17346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 17446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 3: /* Close window */ 17546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (message[0] == sdlWindow) 17646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 17746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Documentation makes it looks as if the following line is correct: 17846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ** if (SDL_PrivateQuit() == 1) _kernel_swi(Wimp_CloseWindow, ®s, ®s); 17946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ** However some programs don't process this message and so sit there invisibly 18046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ** in the background so I just post the quit message and hope the application 18146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ** does the correct thing. 18246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner */ 18346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateQuit(); 18446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else 18546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sysEvent = 1; 18646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner doPoll = 0; 18746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 18846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 18946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 4: /* Pointer_Leaving_Window */ 19046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (message[0] == sdlWindow) 19146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 19246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mouseInWindow = 0; 19346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner //TODO: Lose buttons / dragging 19446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Reset to default pointer */ 19546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WIMP_RestoreWimpCursor(); 19646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateAppActive(0, SDL_APPMOUSEFOCUS); 19746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else 19846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sysEvent = 1; 19946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 20046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 20146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 5: /* Pointer_Entering_Window */ 20246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (message[0] == sdlWindow) 20346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 20446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mouseInWindow = 1; 20546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WIMP_ReshowCursor(this); 20646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateAppActive(1, SDL_APPMOUSEFOCUS); 20746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else sysEvent = 1; 20846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 20946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 21046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 6: /* Mouse_Click */ 21146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (hasFocus == 0) 21246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 21346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* First click gives focus if it's not a menu */ 21446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* we only count non-menu clicks on a window that has the focus */ 21546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WIMP_SetFocus(message[3]); 21646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else 21746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner doPoll = 0; // So PollMouse gets a chance to pick it up 21846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 21946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 22046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 7: /* User_Drag_Box - Used for mouse release */ 22146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner //TODO: May need to implement this in the future 22246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sysEvent = 1; 22346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 22446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 22546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 8: /* Keypressed */ 22646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner doPoll = 0; /* PollKeyboard should pick it up */ 22746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (message[0] != sdlWindow) sysEvent = 1; 22846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /*TODO: May want to always pass F12 etc to the wimp 22946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 23046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner regs.r[0] = message[6]; 23146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _kernel_swi(Wimp_ProcessKey, ®s, ®s); 23246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 23346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner */ 23446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 23546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 23646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 11: /* Lose Caret */ 23746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner hasFocus = 0; 23846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (message[0] == sdlWindow) SDL_PrivateAppActive(0, SDL_APPINPUTFOCUS); 23946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else sysEvent = 1; 24046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 24146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 24246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 12: /* Gain Caret */ 24346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner hasFocus = 1; 24446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (message[0] == sdlWindow) SDL_PrivateAppActive(1, SDL_APPINPUTFOCUS); 24546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else sysEvent = 1; 24646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 24746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 24846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 17: 24946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 18: 25046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sysEvent = 1; /* All messages are passed on */ 25146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 25246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner switch(message[4]) 25346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 25446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 0: /* Quit Event */ 25546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* No choice - have to quit */ 25646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_Quit(); 25746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner exit(0); 25846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 25946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 26046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 8: /* Pre Quit */ 26146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateQuit(); 26246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 26346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 26446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 0x400c1: /* Mode change */ 26546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WIMP_ModeChanged(this); 26646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner resizeOnOpen = 1; 26746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 26846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 26946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 9: /* Palette changed */ 27046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WIMP_PaletteChanged(this); 27146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 27246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 27346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 27446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 27546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner default: 27646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Pass unknown events on */ 27746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sysEvent = 1; 27846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 27946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 28046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 28146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (sysEvent) 28246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 28346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SysWMmsg wmmsg; 28446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 28546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_VERSION(&wmmsg.version); 28646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner wmmsg.eventCode = code; 28746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memcpy(wmmsg.pollBlock, message, 64 * sizeof(int)); 28846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 28946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Fall out of polling loop if message is successfully posted */ 29046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (SDL_PrivateSysWMEvent(&wmmsg)) doPoll = 0; 29146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 29246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if !SDL_THREADS_DISABLED 29346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (riscos_using_threads) 29446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 29546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Restart ticker here so other thread can not interfere 29646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner with the Redraw processing */ 29746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (riscos_using_threads) __pthread_start_ticker(); 29846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Give other threads a better chance of running */ 29946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pthread_yield(); 30046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 30146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 30246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 30346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 30446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 30546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Set focus to specified window */ 30646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid WIMP_SetFocus(int win) 30746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 30846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _kernel_swi_regs regs; 30946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 31046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner regs.r[0] = win; 31146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner regs.r[1] = -1; /* Icon handle */ 31246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner regs.r[2] = 0; /* X-offset we just put it at position 0 */ 31346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner regs.r[3] = 0; /* Y-offset as above */ 31446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner regs.r[4] = 1 << 25; /* Caret is invisible */ 31546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner regs.r[5] = 0; /* index into string */ 31646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 31746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _kernel_swi(Wimp_SetCaretPosition, ®s, ®s); 31846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 31946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 32046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/** Run background task while in a sleep command */ 32146be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid RISCOS_BackgroundTasks(void) 32246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 32346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (current_video && current_video->hidden->window_handle) 32446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 32546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WIMP_Poll(current_video, 0); 32646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 32746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if SDL_THREADS_DISABLED 32846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (SDL_timer_running) RISCOS_CheckTimer(); 32946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 33046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 331