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, ¢er); 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