146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*
246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    SDL - Simple DirectMedia Layer
346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Copyright (C) 1997-2006 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 Lesser General Public
746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    License as published by the Free Software Foundation; either
846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    version 2.1 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    Lesser General Public License for more details.
1446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
1546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    You should have received a copy of the GNU Lesser General Public
1646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    License along with this library; if not, write to the Free Software
1746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  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#define WIN32_LEAN_AND_MEAN
2546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <windows.h>
2646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
2746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Make sure XBUTTON stuff is defined that isn't in older Platform SDKs... */
2846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifndef WM_XBUTTONDOWN
2946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define WM_XBUTTONDOWN 0x020B
3046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
3146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifndef WM_XBUTTONUP
3246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define WM_XBUTTONUP 0x020C
3346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
3446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifndef GET_XBUTTON_WPARAM
3546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define GET_XBUTTON_WPARAM(w) (HIWORD(w))
3646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
3746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
3846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_events.h"
3946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_video.h"
4046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_syswm.h"
4146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "../SDL_sysvideo.h"
4246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "../../events/SDL_sysevents.h"
4346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "../../events/SDL_events_c.h"
4446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_lowvideo.h"
4546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_syswm_c.h"
4646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_main.h"
4746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_loadso.h"
4846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
4946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef WMMSG_DEBUG
5046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "wmmsg.h"
5146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
5246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
5346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef _WIN32_WCE
5446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "../gapi/SDL_gapivideo.h"
5546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
5646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define IsZoomed(HWND) 1
5746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define NO_GETKEYBOARDSTATE
5846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if _WIN32_WCE < 420
5946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define NO_CHANGEDISPLAYSETTINGS
6046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
6146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
6246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
6346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* The window we use for everything... */
6446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef _WIN32_WCE
6546be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerLPWSTR SDL_Appname = NULL;
6646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#else
6746be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerLPSTR SDL_Appname = NULL;
6846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
6946be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerUint32 SDL_Appstyle = 0;
7046be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerHINSTANCE SDL_Instance = NULL;
7146be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerHWND SDL_Window = NULL;
7246be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerRECT SDL_bounds = {0, 0, 0, 0};
7346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint SDL_windowX = 0;
7446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint SDL_windowY = 0;
7546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint SDL_resizing = 0;
7646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint mouse_relative = 0;
7746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint posted = 0;
7846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifndef NO_CHANGEDISPLAYSETTINGS
7946be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerDEVMODE SDL_desktop_mode;
8046be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerDEVMODE SDL_fullscreen_mode;
8146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
8246be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerWORD *gamma_saved = NULL;
8346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
8446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
8546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Functions called by the message processing function */
8646be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerLONG (*HandleMessage)(_THIS, HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)=NULL;
8746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid (*WIN_Activate)(_THIS, BOOL active, BOOL iconic);
8846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid (*WIN_RealizePalette)(_THIS);
8946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid (*WIN_PaletteChanged)(_THIS, HWND window);
9046be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid (*WIN_WinPAINT)(_THIS, HDC hdc);
9146be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerextern void DIB_SwapGamma(_THIS);
9246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
9346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifndef NO_GETKEYBOARDSTATE
9446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Variables and support functions for SDL_ToUnicode() */
9546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int codepage;
9646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int Is9xME();
9746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int GetCodePage();
9846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int WINAPI ToUnicode9xME(UINT vkey, UINT scancode, BYTE *keystate, LPWSTR wchars, int wsize, UINT flags);
9946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
10046be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerToUnicodeFN SDL_ToUnicode = ToUnicode9xME;
10146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif /* !NO_GETKEYBOARDSTATE */
10246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
10346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
10446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if defined(_WIN32_WCE)
10546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
10646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// dynamically load aygshell dll because we want SDL to work on HPC and be300
10746be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerHINSTANCE aygshell = NULL;
10846be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerBOOL (WINAPI *SHFullScreen)(HWND hwndRequester, DWORD dwState) = 0;
10946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
11046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define SHFS_SHOWTASKBAR            0x0001
11146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define SHFS_HIDETASKBAR            0x0002
11246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define SHFS_SHOWSIPBUTTON          0x0004
11346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define SHFS_HIDESIPBUTTON          0x0008
11446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define SHFS_SHOWSTARTICON          0x0010
11546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define SHFS_HIDESTARTICON          0x0020
11646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
11746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void LoadAygshell(void)
11846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
11946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if( !aygshell )
12046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		 aygshell = SDL_LoadObject("aygshell.dll");
12146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if( (aygshell != 0) && (SHFullScreen == 0) )
12246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	{
12346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		SHFullScreen = (int (WINAPI *)(struct HWND__ *,unsigned long)) SDL_LoadFunction(aygshell, "SHFullScreen");
12446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
12546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
12646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
12746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* for gapi landscape mode */
12846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void GapiTransform(SDL_ScreenOrientation rotate, char hires, Sint16 *x, Sint16 *y) {
12946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Sint16 rotatedX;
13046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Sint16 rotatedY;
13146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
13246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if (hires) {
13346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		*x = *x * 2;
13446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		*y = *y * 2;
13546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
13646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
13746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	switch(rotate) {
13846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case SDL_ORIENTATION_UP:
13946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			{
14046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* this code needs testing on a real device!
14146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   So it will be enabled later */
14246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*
14346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef _WIN32_WCE
14446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if _WIN32_WCE >= 420
14546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				// test device orientation
14646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				// FIXME: do not check every mouse message
14746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				DEVMODE settings;
14846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				SDL_memset(&settings, 0, sizeof(DEVMODE));
14946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				settings.dmSize = sizeof(DEVMODE);
15046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				settings.dmFields = DM_DISPLAYORIENTATION;
15146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				ChangeDisplaySettingsEx(NULL, &settings, NULL, CDS_TEST, NULL);
15246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				if( settings.dmOrientation == DMDO_90 )
15346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				{
15446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					rotatedX = SDL_VideoSurface->h - *x;
15546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					rotatedY = *y;
15646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					*x = rotatedX;
15746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					*y = rotatedY;
15846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				}
15946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
16046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif */
16146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			}
16246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			break;
16346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case SDL_ORIENTATION_RIGHT:
16446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			if (!SDL_VideoSurface)
16546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				break;
16646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			rotatedX = SDL_VideoSurface->w - *y;
16746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			rotatedY = *x;
16846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			*x = rotatedX;
16946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			*y = rotatedY;
17046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			break;
17146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case SDL_ORIENTATION_LEFT:
17246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			if (!SDL_VideoSurface)
17346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				break;
17446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			rotatedX = *y;
17546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			rotatedY = SDL_VideoSurface->h - *x;
17646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			*x = rotatedX;
17746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			*y = rotatedY;
17846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			break;
17946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
18046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
18146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
18246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
18346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
18446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* JC 14 Mar 2006
18546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   This is used all over the place, in the windib driver and in the dx5 driver
18646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   So we may as well stick it here instead of having multiple copies scattered
18746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   about
18846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
18946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid WIN_FlushMessageQueue()
19046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
19146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	MSG  msg;
19246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	while ( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) ) {
19346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if ( msg.message == WM_QUIT ) break;
19446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		TranslateMessage( &msg );
19546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		DispatchMessage( &msg );
19646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
19746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
19846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
19946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void SDL_RestoreGameMode(void)
20046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
20146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef _WIN32_WCE
20246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_VideoDevice *this = current_video;
20346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if(SDL_strcmp(this->name, "gapi") == 0)
20446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	{
20546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if( this->hidden->suspended )
20646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		{
20746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			this->hidden->suspended = 0;
20846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
20946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
21046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#else
21146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	ShowWindow(SDL_Window, SW_RESTORE);
21246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
21346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
21446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifndef NO_CHANGEDISPLAYSETTINGS
21546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifndef _WIN32_WCE
21646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	ChangeDisplaySettings(&SDL_fullscreen_mode, CDS_FULLSCREEN);
21746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
21846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif /* NO_CHANGEDISPLAYSETTINGS */
21946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
22046be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void SDL_RestoreDesktopMode(void)
22146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
22246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
22346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef _WIN32_WCE
22446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_VideoDevice *this = current_video;
22546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if(SDL_strcmp(this->name, "gapi") == 0)
22646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	{
22746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if( !this->hidden->suspended )
22846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		{
22946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			this->hidden->suspended = 1;
23046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
23146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
23246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#else
23346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* WinCE does not have a taskbar, so minimizing is not convenient */
23446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	ShowWindow(SDL_Window, SW_MINIMIZE);
23546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
23646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
23746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifndef NO_CHANGEDISPLAYSETTINGS
23846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifndef _WIN32_WCE
23946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	ChangeDisplaySettings(NULL, 0);
24046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
24146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif /* NO_CHANGEDISPLAYSETTINGS */
24246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
24346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
24446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef WM_MOUSELEAVE
24546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*
24646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   Special code to handle mouse leave events - this sucks...
24746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   http://support.microsoft.com/support/kb/articles/q183/1/07.asp
24846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
24946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   TrackMouseEvent() is only available on Win98 and WinNT.
25046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   _TrackMouseEvent() is available on Win95, but isn't yet in the mingw32
25146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   development environment, and only works on systems that have had IE 3.0
25246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   or newer installed on them (which is not the case with the base Win95).
25346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   Therefore, we implement our own version of _TrackMouseEvent() which
25446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   uses our own implementation if TrackMouseEvent() is not available.
25546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
25646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic BOOL (WINAPI *_TrackMouseEvent)(TRACKMOUSEEVENT *ptme) = NULL;
25746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
25846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic VOID CALLBACK
25946be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerTrackMouseTimerProc(HWND hWnd, UINT uMsg, UINT idEvent, DWORD dwTime)
26046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
26146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	RECT rect;
26246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	POINT pt;
26346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
26446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	GetClientRect(hWnd, &rect);
26546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	MapWindowPoints(hWnd, NULL, (LPPOINT)&rect, 2);
26646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	GetCursorPos(&pt);
26746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( !PtInRect(&rect, pt) || (WindowFromPoint(pt) != hWnd) ) {
26846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if ( !KillTimer(hWnd, idEvent) ) {
26946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			/* Error killing the timer! */
27046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
27146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		PostMessage(hWnd, WM_MOUSELEAVE, 0, 0);
27246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
27346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
27446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic BOOL WINAPI WIN_TrackMouseEvent(TRACKMOUSEEVENT *ptme)
27546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
27646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( ptme->dwFlags == TME_LEAVE ) {
27746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return SetTimer(ptme->hwndTrack, ptme->dwFlags, 100,
27846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		                (TIMERPROC)TrackMouseTimerProc) != 0;
27946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
28046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return FALSE;
28146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
28246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif /* WM_MOUSELEAVE */
28346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
28446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Function to retrieve the current keyboard modifiers */
28546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void WIN_GetKeyboardState(void)
28646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
28746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifndef NO_GETKEYBOARDSTATE
28846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDLMod state;
28946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	BYTE keyboard[256];
29046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Uint8 *kstate = SDL_GetKeyState(NULL);
29146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
29246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	state = KMOD_NONE;
29346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( GetKeyboardState(keyboard) ) {
29446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if ( keyboard[VK_LSHIFT] & 0x80) {
29546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			state |= KMOD_LSHIFT;
29646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			kstate[SDLK_LSHIFT] = SDL_PRESSED;
29746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
29846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if ( keyboard[VK_RSHIFT] & 0x80) {
29946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			state |= KMOD_RSHIFT;
30046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			kstate[SDLK_RSHIFT] = SDL_PRESSED;
30146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
30246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if ( keyboard[VK_LCONTROL] & 0x80) {
30346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			state |= KMOD_LCTRL;
30446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			kstate[SDLK_LCTRL] = SDL_PRESSED;
30546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
30646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if ( keyboard[VK_RCONTROL] & 0x80) {
30746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			state |= KMOD_RCTRL;
30846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			kstate[SDLK_RCTRL] = SDL_PRESSED;
30946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
31046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if ( keyboard[VK_LMENU] & 0x80) {
31146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			state |= KMOD_LALT;
31246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			kstate[SDLK_LALT] = SDL_PRESSED;
31346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
31446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if ( keyboard[VK_RMENU] & 0x80) {
31546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			state |= KMOD_RALT;
31646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			kstate[SDLK_RALT] = SDL_PRESSED;
31746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
31846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if ( keyboard[VK_NUMLOCK] & 0x01) {
31946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			state |= KMOD_NUM;
32046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			kstate[SDLK_NUMLOCK] = SDL_PRESSED;
32146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
32246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if ( keyboard[VK_CAPITAL] & 0x01) {
32346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			state |= KMOD_CAPS;
32446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			kstate[SDLK_CAPSLOCK] = SDL_PRESSED;
32546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
32646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
32746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_SetModState(state);
32846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif /* !NO_GETKEYBOARDSTATE */
32946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
33046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
33146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* The main Win32 event handler
33246be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerDJM: This is no longer static as (DX5/DIB)_CreateWindow needs it
33346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
33446be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerLRESULT CALLBACK WinMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
33546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
33646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_VideoDevice *this = current_video;
33746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	static int mouse_pressed = 0;
33846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	static int in_window = 0;
33946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef WMMSG_DEBUG
34046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	fprintf(stderr, "Received windows message:  ");
34146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( msg > MAX_WMMSG ) {
34246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		fprintf(stderr, "%d", msg);
34346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	} else {
34446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		fprintf(stderr, "%s", wmtab[msg]);
34546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
34646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	fprintf(stderr, " -- 0x%X, 0x%X\n", wParam, lParam);
34746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
34846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	switch (msg) {
34946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
35046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case WM_ACTIVATE: {
35146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			SDL_VideoDevice *this = current_video;
35246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			BOOL active, minimized;
35346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			Uint8 appstate;
35446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
35546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			minimized = HIWORD(wParam);
35646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			active = (LOWORD(wParam) != WA_INACTIVE) && !minimized;
35746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			if ( active ) {
35846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				/* Gain the following states */
35946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				appstate = SDL_APPACTIVE|SDL_APPINPUTFOCUS;
36046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				if ( this->input_grab != SDL_GRAB_OFF ) {
36146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					WIN_GrabInput(this, SDL_GRAB_ON);
36246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				}
36346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				if ( !(SDL_GetAppState()&SDL_APPINPUTFOCUS) ) {
36446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					if ( ! DDRAW_FULLSCREEN() ) {
36546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						DIB_SwapGamma(this);
36646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					}
36746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					if ( WINDIB_FULLSCREEN() ) {
36846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						SDL_RestoreGameMode();
36946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					}
37046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				}
37146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if defined(_WIN32_WCE)
37246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				if ( WINDIB_FULLSCREEN() ) {
37346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					LoadAygshell();
37446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					if( SHFullScreen )
37546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						SHFullScreen(SDL_Window, SHFS_HIDESTARTICON|SHFS_HIDETASKBAR|SHFS_HIDESIPBUTTON);
37646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					else
37746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						ShowWindow(FindWindow(TEXT("HHTaskBar"),NULL),SW_HIDE);
37846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				}
37946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
38046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				posted = SDL_PrivateAppActive(1, appstate);
38146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				WIN_GetKeyboardState();
38246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			} else {
38346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				/* Lose the following states */
38446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				appstate = SDL_APPINPUTFOCUS;
38546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				if ( minimized ) {
38646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					appstate |= SDL_APPACTIVE;
38746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				}
38846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				if ( this->input_grab != SDL_GRAB_OFF ) {
38946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					WIN_GrabInput(this, SDL_GRAB_OFF);
39046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				}
39146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				if ( SDL_GetAppState() & SDL_APPINPUTFOCUS ) {
39246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					if ( ! DDRAW_FULLSCREEN() ) {
39346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						DIB_SwapGamma(this);
39446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					}
39546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					if ( WINDIB_FULLSCREEN() ) {
39646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						SDL_RestoreDesktopMode();
39746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if defined(_WIN32_WCE)
39846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						LoadAygshell();
39946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						if( SHFullScreen )
40046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner							SHFullScreen(SDL_Window, SHFS_SHOWSTARTICON|SHFS_SHOWTASKBAR|SHFS_SHOWSIPBUTTON);
40146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						else
40246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner							ShowWindow(FindWindow(TEXT("HHTaskBar"),NULL),SW_SHOW);
40346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
40446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					}
40546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				}
40646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				posted = SDL_PrivateAppActive(0, appstate);
40746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			}
40846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			WIN_Activate(this, active, minimized);
40946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			return(0);
41046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
41146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		break;
41246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
41346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case WM_MOUSEMOVE: {
41446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
41546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			/* Mouse is handled by DirectInput when fullscreen */
41646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			if ( SDL_VideoSurface && ! DINPUT_FULLSCREEN() ) {
41746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				Sint16 x, y;
41846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
41946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				/* mouse has entered the window */
42046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				if ( ! in_window ) {
42146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef WM_MOUSELEAVE
42246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					TRACKMOUSEEVENT tme;
42346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
42446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					tme.cbSize = sizeof(tme);
42546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					tme.dwFlags = TME_LEAVE;
42646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					tme.hwndTrack = SDL_Window;
42746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					_TrackMouseEvent(&tme);
42846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif /* WM_MOUSELEAVE */
42946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					in_window = TRUE;
43046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
43146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					posted = SDL_PrivateAppActive(1, SDL_APPMOUSEFOCUS);
43246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				}
43346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
43446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				/* mouse has moved within the window */
43546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				x = LOWORD(lParam);
43646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				y = HIWORD(lParam);
43746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				if ( mouse_relative ) {
43846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					POINT center;
43946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					center.x = (SDL_VideoSurface->w/2);
44046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					center.y = (SDL_VideoSurface->h/2);
44146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					x -= (Sint16)center.x;
44246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					y -= (Sint16)center.y;
44346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					if ( x || y ) {
44446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						ClientToScreen(SDL_Window, &center);
44546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						SetCursorPos(center.x, center.y);
44646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						posted = SDL_PrivateMouseMotion(0, 1, x, y);
44746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					}
44846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				} else {
44946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef _WIN32_WCE
45046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					if (SDL_VideoSurface)
45146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						GapiTransform(this->hidden->userOrientation, this->hidden->hiresFix, &x, &y);
45246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
45346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					posted = SDL_PrivateMouseMotion(0, 0, x, y);
45446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				}
45546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			}
45646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
45746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return(0);
45846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
45946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef WM_MOUSELEAVE
46046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case WM_MOUSELEAVE: {
46146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
46246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			/* Mouse is handled by DirectInput when fullscreen */
46346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			if ( SDL_VideoSurface && ! DINPUT_FULLSCREEN() ) {
46446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				/* mouse has left the window */
46546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				/* or */
46646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				/* Elvis has left the building! */
46746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				posted = SDL_PrivateAppActive(0, SDL_APPMOUSEFOCUS);
46846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			}
46946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			in_window = FALSE;
47046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
47146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return(0);
47246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif /* WM_MOUSELEAVE */
47346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
47446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case WM_LBUTTONDOWN:
47546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case WM_LBUTTONUP:
47646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case WM_MBUTTONDOWN:
47746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case WM_MBUTTONUP:
47846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case WM_RBUTTONDOWN:
47946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case WM_RBUTTONUP:
48046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case WM_XBUTTONDOWN:
48146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case WM_XBUTTONUP: {
48246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			/* Mouse is handled by DirectInput when fullscreen */
48346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			if ( SDL_VideoSurface && ! DINPUT_FULLSCREEN() ) {
48446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				WORD xbuttonval = 0;
48546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				Sint16 x, y;
48646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				Uint8 button, state;
48746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
48846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				/* DJM:
48946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				   We want the SDL window to take focus so that
49046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				   it acts like a normal windows "component"
49146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				   (e.g. gains keyboard focus on a mouse click).
49246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				 */
49346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				SetFocus(SDL_Window);
49446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
49546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				/* Figure out which button to use */
49646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				switch (msg) {
49746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					case WM_LBUTTONDOWN:
49846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						button = SDL_BUTTON_LEFT;
49946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						state = SDL_PRESSED;
50046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						break;
50146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					case WM_LBUTTONUP:
50246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						button = SDL_BUTTON_LEFT;
50346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						state = SDL_RELEASED;
50446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						break;
50546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					case WM_MBUTTONDOWN:
50646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						button = SDL_BUTTON_MIDDLE;
50746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						state = SDL_PRESSED;
50846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						break;
50946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					case WM_MBUTTONUP:
51046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						button = SDL_BUTTON_MIDDLE;
51146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						state = SDL_RELEASED;
51246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						break;
51346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					case WM_RBUTTONDOWN:
51446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						button = SDL_BUTTON_RIGHT;
51546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						state = SDL_PRESSED;
51646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						break;
51746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					case WM_RBUTTONUP:
51846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						button = SDL_BUTTON_RIGHT;
51946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						state = SDL_RELEASED;
52046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						break;
52146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					case WM_XBUTTONDOWN:
52246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						xbuttonval = GET_XBUTTON_WPARAM(wParam);
52346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						button = SDL_BUTTON_WHEELDOWN + xbuttonval;
52446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						state = SDL_PRESSED;
52546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						break;
52646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					case WM_XBUTTONUP:
52746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						xbuttonval = GET_XBUTTON_WPARAM(wParam);
52846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						button = SDL_BUTTON_WHEELDOWN + xbuttonval;
52946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						state = SDL_RELEASED;
53046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						break;
53146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					default:
53246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						/* Eh? Unknown button? */
53346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						return(0);
53446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				}
53546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				if ( state == SDL_PRESSED ) {
53646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					/* Grab mouse so we get up events */
53746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					if ( ++mouse_pressed > 0 ) {
53846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						SetCapture(hwnd);
53946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					}
54046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				} else {
54146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					/* Release mouse after all up events */
54246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					if ( --mouse_pressed <= 0 ) {
54346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						ReleaseCapture();
54446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						mouse_pressed = 0;
54546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					}
54646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				}
54746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				if ( mouse_relative ) {
54846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				/*	RJR: March 28, 2000
54946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					report internal mouse position if in relative mode */
55046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					x = 0; y = 0;
55146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				} else {
55246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					x = (Sint16)LOWORD(lParam);
55346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					y = (Sint16)HIWORD(lParam);
55446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef _WIN32_WCE
55546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					if (SDL_VideoSurface)
55646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						GapiTransform(this->hidden->userOrientation, this->hidden->hiresFix, &x, &y);
55746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
55846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				}
55946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				posted = SDL_PrivateMouseButton(
56046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner							state, button, x, y);
56146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
56246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				/*
56346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				 * MSDN says:
56446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				 *  "Unlike the WM_LBUTTONUP, WM_MBUTTONUP, and WM_RBUTTONUP
56546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				 *   messages, an application should return TRUE from [an
56646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				 *   XBUTTON message] if it processes it. Doing so will allow
56746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				 *   software that simulates this message on Microsoft Windows
56846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				 *   systems earlier than Windows 2000 to determine whether
56946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				 *   the window procedure processed the message or called
57046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				 *   DefWindowProc to process it.
57146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				 */
57246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				if (xbuttonval > 0)
57346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					return(TRUE);
57446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			}
57546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
57646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return(0);
57746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
57846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
57946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)
58046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case WM_MOUSEWHEEL:
58146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			if ( SDL_VideoSurface && ! DINPUT_FULLSCREEN() ) {
58246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				int move = (short)HIWORD(wParam);
58346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				if ( move ) {
58446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					Uint8 button;
58546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					if ( move > 0 )
58646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						button = SDL_BUTTON_WHEELUP;
58746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					else
58846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						button = SDL_BUTTON_WHEELDOWN;
58946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					posted = SDL_PrivateMouseButton(
59046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						SDL_PRESSED, button, 0, 0);
59146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner					posted |= SDL_PrivateMouseButton(
59246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						SDL_RELEASED, button, 0, 0);
59346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				}
59446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			}
59546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			return(0);
59646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
59746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
59846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef WM_GETMINMAXINFO
59946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* This message is sent as a way for us to "check" the values
60046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		 * of a position change.  If we don't like it, we can adjust
60146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		 * the values before they are changed.
60246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		 */
60346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case WM_GETMINMAXINFO: {
60446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			MINMAXINFO *info;
60546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			RECT        size;
60646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			int x, y;
60746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			int style;
60846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			int width;
60946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			int height;
61046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
61146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			/* We don't want to clobber an internal resize */
61246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			if ( SDL_resizing )
61346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				return(0);
61446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
61546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			/* We allow resizing with the SDL_RESIZABLE flag */
61646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			if ( SDL_PublicSurface &&
61746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				(SDL_PublicSurface->flags & SDL_RESIZABLE) ) {
61846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				return(0);
61946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			}
62046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
62146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			/* Get the current position of our window */
62246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			GetWindowRect(SDL_Window, &size);
62346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			x = size.left;
62446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			y = size.top;
62546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
62646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			/* Calculate current width and height of our window */
62746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			size.top = 0;
62846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			size.left = 0;
62946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			if ( SDL_PublicSurface != NULL ) {
63046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				size.bottom = SDL_PublicSurface->h;
63146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				size.right = SDL_PublicSurface->w;
63246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			} else {
63346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				size.bottom = 0;
63446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				size.right = 0;
63546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			}
63646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
63746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			/* DJM - according to the docs for GetMenu(), the
63846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			   return value is undefined if hwnd is a child window.
63946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			   Aparently it's too difficult for MS to check
64046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			   inside their function, so I have to do it here.
64146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner          		 */
64246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner         		style = GetWindowLong(hwnd, GWL_STYLE);
64346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner         		AdjustWindowRect(
64446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				&size,
64546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				style,
64646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner            			style & WS_CHILDWINDOW ? FALSE
64746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner						       : GetMenu(hwnd) != NULL);
64846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
64946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			width = size.right - size.left;
65046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			height = size.bottom - size.top;
65146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
65246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			/* Fix our size to the current size */
65346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			info = (MINMAXINFO *)lParam;
65446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			info->ptMaxSize.x = width;
65546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			info->ptMaxSize.y = height;
65646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			info->ptMaxPosition.x = x;
65746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			info->ptMaxPosition.y = y;
65846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			info->ptMinTrackSize.x = width;
65946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			info->ptMinTrackSize.y = height;
66046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			info->ptMaxTrackSize.x = width;
66146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			info->ptMaxTrackSize.y = height;
66246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
66346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return(0);
66446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif /* WM_GETMINMAXINFO */
66546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
66646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case WM_WINDOWPOSCHANGED: {
66746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			SDL_VideoDevice *this = current_video;
66846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			int w, h;
66946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
67046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			GetClientRect(SDL_Window, &SDL_bounds);
67146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			ClientToScreen(SDL_Window, (LPPOINT)&SDL_bounds);
67246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			ClientToScreen(SDL_Window, (LPPOINT)&SDL_bounds+1);
67346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			if ( !SDL_resizing && !IsZoomed(SDL_Window) &&
67446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			     SDL_PublicSurface &&
67546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				!(SDL_PublicSurface->flags & SDL_FULLSCREEN) ) {
67646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				SDL_windowX = SDL_bounds.left;
67746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				SDL_windowY = SDL_bounds.top;
67846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			}
67946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			w = SDL_bounds.right-SDL_bounds.left;
68046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			h = SDL_bounds.bottom-SDL_bounds.top;
68146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			if ( this->input_grab != SDL_GRAB_OFF ) {
68246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				ClipCursor(&SDL_bounds);
68346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			}
68446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			if ( SDL_PublicSurface &&
68546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				(SDL_PublicSurface->flags & SDL_RESIZABLE) ) {
68646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				SDL_PrivateResize(w, h);
68746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			}
68846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
68946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		break;
69046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
69146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* We need to set the cursor */
69246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case WM_SETCURSOR: {
69346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			Uint16 hittest;
69446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
69546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			hittest = LOWORD(lParam);
69646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			if ( hittest == HTCLIENT ) {
69746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				SetCursor(SDL_hcursor);
69846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				return(TRUE);
69946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			}
70046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
70146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		break;
70246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
70346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* We are about to get palette focus! */
70446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case WM_QUERYNEWPALETTE: {
70546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			WIN_RealizePalette(current_video);
70646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			return(TRUE);
70746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
70846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		break;
70946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
71046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* Another application changed the palette */
71146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case WM_PALETTECHANGED: {
71246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			WIN_PaletteChanged(current_video, (HWND)wParam);
71346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
71446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		break;
71546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
71646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* We were occluded, refresh our display */
71746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case WM_PAINT: {
71846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			HDC hdc;
71946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			PAINTSTRUCT ps;
72046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
72146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			hdc = BeginPaint(SDL_Window, &ps);
72246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			if ( current_video->screen &&
72346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			     !(current_video->screen->flags & SDL_OPENGL) ) {
72446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				WIN_WinPAINT(current_video, hdc);
72546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			}
72646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			EndPaint(SDL_Window, &ps);
72746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
72846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return(0);
72946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
73046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* DJM: Send an expose event in this case */
73146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case WM_ERASEBKGND: {
73246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			posted = SDL_PrivateExpose();
73346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
73446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return(0);
73546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
73646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case WM_CLOSE: {
73746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			if ( (posted = SDL_PrivateQuit()) )
73846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				PostQuitMessage(0);
73946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
74046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return(0);
74146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
74246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case WM_DESTROY: {
74346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			PostQuitMessage(0);
74446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
74546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return(0);
74646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
74746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifndef NO_GETKEYBOARDSTATE
74846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		case WM_INPUTLANGCHANGE: {
74946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			codepage = GetCodePage();
75046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
75146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return(TRUE);
75246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
75346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
75446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		default: {
75546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			/* Special handling by the video driver */
75646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			if (HandleMessage) {
75746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				return(HandleMessage(current_video,
75846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			                     hwnd, msg, wParam, lParam));
75946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			}
76046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
76146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		break;
76246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
76346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return(DefWindowProc(hwnd, msg, wParam, lParam));
76446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
76546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
76646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Allow the application handle to be stored and retrieved later */
76746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void *SDL_handle = NULL;
76846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
76946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid SDL_SetModuleHandle(void *handle)
77046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
77146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_handle = handle;
77246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
77346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid *SDL_GetModuleHandle(void)
77446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
77546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	void *handle;
77646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
77746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( SDL_handle ) {
77846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		handle = SDL_handle;
77946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	} else {
78046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		handle = GetModuleHandle(NULL);
78146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
78246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return(handle);
78346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
78446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
78546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* This allows the SDL_WINDOWID hack */
78646be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerBOOL SDL_windowid = FALSE;
78746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
78846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int app_registered = 0;
78946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
79046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Register the class for this application -- exported for winmain.c */
79146be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint SDL_RegisterApp(char *name, Uint32 style, void *hInst)
79246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
79346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	WNDCLASS class;
79446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef WM_MOUSELEAVE
79546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	HMODULE handle;
79646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
79746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
79846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Only do this once... */
79946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( app_registered ) {
80046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		++app_registered;
80146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return(0);
80246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
80346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
80446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifndef CS_BYTEALIGNCLIENT
80546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define CS_BYTEALIGNCLIENT	0
80646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
80746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( ! name && ! SDL_Appname ) {
80846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		name = "SDL_app";
80946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		SDL_Appstyle = CS_BYTEALIGNCLIENT;
81046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		SDL_Instance = hInst ? hInst : SDL_GetModuleHandle();
81146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
81246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
81346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( name ) {
81446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef _WIN32_WCE
81546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* WinCE uses the UNICODE version */
81646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		SDL_Appname = SDL_iconv_utf8_ucs2(name);
81746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#else
81846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		SDL_Appname = SDL_iconv_utf8_locale(name);
81946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif /* _WIN32_WCE */
82046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		SDL_Appstyle = style;
82146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		SDL_Instance = hInst ? hInst : SDL_GetModuleHandle();
82246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
82346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
82446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Register the application class */
82546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	class.hCursor		= NULL;
82646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	class.hIcon		= LoadImage(SDL_Instance, SDL_Appname,
82746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				            IMAGE_ICON,
82846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	                                    0, 0, LR_DEFAULTCOLOR);
82946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	class.lpszMenuName	= NULL;
83046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	class.lpszClassName	= SDL_Appname;
83146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	class.hbrBackground	= NULL;
83246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	class.hInstance		= SDL_Instance;
83346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	class.style		= SDL_Appstyle;
83446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if SDL_VIDEO_OPENGL
83546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	class.style		|= CS_OWNDC;
83646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
83746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	class.lpfnWndProc	= WinMessage;
83846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	class.cbWndExtra	= 0;
83946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	class.cbClsExtra	= 0;
84046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( ! RegisterClass(&class) ) {
84146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		SDL_SetError("Couldn't register application class");
84246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return(-1);
84346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
84446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
84546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef WM_MOUSELEAVE
84646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Get the version of TrackMouseEvent() we use */
84746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	_TrackMouseEvent = NULL;
84846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	handle = GetModuleHandle("USER32.DLL");
84946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( handle ) {
85046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		_TrackMouseEvent = (BOOL (WINAPI *)(TRACKMOUSEEVENT *))GetProcAddress(handle, "TrackMouseEvent");
85146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
85246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( _TrackMouseEvent == NULL ) {
85346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		_TrackMouseEvent = WIN_TrackMouseEvent;
85446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
85546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif /* WM_MOUSELEAVE */
85646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
85746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifndef NO_GETKEYBOARDSTATE
85846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Initialise variables for SDL_ToUnicode() */
85946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	codepage = GetCodePage();
86046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_ToUnicode = Is9xME() ? ToUnicode9xME : ToUnicode;
86146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
86246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
86346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	app_registered = 1;
86446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return(0);
86546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
86646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
86746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Unregisters the windowclass registered in SDL_RegisterApp above. */
86846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid SDL_UnregisterApp()
86946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
87046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	WNDCLASS class;
87146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
87246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* SDL_RegisterApp might not have been called before */
87346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( !app_registered ) {
87446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return;
87546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
87646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	--app_registered;
87746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( app_registered == 0 ) {
87846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* Check for any registered window classes. */
87946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if ( GetClassInfo(SDL_Instance, SDL_Appname, &class) ) {
88046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			UnregisterClass(SDL_Appname, SDL_Instance);
88146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
88246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		SDL_free(SDL_Appname);
88346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		SDL_Appname = NULL;
88446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
88546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
88646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
88746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifndef NO_GETKEYBOARDSTATE
88846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* JFP: Implementation of ToUnicode() that works on 9x/ME/2K/XP */
88946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
89046be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int Is9xME()
89146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
89246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	OSVERSIONINFO   info;
89346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
89446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_memset(&info, 0, sizeof(info));
89546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	info.dwOSVersionInfoSize = sizeof(info);
89646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if (!GetVersionEx(&info)) {
89746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return 0;
89846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
89946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return (info.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS);
90046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
90146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
90246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int GetCodePage()
90346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
90446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	char	buff[8];
90546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	int	lcid = MAKELCID(LOWORD(GetKeyboardLayout(0)), SORT_DEFAULT);
90646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	int	cp = GetACP();
90746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
90846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if (GetLocaleInfo(lcid, LOCALE_IDEFAULTANSICODEPAGE, buff, sizeof(buff))) {
90946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		cp = SDL_atoi(buff);
91046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
91146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return cp;
91246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
91346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
91446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int WINAPI ToUnicode9xME(UINT vkey, UINT scancode, PBYTE keystate, LPWSTR wchars, int wsize, UINT flags)
91546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
91646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	BYTE	chars[2];
91746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
91846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if (ToAsciiEx(vkey, scancode, keystate, (WORD*)chars, 0, GetKeyboardLayout(0)) == 1) {
91946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return MultiByteToWideChar(codepage, 0, chars, 1, wchars, wsize);
92046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
92146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return 0;
92246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
92346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
92446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif /* !NO_GETKEYBOARDSTATE */
925