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, &regs, &regs);
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, &regs, &regs);
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, &regs, &regs);
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, &regs,&regs);
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, &regs, &regs);
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, &regs, &regs);
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, &regs, &regs);
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, &regs, &regs);
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, &regs, &regs);
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, &regs, &regs);
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