# HG changeset patch # User Sam Lantinga # Date 1153883741 0 # Node ID 7d642361ef0fcd5b596750e9f81a7847477c4ab1 # Parent 4371d679ee12570be83503b42fedf6e082fbee59 The old windows video drivers are superceded by the unified win32 driver. diff -r 4371d679ee12 -r 7d642361ef0f src/video/wincommon/SDL_lowvideo.h --- a/src/video/wincommon/SDL_lowvideo.h Wed Jul 26 03:12:05 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,136 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ -#include "SDL_config.h" - -#ifndef _SDL_lowvideo_h -#define _SDL_lowvideo_h - -#define WIN32_LEAN_AND_MEAN -#include - -#ifndef SetClassLongPtr -#define SetClassLongPtr SetClassLong -#endif -#ifndef GetWindowLongPtr -#define GetWindowLongPtr GetWindowLong -#endif -#ifndef SetWindowLongPtr -#define SetWindowLongPtr SetWindowLong -#endif -#ifndef GWLP_WNDPROC -#define GWLP_WNDPROC GWL_WNDPROC -#endif -#ifndef GCLP_HICON -#define GCLP_HICON GCL_HICON -#endif - -#include "../SDL_sysvideo.h" - -/* Hidden "this" pointer for the video functions */ -#define _THIS SDL_VideoDevice *this - -#define WINDIB_FULLSCREEN() \ -( \ - SDL_VideoSurface && \ - (SDL_VideoSurface->flags & SDL_FULLSCREEN) && \ - ((SDL_VideoSurface->flags & SDL_INTERNALOPENGL) || \ - ((SDL_strcmp(this->name, "windib") == 0) || \ - (SDL_strcmp(this->name, "gapi") == 0))) \ -) -#define DDRAW_FULLSCREEN() \ -( \ - SDL_VideoSurface && \ - (SDL_VideoSurface->flags & SDL_FULLSCREEN) && \ - (SDL_VideoSurface->flags & SDL_INTERNALOPENGL) && \ - (SDL_strcmp(this->name, "directx") == 0) \ -) - -#define DINPUT_FULLSCREEN() DDRAW_FULLSCREEN() - -/* The main window -- and a function to set it for the audio */ -#ifdef _WIN32_WCE -extern LPWSTR SDL_Appname; -#else -extern LPSTR SDL_Appname; -#endif -extern HINSTANCE SDL_Instance; -extern HWND SDL_Window; -extern BOOL SDL_windowid; - -/* Variables and functions exported to other parts of the native video - subsystem (SDL_sysevents.c) -*/ -extern void WIN_FlushMessageQueue(); - -/* Called by windows message loop when system palette is available */ -extern void (*WIN_RealizePalette) (_THIS); - -/* Called by windows message loop when the system palette changes */ -extern void (*WIN_PaletteChanged) (_THIS, HWND window); - -/* Called by windows message loop when a portion of the screen needs update */ -extern void (*WIN_WinPAINT) (_THIS, HDC hdc); - -/* Called by windows message loop when the message isn't handled */ -extern LONG(*HandleMessage) (_THIS, HWND hwnd, UINT msg, WPARAM wParam, - LPARAM lParam); - -/* The window cursor (from SDL_sysmouse.c) */ -extern HCURSOR SDL_hcursor; - -/* The bounds of the window in screen coordinates */ -extern RECT SDL_bounds; - -/* The position of the window in windowed mode */ -extern int SDL_windowX; -extern int SDL_windowY; - -/* Flag -- SDL is performing a resize, rather than the user */ -extern int SDL_resizing; - -/* Flag -- the mouse is in relative motion mode */ -extern int mouse_relative; - -/* The GDI fullscreen mode currently active */ -#ifndef NO_CHANGEDISPLAYSETTINGS -extern DEVMODE SDL_desktop_mode; -extern DEVMODE SDL_fullscreen_mode; -#endif - -/* The system gamma ramp for GDI modes */ -extern WORD *gamma_saved; - -/* This is really from SDL_dx5audio.c */ -extern void DX5_SoundFocus(HWND window); - -/* DJM: This is really from SDL_sysevents.c, we need it in - GDL_CreateWindow as well */ -LRESULT CALLBACK WinMessage(HWND hwnd, UINT msg, WPARAM wParam, - LPARAM lParam); - -/* JFP: Implementation of ToUnicode() that works on 9x/ME/2K/XP */ -typedef int (WINAPI * ToUnicodeFN) (UINT, UINT, PBYTE, LPWSTR, int, UINT); - -extern ToUnicodeFN SDL_ToUnicode; - -#endif /* SDL_lowvideo_h */ -/* vi: set ts=4 sw=4 expandtab: */ diff -r 4371d679ee12 -r 7d642361ef0f src/video/wincommon/SDL_sysevents.c --- a/src/video/wincommon/SDL_sysevents.c Wed Jul 26 03:12:05 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,928 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ -#include "SDL_config.h" - -#define WIN32_LEAN_AND_MEAN -#include - -#include "SDL_events.h" -#include "SDL_video.h" -#include "SDL_syswm.h" -#include "../SDL_sysvideo.h" -#include "../../events/SDL_sysevents.h" -#include "../../events/SDL_events_c.h" -#include "SDL_lowvideo.h" -#include "SDL_syswm_c.h" -#include "SDL_main.h" -#include "SDL_loadso.h" - -#ifdef WMMSG_DEBUG -#include "wmmsg.h" -#endif - -#ifdef _WIN32_WCE -#include "../gapi/SDL_gapivideo.h" - -#define IsZoomed(HWND) 1 -#define NO_GETKEYBOARDSTATE -#if _WIN32_WCE < 420 -#define NO_CHANGEDISPLAYSETTINGS -#endif -#endif - -/* The window we use for everything... */ -#ifdef _WIN32_WCE -LPWSTR SDL_Appname = NULL; -#else -LPSTR SDL_Appname = NULL; -#endif -Uint32 SDL_Appstyle = 0; -HINSTANCE SDL_Instance = NULL; -HWND SDL_Window = NULL; -RECT SDL_bounds = { 0, 0, 0, 0 }; -int SDL_windowX = 0; -int SDL_windowY = 0; -int SDL_resizing = 0; -int mouse_relative = 0; -int posted = 0; -#ifndef NO_CHANGEDISPLAYSETTINGS -DEVMODE SDL_desktop_mode; -DEVMODE SDL_fullscreen_mode; -#endif -WORD *gamma_saved = NULL; - - -/* Functions called by the message processing function */ -LONG(*HandleMessage) (_THIS, HWND hwnd, UINT msg, WPARAM wParam, - LPARAM lParam) = NULL; -void (*WIN_RealizePalette) (_THIS); -void (*WIN_PaletteChanged) (_THIS, HWND window); -void (*WIN_WinPAINT) (_THIS, HDC hdc); -extern void DIB_SwapGamma(_THIS); - -#ifndef NO_GETKEYBOARDSTATE -/* Variables and support functions for SDL_ToUnicode() */ -static int codepage; -static int Is9xME(); -static int GetCodePage(); -static int WINAPI ToUnicode9xME(UINT vkey, UINT scancode, BYTE * keystate, - LPWSTR wchars, int wsize, UINT flags); - -ToUnicodeFN SDL_ToUnicode = ToUnicode9xME; -#endif /* !NO_GETKEYBOARDSTATE */ - - -#if defined(_WIN32_WCE) - -// dynamically load aygshell dll because we want SDL to work on HPC and be300 -HINSTANCE aygshell = NULL; -BOOL(WINAPI * SHFullScreen) (HWND hwndRequester, DWORD dwState) = 0; - -#define SHFS_SHOWTASKBAR 0x0001 -#define SHFS_HIDETASKBAR 0x0002 -#define SHFS_SHOWSIPBUTTON 0x0004 -#define SHFS_HIDESIPBUTTON 0x0008 -#define SHFS_SHOWSTARTICON 0x0010 -#define SHFS_HIDESTARTICON 0x0020 - -static void -LoadAygshell(void) -{ - if (!aygshell) - aygshell = SDL_LoadObject("aygshell.dll"); - if ((aygshell != 0) && (SHFullScreen == 0)) { - SHFullScreen = (int (WINAPI *) (struct HWND__ *, unsigned long)) - SDL_LoadFunction(aygshell, "SHFullScreen"); - } -} - -/* for gapi landscape mode */ -static void -GapiTransform(SDL_ScreenOrientation rotate, char hires, Sint16 * x, - Sint16 * y) -{ - Sint16 rotatedX; - Sint16 rotatedY; - - if (hires) { - *x = *x * 2; - *y = *y * 2; - } - - switch (rotate) { - case SDL_ORIENTATION_UP: - { -/* this code needs testing on a real device! - So it will be enabled later */ -/* -#ifdef _WIN32_WCE -#if _WIN32_WCE >= 420 - // test device orientation - // FIXME: do not check every mouse message - DEVMODE settings; - SDL_memset(&settings, 0, sizeof(DEVMODE)); - settings.dmSize = sizeof(DEVMODE); - settings.dmFields = DM_DISPLAYORIENTATION; - ChangeDisplaySettingsEx(NULL, &settings, NULL, CDS_TEST, NULL); - if( settings.dmOrientation == DMDO_90 ) - { - rotatedX = SDL_VideoSurface->h - *x; - rotatedY = *y; - *x = rotatedX; - *y = rotatedY; - } -#endif -#endif */ - } - break; - case SDL_ORIENTATION_RIGHT: - if (!SDL_VideoSurface) - break; - rotatedX = SDL_VideoSurface->w - *y; - rotatedY = *x; - *x = rotatedX; - *y = rotatedY; - break; - case SDL_ORIENTATION_LEFT: - if (!SDL_VideoSurface) - break; - rotatedX = *y; - rotatedY = SDL_VideoSurface->h - *x; - *x = rotatedX; - *y = rotatedY; - break; - } -} - -#endif - -/* JC 14 Mar 2006 - This is used all over the place, in the windib driver and in the dx5 driver - So we may as well stick it here instead of having multiple copies scattered - about -*/ -void -WIN_FlushMessageQueue() -{ - MSG msg; - while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { - if (msg.message == WM_QUIT) - break; - TranslateMessage(&msg); - DispatchMessage(&msg); - } -} - -static void -SDL_RestoreGameMode(void) -{ -#ifdef _WIN32_WCE - SDL_VideoDevice *this = current_video; - if (SDL_strcmp(this->name, "gapi") == 0) { - if (this->hidden->suspended) { - this->hidden->suspended = 0; - } - } -#else - ShowWindow(SDL_Window, SW_RESTORE); -#endif - -#ifndef NO_CHANGEDISPLAYSETTINGS -#ifndef _WIN32_WCE - ChangeDisplaySettings(&SDL_fullscreen_mode, CDS_FULLSCREEN); -#endif -#endif /* NO_CHANGEDISPLAYSETTINGS */ -} -static void -SDL_RestoreDesktopMode(void) -{ - -#ifdef _WIN32_WCE - SDL_VideoDevice *this = current_video; - if (SDL_strcmp(this->name, "gapi") == 0) { - if (!this->hidden->suspended) { - this->hidden->suspended = 1; - } - } -#else - /* WinCE does not have a taskbar, so minimizing is not convenient */ - ShowWindow(SDL_Window, SW_MINIMIZE); -#endif - -#ifndef NO_CHANGEDISPLAYSETTINGS -#ifndef _WIN32_WCE - ChangeDisplaySettings(NULL, 0); -#endif -#endif /* NO_CHANGEDISPLAYSETTINGS */ -} - -#ifdef WM_MOUSELEAVE -/* - Special code to handle mouse leave events - this sucks... - http://support.microsoft.com/support/kb/articles/q183/1/07.asp - - TrackMouseEvent() is only available on Win98 and WinNT. - _TrackMouseEvent() is available on Win95, but isn't yet in the mingw32 - development environment, and only works on systems that have had IE 3.0 - or newer installed on them (which is not the case with the base Win95). - Therefore, we implement our own version of _TrackMouseEvent() which - uses our own implementation if TrackMouseEvent() is not available. -*/ -static BOOL(WINAPI * _TrackMouseEvent) (TRACKMOUSEEVENT * ptme) = NULL; - -static VOID CALLBACK -TrackMouseTimerProc(HWND hWnd, UINT uMsg, UINT idEvent, DWORD dwTime) -{ - RECT rect; - POINT pt; - - GetClientRect(hWnd, &rect); - MapWindowPoints(hWnd, NULL, (LPPOINT) & rect, 2); - GetCursorPos(&pt); - if (!PtInRect(&rect, pt) || (WindowFromPoint(pt) != hWnd)) { - if (!KillTimer(hWnd, idEvent)) { - /* Error killing the timer! */ - } - PostMessage(hWnd, WM_MOUSELEAVE, 0, 0); - } -} -static BOOL WINAPI -WIN_TrackMouseEvent(TRACKMOUSEEVENT * ptme) -{ - if (ptme->dwFlags == TME_LEAVE) { - return SetTimer(ptme->hwndTrack, ptme->dwFlags, 100, - (TIMERPROC) TrackMouseTimerProc) != 0; - } - return FALSE; -} -#endif /* WM_MOUSELEAVE */ - -/* Function to retrieve the current keyboard modifiers */ -static void -WIN_GetKeyboardState(void) -{ -#ifndef NO_GETKEYBOARDSTATE - SDLMod state; - BYTE keyboard[256]; - Uint8 *kstate = SDL_GetKeyState(NULL); - - state = KMOD_NONE; - if (GetKeyboardState(keyboard)) { - if (keyboard[VK_LSHIFT] & 0x80) { - state |= KMOD_LSHIFT; - kstate[SDLK_LSHIFT] = SDL_PRESSED; - } - if (keyboard[VK_RSHIFT] & 0x80) { - state |= KMOD_RSHIFT; - kstate[SDLK_RSHIFT] = SDL_PRESSED; - } - if (keyboard[VK_LCONTROL] & 0x80) { - state |= KMOD_LCTRL; - kstate[SDLK_LCTRL] = SDL_PRESSED; - } - if (keyboard[VK_RCONTROL] & 0x80) { - state |= KMOD_RCTRL; - kstate[SDLK_RCTRL] = SDL_PRESSED; - } - if (keyboard[VK_LMENU] & 0x80) { - state |= KMOD_LALT; - kstate[SDLK_LALT] = SDL_PRESSED; - } - if (keyboard[VK_RMENU] & 0x80) { - state |= KMOD_RALT; - kstate[SDLK_RALT] = SDL_PRESSED; - } - if (keyboard[VK_NUMLOCK] & 0x01) { - state |= KMOD_NUM; - kstate[SDLK_NUMLOCK] = SDL_PRESSED; - } - if (keyboard[VK_CAPITAL] & 0x01) { - state |= KMOD_CAPS; - kstate[SDLK_CAPSLOCK] = SDL_PRESSED; - } - } - SDL_SetModState(state); -#endif /* !NO_GETKEYBOARDSTATE */ -} - -/* The main Win32 event handler -DJM: This is no longer static as (DX5/DIB)_CreateWindow needs it -*/ -LRESULT CALLBACK -WinMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - SDL_VideoDevice *this = current_video; - static int mouse_pressed = 0; - static int in_window = 0; -#ifdef WMMSG_DEBUG - fprintf(stderr, "Received windows message: "); - if (msg > MAX_WMMSG) { - fprintf(stderr, "%d", msg); - } else { - fprintf(stderr, "%s", wmtab[msg]); - } - fprintf(stderr, " -- 0x%X, 0x%X\n", wParam, lParam); -#endif - switch (msg) { - - case WM_ACTIVATE: - { - SDL_VideoDevice *this = current_video; - BOOL minimized; - Uint8 appstate; - - minimized = HIWORD(wParam); - if (!minimized && (LOWORD(wParam) != WA_INACTIVE)) { - /* Gain the following states */ - appstate = SDL_APPACTIVE | SDL_APPINPUTFOCUS; - if (this->input_grab != SDL_GRAB_OFF) { - WIN_GrabInput(this, SDL_GRAB_ON); - } - if (!(SDL_GetAppState() & SDL_APPINPUTFOCUS)) { - if (!DDRAW_FULLSCREEN()) { - DIB_SwapGamma(this); - } - if (WINDIB_FULLSCREEN()) { - SDL_RestoreGameMode(); - } - } -#if defined(_WIN32_WCE) - if (WINDIB_FULLSCREEN()) { - LoadAygshell(); - if (SHFullScreen) - SHFullScreen(SDL_Window, - SHFS_HIDESTARTICON | - SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON); - else - ShowWindow(FindWindow - (TEXT("HHTaskBar"), NULL), SW_HIDE); - - } -#endif - - posted = SDL_PrivateAppActive(1, appstate); - WIN_GetKeyboardState(); - } else { - /* Lose the following states */ - appstate = SDL_APPINPUTFOCUS; - if (minimized) { - appstate |= SDL_APPACTIVE; - } - if (this->input_grab != SDL_GRAB_OFF) { - WIN_GrabInput(this, SDL_GRAB_OFF); - } - if (SDL_GetAppState() & SDL_APPINPUTFOCUS) { - if (!DDRAW_FULLSCREEN()) { - DIB_SwapGamma(this); - } - if (WINDIB_FULLSCREEN()) { - SDL_RestoreDesktopMode(); -#if defined(_WIN32_WCE) - LoadAygshell(); - if (SHFullScreen) - SHFullScreen(SDL_Window, - SHFS_SHOWSTARTICON | - SHFS_SHOWTASKBAR | - SHFS_SHOWSIPBUTTON); - else - ShowWindow(FindWindow - (TEXT("HHTaskBar"), NULL), SW_SHOW); - -#endif - } - } - posted = SDL_PrivateAppActive(0, appstate); - } - return (0); - } - break; - - case WM_MOUSEMOVE: - { - - /* Mouse is handled by DirectInput when fullscreen */ - if (SDL_VideoSurface && !DINPUT_FULLSCREEN()) { - Sint16 x, y; - - /* mouse has entered the window */ - if (!in_window) { -#ifdef WM_MOUSELEAVE - TRACKMOUSEEVENT tme; - - tme.cbSize = sizeof(tme); - tme.dwFlags = TME_LEAVE; - tme.hwndTrack = SDL_Window; - _TrackMouseEvent(&tme); -#endif /* WM_MOUSELEAVE */ - in_window = TRUE; - - posted = SDL_PrivateAppActive(1, SDL_APPMOUSEFOCUS); - } - - /* mouse has moved within the window */ - x = LOWORD(lParam); - y = HIWORD(lParam); - if (mouse_relative) { - POINT center; - center.x = (SDL_VideoSurface->w / 2); - center.y = (SDL_VideoSurface->h / 2); - x -= (Sint16) center.x; - y -= (Sint16) center.y; - if (x || y) { - ClientToScreen(SDL_Window, ¢er); - SetCursorPos(center.x, center.y); - posted = SDL_PrivateMouseMotion(0, 1, x, y); - } - } else { -#ifdef _WIN32_WCE - if (SDL_VideoSurface) - GapiTransform(this->hidden->userOrientation, - this->hidden->hiresFix, &x, &y); -#endif - posted = SDL_PrivateMouseMotion(0, 0, x, y); - } - } - } - return (0); - -#ifdef WM_MOUSELEAVE - case WM_MOUSELEAVE: - { - - /* Mouse is handled by DirectInput when fullscreen */ - if (SDL_VideoSurface && !DINPUT_FULLSCREEN()) { - /* mouse has left the window */ - /* or */ - /* Elvis has left the building! */ - posted = SDL_PrivateAppActive(0, SDL_APPMOUSEFOCUS); - } - in_window = FALSE; - } - return (0); -#endif /* WM_MOUSELEAVE */ - - case WM_LBUTTONDOWN: - case WM_LBUTTONUP: - case WM_MBUTTONDOWN: - case WM_MBUTTONUP: - case WM_RBUTTONDOWN: - case WM_RBUTTONUP: - { - /* Mouse is handled by DirectInput when fullscreen */ - if (SDL_VideoSurface && !DINPUT_FULLSCREEN()) { - Sint16 x, y; - Uint8 button, state; - - /* DJM: - We want the SDL window to take focus so that - it acts like a normal windows "component" - (e.g. gains keyboard focus on a mouse click). - */ - SetFocus(SDL_Window); - - /* Figure out which button to use */ - switch (msg) { - case WM_LBUTTONDOWN: - button = SDL_BUTTON_LEFT; - state = SDL_PRESSED; - break; - case WM_LBUTTONUP: - button = SDL_BUTTON_LEFT; - state = SDL_RELEASED; - break; - case WM_MBUTTONDOWN: - button = SDL_BUTTON_MIDDLE; - state = SDL_PRESSED; - break; - case WM_MBUTTONUP: - button = SDL_BUTTON_MIDDLE; - state = SDL_RELEASED; - break; - case WM_RBUTTONDOWN: - button = SDL_BUTTON_RIGHT; - state = SDL_PRESSED; - break; - case WM_RBUTTONUP: - button = SDL_BUTTON_RIGHT; - state = SDL_RELEASED; - break; - default: - /* Eh? Unknown button? */ - return (0); - } - if (state == SDL_PRESSED) { - /* Grab mouse so we get up events */ - if (++mouse_pressed > 0) { - SetCapture(hwnd); - } - } else { - /* Release mouse after all up events */ - if (--mouse_pressed <= 0) { - ReleaseCapture(); - mouse_pressed = 0; - } - } - if (mouse_relative) { - /* RJR: March 28, 2000 - report internal mouse position if in relative mode */ - x = 0; - y = 0; - } else { - x = (Sint16) LOWORD(lParam); - y = (Sint16) HIWORD(lParam); -#ifdef _WIN32_WCE - if (SDL_VideoSurface) - GapiTransform(this->hidden->userOrientation, - this->hidden->hiresFix, &x, &y); -#endif - } - posted = SDL_PrivateMouseButton(state, button, x, y); - } - } - return (0); - - -#if (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400) - case WM_MOUSEWHEEL: - if (SDL_VideoSurface && !DINPUT_FULLSCREEN()) { - int move = (short) HIWORD(wParam); - if (move) { - Uint8 button; - if (move > 0) - button = SDL_BUTTON_WHEELUP; - else - button = SDL_BUTTON_WHEELDOWN; - posted = SDL_PrivateMouseButton(SDL_PRESSED, button, 0, 0); - posted |= SDL_PrivateMouseButton(SDL_RELEASED, button, 0, 0); - } - } - return (0); -#endif - -#ifdef WM_GETMINMAXINFO - /* This message is sent as a way for us to "check" the values - * of a position change. If we don't like it, we can adjust - * the values before they are changed. - */ - case WM_GETMINMAXINFO: - { - MINMAXINFO *info; - RECT size; - int x, y; - int style; - int width; - int height; - - /* We don't want to clobber an internal resize */ - if (SDL_resizing) - return (0); - - /* We allow resizing with the SDL_RESIZABLE flag */ - if (SDL_PublicSurface && - (SDL_PublicSurface->flags & SDL_RESIZABLE)) { - return (0); - } - - /* Get the current position of our window */ - GetWindowRect(SDL_Window, &size); - x = size.left; - y = size.top; - - /* Calculate current width and height of our window */ - size.top = 0; - size.left = 0; - if (SDL_PublicSurface != NULL) { - size.bottom = SDL_PublicSurface->h; - size.right = SDL_PublicSurface->w; - } else { - size.bottom = 0; - size.right = 0; - } - - /* DJM - according to the docs for GetMenu(), the - return value is undefined if hwnd is a child window. - Aparently it's too difficult for MS to check - inside their function, so I have to do it here. - */ - style = GetWindowLong(hwnd, GWL_STYLE); - AdjustWindowRect(&size, - style, - style & WS_CHILDWINDOW ? FALSE - : GetMenu(hwnd) != NULL); - - width = size.right - size.left; - height = size.bottom - size.top; - - /* Fix our size to the current size */ - info = (MINMAXINFO *) lParam; - info->ptMaxSize.x = width; - info->ptMaxSize.y = height; - info->ptMaxPosition.x = x; - info->ptMaxPosition.y = y; - info->ptMinTrackSize.x = width; - info->ptMinTrackSize.y = height; - info->ptMaxTrackSize.x = width; - info->ptMaxTrackSize.y = height; - } - return (0); -#endif /* WM_GETMINMAXINFO */ - - case WM_WINDOWPOSCHANGED: - { - SDL_VideoDevice *this = current_video; - int w, h; - - GetClientRect(SDL_Window, &SDL_bounds); - ClientToScreen(SDL_Window, (LPPOINT) & SDL_bounds); - ClientToScreen(SDL_Window, (LPPOINT) & SDL_bounds + 1); - if (!SDL_resizing && !IsZoomed(SDL_Window) && - SDL_PublicSurface && - !(SDL_PublicSurface->flags & SDL_FULLSCREEN)) { - SDL_windowX = SDL_bounds.left; - SDL_windowY = SDL_bounds.top; - } - w = SDL_bounds.right - SDL_bounds.left; - h = SDL_bounds.bottom - SDL_bounds.top; - if (this->input_grab != SDL_GRAB_OFF) { - ClipCursor(&SDL_bounds); - } - if (SDL_PublicSurface && - (SDL_PublicSurface->flags & SDL_RESIZABLE)) { - SDL_PrivateResize(w, h); - } - } - break; - - /* We need to set the cursor */ - case WM_SETCURSOR: - { - Uint16 hittest; - - hittest = LOWORD(lParam); - if (hittest == HTCLIENT) { - SetCursor(SDL_hcursor); - return (TRUE); - } - } - break; - - /* We are about to get palette focus! */ - case WM_QUERYNEWPALETTE: - { - WIN_RealizePalette(current_video); - return (TRUE); - } - break; - - /* Another application changed the palette */ - case WM_PALETTECHANGED: - { - WIN_PaletteChanged(current_video, (HWND) wParam); - } - break; - - /* We were occluded, refresh our display */ - case WM_PAINT: - { - HDC hdc; - PAINTSTRUCT ps; - - hdc = BeginPaint(SDL_Window, &ps); - if (current_video->screen && - !(current_video->screen->flags & SDL_INTERNALOPENGL)) { - WIN_WinPAINT(current_video, hdc); - } - EndPaint(SDL_Window, &ps); - } - return (0); - - /* DJM: Send an expose event in this case */ - case WM_ERASEBKGND: - { - posted = SDL_PrivateExpose(); - } - return (0); - - case WM_CLOSE: - { - if ((posted = SDL_PrivateQuit())) - PostQuitMessage(0); - } - return (0); - - case WM_DESTROY: - { - PostQuitMessage(0); - } - return (0); - -#ifndef NO_GETKEYBOARDSTATE - case WM_INPUTLANGCHANGE: - { - codepage = GetCodePage(); - } - return (TRUE); -#endif - - default: - { - /* Special handling by the video driver */ - if (HandleMessage) { - return (HandleMessage(current_video, - hwnd, msg, wParam, lParam)); - } - } - break; - } - return (DefWindowProc(hwnd, msg, wParam, lParam)); -} - -/* Allow the application handle to be stored and retrieved later */ -static void *SDL_handle = NULL; - -void -SDL_SetModuleHandle(void *handle) -{ - SDL_handle = handle; -} - -void * -SDL_GetModuleHandle(void) -{ - void *handle; - - if (SDL_handle) { - handle = SDL_handle; - } else { - handle = GetModuleHandle(NULL); - } - return (handle); -} - -/* This allows the SDL_WINDOWID hack */ -BOOL SDL_windowid = FALSE; - -static int app_registered = 0; - -/* Register the class for this application -- exported for winmain.c */ -int -SDL_RegisterApp(char *name, Uint32 style, void *hInst) -{ - WNDCLASS class; -#ifdef WM_MOUSELEAVE - HMODULE handle; -#endif - - /* Only do this once... */ - if (app_registered) { - ++app_registered; - return (0); - } -#ifndef CS_BYTEALIGNCLIENT -#define CS_BYTEALIGNCLIENT 0 -#endif - if (!name && !SDL_Appname) { - name = "SDL_app"; - SDL_Appstyle = CS_BYTEALIGNCLIENT; - SDL_Instance = hInst ? hInst : SDL_GetModuleHandle(); - } - - if (name) { -#ifdef _WIN32_WCE - /* WinCE uses the UNICODE version */ - SDL_Appname = SDL_iconv_utf8_ucs2(name); -#else - SDL_Appname = SDL_iconv_utf8_latin1(name); -#endif /* _WIN32_WCE */ - SDL_Appstyle = style; - SDL_Instance = hInst ? hInst : SDL_GetModuleHandle(); - } - - /* Register the application class */ - class.hCursor = NULL; - class.hIcon = LoadImage(SDL_Instance, SDL_Appname, - IMAGE_ICON, 0, 0, LR_DEFAULTCOLOR); - class.lpszMenuName = NULL; - class.lpszClassName = SDL_Appname; - class.hbrBackground = NULL; - class.hInstance = SDL_Instance; - class.style = SDL_Appstyle; -#if SDL_VIDEO_OPENGL - class.style |= CS_OWNDC; -#endif - class.lpfnWndProc = WinMessage; - class.cbWndExtra = 0; - class.cbClsExtra = 0; - if (!RegisterClass(&class)) { - SDL_SetError("Couldn't register application class"); - return (-1); - } -#ifdef WM_MOUSELEAVE - /* Get the version of TrackMouseEvent() we use */ - _TrackMouseEvent = NULL; - handle = GetModuleHandle("USER32.DLL"); - if (handle) { - _TrackMouseEvent = - (BOOL(WINAPI *) (TRACKMOUSEEVENT *)) GetProcAddress(handle, - "TrackMouseEvent"); - } - if (_TrackMouseEvent == NULL) { - _TrackMouseEvent = WIN_TrackMouseEvent; - } -#endif /* WM_MOUSELEAVE */ - -#ifndef NO_GETKEYBOARDSTATE - /* Initialise variables for SDL_ToUnicode() */ - codepage = GetCodePage(); - SDL_ToUnicode = Is9xME()? ToUnicode9xME : ToUnicode; -#endif - - app_registered = 1; - return (0); -} - -/* Unregisters the windowclass registered in SDL_RegisterApp above. */ -void -SDL_UnregisterApp() -{ - WNDCLASS class; - - /* SDL_RegisterApp might not have been called before */ - if (!app_registered) { - return; - } - --app_registered; - if (app_registered == 0) { - /* Check for any registered window classes. */ - if (GetClassInfo(SDL_Instance, SDL_Appname, &class)) { - UnregisterClass(SDL_Appname, SDL_Instance); - } - SDL_free(SDL_Appname); - SDL_Appname = NULL; - } -} - -#ifndef NO_GETKEYBOARDSTATE -/* JFP: Implementation of ToUnicode() that works on 9x/ME/2K/XP */ - -static int -Is9xME() -{ - OSVERSIONINFO info; - - SDL_memset(&info, 0, sizeof(info)); - info.dwOSVersionInfoSize = sizeof(info); - if (!GetVersionEx(&info)) { - return 0; - } - return (info.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS); -} - -static int -GetCodePage() -{ - char buff[8]; - int lcid = MAKELCID(LOWORD(GetKeyboardLayout(0)), SORT_DEFAULT); - int cp = GetACP(); - - if (GetLocaleInfo(lcid, LOCALE_IDEFAULTANSICODEPAGE, buff, sizeof(buff))) { - cp = SDL_atoi(buff); - } - return cp; -} - -static int WINAPI -ToUnicode9xME(UINT vkey, UINT scancode, PBYTE keystate, LPWSTR wchars, - int wsize, UINT flags) -{ - BYTE chars[2]; - - if (ToAsciiEx - (vkey, scancode, keystate, (WORD *) chars, 0, - GetKeyboardLayout(0)) == 1) { - return MultiByteToWideChar(codepage, 0, chars, 1, wchars, wsize); - } - return 0; -} - -#endif /* !NO_GETKEYBOARDSTATE */ -/* vi: set ts=4 sw=4 expandtab: */ diff -r 4371d679ee12 -r 7d642361ef0f src/video/wincommon/SDL_sysmouse.c --- a/src/video/wincommon/SDL_sysmouse.c Wed Jul 26 03:12:05 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,274 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ -#include "SDL_config.h" - -#define WIN32_LEAN_AND_MEAN -#include - -#include "SDL_mouse.h" -#include "../../events/SDL_events_c.h" -#include "../SDL_cursor_c.h" -#include "SDL_sysmouse_c.h" -#include "SDL_lowvideo.h" - -#ifdef _WIN32_WCE -#define USE_STATIC_CURSOR -#endif - -HCURSOR SDL_hcursor = NULL; /* Exported for SDL_eventloop.c */ - -/* The implementation dependent data for the window manager cursor */ -/* For some reason when creating a windows cursor, the ands and xors memory - is not copied, so we need to keep track of it and free it when we are done - with the cursor. If we free the memory prematurely, the app crashes. :-} -*/ -struct WMcursor -{ - HCURSOR curs; -#ifndef USE_STATIC_CURSOR - Uint8 *ands; - Uint8 *xors; -#endif -}; - -/* Convert bits to padded bytes */ -#define PAD_BITS(bits) ((bits+7)/8) - -#ifdef CURSOR_DEBUG -static void -PrintBITMAP(FILE * out, char *bits, int w, int h) -{ - int i; - unsigned char ch; - - while (h-- > 0) { - for (i = 0; i < w; ++i) { - if ((i % 8) == 0) - ch = *bits++; - if (ch & 0x80) - fprintf(out, "X"); - else - fprintf(out, " "); - ch <<= 1; - } - fprintf(out, "\n"); - } -} -#endif - -#ifndef USE_STATIC_CURSOR -/* Local functions to convert the SDL cursor mask into Windows format */ -static void -memnot(Uint8 * dst, Uint8 * src, int len) -{ - while (len-- > 0) - *dst++ = ~*src++; -} -static void -memxor(Uint8 * dst, Uint8 * src1, Uint8 * src2, int len) -{ - while (len-- > 0) - *dst++ = (*src1++) ^ (*src2++); -} -#endif /* !USE_STATIC_CURSOR */ - -void -WIN_FreeWMCursor(_THIS, WMcursor * cursor) -{ -#ifndef USE_STATIC_CURSOR - if (cursor->curs == GetCursor()) - SetCursor(NULL); - if (cursor->curs != NULL) - DestroyCursor(cursor->curs); - if (cursor->ands != NULL) - SDL_free(cursor->ands); - if (cursor->xors != NULL) - SDL_free(cursor->xors); -#endif /* !USE_STATIC_CURSOR */ - SDL_free(cursor); -} - -WMcursor * -WIN_CreateWMCursor(_THIS, - Uint8 * data, Uint8 * mask, int w, int h, int hot_x, - int hot_y) -{ -#ifdef USE_STATIC_CURSOR - WMcursor *cursor; - - /* Allocate the cursor */ - cursor = (WMcursor *) SDL_malloc(sizeof(*cursor)); - if (cursor) { - cursor->curs = LoadCursor(NULL, IDC_ARROW); - } - return (cursor); -#else - WMcursor *cursor; - int allowed_x; - int allowed_y; - int run, pad, i; - Uint8 *aptr, *xptr; - - /* Check to make sure the cursor size is okay */ - allowed_x = GetSystemMetrics(SM_CXCURSOR); - allowed_y = GetSystemMetrics(SM_CYCURSOR); - if ((w > allowed_x) || (h > allowed_y)) { - SDL_SetError("Only cursors of dimension (%dx%d) are allowed", - allowed_x, allowed_y); - return (NULL); - } - - /* Allocate the cursor */ - cursor = (WMcursor *) SDL_malloc(sizeof(*cursor)); - if (cursor == NULL) { - SDL_SetError("Out of memory"); - return (NULL); - } - cursor->curs = NULL; - cursor->ands = NULL; - cursor->xors = NULL; - - /* Pad out to the normal cursor size */ - run = PAD_BITS(w); - pad = PAD_BITS(allowed_x) - run; - aptr = cursor->ands = (Uint8 *) SDL_malloc((run + pad) * allowed_y); - xptr = cursor->xors = (Uint8 *) SDL_malloc((run + pad) * allowed_y); - if ((aptr == NULL) || (xptr == NULL)) { - WIN_FreeWMCursor(NULL, cursor); - SDL_OutOfMemory(); - return (NULL); - } - for (i = 0; i < h; ++i) { - memxor(xptr, data, mask, run); - xptr += run; - data += run; - memnot(aptr, mask, run); - mask += run; - aptr += run; - SDL_memset(xptr, 0, pad); - xptr += pad; - SDL_memset(aptr, ~0, pad); - aptr += pad; - } - pad += run; - for (; i < allowed_y; ++i) { - SDL_memset(xptr, 0, pad); - xptr += pad; - SDL_memset(aptr, ~0, pad); - aptr += pad; - } - - /* Create the cursor */ - cursor->curs = CreateCursor((HINSTANCE) - GetWindowLongPtr(SDL_Window, - GWLP_HINSTANCE), hot_x, - hot_y, allowed_x, allowed_y, cursor->ands, - cursor->xors); - if (cursor->curs == NULL) { - WIN_FreeWMCursor(NULL, cursor); - SDL_SetError("Windows couldn't create the requested cursor"); - return (NULL); - } - return (cursor); -#endif /* USE_STATIC_CURSOR */ -} - -int -WIN_ShowWMCursor(_THIS, WMcursor * cursor) -{ - POINT mouse_pos; - - /* The fullscreen cursor must be done in software with DirectInput */ - if (!this->screen || DDRAW_FULLSCREEN()) { - return (0); - } - - /* Set the window cursor to our cursor, if applicable */ - if (cursor != NULL) { - SDL_hcursor = cursor->curs; - } else { - SDL_hcursor = NULL; - } - GetCursorPos(&mouse_pos); - if (PtInRect(&SDL_bounds, mouse_pos)) { - SetCursor(SDL_hcursor); - } - return (1); -} - -void -WIN_WarpWMCursor(_THIS, Uint16 x, Uint16 y) -{ - if (DDRAW_FULLSCREEN()) { - SDL_PrivateMouseMotion(0, 0, x, y); - } else if (mouse_relative) { - /* RJR: March 28, 2000 - leave physical cursor at center of screen if - mouse hidden and grabbed */ - SDL_PrivateMouseMotion(0, 0, x, y); - } else { - POINT pt; - pt.x = x; - pt.y = y; - ClientToScreen(SDL_Window, &pt); - SetCursorPos(pt.x, pt.y); - } -} - -/* Update the current mouse state and position */ -void -WIN_UpdateMouse(_THIS) -{ - RECT rect; - POINT pt; - - if (!DDRAW_FULLSCREEN()) { - GetClientRect(SDL_Window, &rect); - GetCursorPos(&pt); - MapWindowPoints(NULL, SDL_Window, &pt, 1); - if (PtInRect(&rect, pt) && (WindowFromPoint(pt) == SDL_Window)) { - SDL_PrivateAppActive(1, SDL_APPMOUSEFOCUS); - SDL_PrivateMouseMotion(0, 0, (Sint16) pt.x, (Sint16) pt.y); - } else { - SDL_PrivateAppActive(0, SDL_APPMOUSEFOCUS); - } - } -} - -/* Check to see if we need to enter or leave mouse relative mode */ -void -WIN_CheckMouseMode(_THIS) -{ -#ifndef _WIN32_WCE - /* If the mouse is hidden and input is grabbed, we use relative mode */ - if (!(SDL_cursorstate & CURSOR_VISIBLE) && - (this->input_grab != SDL_GRAB_OFF)) { - mouse_relative = 1; - } else { - mouse_relative = 0; - } -#else - mouse_relative = 0; -#endif -} - -/* vi: set ts=4 sw=4 expandtab: */ diff -r 4371d679ee12 -r 7d642361ef0f src/video/wincommon/SDL_sysmouse_c.h --- a/src/video/wincommon/SDL_sysmouse_c.h Wed Jul 26 03:12:05 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ -#include "SDL_config.h" - -#include "SDL_lowvideo.h" - -/* Functions to be exported */ -extern void WIN_FreeWMCursor(_THIS, WMcursor * cursor); -extern WMcursor *WIN_CreateWMCursor(_THIS, - Uint8 * data, Uint8 * mask, int w, int h, - int hot_x, int hot_y); -extern int WIN_ShowWMCursor(_THIS, WMcursor * cursor); -extern void WIN_WarpWMCursor(_THIS, Uint16 x, Uint16 y); -extern void WIN_UpdateMouse(_THIS); -extern void WIN_CheckMouseMode(_THIS); -/* vi: set ts=4 sw=4 expandtab: */ diff -r 4371d679ee12 -r 7d642361ef0f src/video/wincommon/SDL_syswm.c --- a/src/video/wincommon/SDL_syswm.c Wed Jul 26 03:12:05 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,334 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ -#include "SDL_config.h" - -#define WIN32_LEAN_AND_MEAN -#include - -#include "SDL_version.h" -#include "SDL_video.h" -#include "SDL_loadso.h" -#include "SDL_syswm.h" -#include "../SDL_pixels_c.h" -#include "../SDL_cursor_c.h" -#include "SDL_syswm_c.h" -#include "SDL_wingl_c.h" - - -#ifdef _WIN32_WCE -#define DISABLE_ICON_SUPPORT -#endif - -/* The screen icon -- needs to be freed on SDL_VideoQuit() */ -HICON screen_icn = NULL; - -#ifdef _WIN32_WCE - -BOOL(WINAPI * CoreCatchInput) (int flag) = NULL; -int input_catched = 0; -HINSTANCE coredll = NULL; - -// the same API call that gx.dll does to catch the input -void -LoadInputCatchFunc() -{ - coredll = SDL_LoadObject("coredll.dll"); - if (coredll) { - CoreCatchInput = - (int (WINAPI *) (int)) GetProcAddress(coredll, - (const unsigned short *) - 1453); - } -} - -#endif - - -/* Win32 icon mask semantics are different from those of SDL: - SDL applies the mask to the icon and copies result to desktop. - Win32 applies the mask to the desktop and XORs the icon on. - This means that the SDL mask needs to be applied to the icon and - then inverted and passed to Win32. -*/ -void -WIN_SetWMIcon(_THIS, SDL_Surface * icon, Uint8 * mask) -{ -#ifdef DISABLE_ICON_SUPPORT - return; -#else - SDL_Palette *pal_256; - SDL_Surface *icon_256; - Uint8 *pdata, *pwin32; - Uint8 *mdata, *mwin32, m = 0; - int icon_len; - int icon_plen; - int icon_mlen; - int icon_pitch; - int mask_pitch; - SDL_Rect bounds; - int i, skip; - int row, col; - struct /* quasi-BMP format */ Win32Icon - { - Uint32 biSize; - Sint32 biWidth; - Sint32 biHeight; - Uint16 biPlanes; - Uint16 biBitCount; - Uint32 biCompression; - Uint32 biSizeImage; - Sint32 biXPelsPerMeter; - Sint32 biYPelsPerMeter; - Uint32 biClrUsed; - Uint32 biClrImportant; - struct /* RGBQUAD -- note it's BGR ordered */ - { - Uint8 rgbBlue; - Uint8 rgbGreen; - Uint8 rgbRed; - Uint8 rgbReserved; - } biColors[256]; - /* Pixels: - Uint8 pixels[] - */ - /* Mask: - Uint8 mask[] - */ - } *icon_win32; - - /* Allocate the win32 bmp icon and set everything to zero */ - icon_pitch = ((icon->w + 3) & ~3); - mask_pitch = ((icon->w + 7) / 8); - icon_plen = icon->h * icon_pitch; - icon_mlen = icon->h * mask_pitch; - icon_len = sizeof(*icon_win32) + icon_plen + icon_mlen; - icon_win32 = (struct Win32Icon *) SDL_stack_alloc(Uint8, icon_len); - if (icon_win32 == NULL) { - return; - } - SDL_memset(icon_win32, 0, icon_len); - - /* Set the basic BMP parameters */ - icon_win32->biSize = sizeof(*icon_win32) - sizeof(icon_win32->biColors); - icon_win32->biWidth = icon->w; - icon_win32->biHeight = icon->h * 2; - icon_win32->biPlanes = 1; - icon_win32->biBitCount = 8; - icon_win32->biSizeImage = icon_plen + icon_mlen; - - /* Allocate a standard 256 color icon surface */ - icon_256 = SDL_CreateRGBSurface(SDL_SWSURFACE, icon->w, icon->h, - icon_win32->biBitCount, 0, 0, 0, 0); - if (icon_256 == NULL) { - SDL_stack_free(icon_win32); - return; - } - pal_256 = icon_256->format->palette; - if (icon->format->palette && - (icon->format->BitsPerPixel == icon_256->format->BitsPerPixel)) { - Uint8 black; - SDL_memcpy(pal_256->colors, icon->format->palette->colors, - pal_256->ncolors * sizeof(SDL_Color)); - /* Make sure that 0 is black! */ - black = SDL_FindColor(pal_256, 0x00, 0x00, 0x00); - pal_256->colors[black] = pal_256->colors[0]; - pal_256->colors[0].r = 0x00; - pal_256->colors[0].g = 0x00; - pal_256->colors[0].b = 0x00; - } else { - SDL_DitherColors(pal_256->colors, icon_256->format->BitsPerPixel); - } - - /* Now copy color data to the icon BMP */ - for (i = 0; i < (1 << icon_win32->biBitCount); ++i) { - icon_win32->biColors[i].rgbRed = pal_256->colors[i].r; - icon_win32->biColors[i].rgbGreen = pal_256->colors[i].g; - icon_win32->biColors[i].rgbBlue = pal_256->colors[i].b; - } - - /* Convert icon to a standard surface format. This may not always - be necessary, as Windows supports a variety of BMP formats, but - it greatly simplifies our code. - */ - bounds.x = 0; - bounds.y = 0; - bounds.w = icon->w; - bounds.h = icon->h; - if (SDL_LowerBlit(icon, &bounds, icon_256, &bounds) < 0) { - SDL_stack_free(icon_win32); - SDL_FreeSurface(icon_256); - return; - } - - /* Copy pixels upside-down to icon BMP, masked with the icon mask */ - if (SDL_MUSTLOCK(icon_256) || (icon_256->pitch != icon_pitch)) { - SDL_stack_free(icon_win32); - SDL_FreeSurface(icon_256); - SDL_SetError("Warning: Unexpected icon_256 characteristics"); - return; - } - pdata = (Uint8 *) icon_256->pixels; - mdata = mask; - pwin32 = - (Uint8 *) icon_win32 + sizeof(*icon_win32) + icon_plen - icon_pitch; - skip = icon_pitch - icon->w; - for (row = 0; row < icon->h; ++row) { - for (col = 0; col < icon->w; ++col) { - if ((col % 8) == 0) { - m = *mdata++; - } - if ((m & 0x80) != 0x00) { - *pwin32 = *pdata; - } - m <<= 1; - ++pdata; - ++pwin32; - } - pdata += skip; - pwin32 += skip; - pwin32 -= 2 * icon_pitch; - } - SDL_FreeSurface(icon_256); - - /* Copy mask inverted and upside-down to icon BMP */ - mdata = mask; - mwin32 = (Uint8 *) icon_win32 - + sizeof(*icon_win32) + icon_plen + icon_mlen - mask_pitch; - for (row = 0; row < icon->h; ++row) { - for (col = 0; col < mask_pitch; ++col) { - *mwin32++ = ~*mdata++; - } - mwin32 -= 2 * mask_pitch; - } - - /* Finally, create the icon handle and set the window icon */ - screen_icn = CreateIconFromResourceEx((Uint8 *) icon_win32, icon_len, - TRUE, 0x00030000, icon->w, icon->h, - LR_DEFAULTCOLOR); - if (screen_icn == NULL) { - SDL_SetError("Couldn't create Win32 icon handle"); - } else { - SetClassLongPtr(SDL_Window, GCLP_HICON, (LONG_PTR) screen_icn); - } - SDL_stack_free(icon_win32); -#endif /* DISABLE_ICON_SUPPORT */ -} - -void -WIN_SetWMCaption(_THIS, const char *title, const char *icon) -{ -#ifdef _WIN32_WCE - /* WinCE uses the UNICODE version */ - LPWSTR lpszW = SDL_iconv_utf8_ucs2((char *) title); - SetWindowText(SDL_Window, lpszW); - SDL_free(lpszW); -#else - char *lpsz = SDL_iconv_utf8_latin1((char *) title); - SetWindowText(SDL_Window, lpsz); - SDL_free(lpsz); -#endif -} - -int -WIN_IconifyWindow(_THIS) -{ - ShowWindow(SDL_Window, SW_MINIMIZE); - return (1); -} - -SDL_GrabMode -WIN_GrabInput(_THIS, SDL_GrabMode mode) -{ - if (mode == SDL_GRAB_OFF) { - ClipCursor(NULL); - if (!(SDL_cursorstate & CURSOR_VISIBLE)) { - /* RJR: March 28, 2000 - must be leaving relative mode, move mouse from - center of window to where it belongs ... */ - POINT pt; - int x, y; - SDL_GetMouseState(&x, &y); - pt.x = x; - pt.y = y; - ClientToScreen(SDL_Window, &pt); - SetCursorPos(pt.x, pt.y); - } -#ifdef _WIN32_WCE - if (input_catched) { - if (!CoreCatchInput) - LoadInputCatchFunc(); - - if (CoreCatchInput) - CoreCatchInput(0); - } -#endif - } else { - ClipCursor(&SDL_bounds); - if (!(SDL_cursorstate & CURSOR_VISIBLE)) { - /* RJR: March 28, 2000 - must be entering relative mode, get ready by - moving mouse to center of window ... */ - POINT pt; - pt.x = (SDL_VideoSurface->w / 2); - pt.y = (SDL_VideoSurface->h / 2); - ClientToScreen(SDL_Window, &pt); - SetCursorPos(pt.x, pt.y); - } -#ifdef _WIN32_WCE - if (!input_catched) { - if (!CoreCatchInput) - LoadInputCatchFunc(); - - if (CoreCatchInput) - CoreCatchInput(1); - } -#endif - } - return (mode); -} - -/* If 'info' is the right version, this function fills it and returns 1. - Otherwise, in case of a version mismatch, it returns -1. -*/ -int -WIN_GetWMInfo(_THIS, SDL_SysWMinfo * info) -{ - if (info->version.major <= SDL_MAJOR_VERSION) { - info->window = SDL_Window; - if (SDL_VERSIONNUM(info->version.major, - info->version.minor, - info->version.patch) >= SDL_VERSIONNUM(1, 2, 5)) { -#if SDL_VIDEO_OPENGL - info->hglrc = GL_hrc; -#else - info->hglrc = NULL; -#endif - } - return (1); - } else { - SDL_SetError("Application not compiled with SDL %d.%d\n", - SDL_MAJOR_VERSION, SDL_MINOR_VERSION); - return (-1); - } -} - -/* vi: set ts=4 sw=4 expandtab: */ diff -r 4371d679ee12 -r 7d642361ef0f src/video/wincommon/SDL_syswm_c.h --- a/src/video/wincommon/SDL_syswm_c.h Wed Jul 26 03:12:05 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ -#include "SDL_config.h" - -#include "SDL_lowvideo.h" - -/* Data that needs to be freed at SDL_SYS_VideoQuit() */ -extern HICON screen_icn; - -/* Functions to be exported */ -extern void WIN_SetWMIcon(_THIS, SDL_Surface * icon, Uint8 * mask); -extern void WIN_SetWMCaption(_THIS, const char *title, const char *icon); -extern int WIN_IconifyWindow(_THIS); -extern SDL_GrabMode WIN_GrabInput(_THIS, SDL_GrabMode mode); -extern int WIN_GetWMInfo(_THIS, SDL_SysWMinfo * info); -/* vi: set ts=4 sw=4 expandtab: */ diff -r 4371d679ee12 -r 7d642361ef0f src/video/wincommon/SDL_wingl.c --- a/src/video/wincommon/SDL_wingl.c Wed Jul 26 03:12:05 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,671 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ -#include "SDL_config.h" - -/* WGL implementation of SDL OpenGL support */ - -#if SDL_VIDEO_OPENGL -#include "SDL_opengl.h" -#endif -#include "SDL_lowvideo.h" -#include "SDL_wingl_c.h" - -#if SDL_VIDEO_OPENGL -#define DEFAULT_GL_DRIVER_PATH "OPENGL32.DLL" -#endif - -/* If setting the HDC fails, we may need to recreate the window (MSDN) */ -static int -WIN_GL_ResetWindow(_THIS) -{ - int status = 0; - -#ifndef _WIN32_WCE /* FIXME WinCE needs the UNICODE version of CreateWindow() */ - /* This doesn't work with DirectX code (see CVS comments) */ - /* If we were passed a window, then we can't create a new one */ - if (!SDL_windowid && SDL_strcmp(this->name, "windib") == 0) { - /* Save the existing window attributes */ - LONG style; - RECT rect = { 0, 0, 0, 0 }; - style = GetWindowLong(SDL_Window, GWL_STYLE); - GetWindowRect(SDL_Window, &rect); - DestroyWindow(SDL_Window); - WIN_FlushMessageQueue(); - - SDL_Window = CreateWindow(SDL_Appname, SDL_Appname, - style, - rect.left, rect.top, - (rect.right - rect.left) + 1, - (rect.top - rect.bottom) + 1, - NULL, NULL, SDL_Instance, NULL); - WIN_FlushMessageQueue(); - - if (SDL_Window) { - this->SetCaption(this, this->wm_title, this->wm_icon); - } else { - SDL_SetError("Couldn't create window"); - status = -1; - } - } else -#endif /* !_WIN32_WCE */ - { - SDL_SetError("Unable to reset window for OpenGL context"); - status = -1; - } - return (status); -} - -#if SDL_VIDEO_OPENGL - -static int -ExtensionSupported(const char *extension, const char *extensions) -{ - const char *start; - const char *where, *terminator; - - /* Extension names should not have spaces. */ - where = SDL_strchr(extension, ' '); - if (where || *extension == '\0') - return 0; - - if (!extensions) - return 0; - - /* It takes a bit of care to be fool-proof about parsing the - * OpenGL extensions string. Don't be fooled by sub-strings, - * etc. */ - - start = extensions; - - for (;;) { - where = SDL_strstr(start, extension); - if (!where) - break; - - terminator = where + SDL_strlen(extension); - if (where == start || *(where - 1) == ' ') - if (*terminator == ' ' || *terminator == '\0') - return 1; - - start = terminator; - } - - return 0; -} - -static void -Init_WGL_ARB_extensions(_THIS) -{ - HWND hwnd; - HDC hdc; - HGLRC hglrc; - int pformat; - const char *(WINAPI * wglGetExtensionsStringARB) (HDC) = 0; - const char *extensions; - - hwnd = CreateWindow(SDL_Appname, SDL_Appname, WS_POPUP | WS_DISABLED, - 0, 0, 10, 10, NULL, NULL, SDL_Instance, NULL); - WIN_FlushMessageQueue(); - - hdc = GetDC(hwnd); - - pformat = ChoosePixelFormat(hdc, &GL_pfd); - SetPixelFormat(hdc, pformat, &GL_pfd); - - hglrc = this->gl_data->wglCreateContext(hdc); - if (hglrc) { - this->gl_data->wglMakeCurrent(hdc, hglrc); - } - - wglGetExtensionsStringARB = (const char *(WINAPI *) (HDC)) - this->gl_data->wglGetProcAddress("wglGetExtensionsStringARB"); - - if (wglGetExtensionsStringARB) { - extensions = wglGetExtensionsStringARB(hdc); - } else { - extensions = NULL; - } - - this->gl_data->WGL_ARB_pixel_format = 0; - if (ExtensionSupported("WGL_ARB_pixel_format", extensions)) { - this->gl_data->wglChoosePixelFormatARB = (BOOL(WINAPI *) - (HDC, const int *, - const FLOAT *, UINT, int *, - UINT *)) - this->gl_data->wglGetProcAddress("wglChoosePixelFormatARB"); - this->gl_data->wglGetPixelFormatAttribivARB = - (BOOL(WINAPI *) (HDC, int, int, UINT, const int *, int *)) - this->gl_data->wglGetProcAddress("wglGetPixelFormatAttribivARB"); - - if ((this->gl_data->wglChoosePixelFormatARB != NULL) && - (this->gl_data->wglGetPixelFormatAttribivARB != NULL)) { - this->gl_data->WGL_ARB_pixel_format = 1; - } - } - - if (hglrc) { - this->gl_data->wglMakeCurrent(NULL, NULL); - this->gl_data->wglDeleteContext(hglrc); - } - ReleaseDC(hwnd, hdc); - DestroyWindow(hwnd); - WIN_FlushMessageQueue(); -} - -#endif /* SDL_VIDEO_OPENGL */ - -int -WIN_GL_SetupWindow(_THIS) -{ - int retval; -#if SDL_VIDEO_OPENGL - int i; - unsigned int matching; - int iAttribs[64]; - int *iAttr; - float fAttribs[1] = { 0 }; - const GLubyte *(WINAPI * glGetStringFunc) (GLenum); - const char *wglext; - - /* load the gl driver from a default path */ - if (!this->gl_config.driver_loaded) { - /* no driver has been loaded, use default (ourselves) */ - if (WIN_GL_LoadLibrary(this, NULL) < 0) { - return (-1); - } - } - - for (i = 0;; ++i) { - /* Get the window device context for our OpenGL drawing */ - GL_hdc = GetDC(SDL_Window); - if (GL_hdc == NULL) { - SDL_SetError("Unable to get DC for SDL_Window"); - return (-1); - } - - /* Set up the pixel format descriptor with our needed format */ - SDL_memset(&GL_pfd, 0, sizeof(GL_pfd)); - GL_pfd.nSize = sizeof(GL_pfd); - GL_pfd.nVersion = 1; - GL_pfd.dwFlags = (PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL); - if (this->gl_config.double_buffer) { - GL_pfd.dwFlags |= PFD_DOUBLEBUFFER; - } - if (this->gl_config.stereo) { - GL_pfd.dwFlags |= PFD_STEREO; - } - GL_pfd.iPixelType = PFD_TYPE_RGBA; - GL_pfd.cColorBits = this->gl_config.buffer_size; - GL_pfd.cRedBits = this->gl_config.red_size; - GL_pfd.cGreenBits = this->gl_config.green_size; - GL_pfd.cBlueBits = this->gl_config.blue_size; - GL_pfd.cAlphaBits = this->gl_config.alpha_size; - GL_pfd.cAccumRedBits = this->gl_config.accum_red_size; - GL_pfd.cAccumGreenBits = this->gl_config.accum_green_size; - GL_pfd.cAccumBlueBits = this->gl_config.accum_blue_size; - GL_pfd.cAccumAlphaBits = this->gl_config.accum_alpha_size; - GL_pfd.cAccumBits = - (GL_pfd.cAccumRedBits + GL_pfd.cAccumGreenBits + - GL_pfd.cAccumBlueBits + GL_pfd.cAccumAlphaBits); - GL_pfd.cDepthBits = this->gl_config.depth_size; - GL_pfd.cStencilBits = this->gl_config.stencil_size; - - /* initialize WGL_ARB_pixel_format */ - Init_WGL_ARB_extensions(this); - - /* setup WGL_ARB_pixel_format attribs */ - iAttr = &iAttribs[0]; - - *iAttr++ = WGL_DRAW_TO_WINDOW_ARB; - *iAttr++ = GL_TRUE; - *iAttr++ = WGL_ACCELERATION_ARB; - *iAttr++ = WGL_FULL_ACCELERATION_ARB; - *iAttr++ = WGL_RED_BITS_ARB; - *iAttr++ = this->gl_config.red_size; - *iAttr++ = WGL_GREEN_BITS_ARB; - *iAttr++ = this->gl_config.green_size; - *iAttr++ = WGL_BLUE_BITS_ARB; - *iAttr++ = this->gl_config.blue_size; - - if (this->gl_config.alpha_size) { - *iAttr++ = WGL_ALPHA_BITS_ARB; - *iAttr++ = this->gl_config.alpha_size; - } - - *iAttr++ = WGL_DOUBLE_BUFFER_ARB; - *iAttr++ = this->gl_config.double_buffer; - - *iAttr++ = WGL_DEPTH_BITS_ARB; - *iAttr++ = this->gl_config.depth_size; - - if (this->gl_config.stencil_size) { - *iAttr++ = WGL_STENCIL_BITS_ARB; - *iAttr++ = this->gl_config.stencil_size; - } - - if (this->gl_config.accum_red_size) { - *iAttr++ = WGL_ACCUM_RED_BITS_ARB; - *iAttr++ = this->gl_config.accum_red_size; - } - - if (this->gl_config.accum_green_size) { - *iAttr++ = WGL_ACCUM_GREEN_BITS_ARB; - *iAttr++ = this->gl_config.accum_green_size; - } - - if (this->gl_config.accum_blue_size) { - *iAttr++ = WGL_ACCUM_BLUE_BITS_ARB; - *iAttr++ = this->gl_config.accum_blue_size; - } - - if (this->gl_config.accum_alpha_size) { - *iAttr++ = WGL_ACCUM_ALPHA_BITS_ARB; - *iAttr++ = this->gl_config.accum_alpha_size; - } - - if (this->gl_config.stereo) { - *iAttr++ = WGL_STEREO_ARB; - *iAttr++ = GL_TRUE; - } - - if (this->gl_config.multisamplebuffers) { - *iAttr++ = WGL_SAMPLE_BUFFERS_ARB; - *iAttr++ = this->gl_config.multisamplebuffers; - } - - if (this->gl_config.multisamplesamples) { - *iAttr++ = WGL_SAMPLES_ARB; - *iAttr++ = this->gl_config.multisamplesamples; - } - - if (this->gl_config.accelerated >= 0) { - *iAttr++ = WGL_ACCELERATION_ARB; - *iAttr++ = - (this->gl_config. - accelerated ? WGL_GENERIC_ACCELERATION_ARB : - WGL_NO_ACCELERATION_ARB); - } - - *iAttr = 0; - - /* Choose and set the closest available pixel format */ - if (!this->gl_data->WGL_ARB_pixel_format || - !this->gl_data->wglChoosePixelFormatARB(GL_hdc, iAttribs, - fAttribs, 1, - &pixel_format, &matching) - || !matching) { - pixel_format = ChoosePixelFormat(GL_hdc, &GL_pfd); - this->gl_data->WGL_ARB_pixel_format = 0; - } - if (!pixel_format) { - SDL_SetError("No matching GL pixel format available"); - return (-1); - } - if (!SetPixelFormat(GL_hdc, pixel_format, &GL_pfd)) { - if (i == 0) { - /* First time through, try resetting the window */ - if (WIN_GL_ResetWindow(this) < 0) { - return (-1); - } - continue; - } - SDL_SetError("Unable to set HDC pixel format"); - return (-1); - } - /* We either succeeded or failed by this point */ - break; - } - DescribePixelFormat(GL_hdc, pixel_format, sizeof(GL_pfd), &GL_pfd); - - GL_hrc = this->gl_data->wglCreateContext(GL_hdc); - if (GL_hrc == NULL) { - SDL_SetError("Unable to create GL context"); - return (-1); - } - if (WIN_GL_MakeCurrent(this) < 0) { - return (-1); - } - gl_active = 1; - - /* Vsync control under Windows. Checking glGetString here is - * somewhat a documented and reliable hack - it was originally - * as a feature added by mistake, but since so many people rely - * on it, it will not be removed. strstr should be safe here.*/ - glGetStringFunc = WIN_GL_GetProcAddress(this, "glGetString"); - if (glGetStringFunc) { - wglext = (const char *) glGetStringFunc(GL_EXTENSIONS); - } else { - /* Uh oh, something is seriously wrong here... */ - wglext = NULL; - } - if (wglext && SDL_strstr(wglext, "WGL_EXT_swap_control")) { - this->gl_data->wglSwapIntervalEXT = - WIN_GL_GetProcAddress(this, "wglSwapIntervalEXT"); - this->gl_data->wglGetSwapIntervalEXT = - WIN_GL_GetProcAddress(this, "wglGetSwapIntervalEXT"); - } else { - this->gl_data->wglSwapIntervalEXT = NULL; - this->gl_data->wglGetSwapIntervalEXT = NULL; - } - if (this->gl_config.swap_control >= 0) { - if (this->gl_data->wglSwapIntervalEXT) { - this->gl_data->wglSwapIntervalEXT(this->gl_config.swap_control); - } - } -#else - SDL_SetError("WIN driver not configured with OpenGL"); -#endif - if (gl_active) { - retval = 0; - } else { - retval = -1; - } - return (retval); -} - -void -WIN_GL_ShutDown(_THIS) -{ -#if SDL_VIDEO_OPENGL - /* Clean up OpenGL */ - if (GL_hrc) { - this->gl_data->wglMakeCurrent(NULL, NULL); - this->gl_data->wglDeleteContext(GL_hrc); - GL_hrc = NULL; - } - if (GL_hdc) { - ReleaseDC(SDL_Window, GL_hdc); - GL_hdc = NULL; - } - gl_active = 0; - - WIN_GL_UnloadLibrary(this); -#endif /* SDL_VIDEO_OPENGL */ -} - -#if SDL_VIDEO_OPENGL - -/* Make the current context active */ -int -WIN_GL_MakeCurrent(_THIS) -{ - int retval; - - retval = 0; - if (!this->gl_data->wglMakeCurrent(GL_hdc, GL_hrc)) { - SDL_SetError("Unable to make GL context current"); - retval = -1; - } - return (retval); -} - -/* Get attribute data from glX. */ -int -WIN_GL_GetAttribute(_THIS, SDL_GLattr attrib, int *value) -{ - int retval; - - if (this->gl_data->WGL_ARB_pixel_format) { - int wgl_attrib; - - switch (attrib) { - case SDL_GL_RED_SIZE: - wgl_attrib = WGL_RED_BITS_ARB; - break; - case SDL_GL_GREEN_SIZE: - wgl_attrib = WGL_GREEN_BITS_ARB; - break; - case SDL_GL_BLUE_SIZE: - wgl_attrib = WGL_BLUE_BITS_ARB; - break; - case SDL_GL_ALPHA_SIZE: - wgl_attrib = WGL_ALPHA_BITS_ARB; - break; - case SDL_GL_DOUBLEBUFFER: - wgl_attrib = WGL_DOUBLE_BUFFER_ARB; - break; - case SDL_GL_BUFFER_SIZE: - wgl_attrib = WGL_COLOR_BITS_ARB; - break; - case SDL_GL_DEPTH_SIZE: - wgl_attrib = WGL_DEPTH_BITS_ARB; - break; - case SDL_GL_STENCIL_SIZE: - wgl_attrib = WGL_STENCIL_BITS_ARB; - break; - case SDL_GL_ACCUM_RED_SIZE: - wgl_attrib = WGL_ACCUM_RED_BITS_ARB; - break; - case SDL_GL_ACCUM_GREEN_SIZE: - wgl_attrib = WGL_ACCUM_GREEN_BITS_ARB; - break; - case SDL_GL_ACCUM_BLUE_SIZE: - wgl_attrib = WGL_ACCUM_BLUE_BITS_ARB; - break; - case SDL_GL_ACCUM_ALPHA_SIZE: - wgl_attrib = WGL_ACCUM_ALPHA_BITS_ARB; - break; - case SDL_GL_STEREO: - wgl_attrib = WGL_STEREO_ARB; - break; - case SDL_GL_MULTISAMPLEBUFFERS: - wgl_attrib = WGL_SAMPLE_BUFFERS_ARB; - break; - case SDL_GL_MULTISAMPLESAMPLES: - wgl_attrib = WGL_SAMPLES_ARB; - break; - case SDL_GL_ACCELERATED_VISUAL: - wgl_attrib = WGL_ACCELERATION_ARB; - this->gl_data->wglGetPixelFormatAttribivARB(GL_hdc, pixel_format, - 0, 1, &wgl_attrib, - value); - if (*value == WGL_NO_ACCELERATION_ARB) { - *value = SDL_FALSE; - } else { - *value = SDL_TRUE; - } - return 0; - break; - case SDL_GL_SWAP_CONTROL: - if (this->gl_data->wglGetSwapIntervalEXT) { - *value = this->gl_data->wglGetSwapIntervalEXT(); - return 0; - } else { - return -1; - } - break; - default: - return (-1); - } - this->gl_data->wglGetPixelFormatAttribivARB(GL_hdc, pixel_format, 0, - 1, &wgl_attrib, value); - - return 0; - } - - retval = 0; - switch (attrib) { - case SDL_GL_RED_SIZE: - *value = GL_pfd.cRedBits; - break; - case SDL_GL_GREEN_SIZE: - *value = GL_pfd.cGreenBits; - break; - case SDL_GL_BLUE_SIZE: - *value = GL_pfd.cBlueBits; - break; - case SDL_GL_ALPHA_SIZE: - *value = GL_pfd.cAlphaBits; - break; - case SDL_GL_DOUBLEBUFFER: - if (GL_pfd.dwFlags & PFD_DOUBLEBUFFER) { - *value = 1; - } else { - *value = 0; - } - break; - case SDL_GL_BUFFER_SIZE: - *value = GL_pfd.cColorBits; - break; - case SDL_GL_DEPTH_SIZE: - *value = GL_pfd.cDepthBits; - break; - case SDL_GL_STENCIL_SIZE: - *value = GL_pfd.cStencilBits; - break; - case SDL_GL_ACCUM_RED_SIZE: - *value = GL_pfd.cAccumRedBits; - break; - case SDL_GL_ACCUM_GREEN_SIZE: - *value = GL_pfd.cAccumGreenBits; - break; - case SDL_GL_ACCUM_BLUE_SIZE: - *value = GL_pfd.cAccumBlueBits; - break; - case SDL_GL_ACCUM_ALPHA_SIZE: - *value = GL_pfd.cAccumAlphaBits; - break; - case SDL_GL_STEREO: - if (GL_pfd.dwFlags & PFD_STEREO) { - *value = 1; - } else { - *value = 0; - } - break; - case SDL_GL_MULTISAMPLEBUFFERS: - *value = 0; - break; - case SDL_GL_MULTISAMPLESAMPLES: - *value = 1; - break; - case SDL_GL_SWAP_CONTROL: - if (this->gl_data->wglGetSwapIntervalEXT) { - *value = this->gl_data->wglGetSwapIntervalEXT(); - return 0; - } else { - return -1; - } - break; - default: - retval = -1; - break; - } - return retval; -} - -void -WIN_GL_SwapBuffers(_THIS) -{ - SwapBuffers(GL_hdc); -} - -void -WIN_GL_UnloadLibrary(_THIS) -{ - if (this->gl_config.driver_loaded) { - FreeLibrary((HMODULE) this->gl_config.dll_handle); - - this->gl_data->wglGetProcAddress = NULL; - this->gl_data->wglCreateContext = NULL; - this->gl_data->wglDeleteContext = NULL; - this->gl_data->wglMakeCurrent = NULL; - this->gl_data->wglChoosePixelFormatARB = NULL; - this->gl_data->wglGetPixelFormatAttribivARB = NULL; - this->gl_data->wglSwapIntervalEXT = NULL; - this->gl_data->wglGetSwapIntervalEXT = NULL; - - this->gl_config.dll_handle = NULL; - this->gl_config.driver_loaded = 0; - } -} - -/* Passing a NULL path means load pointers from the application */ -int -WIN_GL_LoadLibrary(_THIS, const char *path) -{ - HMODULE handle; - - if (gl_active) { - SDL_SetError("OpenGL context already created"); - return -1; - } - - if (path == NULL) { - path = DEFAULT_GL_DRIVER_PATH; - } - handle = LoadLibrary(path); - if (handle == NULL) { - SDL_SetError("Could not load OpenGL library"); - return -1; - } - - /* Unload the old driver and reset the pointers */ - WIN_GL_UnloadLibrary(this); - - /* Load new function pointers */ - SDL_memset(this->gl_data, 0, sizeof(*this->gl_data)); - this->gl_data->wglGetProcAddress = (void *(WINAPI *) (const char *)) - GetProcAddress(handle, "wglGetProcAddress"); - this->gl_data->wglCreateContext = (HGLRC(WINAPI *) (HDC)) - GetProcAddress(handle, "wglCreateContext"); - this->gl_data->wglDeleteContext = (BOOL(WINAPI *) (HGLRC)) - GetProcAddress(handle, "wglDeleteContext"); - this->gl_data->wglMakeCurrent = (BOOL(WINAPI *) (HDC, HGLRC)) - GetProcAddress(handle, "wglMakeCurrent"); - this->gl_data->wglSwapIntervalEXT = (void (WINAPI *) (int)) - GetProcAddress(handle, "wglSwapIntervalEXT"); - this->gl_data->wglGetSwapIntervalEXT = (int (WINAPI *) (void)) - GetProcAddress(handle, "wglGetSwapIntervalEXT"); - - if ((this->gl_data->wglGetProcAddress == NULL) || - (this->gl_data->wglCreateContext == NULL) || - (this->gl_data->wglDeleteContext == NULL) || - (this->gl_data->wglMakeCurrent == NULL)) { - SDL_SetError("Could not retrieve OpenGL functions"); - FreeLibrary(handle); - return -1; - } - - this->gl_config.dll_handle = handle; - SDL_strlcpy(this->gl_config.driver_path, path, - SDL_arraysize(this->gl_config.driver_path)); - this->gl_config.driver_loaded = 1; - return 0; -} - -void * -WIN_GL_GetProcAddress(_THIS, const char *proc) -{ - void *func; - - /* This is to pick up extensions */ - func = this->gl_data->wglGetProcAddress(proc); - if (!func) { - /* This is probably a normal GL function */ - func = GetProcAddress(this->gl_config.dll_handle, proc); - } - return func; -} - -#endif /* SDL_VIDEO_OPENGL */ - -/* vi: set ts=4 sw=4 expandtab: */ diff -r 4371d679ee12 -r 7d642361ef0f src/video/wincommon/SDL_wingl_c.h --- a/src/video/wincommon/SDL_wingl_c.h Wed Jul 26 03:12:05 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,143 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ -#include "SDL_config.h" - -/* WGL implementation of SDL OpenGL support */ - -#include "../SDL_sysvideo.h" - - -struct SDL_PrivateGLData -{ - int gl_active; /* to stop switching drivers while we have a valid context */ - -#if SDL_VIDEO_OPENGL - PIXELFORMATDESCRIPTOR GL_pfd; - HDC GL_hdc; - HGLRC GL_hrc; - int pixel_format; - int WGL_ARB_pixel_format; - - void *(WINAPI * wglGetProcAddress) (const char *proc); - - HGLRC(WINAPI * wglCreateContext) (HDC hdc); - - BOOL(WINAPI * wglDeleteContext) (HGLRC hglrc); - - BOOL(WINAPI * wglMakeCurrent) (HDC hdc, HGLRC hglrc); - - BOOL(WINAPI * wglChoosePixelFormatARB) (HDC hdc, - const int *piAttribIList, - const FLOAT * pfAttribFList, - UINT nMaxFormats, - int *piFormats, - UINT * nNumFormats); - BOOL(WINAPI * wglGetPixelFormatAttribivARB) (HDC hdc, int iPixelFormat, - int iLayerPlane, - UINT nAttributes, - const int *piAttributes, - int *piValues); - void (WINAPI * wglSwapIntervalEXT) (int interval); - int (WINAPI * wglGetSwapIntervalEXT) (void); -#endif /* SDL_VIDEO_OPENGL */ -}; - -/* Old variable names */ -#define gl_active (this->gl_data->gl_active) -#define GL_pfd (this->gl_data->GL_pfd) -#define GL_hdc (this->gl_data->GL_hdc) -#define GL_hrc (this->gl_data->GL_hrc) -#define pixel_format (this->gl_data->pixel_format) - -/* OpenGL functions */ -extern int WIN_GL_SetupWindow(_THIS); -extern void WIN_GL_ShutDown(_THIS); -#if SDL_VIDEO_OPENGL -extern int WIN_GL_MakeCurrent(_THIS); -extern int WIN_GL_GetAttribute(_THIS, SDL_GLattr attrib, int *value); -extern void WIN_GL_SwapBuffers(_THIS); -extern void WIN_GL_UnloadLibrary(_THIS); -extern int WIN_GL_LoadLibrary(_THIS, const char *path); -extern void *WIN_GL_GetProcAddress(_THIS, const char *proc); -#endif - -#if SDL_VIDEO_OPENGL - -#ifndef WGL_ARB_pixel_format -#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 -#define WGL_DRAW_TO_WINDOW_ARB 0x2001 -#define WGL_DRAW_TO_BITMAP_ARB 0x2002 -#define WGL_ACCELERATION_ARB 0x2003 -#define WGL_NEED_PALETTE_ARB 0x2004 -#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005 -#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006 -#define WGL_SWAP_METHOD_ARB 0x2007 -#define WGL_NUMBER_OVERLAYS_ARB 0x2008 -#define WGL_NUMBER_UNDERLAYS_ARB 0x2009 -#define WGL_TRANSPARENT_ARB 0x200A -#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037 -#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038 -#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039 -#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A -#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B -#define WGL_SHARE_DEPTH_ARB 0x200C -#define WGL_SHARE_STENCIL_ARB 0x200D -#define WGL_SHARE_ACCUM_ARB 0x200E -#define WGL_SUPPORT_GDI_ARB 0x200F -#define WGL_SUPPORT_OPENGL_ARB 0x2010 -#define WGL_DOUBLE_BUFFER_ARB 0x2011 -#define WGL_STEREO_ARB 0x2012 -#define WGL_PIXEL_TYPE_ARB 0x2013 -#define WGL_COLOR_BITS_ARB 0x2014 -#define WGL_RED_BITS_ARB 0x2015 -#define WGL_RED_SHIFT_ARB 0x2016 -#define WGL_GREEN_BITS_ARB 0x2017 -#define WGL_GREEN_SHIFT_ARB 0x2018 -#define WGL_BLUE_BITS_ARB 0x2019 -#define WGL_BLUE_SHIFT_ARB 0x201A -#define WGL_ALPHA_BITS_ARB 0x201B -#define WGL_ALPHA_SHIFT_ARB 0x201C -#define WGL_ACCUM_BITS_ARB 0x201D -#define WGL_ACCUM_RED_BITS_ARB 0x201E -#define WGL_ACCUM_GREEN_BITS_ARB 0x201F -#define WGL_ACCUM_BLUE_BITS_ARB 0x2020 -#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021 -#define WGL_DEPTH_BITS_ARB 0x2022 -#define WGL_STENCIL_BITS_ARB 0x2023 -#define WGL_AUX_BUFFERS_ARB 0x2024 -#define WGL_NO_ACCELERATION_ARB 0x2025 -#define WGL_GENERIC_ACCELERATION_ARB 0x2026 -#define WGL_FULL_ACCELERATION_ARB 0x2027 -#define WGL_SWAP_EXCHANGE_ARB 0x2028 -#define WGL_SWAP_COPY_ARB 0x2029 -#define WGL_SWAP_UNDEFINED_ARB 0x202A -#define WGL_TYPE_RGBA_ARB 0x202B -#define WGL_TYPE_COLORINDEX_ARB 0x202C -#endif - -#ifndef WGL_ARB_multisample -#define WGL_SAMPLE_BUFFERS_ARB 0x2041 -#define WGL_SAMPLES_ARB 0x2042 -#endif - -#endif -/* vi: set ts=4 sw=4 expandtab: */ diff -r 4371d679ee12 -r 7d642361ef0f src/video/wincommon/wmmsg.h --- a/src/video/wincommon/wmmsg.h Wed Jul 26 03:12:05 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1032 +0,0 @@ - -#define MAX_WMMSG (sizeof(wmtab)/sizeof(wmtab[0])) - -char *wmtab[] = { - "WM_NULL", - "WM_CREATE", - "WM_DESTROY", - "WM_MOVE", - "UNKNOWN (4)", - "WM_SIZE", - "WM_ACTIVATE", - "WM_SETFOCUS", - "WM_KILLFOCUS", - "UNKNOWN (9)", - "WM_ENABLE", - "WM_SETREDRAW", - "WM_SETTEXT", - "WM_GETTEXT", - "WM_GETTEXTLENGTH", - "WM_PAINT", - "WM_CLOSE", - "WM_QUERYENDSESSION", - "WM_QUIT", - "WM_QUERYOPEN", - "WM_ERASEBKGND", - "WM_SYSCOLORCHANGE", - "WM_ENDSESSION", - "UNKNOWN (23)", - "WM_SHOWWINDOW", - "UNKNOWN (25)", - "WM_SETTINGCHANGE", - "WM_DEVMODECHANGE", - "WM_ACTIVATEAPP", - "WM_FONTCHANGE", - "WM_TIMECHANGE", - "WM_CANCELMODE", - "WM_SETCURSOR", - "WM_MOUSEACTIVATE", - "WM_CHILDACTIVATE", - "WM_QUEUESYNC", - "WM_GETMINMAXINFO", - "UNKNOWN (37)", - "WM_PAINTICON", - "WM_ICONERASEBKGND", - "WM_NEXTDLGCTL", - "UNKNOWN (41)", - "WM_SPOOLERSTATUS", - "WM_DRAWITEM", - "WM_MEASUREITEM", - "WM_DELETEITEM", - "WM_VKEYTOITEM", - "WM_CHARTOITEM", - "WM_SETFONT", - "WM_GETFONT", - "WM_SETHOTKEY", - "WM_GETHOTKEY", - "UNKNOWN (52)", - "UNKNOWN (53)", - "UNKNOWN (54)", - "WM_QUERYDRAGICON", - "UNKNOWN (56)", - "WM_COMPAREITEM", - "UNKNOWN (58)", - "UNKNOWN (59)", - "UNKNOWN (60)", - "WM_GETOBJECT", - "UNKNOWN (62)", - "UNKNOWN (63)", - "UNKNOWN (64)", - "WM_COMPACTING", - "UNKNOWN (66)", - "UNKNOWN (67)", - "WM_COMMNOTIFY", - "UNKNOWN (69)", - "WM_WINDOWPOSCHANGING", - "WM_WINDOWPOSCHANGED", - "WM_POWER", - "UNKNOWN (73)", - "WM_COPYDATA", - "WM_CANCELJOURNAL", - "UNKNOWN (76)", - "UNKNOWN (77)", - "WM_NOTIFY", - "UNKNOWN (79)", - "WM_INPUTLANGCHANGEREQUEST", - "WM_INPUTLANGCHANGE", - "WM_TCARD", - "WM_HELP", - "WM_USERCHANGED", - "WM_NOTIFYFORMAT", - "UNKNOWN (86)", - "UNKNOWN (87)", - "UNKNOWN (88)", - "UNKNOWN (89)", - "UNKNOWN (90)", - "UNKNOWN (91)", - "UNKNOWN (92)", - "UNKNOWN (93)", - "UNKNOWN (94)", - "UNKNOWN (95)", - "UNKNOWN (96)", - "UNKNOWN (97)", - "UNKNOWN (98)", - "UNKNOWN (99)", - "UNKNOWN (100)", - "UNKNOWN (101)", - "UNKNOWN (102)", - "UNKNOWN (103)", - "UNKNOWN (104)", - "UNKNOWN (105)", - "UNKNOWN (106)", - "UNKNOWN (107)", - "UNKNOWN (108)", - "UNKNOWN (109)", - "UNKNOWN (110)", - "UNKNOWN (111)", - "UNKNOWN (112)", - "UNKNOWN (113)", - "UNKNOWN (114)", - "UNKNOWN (115)", - "UNKNOWN (116)", - "UNKNOWN (117)", - "UNKNOWN (118)", - "UNKNOWN (119)", - "UNKNOWN (120)", - "UNKNOWN (121)", - "UNKNOWN (122)", - "WM_CONTEXTMENU", - "WM_STYLECHANGING", - "WM_STYLECHANGED", - "WM_DISPLAYCHANGE", - "WM_GETICON", - "WM_SETICON", - "WM_NCCREATE", - "WM_NCDESTROY", - "WM_NCCALCSIZE", - "WM_NCHITTEST", - "WM_NCPAINT", - "WM_NCACTIVATE", - "WM_GETDLGCODE", - "WM_SYNCPAINT", - "UNKNOWN (137)", - "UNKNOWN (138)", - "UNKNOWN (139)", - "UNKNOWN (140)", - "UNKNOWN (141)", - "UNKNOWN (142)", - "UNKNOWN (143)", - "UNKNOWN (144)", - "UNKNOWN (145)", - "UNKNOWN (146)", - "UNKNOWN (147)", - "UNKNOWN (148)", - "UNKNOWN (149)", - "UNKNOWN (150)", - "UNKNOWN (151)", - "UNKNOWN (152)", - "UNKNOWN (153)", - "UNKNOWN (154)", - "UNKNOWN (155)", - "UNKNOWN (156)", - "UNKNOWN (157)", - "UNKNOWN (158)", - "UNKNOWN (159)", - "WM_NCMOUSEMOVE", - "WM_NCLBUTTONDOWN", - "WM_NCLBUTTONUP", - "WM_NCLBUTTONDBLCLK", - "WM_NCRBUTTONDOWN", - "WM_NCRBUTTONUP", - "WM_NCRBUTTONDBLCLK", - "WM_NCMBUTTONDOWN", - "WM_NCMBUTTONUP", - "WM_NCMBUTTONDBLCLK", - "UNKNOWN (170)", - "UNKNOWN (171)", - "UNKNOWN (172)", - "UNKNOWN (173)", - "UNKNOWN (174)", - "UNKNOWN (175)", - "UNKNOWN (176)", - "UNKNOWN (177)", - "UNKNOWN (178)", - "UNKNOWN (179)", - "UNKNOWN (180)", - "UNKNOWN (181)", - "UNKNOWN (182)", - "UNKNOWN (183)", - "UNKNOWN (184)", - "UNKNOWN (185)", - "UNKNOWN (186)", - "UNKNOWN (187)", - "UNKNOWN (188)", - "UNKNOWN (189)", - "UNKNOWN (190)", - "UNKNOWN (191)", - "UNKNOWN (192)", - "UNKNOWN (193)", - "UNKNOWN (194)", - "UNKNOWN (195)", - "UNKNOWN (196)", - "UNKNOWN (197)", - "UNKNOWN (198)", - "UNKNOWN (199)", - "UNKNOWN (200)", - "UNKNOWN (201)", - "UNKNOWN (202)", - "UNKNOWN (203)", - "UNKNOWN (204)", - "UNKNOWN (205)", - "UNKNOWN (206)", - "UNKNOWN (207)", - "UNKNOWN (208)", - "UNKNOWN (209)", - "UNKNOWN (210)", - "UNKNOWN (211)", - "UNKNOWN (212)", - "UNKNOWN (213)", - "UNKNOWN (214)", - "UNKNOWN (215)", - "UNKNOWN (216)", - "UNKNOWN (217)", - "UNKNOWN (218)", - "UNKNOWN (219)", - "UNKNOWN (220)", - "UNKNOWN (221)", - "UNKNOWN (222)", - "UNKNOWN (223)", - "UNKNOWN (224)", - "UNKNOWN (225)", - "UNKNOWN (226)", - "UNKNOWN (227)", - "UNKNOWN (228)", - "UNKNOWN (229)", - "UNKNOWN (230)", - "UNKNOWN (231)", - "UNKNOWN (232)", - "UNKNOWN (233)", - "UNKNOWN (234)", - "UNKNOWN (235)", - "UNKNOWN (236)", - "UNKNOWN (237)", - "UNKNOWN (238)", - "UNKNOWN (239)", - "UNKNOWN (240)", - "UNKNOWN (241)", - "UNKNOWN (242)", - "UNKNOWN (243)", - "UNKNOWN (244)", - "UNKNOWN (245)", - "UNKNOWN (246)", - "UNKNOWN (247)", - "UNKNOWN (248)", - "UNKNOWN (249)", - "UNKNOWN (250)", - "UNKNOWN (251)", - "UNKNOWN (252)", - "UNKNOWN (253)", - "UNKNOWN (254)", - "UNKNOWN (255)", - "WM_KEYDOWN", - "WM_KEYUP", - "WM_CHAR", - "WM_DEADCHAR", - "WM_SYSKEYDOWN", - "WM_SYSKEYUP", - "WM_SYSCHAR", - "WM_SYSDEADCHAR", - "WM_KEYLAST", - "UNKNOWN (265)", - "UNKNOWN (266)", - "UNKNOWN (267)", - "UNKNOWN (268)", - "UNKNOWN (269)", - "UNKNOWN (270)", - "UNKNOWN (271)", - "WM_INITDIALOG", - "WM_COMMAND", - "WM_SYSCOMMAND", - "WM_TIMER", - "WM_HSCROLL", - "WM_VSCROLL", - "WM_INITMENU", - "WM_INITMENUPOPUP", - "UNKNOWN (280)", - "UNKNOWN (281)", - "UNKNOWN (282)", - "UNKNOWN (283)", - "UNKNOWN (284)", - "UNKNOWN (285)", - "UNKNOWN (286)", - "WM_MENUSELECT", - "WM_MENUCHAR", - "WM_ENTERIDLE", - "WM_MENURBUTTONUP", - "WM_MENUDRAG", - "WM_MENUGETOBJECT", - "WM_UNINITMENUPOPUP", - "WM_MENUCOMMAND", - "UNKNOWN (295)", - "UNKNOWN (296)", - "UNKNOWN (297)", - "UNKNOWN (298)", - "UNKNOWN (299)", - "UNKNOWN (300)", - "UNKNOWN (301)", - "UNKNOWN (302)", - "UNKNOWN (303)", - "UNKNOWN (304)", - "UNKNOWN (305)", - "WM_CTLCOLORMSGBOX", - "WM_CTLCOLOREDIT", - "WM_CTLCOLORLISTBOX", - "WM_CTLCOLORBTN", - "WM_CTLCOLORDLG", - "WM_CTLCOLORSCROLLBAR", - "WM_CTLCOLORSTATIC", - "UNKNOWN (313)", - "UNKNOWN (314)", - "UNKNOWN (315)", - "UNKNOWN (316)", - "UNKNOWN (317)", - "UNKNOWN (318)", - "UNKNOWN (319)", - "UNKNOWN (320)", - "UNKNOWN (321)", - "UNKNOWN (322)", - "UNKNOWN (323)", - "UNKNOWN (324)", - "UNKNOWN (325)", - "UNKNOWN (326)", - "UNKNOWN (327)", - "UNKNOWN (328)", - "UNKNOWN (329)", - "UNKNOWN (330)", - "UNKNOWN (331)", - "UNKNOWN (332)", - "UNKNOWN (333)", - "UNKNOWN (334)", - "UNKNOWN (335)", - "UNKNOWN (336)", - "UNKNOWN (337)", - "UNKNOWN (338)", - "UNKNOWN (339)", - "UNKNOWN (340)", - "UNKNOWN (341)", - "UNKNOWN (342)", - "UNKNOWN (343)", - "UNKNOWN (344)", - "UNKNOWN (345)", - "UNKNOWN (346)", - "UNKNOWN (347)", - "UNKNOWN (348)", - "UNKNOWN (349)", - "UNKNOWN (350)", - "UNKNOWN (351)", - "UNKNOWN (352)", - "UNKNOWN (353)", - "UNKNOWN (354)", - "UNKNOWN (355)", - "UNKNOWN (356)", - "UNKNOWN (357)", - "UNKNOWN (358)", - "UNKNOWN (359)", - "UNKNOWN (360)", - "UNKNOWN (361)", - "UNKNOWN (362)", - "UNKNOWN (363)", - "UNKNOWN (364)", - "UNKNOWN (365)", - "UNKNOWN (366)", - "UNKNOWN (367)", - "UNKNOWN (368)", - "UNKNOWN (369)", - "UNKNOWN (370)", - "UNKNOWN (371)", - "UNKNOWN (372)", - "UNKNOWN (373)", - "UNKNOWN (374)", - "UNKNOWN (375)", - "UNKNOWN (376)", - "UNKNOWN (377)", - "UNKNOWN (378)", - "UNKNOWN (379)", - "UNKNOWN (380)", - "UNKNOWN (381)", - "UNKNOWN (382)", - "UNKNOWN (383)", - "UNKNOWN (384)", - "UNKNOWN (385)", - "UNKNOWN (386)", - "UNKNOWN (387)", - "UNKNOWN (388)", - "UNKNOWN (389)", - "UNKNOWN (390)", - "UNKNOWN (391)", - "UNKNOWN (392)", - "UNKNOWN (393)", - "UNKNOWN (394)", - "UNKNOWN (395)", - "UNKNOWN (396)", - "UNKNOWN (397)", - "UNKNOWN (398)", - "UNKNOWN (399)", - "UNKNOWN (400)", - "UNKNOWN (401)", - "UNKNOWN (402)", - "UNKNOWN (403)", - "UNKNOWN (404)", - "UNKNOWN (405)", - "UNKNOWN (406)", - "UNKNOWN (407)", - "UNKNOWN (408)", - "UNKNOWN (409)", - "UNKNOWN (410)", - "UNKNOWN (411)", - "UNKNOWN (412)", - "UNKNOWN (413)", - "UNKNOWN (414)", - "UNKNOWN (415)", - "UNKNOWN (416)", - "UNKNOWN (417)", - "UNKNOWN (418)", - "UNKNOWN (419)", - "UNKNOWN (420)", - "UNKNOWN (421)", - "UNKNOWN (422)", - "UNKNOWN (423)", - "UNKNOWN (424)", - "UNKNOWN (425)", - "UNKNOWN (426)", - "UNKNOWN (427)", - "UNKNOWN (428)", - "UNKNOWN (429)", - "UNKNOWN (430)", - "UNKNOWN (431)", - "UNKNOWN (432)", - "UNKNOWN (433)", - "UNKNOWN (434)", - "UNKNOWN (435)", - "UNKNOWN (436)", - "UNKNOWN (437)", - "UNKNOWN (438)", - "UNKNOWN (439)", - "UNKNOWN (440)", - "UNKNOWN (441)", - "UNKNOWN (442)", - "UNKNOWN (443)", - "UNKNOWN (444)", - "UNKNOWN (445)", - "UNKNOWN (446)", - "UNKNOWN (447)", - "UNKNOWN (448)", - "UNKNOWN (449)", - "UNKNOWN (450)", - "UNKNOWN (451)", - "UNKNOWN (452)", - "UNKNOWN (453)", - "UNKNOWN (454)", - "UNKNOWN (455)", - "UNKNOWN (456)", - "UNKNOWN (457)", - "UNKNOWN (458)", - "UNKNOWN (459)", - "UNKNOWN (460)", - "UNKNOWN (461)", - "UNKNOWN (462)", - "UNKNOWN (463)", - "UNKNOWN (464)", - "UNKNOWN (465)", - "UNKNOWN (466)", - "UNKNOWN (467)", - "UNKNOWN (468)", - "UNKNOWN (469)", - "UNKNOWN (470)", - "UNKNOWN (471)", - "UNKNOWN (472)", - "UNKNOWN (473)", - "UNKNOWN (474)", - "UNKNOWN (475)", - "UNKNOWN (476)", - "UNKNOWN (477)", - "UNKNOWN (478)", - "UNKNOWN (479)", - "UNKNOWN (480)", - "UNKNOWN (481)", - "UNKNOWN (482)", - "UNKNOWN (483)", - "UNKNOWN (484)", - "UNKNOWN (485)", - "UNKNOWN (486)", - "UNKNOWN (487)", - "UNKNOWN (488)", - "UNKNOWN (489)", - "UNKNOWN (490)", - "UNKNOWN (491)", - "UNKNOWN (492)", - "UNKNOWN (493)", - "UNKNOWN (494)", - "UNKNOWN (495)", - "UNKNOWN (496)", - "UNKNOWN (497)", - "UNKNOWN (498)", - "UNKNOWN (499)", - "UNKNOWN (500)", - "UNKNOWN (501)", - "UNKNOWN (502)", - "UNKNOWN (503)", - "UNKNOWN (504)", - "UNKNOWN (505)", - "UNKNOWN (506)", - "UNKNOWN (507)", - "UNKNOWN (508)", - "UNKNOWN (509)", - "UNKNOWN (510)", - "UNKNOWN (511)", - "WM_MOUSEMOVE", - "WM_LBUTTONDOWN", - "WM_LBUTTONUP", - "WM_LBUTTONDBLCLK", - "WM_RBUTTONDOWN", - "WM_RBUTTONUP", - "WM_RBUTTONDBLCLK", - "WM_MBUTTONDOWN", - "WM_MBUTTONUP", - "WM_MOUSELAST", - "WM_MOUSELAST", - "UNKNOWN (523)", - "UNKNOWN (524)", - "UNKNOWN (525)", - "UNKNOWN (526)", - "UNKNOWN (527)", - "WM_PARENTNOTIFY", - "WM_ENTERMENULOOP", - "WM_EXITMENULOOP", - "WM_NEXTMENU", - "WM_SIZING", - "WM_CAPTURECHANGED", - "WM_MOVING", - "UNKNOWN (535)", - "WM_POWERBROADCAST", - "WM_DEVICECHANGE", - "UNKNOWN (538)", - "UNKNOWN (539)", - "UNKNOWN (540)", - "UNKNOWN (541)", - "UNKNOWN (542)", - "UNKNOWN (543)", - "WM_MDICREATE", - "WM_MDIDESTROY", - "WM_MDIACTIVATE", - "WM_MDIRESTORE", - "WM_MDINEXT", - "WM_MDIMAXIMIZE", - "WM_MDITILE", - "WM_MDICASCADE", - "WM_MDIICONARRANGE", - "WM_MDIGETACTIVE", - "UNKNOWN (554)", - "UNKNOWN (555)", - "UNKNOWN (556)", - "UNKNOWN (557)", - "UNKNOWN (558)", - "UNKNOWN (559)", - "WM_MDISETMENU", - "WM_ENTERSIZEMOVE", - "WM_EXITSIZEMOVE", - "WM_DROPFILES", - "WM_MDIREFRESHMENU", - "UNKNOWN (565)", - "UNKNOWN (566)", - "UNKNOWN (567)", - "UNKNOWN (568)", - "UNKNOWN (569)", - "UNKNOWN (570)", - "UNKNOWN (571)", - "UNKNOWN (572)", - "UNKNOWN (573)", - "UNKNOWN (574)", - "UNKNOWN (575)", - "UNKNOWN (576)", - "UNKNOWN (577)", - "UNKNOWN (578)", - "UNKNOWN (579)", - "UNKNOWN (580)", - "UNKNOWN (581)", - "UNKNOWN (582)", - "UNKNOWN (583)", - "UNKNOWN (584)", - "UNKNOWN (585)", - "UNKNOWN (586)", - "UNKNOWN (587)", - "UNKNOWN (588)", - "UNKNOWN (589)", - "UNKNOWN (590)", - "UNKNOWN (591)", - "UNKNOWN (592)", - "UNKNOWN (593)", - "UNKNOWN (594)", - "UNKNOWN (595)", - "UNKNOWN (596)", - "UNKNOWN (597)", - "UNKNOWN (598)", - "UNKNOWN (599)", - "UNKNOWN (600)", - "UNKNOWN (601)", - "UNKNOWN (602)", - "UNKNOWN (603)", - "UNKNOWN (604)", - "UNKNOWN (605)", - "UNKNOWN (606)", - "UNKNOWN (607)", - "UNKNOWN (608)", - "UNKNOWN (609)", - "UNKNOWN (610)", - "UNKNOWN (611)", - "UNKNOWN (612)", - "UNKNOWN (613)", - "UNKNOWN (614)", - "UNKNOWN (615)", - "UNKNOWN (616)", - "UNKNOWN (617)", - "UNKNOWN (618)", - "UNKNOWN (619)", - "UNKNOWN (620)", - "UNKNOWN (621)", - "UNKNOWN (622)", - "UNKNOWN (623)", - "UNKNOWN (624)", - "UNKNOWN (625)", - "UNKNOWN (626)", - "UNKNOWN (627)", - "UNKNOWN (628)", - "UNKNOWN (629)", - "UNKNOWN (630)", - "UNKNOWN (631)", - "UNKNOWN (632)", - "UNKNOWN (633)", - "UNKNOWN (634)", - "UNKNOWN (635)", - "UNKNOWN (636)", - "UNKNOWN (637)", - "UNKNOWN (638)", - "UNKNOWN (639)", - "UNKNOWN (640)", - "UNKNOWN (641)", - "UNKNOWN (642)", - "UNKNOWN (643)", - "UNKNOWN (644)", - "UNKNOWN (645)", - "UNKNOWN (646)", - "UNKNOWN (647)", - "UNKNOWN (648)", - "UNKNOWN (649)", - "UNKNOWN (650)", - "UNKNOWN (651)", - "UNKNOWN (652)", - "UNKNOWN (653)", - "UNKNOWN (654)", - "UNKNOWN (655)", - "UNKNOWN (656)", - "UNKNOWN (657)", - "UNKNOWN (658)", - "UNKNOWN (659)", - "UNKNOWN (660)", - "UNKNOWN (661)", - "UNKNOWN (662)", - "UNKNOWN (663)", - "UNKNOWN (664)", - "UNKNOWN (665)", - "UNKNOWN (666)", - "UNKNOWN (667)", - "UNKNOWN (668)", - "UNKNOWN (669)", - "UNKNOWN (670)", - "UNKNOWN (671)", - "UNKNOWN (672)", - "WM_MOUSEHOVER", - "UNKNOWN (674)", - "WM_MOUSELEAVE", - "UNKNOWN (676)", - "UNKNOWN (677)", - "UNKNOWN (678)", - "UNKNOWN (679)", - "UNKNOWN (680)", - "UNKNOWN (681)", - "UNKNOWN (682)", - "UNKNOWN (683)", - "UNKNOWN (684)", - "UNKNOWN (685)", - "UNKNOWN (686)", - "UNKNOWN (687)", - "UNKNOWN (688)", - "UNKNOWN (689)", - "UNKNOWN (690)", - "UNKNOWN (691)", - "UNKNOWN (692)", - "UNKNOWN (693)", - "UNKNOWN (694)", - "UNKNOWN (695)", - "UNKNOWN (696)", - "UNKNOWN (697)", - "UNKNOWN (698)", - "UNKNOWN (699)", - "UNKNOWN (700)", - "UNKNOWN (701)", - "UNKNOWN (702)", - "UNKNOWN (703)", - "UNKNOWN (704)", - "UNKNOWN (705)", - "UNKNOWN (706)", - "UNKNOWN (707)", - "UNKNOWN (708)", - "UNKNOWN (709)", - "UNKNOWN (710)", - "UNKNOWN (711)", - "UNKNOWN (712)", - "UNKNOWN (713)", - "UNKNOWN (714)", - "UNKNOWN (715)", - "UNKNOWN (716)", - "UNKNOWN (717)", - "UNKNOWN (718)", - "UNKNOWN (719)", - "UNKNOWN (720)", - "UNKNOWN (721)", - "UNKNOWN (722)", - "UNKNOWN (723)", - "UNKNOWN (724)", - "UNKNOWN (725)", - "UNKNOWN (726)", - "UNKNOWN (727)", - "UNKNOWN (728)", - "UNKNOWN (729)", - "UNKNOWN (730)", - "UNKNOWN (731)", - "UNKNOWN (732)", - "UNKNOWN (733)", - "UNKNOWN (734)", - "UNKNOWN (735)", - "UNKNOWN (736)", - "UNKNOWN (737)", - "UNKNOWN (738)", - "UNKNOWN (739)", - "UNKNOWN (740)", - "UNKNOWN (741)", - "UNKNOWN (742)", - "UNKNOWN (743)", - "UNKNOWN (744)", - "UNKNOWN (745)", - "UNKNOWN (746)", - "UNKNOWN (747)", - "UNKNOWN (748)", - "UNKNOWN (749)", - "UNKNOWN (750)", - "UNKNOWN (751)", - "UNKNOWN (752)", - "UNKNOWN (753)", - "UNKNOWN (754)", - "UNKNOWN (755)", - "UNKNOWN (756)", - "UNKNOWN (757)", - "UNKNOWN (758)", - "UNKNOWN (759)", - "UNKNOWN (760)", - "UNKNOWN (761)", - "UNKNOWN (762)", - "UNKNOWN (763)", - "UNKNOWN (764)", - "UNKNOWN (765)", - "UNKNOWN (766)", - "UNKNOWN (767)", - "WM_CUT", - "WM_COPY", - "WM_PASTE", - "WM_CLEAR", - "WM_UNDO", - "WM_RENDERFORMAT", - "WM_RENDERALLFORMATS", - "WM_DESTROYCLIPBOARD", - "WM_DRAWCLIPBOARD", - "WM_PAINTCLIPBOARD", - "WM_VSCROLLCLIPBOARD", - "WM_SIZECLIPBOARD", - "WM_ASKCBFORMATNAME", - "WM_CHANGECBCHAIN", - "WM_HSCROLLCLIPBOARD", - "WM_QUERYNEWPALETTE", - "WM_PALETTEISCHANGING", - "WM_PALETTECHANGED", - "WM_HOTKEY", - "UNKNOWN (787)", - "UNKNOWN (788)", - "UNKNOWN (789)", - "UNKNOWN (790)", - "WM_PRINT", - "WM_PRINTCLIENT", - "UNKNOWN (793)", - "UNKNOWN (794)", - "UNKNOWN (795)", - "UNKNOWN (796)", - "UNKNOWN (797)", - "UNKNOWN (798)", - "UNKNOWN (799)", - "UNKNOWN (800)", - "UNKNOWN (801)", - "UNKNOWN (802)", - "UNKNOWN (803)", - "UNKNOWN (804)", - "UNKNOWN (805)", - "UNKNOWN (806)", - "UNKNOWN (807)", - "UNKNOWN (808)", - "UNKNOWN (809)", - "UNKNOWN (810)", - "UNKNOWN (811)", - "UNKNOWN (812)", - "UNKNOWN (813)", - "UNKNOWN (814)", - "UNKNOWN (815)", - "UNKNOWN (816)", - "UNKNOWN (817)", - "UNKNOWN (818)", - "UNKNOWN (819)", - "UNKNOWN (820)", - "UNKNOWN (821)", - "UNKNOWN (822)", - "UNKNOWN (823)", - "UNKNOWN (824)", - "UNKNOWN (825)", - "UNKNOWN (826)", - "UNKNOWN (827)", - "UNKNOWN (828)", - "UNKNOWN (829)", - "UNKNOWN (830)", - "UNKNOWN (831)", - "UNKNOWN (832)", - "UNKNOWN (833)", - "UNKNOWN (834)", - "UNKNOWN (835)", - "UNKNOWN (836)", - "UNKNOWN (837)", - "UNKNOWN (838)", - "UNKNOWN (839)", - "UNKNOWN (840)", - "UNKNOWN (841)", - "UNKNOWN (842)", - "UNKNOWN (843)", - "UNKNOWN (844)", - "UNKNOWN (845)", - "UNKNOWN (846)", - "UNKNOWN (847)", - "UNKNOWN (848)", - "UNKNOWN (849)", - "UNKNOWN (850)", - "UNKNOWN (851)", - "UNKNOWN (852)", - "UNKNOWN (853)", - "UNKNOWN (854)", - "UNKNOWN (855)", - "WM_HANDHELDFIRST", - "UNKNOWN (857)", - "UNKNOWN (858)", - "UNKNOWN (859)", - "UNKNOWN (860)", - "UNKNOWN (861)", - "UNKNOWN (862)", - "WM_HANDHELDLAST", - "WM_AFXFIRST", - "UNKNOWN (865)", - "UNKNOWN (866)", - "UNKNOWN (867)", - "UNKNOWN (868)", - "UNKNOWN (869)", - "UNKNOWN (870)", - "UNKNOWN (871)", - "UNKNOWN (872)", - "UNKNOWN (873)", - "UNKNOWN (874)", - "UNKNOWN (875)", - "UNKNOWN (876)", - "UNKNOWN (877)", - "UNKNOWN (878)", - "UNKNOWN (879)", - "UNKNOWN (880)", - "UNKNOWN (881)", - "UNKNOWN (882)", - "UNKNOWN (883)", - "UNKNOWN (884)", - "UNKNOWN (885)", - "UNKNOWN (886)", - "UNKNOWN (887)", - "UNKNOWN (888)", - "UNKNOWN (889)", - "UNKNOWN (890)", - "UNKNOWN (891)", - "UNKNOWN (892)", - "UNKNOWN (893)", - "UNKNOWN (894)", - "WM_AFXLAST", - "WM_PENWINFIRST", - "UNKNOWN (897)", - "UNKNOWN (898)", - "UNKNOWN (899)", - "UNKNOWN (900)", - "UNKNOWN (901)", - "UNKNOWN (902)", - "UNKNOWN (903)", - "UNKNOWN (904)", - "UNKNOWN (905)", - "UNKNOWN (906)", - "UNKNOWN (907)", - "UNKNOWN (908)", - "UNKNOWN (909)", - "UNKNOWN (910)", - "WM_PENWINLAST", - "UNKNOWN (912)", - "UNKNOWN (913)", - "UNKNOWN (914)", - "UNKNOWN (915)", - "UNKNOWN (916)", - "UNKNOWN (917)", - "UNKNOWN (918)", - "UNKNOWN (919)", - "UNKNOWN (920)", - "UNKNOWN (921)", - "UNKNOWN (922)", - "UNKNOWN (923)", - "UNKNOWN (924)", - "UNKNOWN (925)", - "UNKNOWN (926)", - "UNKNOWN (927)", - "UNKNOWN (928)", - "UNKNOWN (929)", - "UNKNOWN (930)", - "UNKNOWN (931)", - "UNKNOWN (932)", - "UNKNOWN (933)", - "UNKNOWN (934)", - "UNKNOWN (935)", - "UNKNOWN (936)", - "UNKNOWN (937)", - "UNKNOWN (938)", - "UNKNOWN (939)", - "UNKNOWN (940)", - "UNKNOWN (941)", - "UNKNOWN (942)", - "UNKNOWN (943)", - "UNKNOWN (944)", - "UNKNOWN (945)", - "UNKNOWN (946)", - "UNKNOWN (947)", - "UNKNOWN (948)", - "UNKNOWN (949)", - "UNKNOWN (950)", - "UNKNOWN (951)", - "UNKNOWN (952)", - "UNKNOWN (953)", - "UNKNOWN (954)", - "UNKNOWN (955)", - "UNKNOWN (956)", - "UNKNOWN (957)", - "UNKNOWN (958)", - "UNKNOWN (959)", - "UNKNOWN (960)", - "UNKNOWN (961)", - "UNKNOWN (962)", - "UNKNOWN (963)", - "UNKNOWN (964)", - "UNKNOWN (965)", - "UNKNOWN (966)", - "UNKNOWN (967)", - "UNKNOWN (968)", - "UNKNOWN (969)", - "UNKNOWN (970)", - "UNKNOWN (971)", - "UNKNOWN (972)", - "UNKNOWN (973)", - "UNKNOWN (974)", - "UNKNOWN (975)", - "UNKNOWN (976)", - "UNKNOWN (977)", - "UNKNOWN (978)", - "UNKNOWN (979)", - "UNKNOWN (980)", - "UNKNOWN (981)", - "UNKNOWN (982)", - "UNKNOWN (983)", - "UNKNOWN (984)", - "UNKNOWN (985)", - "UNKNOWN (986)", - "UNKNOWN (987)", - "UNKNOWN (988)", - "UNKNOWN (989)", - "UNKNOWN (990)", - "UNKNOWN (991)", - "UNKNOWN (992)", - "UNKNOWN (993)", - "UNKNOWN (994)", - "UNKNOWN (995)", - "UNKNOWN (996)", - "UNKNOWN (997)", - "UNKNOWN (998)", - "UNKNOWN (999)", - "UNKNOWN (1000)", - "UNKNOWN (1001)", - "UNKNOWN (1002)", - "UNKNOWN (1003)", - "UNKNOWN (1004)", - "UNKNOWN (1005)", - "UNKNOWN (1006)", - "UNKNOWN (1007)", - "UNKNOWN (1008)", - "UNKNOWN (1009)", - "UNKNOWN (1010)", - "UNKNOWN (1011)", - "UNKNOWN (1012)", - "UNKNOWN (1013)", - "UNKNOWN (1014)", - "UNKNOWN (1015)", - "UNKNOWN (1016)", - "UNKNOWN (1017)", - "UNKNOWN (1018)", - "UNKNOWN (1019)", - "UNKNOWN (1020)", - "UNKNOWN (1021)", - "UNKNOWN (1022)", - "UNKNOWN (1023)", - "WM_USER" -}; - -/* vi: set ts=4 sw=4 expandtab: */ diff -r 4371d679ee12 -r 7d642361ef0f src/video/windib/SDL_dibevents.c --- a/src/video/windib/SDL_dibevents.c Wed Jul 26 03:12:05 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,505 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ -#include "SDL_config.h" - -#define WIN32_LEAN_AND_MEAN -#include - -#include "SDL_main.h" -#include "SDL_events.h" -#include "SDL_syswm.h" -#include "../../events/SDL_sysevents.h" -#include "../../events/SDL_events_c.h" -#include "../wincommon/SDL_lowvideo.h" -#include "SDL_dibvideo.h" -#include "SDL_vkeys.h" - -#ifndef WM_APP -#define WM_APP 0x8000 -#endif - -#ifdef _WIN32_WCE -#define NO_GETKEYBOARDSTATE -#endif - -/* The translation table from a Microsoft VK keysym to a SDL keysym */ -static SDLKey VK_keymap[SDLK_LAST]; -static SDL_keysym *TranslateKey(WPARAM vkey, UINT scancode, - SDL_keysym * keysym, int pressed); - -/* Masks for processing the windows KEYDOWN and KEYUP messages */ -#define REPEATED_KEYMASK (1<<30) -#define EXTENDED_KEYMASK (1<<24) - -/* DJM: If the user setup the window for us, we want to save his window proc, - and give him a chance to handle some messages. */ -#ifdef STRICT -#define WNDPROCTYPE WNDPROC -#else -#define WNDPROCTYPE FARPROC -#endif -static WNDPROCTYPE userWindowProc = NULL; - - -#ifdef _WIN32_WCE - -WPARAM -rotateKey(WPARAM key, SDL_ScreenOrientation direction) -{ - if (direction != SDL_ORIENTATION_LEFT) - return key; - - switch (key) { - case 0x26: /* up */ - return 0x27; - case 0x27: /* right */ - return 0x28; - case 0x28: /* down */ - return 0x25; - case 0x25: /* left */ - return 0x26; - } - - return key; -} - -#endif - - -/* The main Win32 event handler */ -LRESULT -DIB_HandleMessage(_THIS, HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - extern int posted; - - switch (msg) { - case WM_SYSKEYDOWN: - case WM_KEYDOWN: - { - SDL_keysym keysym; - -#ifdef _WIN32_WCE - // Drop GAPI artefacts - if (wParam == 0x84 || wParam == 0x5B) - return 0; - - // Rotate key if necessary - if (this->hidden->orientation != SDL_ORIENTATION_UP) - wParam = rotateKey(wParam, this->hidden->orientation); -#endif - /* Ignore repeated keys */ - if (lParam & REPEATED_KEYMASK) { - return (0); - } - switch (wParam) { - case VK_CONTROL: - if (lParam & EXTENDED_KEYMASK) - wParam = VK_RCONTROL; - else - wParam = VK_LCONTROL; - break; - case VK_SHIFT: - /* EXTENDED trick doesn't work here */ - { - Uint8 *state = SDL_GetKeyState(NULL); - if (state[SDLK_LSHIFT] == SDL_RELEASED - && (GetKeyState(VK_LSHIFT) & 0x8000)) { - wParam = VK_LSHIFT; - } else if (state[SDLK_RSHIFT] == SDL_RELEASED - && (GetKeyState(VK_RSHIFT) & 0x8000)) { - wParam = VK_RSHIFT; - } else { - /* Probably a key repeat */ - return (0); - } - } - break; - case VK_MENU: - if (lParam & EXTENDED_KEYMASK) - wParam = VK_RMENU; - else - wParam = VK_LMENU; - break; - } -#ifdef NO_GETKEYBOARDSTATE - /* this is the workaround for the missing ToAscii() and ToUnicode() in CE (not necessary at KEYUP!) */ - if (SDL_TranslateUNICODE) { - MSG m; - - m.hwnd = hwnd; - m.message = msg; - m.wParam = wParam; - m.lParam = lParam; - m.time = 0; - if (TranslateMessage(&m) - && PeekMessage(&m, hwnd, 0, WM_USER, PM_NOREMOVE) - && (m.message == WM_CHAR)) { - GetMessage(&m, hwnd, 0, WM_USER); - wParam = m.wParam; - } - } -#endif /* NO_GETKEYBOARDSTATE */ - posted = SDL_PrivateKeyboard(SDL_PRESSED, - TranslateKey(wParam, - HIWORD(lParam), - &keysym, 1)); - } - return (0); - - case WM_SYSKEYUP: - case WM_KEYUP: - { - SDL_keysym keysym; - -#ifdef _WIN32_WCE - // Drop GAPI artifacts - if (wParam == 0x84 || wParam == 0x5B) - return 0; - - // Rotate key if necessary - if (this->hidden->orientation != SDL_ORIENTATION_UP) - wParam = rotateKey(wParam, this->hidden->orientation); -#endif - - switch (wParam) { - case VK_CONTROL: - if (lParam & EXTENDED_KEYMASK) - wParam = VK_RCONTROL; - else - wParam = VK_LCONTROL; - break; - case VK_SHIFT: - /* EXTENDED trick doesn't work here */ - { - Uint8 *state = SDL_GetKeyState(NULL); - if (state[SDLK_LSHIFT] == SDL_PRESSED - && !(GetKeyState(VK_LSHIFT) & 0x8000)) { - wParam = VK_LSHIFT; - } else if (state[SDLK_RSHIFT] == SDL_PRESSED - && !(GetKeyState(VK_RSHIFT) & 0x8000)) { - wParam = VK_RSHIFT; - } else { - /* Probably a key repeat */ - return (0); - } - } - break; - case VK_MENU: - if (lParam & EXTENDED_KEYMASK) - wParam = VK_RMENU; - else - wParam = VK_LMENU; - break; - } - /* Windows only reports keyup for print screen */ - if (wParam == VK_SNAPSHOT - && SDL_GetKeyState(NULL)[SDLK_PRINT] == SDL_RELEASED) { - posted = SDL_PrivateKeyboard(SDL_PRESSED, - TranslateKey(wParam, - HIWORD - (lParam), - &keysym, 1)); - } - posted = SDL_PrivateKeyboard(SDL_RELEASED, - TranslateKey(wParam, - HIWORD(lParam), - &keysym, 0)); - } - return (0); - -#if defined(SC_SCREENSAVE) && defined(SC_MONITORPOWER) - case WM_SYSCOMMAND: - { - if ((wParam & 0xFFF0) == SC_SCREENSAVE || - (wParam & 0xFFF0) == SC_MONITORPOWER) - return (0); - } - /* Fall through to default processing */ -#endif /* SC_SCREENSAVE && SC_MONITORPOWER */ - - default: - { - /* Only post the event if we're watching for it */ - if (SDL_ProcessEvents[SDL_SYSWMEVENT] == SDL_ENABLE) { - SDL_SysWMmsg wmmsg; - - SDL_VERSION(&wmmsg.version); - wmmsg.hwnd = hwnd; - wmmsg.msg = msg; - wmmsg.wParam = wParam; - wmmsg.lParam = lParam; - posted = SDL_PrivateSysWMEvent(&wmmsg); - - /* DJM: If the user isn't watching for private - messages in her SDL event loop, then pass it - along to any win32 specific window proc. - */ - } else if (userWindowProc) { - return CallWindowProc(userWindowProc, hwnd, msg, wParam, - lParam); - } - } - break; - } - return (DefWindowProc(hwnd, msg, wParam, lParam)); -} - -void -DIB_PumpEvents(_THIS) -{ - MSG msg; - - while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) { - if (GetMessage(&msg, NULL, 0, 0) > 0) { - DispatchMessage(&msg); - } - } -} - -void -DIB_InitOSKeymap(_THIS) -{ - int i; - - /* Map the VK keysyms */ - for (i = 0; i < SDL_arraysize(VK_keymap); ++i) - VK_keymap[i] = SDLK_UNKNOWN; - - VK_keymap[VK_BACK] = SDLK_BACKSPACE; - VK_keymap[VK_TAB] = SDLK_TAB; - VK_keymap[VK_CLEAR] = SDLK_CLEAR; - VK_keymap[VK_RETURN] = SDLK_RETURN; - VK_keymap[VK_PAUSE] = SDLK_PAUSE; - VK_keymap[VK_ESCAPE] = SDLK_ESCAPE; - VK_keymap[VK_SPACE] = SDLK_SPACE; - VK_keymap[VK_APOSTROPHE] = SDLK_QUOTE; - VK_keymap[VK_COMMA] = SDLK_COMMA; - VK_keymap[VK_MINUS] = SDLK_MINUS; - VK_keymap[VK_PERIOD] = SDLK_PERIOD; - VK_keymap[VK_SLASH] = SDLK_SLASH; - VK_keymap[VK_0] = SDLK_0; - VK_keymap[VK_1] = SDLK_1; - VK_keymap[VK_2] = SDLK_2; - VK_keymap[VK_3] = SDLK_3; - VK_keymap[VK_4] = SDLK_4; - VK_keymap[VK_5] = SDLK_5; - VK_keymap[VK_6] = SDLK_6; - VK_keymap[VK_7] = SDLK_7; - VK_keymap[VK_8] = SDLK_8; - VK_keymap[VK_9] = SDLK_9; - VK_keymap[VK_SEMICOLON] = SDLK_SEMICOLON; - VK_keymap[VK_EQUALS] = SDLK_EQUALS; - VK_keymap[VK_LBRACKET] = SDLK_LEFTBRACKET; - VK_keymap[VK_BACKSLASH] = SDLK_BACKSLASH; - VK_keymap[VK_OEM_102] = SDLK_LESS; - VK_keymap[VK_RBRACKET] = SDLK_RIGHTBRACKET; - VK_keymap[VK_GRAVE] = SDLK_BACKQUOTE; - VK_keymap[VK_BACKTICK] = SDLK_BACKQUOTE; - VK_keymap[VK_A] = SDLK_a; - VK_keymap[VK_B] = SDLK_b; - VK_keymap[VK_C] = SDLK_c; - VK_keymap[VK_D] = SDLK_d; - VK_keymap[VK_E] = SDLK_e; - VK_keymap[VK_F] = SDLK_f; - VK_keymap[VK_G] = SDLK_g; - VK_keymap[VK_H] = SDLK_h; - VK_keymap[VK_I] = SDLK_i; - VK_keymap[VK_J] = SDLK_j; - VK_keymap[VK_K] = SDLK_k; - VK_keymap[VK_L] = SDLK_l; - VK_keymap[VK_M] = SDLK_m; - VK_keymap[VK_N] = SDLK_n; - VK_keymap[VK_O] = SDLK_o; - VK_keymap[VK_P] = SDLK_p; - VK_keymap[VK_Q] = SDLK_q; - VK_keymap[VK_R] = SDLK_r; - VK_keymap[VK_S] = SDLK_s; - VK_keymap[VK_T] = SDLK_t; - VK_keymap[VK_U] = SDLK_u; - VK_keymap[VK_V] = SDLK_v; - VK_keymap[VK_W] = SDLK_w; - VK_keymap[VK_X] = SDLK_x; - VK_keymap[VK_Y] = SDLK_y; - VK_keymap[VK_Z] = SDLK_z; - VK_keymap[VK_DELETE] = SDLK_DELETE; - - VK_keymap[VK_NUMPAD0] = SDLK_KP0; - VK_keymap[VK_NUMPAD1] = SDLK_KP1; - VK_keymap[VK_NUMPAD2] = SDLK_KP2; - VK_keymap[VK_NUMPAD3] = SDLK_KP3; - VK_keymap[VK_NUMPAD4] = SDLK_KP4; - VK_keymap[VK_NUMPAD5] = SDLK_KP5; - VK_keymap[VK_NUMPAD6] = SDLK_KP6; - VK_keymap[VK_NUMPAD7] = SDLK_KP7; - VK_keymap[VK_NUMPAD8] = SDLK_KP8; - VK_keymap[VK_NUMPAD9] = SDLK_KP9; - VK_keymap[VK_DECIMAL] = SDLK_KP_PERIOD; - VK_keymap[VK_DIVIDE] = SDLK_KP_DIVIDE; - VK_keymap[VK_MULTIPLY] = SDLK_KP_MULTIPLY; - VK_keymap[VK_SUBTRACT] = SDLK_KP_MINUS; - VK_keymap[VK_ADD] = SDLK_KP_PLUS; - - VK_keymap[VK_UP] = SDLK_UP; - VK_keymap[VK_DOWN] = SDLK_DOWN; - VK_keymap[VK_RIGHT] = SDLK_RIGHT; - VK_keymap[VK_LEFT] = SDLK_LEFT; - VK_keymap[VK_INSERT] = SDLK_INSERT; - VK_keymap[VK_HOME] = SDLK_HOME; - VK_keymap[VK_END] = SDLK_END; - VK_keymap[VK_PRIOR] = SDLK_PAGEUP; - VK_keymap[VK_NEXT] = SDLK_PAGEDOWN; - - VK_keymap[VK_F1] = SDLK_F1; - VK_keymap[VK_F2] = SDLK_F2; - VK_keymap[VK_F3] = SDLK_F3; - VK_keymap[VK_F4] = SDLK_F4; - VK_keymap[VK_F5] = SDLK_F5; - VK_keymap[VK_F6] = SDLK_F6; - VK_keymap[VK_F7] = SDLK_F7; - VK_keymap[VK_F8] = SDLK_F8; - VK_keymap[VK_F9] = SDLK_F9; - VK_keymap[VK_F10] = SDLK_F10; - VK_keymap[VK_F11] = SDLK_F11; - VK_keymap[VK_F12] = SDLK_F12; - VK_keymap[VK_F13] = SDLK_F13; - VK_keymap[VK_F14] = SDLK_F14; - VK_keymap[VK_F15] = SDLK_F15; - - VK_keymap[VK_NUMLOCK] = SDLK_NUMLOCK; - VK_keymap[VK_CAPITAL] = SDLK_CAPSLOCK; - VK_keymap[VK_SCROLL] = SDLK_SCROLLOCK; - VK_keymap[VK_RSHIFT] = SDLK_RSHIFT; - VK_keymap[VK_LSHIFT] = SDLK_LSHIFT; - VK_keymap[VK_RCONTROL] = SDLK_RCTRL; - VK_keymap[VK_LCONTROL] = SDLK_LCTRL; - VK_keymap[VK_RMENU] = SDLK_RALT; - VK_keymap[VK_LMENU] = SDLK_LALT; - VK_keymap[VK_RWIN] = SDLK_RSUPER; - VK_keymap[VK_LWIN] = SDLK_LSUPER; - - VK_keymap[VK_HELP] = SDLK_HELP; -#ifdef VK_PRINT - VK_keymap[VK_PRINT] = SDLK_PRINT; -#endif - VK_keymap[VK_SNAPSHOT] = SDLK_PRINT; - VK_keymap[VK_CANCEL] = SDLK_BREAK; - VK_keymap[VK_APPS] = SDLK_MENU; -} - -static SDL_keysym * -TranslateKey(WPARAM vkey, UINT scancode, SDL_keysym * keysym, int pressed) -{ - /* Set the keysym information */ - keysym->scancode = (unsigned char) scancode; - keysym->sym = VK_keymap[vkey]; - keysym->mod = KMOD_NONE; - keysym->unicode = 0; - if (pressed && SDL_TranslateUNICODE) { -#ifdef NO_GETKEYBOARDSTATE - /* Uh oh, better hope the vkey is close enough.. */ - keysym->unicode = vkey; -#else - BYTE keystate[256]; - Uint16 wchars[2]; - - GetKeyboardState(keystate); - if (SDL_ToUnicode - ((UINT) vkey, scancode, keystate, wchars, - sizeof(wchars) / sizeof(wchars[0]), 0) == 1) { - keysym->unicode = wchars[0]; - } -#endif /* NO_GETKEYBOARDSTATE */ - } - return (keysym); -} - -int -DIB_CreateWindow(_THIS) -{ - char *windowid = SDL_getenv("SDL_WINDOWID"); - - SDL_RegisterApp(NULL, 0, 0); - - SDL_windowid = (windowid != NULL); - if (SDL_windowid) { -#if defined(_WIN32_WCE) && (_WIN32_WCE < 300) - /* wince 2.1 does not have strtol */ - wchar_t *windowid_t = - SDL_malloc((SDL_strlen(windowid) + 1) * sizeof(wchar_t)); - MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, windowid, -1, - windowid_t, SDL_strlen(windowid) + 1); - SDL_Window = (HWND) wcstol(windowid_t, NULL, 0); - SDL_free(windowid_t); -#else - SDL_Window = (HWND) SDL_strtoull(windowid, NULL, 0); -#endif - if (SDL_Window == NULL) { - SDL_SetError("Couldn't get user specified window"); - return (-1); - } - - /* DJM: we want all event's for the user specified - window to be handled by SDL. - */ - userWindowProc = - (WNDPROCTYPE) GetWindowLongPtr(SDL_Window, GWLP_WNDPROC); - SetWindowLongPtr(SDL_Window, GWLP_WNDPROC, (LONG_PTR) WinMessage); - } else { - SDL_Window = CreateWindow(SDL_Appname, SDL_Appname, - (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU - | WS_MINIMIZEBOX), CW_USEDEFAULT, - CW_USEDEFAULT, 0, 0, NULL, NULL, - SDL_Instance, NULL); - if (SDL_Window == NULL) { - SDL_SetError("Couldn't create window"); - return (-1); - } - ShowWindow(SDL_Window, SW_HIDE); - } - - /* JC 14 Mar 2006 - Flush the message loop or this can cause big problems later - Especially if the user decides to use dialog boxes or assert()! - */ - WIN_FlushMessageQueue(); - - return (0); -} - -void -DIB_DestroyWindow(_THIS) -{ - if (SDL_windowid) { - SetWindowLongPtr(SDL_Window, GWLP_WNDPROC, (LONG_PTR) userWindowProc); - } else { - DestroyWindow(SDL_Window); - } - SDL_UnregisterApp(); - - /* JC 14 Mar 2006 - Flush the message loop or this can cause big problems later - Especially if the user decides to use dialog boxes or assert()! - */ - WIN_FlushMessageQueue(); -} - -/* vi: set ts=4 sw=4 expandtab: */ diff -r 4371d679ee12 -r 7d642361ef0f src/video/windib/SDL_dibevents_c.h --- a/src/video/windib/SDL_dibevents_c.h Wed Jul 26 03:12:05 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,36 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ -#include "SDL_config.h" - -#include "../wincommon/SDL_lowvideo.h" - -/* Variables and functions exported by SDL_dibevents.c to other parts - of the native video subsystem (SDL_dibvideo.c) -*/ -extern LONG -DIB_HandleMessage(_THIS, HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); -extern int DIB_CreateWindow(_THIS); -extern void DIB_DestroyWindow(_THIS); - -extern void DIB_PumpEvents(_THIS); -extern void DIB_InitOSKeymap(_THIS); -/* vi: set ts=4 sw=4 expandtab: */ diff -r 4371d679ee12 -r 7d642361ef0f src/video/windib/SDL_dibvideo.c --- a/src/video/windib/SDL_dibvideo.c Wed Jul 26 03:12:05 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1165 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ -#include "SDL_config.h" - -#define WIN32_LEAN_AND_MEAN -#include - -/* Not yet in the mingw32 cross-compile headers */ -#ifndef CDS_FULLSCREEN -#define CDS_FULLSCREEN 4 -#endif - -#include "SDL_syswm.h" -#include "../SDL_sysvideo.h" -#include "../SDL_pixels_c.h" -#include "../../events/SDL_sysevents.h" -#include "../../events/SDL_events_c.h" -#include "SDL_dibvideo.h" -#include "../wincommon/SDL_syswm_c.h" -#include "../wincommon/SDL_sysmouse_c.h" -#include "SDL_dibevents_c.h" -#include "../wincommon/SDL_wingl_c.h" - -#ifdef _WIN32_WCE -#define NO_GETDIBITS -#define NO_GAMMA_SUPPORT -#if _WIN32_WCE < 420 -#define NO_CHANGEDISPLAYSETTINGS -#else -#define ChangeDisplaySettings(lpDevMode, dwFlags) ChangeDisplaySettingsEx(NULL, (lpDevMode), 0, (dwFlags), 0) -#endif -#endif -#ifndef WS_MAXIMIZE -#define WS_MAXIMIZE 0 -#endif -#ifndef WS_THICKFRAME -#define WS_THICKFRAME 0 -#endif -#ifndef SWP_NOCOPYBITS -#define SWP_NOCOPYBITS 0 -#endif -#ifndef PC_NOCOLLAPSE -#define PC_NOCOLLAPSE 0 -#endif - -#ifdef _WIN32_WCE -// defined and used in SDL_sysevents.c -extern HINSTANCE aygshell; -#endif - -/* Initialization/Query functions */ -static int DIB_VideoInit(_THIS, SDL_PixelFormat * vformat); -static SDL_Rect **DIB_ListModes(_THIS, SDL_PixelFormat * format, - Uint32 flags); -SDL_Surface *DIB_SetVideoMode(_THIS, SDL_Surface * current, int width, - int height, int bpp, Uint32 flags); -static int DIB_SetColors(_THIS, int firstcolor, int ncolors, - SDL_Color * colors); -static void DIB_CheckGamma(_THIS); -void DIB_SwapGamma(_THIS); -void DIB_QuitGamma(_THIS); -int DIB_SetGammaRamp(_THIS, Uint16 * ramp); -int DIB_GetGammaRamp(_THIS, Uint16 * ramp); -static void DIB_VideoQuit(_THIS); - -/* Hardware surface functions */ -static int DIB_AllocHWSurface(_THIS, SDL_Surface * surface); -static int DIB_LockHWSurface(_THIS, SDL_Surface * surface); -static void DIB_UnlockHWSurface(_THIS, SDL_Surface * surface); -static void DIB_FreeHWSurface(_THIS, SDL_Surface * surface); - -/* Windows message handling functions */ -static void DIB_RealizePalette(_THIS); -static void DIB_PaletteChanged(_THIS, HWND window); -static void DIB_WinPAINT(_THIS, HDC hdc); - -/* helper fn */ -static int DIB_SussScreenDepth(); - -/* DIB driver bootstrap functions */ - -static int -DIB_Available(void) -{ - return (1); -} - -static void -DIB_DeleteDevice(SDL_VideoDevice * device) -{ - if (device) { - if (device->hidden) { - SDL_free(device->hidden); - } - if (device->gl_data) { - SDL_free(device->gl_data); - } - SDL_free(device); - } -} - -static SDL_VideoDevice * -DIB_CreateDevice(int devindex) -{ - SDL_VideoDevice *device; - - /* Initialize all variables that we clean on shutdown */ - device = (SDL_VideoDevice *) SDL_malloc(sizeof(SDL_VideoDevice)); - if (device) { - SDL_memset(device, 0, (sizeof *device)); - device->hidden = (struct SDL_PrivateVideoData *) - SDL_malloc((sizeof *device->hidden)); - device->gl_data = (struct SDL_PrivateGLData *) - SDL_malloc((sizeof *device->gl_data)); - } - if ((device == NULL) || (device->hidden == NULL) || - (device->gl_data == NULL)) { - SDL_OutOfMemory(); - DIB_DeleteDevice(device); - return (NULL); - } - SDL_memset(device->hidden, 0, (sizeof *device->hidden)); - SDL_memset(device->gl_data, 0, (sizeof *device->gl_data)); - - /* Set the function pointers */ - device->VideoInit = DIB_VideoInit; - device->ListModes = DIB_ListModes; - device->SetVideoMode = DIB_SetVideoMode; - device->UpdateMouse = WIN_UpdateMouse; - device->SetColors = DIB_SetColors; - device->UpdateRects = NULL; - device->VideoQuit = DIB_VideoQuit; - device->AllocHWSurface = DIB_AllocHWSurface; - device->CheckHWBlit = NULL; - device->FillHWRect = NULL; - device->SetHWColorKey = NULL; - device->SetHWAlpha = NULL; - device->LockHWSurface = DIB_LockHWSurface; - device->UnlockHWSurface = DIB_UnlockHWSurface; - device->FlipHWSurface = NULL; - device->FreeHWSurface = DIB_FreeHWSurface; - device->SetGammaRamp = DIB_SetGammaRamp; - device->GetGammaRamp = DIB_GetGammaRamp; -#if SDL_VIDEO_OPENGL - device->GL_LoadLibrary = WIN_GL_LoadLibrary; - device->GL_GetProcAddress = WIN_GL_GetProcAddress; - device->GL_GetAttribute = WIN_GL_GetAttribute; - device->GL_MakeCurrent = WIN_GL_MakeCurrent; - device->GL_SwapBuffers = WIN_GL_SwapBuffers; -#endif - device->SetCaption = WIN_SetWMCaption; - device->SetIcon = WIN_SetWMIcon; - device->IconifyWindow = WIN_IconifyWindow; - device->GrabInput = WIN_GrabInput; - device->GetWMInfo = WIN_GetWMInfo; - device->FreeWMCursor = WIN_FreeWMCursor; - device->CreateWMCursor = WIN_CreateWMCursor; - device->ShowWMCursor = WIN_ShowWMCursor; - device->WarpWMCursor = WIN_WarpWMCursor; - device->CheckMouseMode = WIN_CheckMouseMode; - device->InitOSKeymap = DIB_InitOSKeymap; - device->PumpEvents = DIB_PumpEvents; - - /* Set up the windows message handling functions */ - WIN_RealizePalette = DIB_RealizePalette; - WIN_PaletteChanged = DIB_PaletteChanged; - WIN_WinPAINT = DIB_WinPAINT; - HandleMessage = DIB_HandleMessage; - - device->free = DIB_DeleteDevice; - - /* We're finally ready */ - return device; -} - -VideoBootStrap WINDIB_bootstrap = { - "windib", "Win95/98/NT/2000/CE GDI", - DIB_Available, DIB_CreateDevice -}; - -static int -cmpmodes(const void *va, const void *vb) -{ - SDL_Rect *a = *(SDL_Rect **) va; - SDL_Rect *b = *(SDL_Rect **) vb; - if (a->w == b->w) - return b->h - a->h; - else - return b->w - a->w; -} - -static int -DIB_AddMode(_THIS, int bpp, int w, int h) -{ - SDL_Rect *mode; - int i, index; - int next_mode; - - /* Check to see if we already have this mode */ - if (bpp < 8) { /* Not supported */ - return (0); - } - index = ((bpp + 7) / 8) - 1; - for (i = 0; i < SDL_nummodes[index]; ++i) { - mode = SDL_modelist[index][i]; - if ((mode->w == w) && (mode->h == h)) { - return (0); - } - } - - /* Set up the new video mode rectangle */ - mode = (SDL_Rect *) SDL_malloc(sizeof *mode); - if (mode == NULL) { - SDL_OutOfMemory(); - return (-1); - } - mode->x = 0; - mode->y = 0; - mode->w = w; - mode->h = h; - - /* Allocate the new list of modes, and fill in the new mode */ - next_mode = SDL_nummodes[index]; - SDL_modelist[index] = (SDL_Rect **) - SDL_realloc(SDL_modelist[index], - (1 + next_mode + 1) * sizeof(SDL_Rect *)); - if (SDL_modelist[index] == NULL) { - SDL_OutOfMemory(); - SDL_nummodes[index] = 0; - SDL_free(mode); - return (-1); - } - SDL_modelist[index][next_mode] = mode; - SDL_modelist[index][next_mode + 1] = NULL; - SDL_nummodes[index]++; - - return (0); -} - -static HPALETTE -DIB_CreatePalette(int bpp) -{ -/* RJR: March 28, 2000 - moved palette creation here from "DIB_VideoInit" */ - - HPALETTE handle = NULL; - - if (bpp <= 8) { - LOGPALETTE *palette; - HDC hdc; - int ncolors; - int i; - - ncolors = 1; - for (i = 0; i < bpp; ++i) { - ncolors *= 2; - } - palette = (LOGPALETTE *) SDL_malloc(sizeof(*palette) + - ncolors * sizeof(PALETTEENTRY)); - palette->palVersion = 0x300; - palette->palNumEntries = ncolors; - hdc = GetDC(SDL_Window); - GetSystemPaletteEntries(hdc, 0, ncolors, palette->palPalEntry); - ReleaseDC(SDL_Window, hdc); - handle = CreatePalette(palette); - SDL_free(palette); - } - - return handle; -} - -int -DIB_VideoInit(_THIS, SDL_PixelFormat * vformat) -{ -#ifndef NO_CHANGEDISPLAYSETTINGS - int i; - DEVMODE settings; -#endif - - /* Create the window */ - if (DIB_CreateWindow(this) < 0) { - return (-1); - } -#if !SDL_AUDIO_DISABLED - DX5_SoundFocus(SDL_Window); -#endif - - /* Determine the screen depth */ - vformat->BitsPerPixel = DIB_SussScreenDepth(); - switch (vformat->BitsPerPixel) { - case 15: - vformat->Rmask = 0x00007c00; - vformat->Gmask = 0x000003e0; - vformat->Bmask = 0x0000001f; - vformat->BitsPerPixel = 16; - break; - case 16: - vformat->Rmask = 0x0000f800; - vformat->Gmask = 0x000007e0; - vformat->Bmask = 0x0000001f; - break; - case 24: - case 32: - /* GDI defined as 8-8-8 */ - vformat->Rmask = 0x00ff0000; - vformat->Gmask = 0x0000ff00; - vformat->Bmask = 0x000000ff; - break; - default: - break; - } - - /* See if gamma is supported on this screen */ - DIB_CheckGamma(this); - -#ifndef NO_CHANGEDISPLAYSETTINGS - - settings.dmSize = sizeof(DEVMODE); - settings.dmDriverExtra = 0; -#ifdef _WIN32_WCE - settings.dmFields = DM_DISPLAYQUERYORIENTATION; - this->hidden->supportRotation = - ChangeDisplaySettingsEx(NULL, &settings, NULL, CDS_TEST, - NULL) == DISP_CHANGE_SUCCESSFUL; -#endif - /* Query for the desktop resolution */ - EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &SDL_desktop_mode); - this->info.current_w = SDL_desktop_mode.dmPelsWidth; - this->info.current_h = SDL_desktop_mode.dmPelsHeight; - - /* Query for the list of available video modes */ - for (i = 0; EnumDisplaySettings(NULL, i, &settings); ++i) { - DIB_AddMode(this, settings.dmBitsPerPel, - settings.dmPelsWidth, settings.dmPelsHeight); -#ifdef _WIN32_WCE - if (this->hidden->supportRotation) - DIB_AddMode(this, settings.dmBitsPerPel, - settings.dmPelsHeight, settings.dmPelsWidth); -#endif - } - /* Sort the mode lists */ - for (i = 0; i < NUM_MODELISTS; ++i) { - if (SDL_nummodes[i] > 0) { - SDL_qsort(SDL_modelist[i], SDL_nummodes[i], - sizeof *SDL_modelist[i], cmpmodes); - } - } -#else - // WinCE and fullscreen mode: - // We use only vformat->BitsPerPixel that allow SDL to - // emulate other bpp (8, 32) and use triple buffer, - // because SDL surface conversion is much faster than the WinCE one. - // Although it should be tested on devices with graphics accelerator. - - DIB_AddMode(this, vformat->BitsPerPixel, - GetDeviceCaps(GetDC(NULL), HORZRES), - GetDeviceCaps(GetDC(NULL), VERTRES)); - -#endif /* !NO_CHANGEDISPLAYSETTINGS */ - - /* Grab an identity palette if we are in a palettized mode */ - if (vformat->BitsPerPixel <= 8) { - /* RJR: March 28, 2000 - moved palette creation to "DIB_CreatePalette" */ - screen_pal = DIB_CreatePalette(vformat->BitsPerPixel); - } - - /* Fill in some window manager capabilities */ - this->info.wm_available = 1; - -#ifdef _WIN32_WCE - this->hidden->origRotation = -1; -#endif - - /* We're done! */ - return (0); -} - -/* We support any format at any dimension */ -SDL_Rect ** -DIB_ListModes(_THIS, SDL_PixelFormat * format, Uint32 flags) -{ - if ((flags & SDL_FULLSCREEN) == SDL_FULLSCREEN) { - return (SDL_modelist[((format->BitsPerPixel + 7) / 8) - 1]); - } else { - return ((SDL_Rect **) - 1); - } -} - - -/* - Helper fn to work out which screen depth windows is currently using. - 15 bit mode is considered 555 format, 16 bit is 565. - returns 0 for unknown mode. - (Derived from code in sept 1999 Windows Developer Journal - http://www.wdj.com/code/archive.html) -*/ -static int -DIB_SussScreenDepth() -{ -#ifdef NO_GETDIBITS - int depth; - HDC hdc; - - hdc = GetDC(SDL_Window); - depth = GetDeviceCaps(hdc, PLANES) * GetDeviceCaps(hdc, BITSPIXEL); - ReleaseDC(SDL_Window, hdc); - return (depth); -#else - int depth; - int dib_size; - LPBITMAPINFOHEADER dib_hdr; - HDC hdc; - HBITMAP hbm; - - /* Allocate enough space for a DIB header plus palette (for - * 8-bit modes) or bitfields (for 16- and 32-bit modes) - */ - dib_size = sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD); - dib_hdr = (LPBITMAPINFOHEADER) SDL_malloc(dib_size); - SDL_memset(dib_hdr, 0, dib_size); - dib_hdr->biSize = sizeof(BITMAPINFOHEADER); - - /* Get a device-dependent bitmap that's compatible with the - screen. - */ - hdc = GetDC(NULL); - hbm = CreateCompatibleBitmap(hdc, 1, 1); - - /* Convert the DDB to a DIB. We need to call GetDIBits twice: - * the first call just fills in the BITMAPINFOHEADER; the - * second fills in the bitfields or palette. - */ - GetDIBits(hdc, hbm, 0, 1, NULL, (LPBITMAPINFO) dib_hdr, DIB_RGB_COLORS); - GetDIBits(hdc, hbm, 0, 1, NULL, (LPBITMAPINFO) dib_hdr, DIB_RGB_COLORS); - DeleteObject(hbm); - ReleaseDC(NULL, hdc); - - depth = 0; - switch (dib_hdr->biBitCount) { - case 8: - depth = 8; - break; - case 24: - depth = 24; - break; - case 32: - depth = 32; - break; - case 16: - if (dib_hdr->biCompression == BI_BITFIELDS) { - /* check the red mask */ - switch (((DWORD *) ((char *) dib_hdr + dib_hdr->biSize))[0]) { - case 0xf800: - depth = 16; - break; /* 565 */ - case 0x7c00: - depth = 15; - break; /* 555 */ - } - } - } - SDL_free(dib_hdr); - return depth; -#endif /* NO_GETDIBITS */ -} - - -/* Various screen update functions available */ -static void DIB_NormalUpdate(_THIS, int numrects, SDL_Rect * rects); - -SDL_Surface * -DIB_SetVideoMode(_THIS, SDL_Surface * current, - int width, int height, int bpp, Uint32 flags) -{ - SDL_Surface *video; - Uint32 prev_flags; - DWORD style; - const DWORD directstyle = (WS_POPUP); - const DWORD windowstyle = - (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX); - const DWORD resizestyle = (WS_THICKFRAME | WS_MAXIMIZEBOX); - int binfo_size; - BITMAPINFO *binfo; - HDC hdc; - RECT bounds; - int x, y; - Uint32 Rmask, Gmask, Bmask; - - /* Clean up any GL context that may be hanging around */ - if (current->flags & SDL_INTERNALOPENGL) { - WIN_GL_ShutDown(this); - } - SDL_resizing = 1; - - /* Recalculate the bitmasks if necessary */ - if (bpp == current->format->BitsPerPixel) { - video = current; - } else { - switch (bpp) { - case 15: - case 16: - if (DIB_SussScreenDepth() == 15) { - /* 5-5-5 */ - Rmask = 0x00007c00; - Gmask = 0x000003e0; - Bmask = 0x0000001f; - } else { - /* 5-6-5 */ - Rmask = 0x0000f800; - Gmask = 0x000007e0; - Bmask = 0x0000001f; - } - break; - case 24: - case 32: - /* GDI defined as 8-8-8 */ - Rmask = 0x00ff0000; - Gmask = 0x0000ff00; - Bmask = 0x000000ff; - break; - default: - Rmask = 0x00000000; - Gmask = 0x00000000; - Bmask = 0x00000000; - break; - } - video = SDL_CreateRGBSurface(SDL_SWSURFACE, - 0, 0, bpp, Rmask, Gmask, Bmask, 0); - if (video == NULL) { - SDL_OutOfMemory(); - return (NULL); - } - } - - /* Fill in part of the video surface */ - prev_flags = video->flags; - video->flags = 0; /* Clear flags */ - video->w = width; - video->h = height; - video->pitch = SDL_CalculatePitch(video); - - /* Small fix for WinCE/Win32 - when activating window - SDL_VideoSurface is equal to zero, so activating code - is not called properly for fullscreen windows because - macros WINDIB_FULLSCREEN uses SDL_VideoSurface - */ - SDL_VideoSurface = video; - -#if defined(_WIN32_WCE) - if (flags & SDL_FULLSCREEN) - video->flags |= SDL_FULLSCREEN; -#endif - -#ifndef NO_CHANGEDISPLAYSETTINGS - /* Set fullscreen mode if appropriate */ - if ((flags & SDL_FULLSCREEN) == SDL_FULLSCREEN) { - DEVMODE settings; - BOOL changed; - - SDL_memset(&settings, 0, sizeof(DEVMODE)); - settings.dmSize = sizeof(DEVMODE); - -#ifdef _WIN32_WCE - // try to rotate screen to fit requested resolution - if (this->hidden->supportRotation) { - DWORD rotation; - - // ask current mode - settings.dmFields = DM_DISPLAYORIENTATION; - ChangeDisplaySettingsEx(NULL, &settings, NULL, CDS_TEST, NULL); - rotation = settings.dmDisplayOrientation; - - if ((width > GetDeviceCaps(GetDC(NULL), HORZRES)) - && (height < GetDeviceCaps(GetDC(NULL), VERTRES))) { - switch (rotation) { - case DMDO_0: - settings.dmDisplayOrientation = DMDO_90; - break; - case DMDO_270: - settings.dmDisplayOrientation = DMDO_180; - break; - } - if (settings.dmDisplayOrientation != rotation) { - // go to landscape - this->hidden->origRotation = rotation; - ChangeDisplaySettingsEx(NULL, &settings, NULL, CDS_RESET, - NULL); - } - } - if ((width < GetDeviceCaps(GetDC(NULL), HORZRES)) - && (height > GetDeviceCaps(GetDC(NULL), VERTRES))) { - switch (rotation) { - case DMDO_90: - settings.dmDisplayOrientation = DMDO_0; - break; - case DMDO_180: - settings.dmDisplayOrientation = DMDO_270; - break; - } - if (settings.dmDisplayOrientation != rotation) { - // go to portrait - this->hidden->origRotation = rotation; - ChangeDisplaySettingsEx(NULL, &settings, NULL, CDS_RESET, - NULL); - } - } - - } -#endif - -#ifndef _WIN32_WCE - settings.dmBitsPerPel = video->format->BitsPerPixel; - settings.dmPelsWidth = width; - settings.dmPelsHeight = height; - settings.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL; - if (width <= (int) SDL_desktop_mode.dmPelsWidth && - height <= (int) SDL_desktop_mode.dmPelsHeight) { - settings.dmDisplayFrequency = SDL_desktop_mode.dmDisplayFrequency; - settings.dmFields |= DM_DISPLAYFREQUENCY; - } - changed = - (ChangeDisplaySettings(&settings, CDS_FULLSCREEN) == - DISP_CHANGE_SUCCESSFUL); - if (!changed && (settings.dmFields & DM_DISPLAYFREQUENCY)) { - settings.dmFields &= ~DM_DISPLAYFREQUENCY; - changed = - (ChangeDisplaySettings(&settings, CDS_FULLSCREEN) == - DISP_CHANGE_SUCCESSFUL); - } -#else - changed = 1; -#endif - if (changed) { - video->flags |= SDL_FULLSCREEN; - SDL_fullscreen_mode = settings; - } - - } -#endif /* !NO_CHANGEDISPLAYSETTINGS */ - - /* Reset the palette and create a new one if necessary */ - if (screen_pal != NULL) { - /* RJR: March 28, 2000 - delete identity palette if switching from a palettized mode */ - DeleteObject(screen_pal); - screen_pal = NULL; - } - if (bpp <= 8) { - /* RJR: March 28, 2000 - create identity palette switching to a palettized mode */ - screen_pal = DIB_CreatePalette(bpp); - } - - style = GetWindowLong(SDL_Window, GWL_STYLE); - style &= ~(resizestyle | WS_MAXIMIZE); - if ((video->flags & SDL_FULLSCREEN) == SDL_FULLSCREEN) { - style &= ~windowstyle; - style |= directstyle; - } else { -#ifndef NO_CHANGEDISPLAYSETTINGS - if ((prev_flags & SDL_FULLSCREEN) == SDL_FULLSCREEN) { - ChangeDisplaySettings(NULL, 0); - } -#endif - if (flags & SDL_NOFRAME) { - style &= ~windowstyle; - style |= directstyle; - video->flags |= SDL_NOFRAME; - } else { - style &= ~directstyle; - style |= windowstyle; - if (flags & SDL_RESIZABLE) { - style |= resizestyle; - video->flags |= SDL_RESIZABLE; - } - } -#if WS_MAXIMIZE - if (IsZoomed(SDL_Window)) - style |= WS_MAXIMIZE; -#endif - } - - /* DJM: Don't piss of anyone who has setup his own window */ - if (!SDL_windowid) - SetWindowLong(SDL_Window, GWL_STYLE, style); - - /* Delete the old bitmap if necessary */ - if (screen_bmp != NULL) { - DeleteObject(screen_bmp); - } - if (!(flags & SDL_INTERNALOPENGL)) { - BOOL is16bitmode = (video->format->BytesPerPixel == 2); - - /* Suss out the bitmap info header */ - binfo_size = sizeof(*binfo); - if (is16bitmode) { - /* 16bit modes, palette area used for rgb bitmasks */ - binfo_size += 3 * sizeof(DWORD); - } else if (video->format->palette) { - binfo_size += video->format->palette->ncolors * sizeof(RGBQUAD); - } - binfo = (BITMAPINFO *) SDL_malloc(binfo_size); - if (!binfo) { - if (video != current) { - SDL_FreeSurface(video); - } - SDL_OutOfMemory(); - return (NULL); - } - - binfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - binfo->bmiHeader.biWidth = video->w; - binfo->bmiHeader.biHeight = -video->h; /* -ve for topdown bitmap */ - binfo->bmiHeader.biPlanes = 1; - binfo->bmiHeader.biSizeImage = video->h * video->pitch; - binfo->bmiHeader.biXPelsPerMeter = 0; - binfo->bmiHeader.biYPelsPerMeter = 0; - binfo->bmiHeader.biClrUsed = 0; - binfo->bmiHeader.biClrImportant = 0; - binfo->bmiHeader.biBitCount = video->format->BitsPerPixel; - - if (is16bitmode) { - /* BI_BITFIELDS tells CreateDIBSection about the rgb masks in the palette */ - binfo->bmiHeader.biCompression = BI_BITFIELDS; - ((Uint32 *) binfo->bmiColors)[0] = video->format->Rmask; - ((Uint32 *) binfo->bmiColors)[1] = video->format->Gmask; - ((Uint32 *) binfo->bmiColors)[2] = video->format->Bmask; - } else { - binfo->bmiHeader.biCompression = BI_RGB; /* BI_BITFIELDS for 565 vs 555 */ - if (video->format->palette) { - SDL_memset(binfo->bmiColors, 0, - video->format->palette->ncolors * sizeof(RGBQUAD)); - } - } - - /* Create the offscreen bitmap buffer */ - hdc = GetDC(SDL_Window); - screen_bmp = CreateDIBSection(hdc, binfo, DIB_RGB_COLORS, - (void **) (&video->pixels), NULL, 0); - ReleaseDC(SDL_Window, hdc); - SDL_free(binfo); - if (screen_bmp == NULL) { - if (video != current) { - SDL_FreeSurface(video); - } - SDL_SetError("Couldn't create DIB section"); - return (NULL); - } - this->UpdateRects = DIB_NormalUpdate; - - /* Set video surface flags */ - if (bpp <= 8) { - /* BitBlt() maps colors for us */ - video->flags |= SDL_HWPALETTE; - } - } -#ifndef _WIN32_WCE - /* Resize the window */ - if (!SDL_windowid && !IsZoomed(SDL_Window)) { -#else - if (!SDL_windowid) { -#endif - HWND top; - UINT swp_flags; - const char *window = NULL; - const char *center = NULL; - - if (!SDL_windowX && !SDL_windowY) { - window = SDL_getenv("SDL_VIDEO_WINDOW_POS"); - center = SDL_getenv("SDL_VIDEO_CENTERED"); - if (window) { - if (SDL_sscanf(window, "%d,%d", &x, &y) == 2) { - SDL_windowX = x; - SDL_windowY = y; - } - if (SDL_strcmp(window, "center") == 0) { - center = window; - } - } - } - swp_flags = (SWP_NOCOPYBITS | SWP_SHOWWINDOW); - - bounds.left = SDL_windowX; - bounds.top = SDL_windowY; - bounds.right = SDL_windowX + video->w; - bounds.bottom = SDL_windowY + video->h; - AdjustWindowRectEx(&bounds, GetWindowLong(SDL_Window, GWL_STYLE), - (GetMenu(SDL_Window) != NULL), 0); - width = bounds.right - bounds.left; - height = bounds.bottom - bounds.top; - if ((flags & SDL_FULLSCREEN)) { - x = (GetSystemMetrics(SM_CXSCREEN) - width) / 2; - y = (GetSystemMetrics(SM_CYSCREEN) - height) / 2; - } else if (center) { - x = (GetSystemMetrics(SM_CXSCREEN) - width) / 2; - y = (GetSystemMetrics(SM_CYSCREEN) - height) / 2; - } else if (SDL_windowX || SDL_windowY || window) { - x = bounds.left; - y = bounds.top; - } else { - x = y = -1; - swp_flags |= SWP_NOMOVE; - } - if (flags & SDL_FULLSCREEN) { - top = HWND_TOPMOST; - } else { - top = HWND_NOTOPMOST; - } - SetWindowPos(SDL_Window, top, x, y, width, height, swp_flags); - if (!(flags & SDL_FULLSCREEN)) { - SDL_windowX = SDL_bounds.left; - SDL_windowY = SDL_bounds.top; - } - SetForegroundWindow(SDL_Window); - } - SDL_resizing = 0; - - /* Set up for OpenGL */ - if (flags & SDL_INTERNALOPENGL) { - if (WIN_GL_SetupWindow(this) < 0) { - return (NULL); - } - video->flags |= SDL_INTERNALOPENGL; - } - - /* JC 14 Mar 2006 - Flush the message loop or this can cause big problems later - Especially if the user decides to use dialog boxes or assert()! - */ - WIN_FlushMessageQueue(); - - /* We're live! */ - return (video); -} - -/* We don't actually allow hardware surfaces in the DIB driver */ -static int -DIB_AllocHWSurface(_THIS, SDL_Surface * surface) -{ - return (-1); -} -static void -DIB_FreeHWSurface(_THIS, SDL_Surface * surface) -{ - return; -} -static int -DIB_LockHWSurface(_THIS, SDL_Surface * surface) -{ - return (0); -} -static void -DIB_UnlockHWSurface(_THIS, SDL_Surface * surface) -{ - return; -} - -static void -DIB_NormalUpdate(_THIS, int numrects, SDL_Rect * rects) -{ - HDC hdc, mdc; - int i; - - hdc = GetDC(SDL_Window); - if (screen_pal) { - SelectPalette(hdc, screen_pal, FALSE); - } - mdc = CreateCompatibleDC(hdc); - SelectObject(mdc, screen_bmp); - for (i = 0; i < numrects; ++i) { - BitBlt(hdc, rects[i].x, rects[i].y, rects[i].w, rects[i].h, - mdc, rects[i].x, rects[i].y, SRCCOPY); - } - DeleteDC(mdc); - ReleaseDC(SDL_Window, hdc); -} - - -int -DIB_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color * colors) -{ -#if !defined(_WIN32_WCE) || (_WIN32_WCE >= 400) - HDC hdc, mdc; - RGBQUAD *pal; -#else - HDC hdc; -#endif - int i; - - /* Update the display palette */ - hdc = GetDC(SDL_Window); - if (screen_pal) { - PALETTEENTRY *entries; - - entries = SDL_stack_alloc(PALETTEENTRY, ncolors); - for (i = 0; i < ncolors; ++i) { - entries[i].peRed = colors[i].r; - entries[i].peGreen = colors[i].g; - entries[i].peBlue = colors[i].b; - entries[i].peFlags = PC_NOCOLLAPSE; - } - SetPaletteEntries(screen_pal, firstcolor, ncolors, entries); - SelectPalette(hdc, screen_pal, FALSE); - RealizePalette(hdc); - SDL_stack_free(entries); - } -#if !defined(_WIN32_WCE) || (_WIN32_WCE >= 400) - /* Copy palette colors into DIB palette */ - pal = SDL_stack_alloc(RGBQUAD, ncolors); - for (i = 0; i < ncolors; ++i) { - pal[i].rgbRed = colors[i].r; - pal[i].rgbGreen = colors[i].g; - pal[i].rgbBlue = colors[i].b; - pal[i].rgbReserved = 0; - } - - /* Set the DIB palette and update the display */ - mdc = CreateCompatibleDC(hdc); - SelectObject(mdc, screen_bmp); - SetDIBColorTable(mdc, firstcolor, ncolors, pal); - BitBlt(hdc, 0, 0, this->screen->w, this->screen->h, mdc, 0, 0, SRCCOPY); - DeleteDC(mdc); - SDL_stack_free(pal); -#endif - ReleaseDC(SDL_Window, hdc); - return (1); -} - - -static void -DIB_CheckGamma(_THIS) -{ -#ifndef NO_GAMMA_SUPPORT - HDC hdc; - WORD ramp[3 * 256]; - - /* If we fail to get gamma, disable gamma control */ - hdc = GetDC(SDL_Window); - if (!GetDeviceGammaRamp(hdc, ramp)) { - this->GetGammaRamp = NULL; - this->SetGammaRamp = NULL; - } - ReleaseDC(SDL_Window, hdc); -#endif /* !NO_GAMMA_SUPPORT */ -} - -void -DIB_SwapGamma(_THIS) -{ -#ifndef NO_GAMMA_SUPPORT - HDC hdc; - - if (gamma_saved) { - hdc = GetDC(SDL_Window); - if (SDL_GetAppState() & SDL_APPINPUTFOCUS) { - /* About to leave active state, restore gamma */ - SetDeviceGammaRamp(hdc, gamma_saved); - } else { - /* About to enter active state, set game gamma */ - GetDeviceGammaRamp(hdc, gamma_saved); - SetDeviceGammaRamp(hdc, this->gamma); - } - ReleaseDC(SDL_Window, hdc); - } -#endif /* !NO_GAMMA_SUPPORT */ -} -void -DIB_QuitGamma(_THIS) -{ -#ifndef NO_GAMMA_SUPPORT - if (gamma_saved) { - /* Restore the original gamma if necessary */ - if (SDL_GetAppState() & SDL_APPINPUTFOCUS) { - HDC hdc; - - hdc = GetDC(SDL_Window); - SetDeviceGammaRamp(hdc, gamma_saved); - ReleaseDC(SDL_Window, hdc); - } - - /* Free the saved gamma memory */ - SDL_free(gamma_saved); - gamma_saved = 0; - } -#endif /* !NO_GAMMA_SUPPORT */ -} - -int -DIB_SetGammaRamp(_THIS, Uint16 * ramp) -{ -#ifdef NO_GAMMA_SUPPORT - SDL_SetError("SDL compiled without gamma ramp support"); - return -1; -#else - HDC hdc; - BOOL succeeded; - - /* Set the ramp for the display */ - if (!gamma_saved) { - gamma_saved = (WORD *) SDL_malloc(3 * 256 * sizeof(*gamma_saved)); - if (!gamma_saved) { - SDL_OutOfMemory(); - return -1; - } - hdc = GetDC(SDL_Window); - GetDeviceGammaRamp(hdc, gamma_saved); - ReleaseDC(SDL_Window, hdc); - } - if (SDL_GetAppState() & SDL_APPINPUTFOCUS) { - hdc = GetDC(SDL_Window); - succeeded = SetDeviceGammaRamp(hdc, ramp); - ReleaseDC(SDL_Window, hdc); - } else { - succeeded = TRUE; - } - return succeeded ? 0 : -1; -#endif /* !NO_GAMMA_SUPPORT */ -} - -int -DIB_GetGammaRamp(_THIS, Uint16 * ramp) -{ -#ifdef NO_GAMMA_SUPPORT - SDL_SetError("SDL compiled without gamma ramp support"); - return -1; -#else - HDC hdc; - BOOL succeeded; - - /* Get the ramp from the display */ - hdc = GetDC(SDL_Window); - succeeded = GetDeviceGammaRamp(hdc, ramp); - ReleaseDC(SDL_Window, hdc); - return succeeded ? 0 : -1; -#endif /* !NO_GAMMA_SUPPORT */ -} - -void -DIB_VideoQuit(_THIS) -{ - int i, j; - - /* Destroy the window and everything associated with it */ - if (SDL_Window) { - /* Delete the screen bitmap (also frees screen->pixels) */ - if (this->screen) { -#ifndef NO_CHANGEDISPLAYSETTINGS - if (this->screen->flags & SDL_FULLSCREEN) { - ChangeDisplaySettings(NULL, 0); - ShowWindow(SDL_Window, SW_HIDE); - } -#endif - if (this->screen->flags & SDL_OPENGL) { - WIN_GL_ShutDown(this); - } - this->screen->pixels = NULL; - } - if (screen_bmp) { - DeleteObject(screen_bmp); - screen_bmp = NULL; - } - if (screen_icn) { - DestroyIcon(screen_icn); - screen_icn = NULL; - } - DIB_QuitGamma(this); - DIB_DestroyWindow(this); - - SDL_Window = NULL; - -#if defined(_WIN32_WCE) - -// Unload wince aygshell library to prevent leak - if (aygshell) { - FreeLibrary(aygshell); - aygshell = NULL; - } -#endif - } - - for (i = 0; i < SDL_arraysize(SDL_modelist); ++i) { - if (!SDL_modelist[i]) { - continue; - } - for (j = 0; SDL_modelist[i][j]; ++j) { - SDL_free(SDL_modelist[i][j]); - } - SDL_free(SDL_modelist[i]); - SDL_modelist[i] = NULL; - SDL_nummodes[i] = 0; - } -} - -/* Exported for the windows message loop only */ -static void -DIB_FocusPalette(_THIS, int foreground) -{ - if (screen_pal != NULL) { - HDC hdc; - - hdc = GetDC(SDL_Window); - SelectPalette(hdc, screen_pal, FALSE); - if (RealizePalette(hdc)) - InvalidateRect(SDL_Window, NULL, FALSE); - ReleaseDC(SDL_Window, hdc); - } -} -static void -DIB_RealizePalette(_THIS) -{ - DIB_FocusPalette(this, 1); -} -static void -DIB_PaletteChanged(_THIS, HWND window) -{ - if (window != SDL_Window) { - DIB_FocusPalette(this, 0); - } -} - -/* Exported for the windows message loop only */ -static void -DIB_WinPAINT(_THIS, HDC hdc) -{ - HDC mdc; - - if (screen_pal) { - SelectPalette(hdc, screen_pal, FALSE); - } - mdc = CreateCompatibleDC(hdc); - SelectObject(mdc, screen_bmp); - BitBlt(hdc, 0, 0, SDL_VideoSurface->w, SDL_VideoSurface->h, - mdc, 0, 0, SRCCOPY); - DeleteDC(mdc); -} - -/* Stub in case DirectX isn't available */ -#if !SDL_AUDIO_DRIVER_DSOUND -void -DX5_SoundFocus(HWND hwnd) -{ - return; -} -#endif -/* vi: set ts=4 sw=4 expandtab: */ diff -r 4371d679ee12 -r 7d642361ef0f src/video/windib/SDL_dibvideo.h --- a/src/video/windib/SDL_dibvideo.h Wed Jul 26 03:12:05 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,64 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ -#include "SDL_config.h" - -#ifndef _SDL_dibvideo_h -#define _SDL_dibvideo_h - -#define WIN32_LEAN_AND_MEAN -#include - -/* for PDA */ -typedef enum -{ - SDL_ORIENTATION_UP, - SDL_ORIENTATION_DOWN, - SDL_ORIENTATION_LEFT, - SDL_ORIENTATION_RIGHT -} SDL_ScreenOrientation; - -/* Private display data */ -struct SDL_PrivateVideoData -{ - HBITMAP screen_bmp; - HPALETTE screen_pal; - -#define NUM_MODELISTS 4 /* 8, 16, 24, and 32 bits-per-pixel */ - int SDL_nummodes[NUM_MODELISTS]; - SDL_Rect **SDL_modelist[NUM_MODELISTS]; - - SDL_ScreenOrientation orientation; -#ifdef _WIN32_WCE - int invert; /* do to remove, used by GAPI driver! */ - char hiresFix; /* using hires mode without defining hires resource */ - int supportRotation; /* for Pocket PC devices */ - DWORD origRotation; /* for Pocket PC devices */ -#endif -}; -/* Old variable names */ -#define screen_bmp (this->hidden->screen_bmp) -#define screen_pal (this->hidden->screen_pal) -#define SDL_nummodes (this->hidden->SDL_nummodes) -#define SDL_modelist (this->hidden->SDL_modelist) - -#endif /* _SDL_dibvideo_h */ -/* vi: set ts=4 sw=4 expandtab: */ diff -r 4371d679ee12 -r 7d642361ef0f src/video/windib/SDL_vkeys.h --- a/src/video/windib/SDL_vkeys.h Wed Jul 26 03:12:05 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,76 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -#ifndef VK_0 -#define VK_0 '0' -#define VK_1 '1' -#define VK_2 '2' -#define VK_3 '3' -#define VK_4 '4' -#define VK_5 '5' -#define VK_6 '6' -#define VK_7 '7' -#define VK_8 '8' -#define VK_9 '9' -#define VK_A 'A' -#define VK_B 'B' -#define VK_C 'C' -#define VK_D 'D' -#define VK_E 'E' -#define VK_F 'F' -#define VK_G 'G' -#define VK_H 'H' -#define VK_I 'I' -#define VK_J 'J' -#define VK_K 'K' -#define VK_L 'L' -#define VK_M 'M' -#define VK_N 'N' -#define VK_O 'O' -#define VK_P 'P' -#define VK_Q 'Q' -#define VK_R 'R' -#define VK_S 'S' -#define VK_T 'T' -#define VK_U 'U' -#define VK_V 'V' -#define VK_W 'W' -#define VK_X 'X' -#define VK_Y 'Y' -#define VK_Z 'Z' -#endif /* VK_0 */ - -/* These keys haven't been defined, but were experimentally determined */ -#define VK_SEMICOLON 0xBA -#define VK_EQUALS 0xBB -#define VK_COMMA 0xBC -#define VK_MINUS 0xBD -#define VK_PERIOD 0xBE -#define VK_SLASH 0xBF -#define VK_GRAVE 0xC0 -#define VK_LBRACKET 0xDB -#define VK_BACKSLASH 0xDC -#define VK_RBRACKET 0xDD -#define VK_APOSTROPHE 0xDE -#define VK_BACKTICK 0xDF -#define VK_OEM_102 0xE2 -/* vi: set ts=4 sw=4 expandtab: */ diff -r 4371d679ee12 -r 7d642361ef0f src/video/windx5/SDL_dx5events.c --- a/src/video/windx5/SDL_dx5events.c Wed Jul 26 03:12:05 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,944 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ -#include "SDL_config.h" - -/* CAUTION!!!! If you modify this file, check ../windib/SDL_sysevents.c */ - -#include "directx.h" - -#include "SDL_main.h" -#include "SDL_events.h" -#include "SDL_video.h" -#include "SDL_syswm.h" -#include "../../events/SDL_sysevents.h" -#include "../../events/SDL_events_c.h" -#include "../wincommon/SDL_lowvideo.h" -#include "SDL_dx5video.h" - -#ifndef WM_APP -#define WM_APP 0x8000 -#endif - -#ifdef _WIN32_WCE -#define NO_GETKEYBOARDSTATE -#endif - -/* The keyboard and mouse device input */ -#define MAX_INPUTS 16 /* Maximum of 16-1 input devices */ -#define INPUT_QSIZE 512 /* Buffer up to 512 input messages */ - -static LPDIRECTINPUT dinput = NULL; -static LPDIRECTINPUTDEVICE2 SDL_DIdev[MAX_INPUTS]; -static HANDLE SDL_DIevt[MAX_INPUTS]; -static void (*SDL_DIfun[MAX_INPUTS]) (const int, DIDEVICEOBJECTDATA *); -static int SDL_DIndev = 0; -static int mouse_lost; -static int mouse_pressed; -static int mouse_buttons_swapped = 0; - -/* The translation table from a DirectInput scancode to an SDL keysym */ -static SDLKey DIK_keymap[256]; -static SDL_keysym *TranslateKey(UINT scancode, SDL_keysym * keysym, - int pressed); - -/* DJM: If the user setup the window for us, we want to save his window proc, - and give him a chance to handle some messages. */ -#ifdef STRICT -#define WNDPROCTYPE WNDPROC -#else -#define WNDPROCTYPE FARPROC -#endif -static WNDPROCTYPE userWindowProc = NULL; - -static HWND -GetTopLevelParent(HWND hWnd) -{ - HWND hParentWnd; - while (1) { - hParentWnd = GetParent(hWnd); - if (hParentWnd == NULL) - break; - hWnd = hParentWnd; - } - return hWnd; -} - -/* Convert a DirectInput return code to a text message */ -static void -SetDIerror(char *function, int code) -{ - static char *error; - static char errbuf[1024]; - - errbuf[0] = 0; - switch (code) { - case DIERR_GENERIC: - error = "Undefined error!"; - break; - case DIERR_OLDDIRECTINPUTVERSION: - error = "Your version of DirectInput needs upgrading"; - break; - case DIERR_INVALIDPARAM: - error = "Invalid parameters"; - break; - case DIERR_OUTOFMEMORY: - error = "Out of memory"; - break; - case DIERR_DEVICENOTREG: - error = "Device not registered"; - break; - case DIERR_NOINTERFACE: - error = "Interface not supported"; - break; - case DIERR_NOTINITIALIZED: - error = "Device not initialized"; - break; - default: - SDL_snprintf(errbuf, SDL_arraysize(errbuf), - "%s: Unknown DirectInput error: 0x%x", function, code); - break; - } - if (!errbuf[0]) { - SDL_snprintf(errbuf, SDL_arraysize(errbuf), "%s: %s", function, - error); - } - SDL_SetError("%s", errbuf); - return; -} - -/* Initialize DirectInput - Note: If NONEXCLUSIVE access is requested for the devices, normal - windows input messages will continue to be generated for that - input device, in addition to DirectInput messages. - */ -static void handle_keyboard(const int numevents, DIDEVICEOBJECTDATA * events); -static void handle_mouse(const int numevents, DIDEVICEOBJECTDATA * events); -struct -{ - char *name; - REFGUID guid; - LPCDIDATAFORMAT format; - DWORD win_level; - DWORD raw_level; - void (*fun) (const int numevents, DIDEVICEOBJECTDATA * events); -} inputs[] = { - { - "keyboard", - &GUID_SysKeyboard, &c_dfDIKeyboard, - (DISCL_FOREGROUND | DISCL_NONEXCLUSIVE), - (DISCL_FOREGROUND | DISCL_NONEXCLUSIVE), handle_keyboard}, { - "mouse", - &GUID_SysMouse, &c_dfDIMouse, - (DISCL_FOREGROUND | DISCL_NONEXCLUSIVE), - (DISCL_FOREGROUND | DISCL_EXCLUSIVE), handle_mouse}, { - NULL, NULL, NULL, 0, 0, NULL} -}; - -static int -DX5_DInputInit(_THIS) -{ - int i; - LPDIRECTINPUTDEVICE device; - HRESULT result; - DIPROPDWORD dipdw; - HWND topwnd; - - /* Create the DirectInput object */ - result = DInputCreate(SDL_Instance, DIRECTINPUT_VERSION, &dinput, NULL); - if (result != DI_OK) { - SetDIerror("DirectInputCreate", result); - return (-1); - } - - /* Create all of our registered input devices */ - SDL_DIndev = 0; - for (i = 0; inputs[i].name; ++i) { - /* Create the DirectInput device */ - result = IDirectInput_CreateDevice(dinput, inputs[i].guid, - &device, NULL); - if (result != DI_OK) { - SetDIerror("DirectInput::CreateDevice", result); - return (-1); - } - result = IDirectInputDevice_QueryInterface(device, - &IID_IDirectInputDevice2, - (LPVOID *) & SDL_DIdev[i]); - IDirectInputDevice_Release(device); - if (result != DI_OK) { - SetDIerror("DirectInputDevice::QueryInterface", result); - return (-1); - } - topwnd = GetTopLevelParent(SDL_Window); - result = IDirectInputDevice2_SetCooperativeLevel(SDL_DIdev[i], - topwnd, - inputs[i].win_level); - if (result != DI_OK) { - SetDIerror("DirectInputDevice::SetCooperativeLevel", result); - return (-1); - } - result = IDirectInputDevice2_SetDataFormat(SDL_DIdev[i], - inputs[i].format); - if (result != DI_OK) { - SetDIerror("DirectInputDevice::SetDataFormat", result); - return (-1); - } - - /* Set buffered input -- we aren't polling */ - SDL_memset(&dipdw, 0, sizeof(dipdw)); - dipdw.diph.dwSize = sizeof(dipdw); - dipdw.diph.dwHeaderSize = sizeof(dipdw.diph); - dipdw.diph.dwObj = 0; - dipdw.diph.dwHow = DIPH_DEVICE; - dipdw.dwData = INPUT_QSIZE; - result = IDirectInputDevice2_SetProperty(SDL_DIdev[i], - DIPROP_BUFFERSIZE, - &dipdw.diph); - if (result != DI_OK) { - SetDIerror("DirectInputDevice::SetProperty", result); - return (-1); - } - - /* Create an event to be signaled when input is ready */ - SDL_DIevt[i] = CreateEvent(NULL, FALSE, FALSE, NULL); - if (SDL_DIevt[i] == NULL) { - SDL_SetError("Couldn't create DirectInput event"); - return (-1); - } - result = IDirectInputDevice2_SetEventNotification(SDL_DIdev[i], - SDL_DIevt[i]); - if (result != DI_OK) { - SetDIerror("DirectInputDevice::SetEventNotification", result); - return (-1); - } - SDL_DIfun[i] = inputs[i].fun; - - /* Acquire the device for input */ - IDirectInputDevice2_Acquire(SDL_DIdev[i]); - - /* Increment the number of devices we have */ - ++SDL_DIndev; - } - mouse_pressed = 0; - mouse_buttons_swapped = GetSystemMetrics(SM_SWAPBUTTON); - - /* DirectInput is ready! */ - return (0); -} - -/* Clean up DirectInput */ -static void -DX5_DInputQuit(_THIS) -{ - int i; - - if (dinput != NULL) { - /* Close and release all DirectInput devices */ - for (i = 0; i < MAX_INPUTS; ++i) { - if (SDL_DIdev[i] != NULL) { - IDirectInputDevice2_Unacquire(SDL_DIdev[i]); - IDirectInputDevice2_SetEventNotification(SDL_DIdev[i], NULL); - if (SDL_DIevt[i] != NULL) { - CloseHandle(SDL_DIevt[i]); - SDL_DIevt[i] = NULL; - } - IDirectInputDevice2_Release(SDL_DIdev[i]); - SDL_DIdev[i] = NULL; - } - } - /* Release DirectInput */ - IDirectInput_Release(dinput); - dinput = NULL; - } -} - -/* Flag to tell SDL whether or not we queued an event */ -static int posted = 0; - -/* Input event handler functions */ -static void -handle_keyboard(const int numevents, DIDEVICEOBJECTDATA * keybuf) -{ - int i; - SDL_keysym keysym; - - /* Translate keyboard messages */ - for (i = 0; i < numevents; ++i) { - if (keybuf[i].dwData & 0x80) { - posted = SDL_PrivateKeyboard(SDL_PRESSED, - TranslateKey(keybuf[i].dwOfs, - &keysym, 1)); - } else { - posted = SDL_PrivateKeyboard(SDL_RELEASED, - TranslateKey(keybuf[i].dwOfs, - &keysym, 0)); - } - } -} -static void -handle_mouse(const int numevents, DIDEVICEOBJECTDATA * ptrbuf) -{ - int i; - Sint16 xrel, yrel; - Uint8 state; - Uint8 button; - DWORD timestamp = 0; - - /* Sanity check. Mailing list reports this being NULL unexpectedly. */ - if (SDL_PublicSurface == NULL) { - return; - } - - /* If we are in windowed mode, Windows is taking care of the mouse */ - if ((SDL_PublicSurface->flags & SDL_INTERNALOPENGL) || - !(SDL_PublicSurface->flags & SDL_FULLSCREEN)) { - return; - } - - /* If the mouse was lost, regain some sense of mouse state */ - if (mouse_lost) { - POINT mouse_pos; - Uint8 old_state; - Uint8 new_state; - - /* Set ourselves up with the current cursor position */ - GetCursorPos(&mouse_pos); - ScreenToClient(SDL_Window, &mouse_pos); - posted = SDL_PrivateMouseMotion(0, 0, - (Sint16) mouse_pos.x, - (Sint16) mouse_pos.y); - - /* Check for mouse button changes */ - old_state = SDL_GetMouseState(NULL, NULL); - new_state = 0; - { /* Get the new DirectInput button state for the mouse */ - DIMOUSESTATE distate; - HRESULT result; - - result = IDirectInputDevice2_GetDeviceState(SDL_DIdev[1], - sizeof(distate), - &distate); - if (result != DI_OK) { - /* Try again next time */ - SetDIerror("IDirectInputDevice2::GetDeviceState", result); - return; - } - for (i = 3; i >= 0; --i) { - if ((distate.rgbButtons[i] & 0x80) == 0x80) { - new_state |= 0x01; - } - new_state <<= 1; - } - } - for (i = 0; i < 8; ++i) { - if ((old_state & 0x01) != (new_state & 0x01)) { - button = (Uint8) (i + 1); - /* Button #2 on two button mice is button 3 - (the middle button is button 2) - */ - if (button == 2) { - button = 3; - } else if (button == 3) { - button = 2; - } - if (new_state & 0x01) { - /* Grab mouse so we get mouse-up */ - if (++mouse_pressed > 0) { - SetCapture(SDL_Window); - } - state = SDL_PRESSED; - } else { - /* Release mouse after all mouse-ups */ - if (--mouse_pressed <= 0) { - ReleaseCapture(); - mouse_pressed = 0; - } - state = SDL_RELEASED; - } - if (mouse_buttons_swapped) { - if (button == 1) - button = 3; - else if (button == 3) - button = 1; - } - posted = SDL_PrivateMouseButton(state, button, 0, 0); - } - old_state >>= 1; - new_state >>= 1; - } - mouse_lost = 0; - return; - } - - /* Translate mouse messages */ - xrel = 0; - yrel = 0; - for (i = 0; i < (int) numevents; ++i) { - switch (ptrbuf[i].dwOfs) { - case DIMOFS_X: - if (timestamp != ptrbuf[i].dwTimeStamp) { - if (xrel || yrel) { - posted = SDL_PrivateMouseMotion(0, 1, xrel, yrel); - xrel = 0; - yrel = 0; - } - timestamp = ptrbuf[i].dwTimeStamp; - } - xrel += (Sint16) ptrbuf[i].dwData; - break; - case DIMOFS_Y: - if (timestamp != ptrbuf[i].dwTimeStamp) { - if (xrel || yrel) { - posted = SDL_PrivateMouseMotion(0, 1, xrel, yrel); - xrel = 0; - yrel = 0; - } - timestamp = ptrbuf[i].dwTimeStamp; - } - yrel += (Sint16) ptrbuf[i].dwData; - break; - case DIMOFS_Z: - if (xrel || yrel) { - posted = SDL_PrivateMouseMotion(0, 1, xrel, yrel); - xrel = 0; - yrel = 0; - } - timestamp = 0; - if ((int) ptrbuf[i].dwData > 0) - button = SDL_BUTTON_WHEELUP; - else - button = SDL_BUTTON_WHEELDOWN; - posted = SDL_PrivateMouseButton(SDL_PRESSED, button, 0, 0); - posted |= SDL_PrivateMouseButton(SDL_RELEASED, button, 0, 0); - break; - case DIMOFS_BUTTON0: - case DIMOFS_BUTTON1: - case DIMOFS_BUTTON2: - case DIMOFS_BUTTON3: - if (xrel || yrel) { - posted = SDL_PrivateMouseMotion(0, 1, xrel, yrel); - xrel = 0; - yrel = 0; - } - timestamp = 0; - button = (Uint8) (ptrbuf[i].dwOfs - DIMOFS_BUTTON0) + 1; - /* Button #2 on two button mice is button 3 - (the middle button is button 2) - */ - if (button == 2) { - button = 3; - } else if (button == 3) { - button = 2; - } - if (ptrbuf[i].dwData & 0x80) { - /* Grab mouse so we get mouse-up */ - if (++mouse_pressed > 0) { - SetCapture(SDL_Window); - } - state = SDL_PRESSED; - } else { - /* Release mouse after all mouse-ups */ - if (--mouse_pressed <= 0) { - ReleaseCapture(); - mouse_pressed = 0; - } - state = SDL_RELEASED; - } - if (mouse_buttons_swapped) { - if (button == 1) - button = 3; - else if (button == 3) - button = 1; - } - posted = SDL_PrivateMouseButton(state, button, 0, 0); - break; - } - } - if (xrel || yrel) { - posted = SDL_PrivateMouseMotion(0, 1, xrel, yrel); - } -} - -/* The main Win32 event handler */ -LRESULT -DX5_HandleMessage(_THIS, HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - switch (msg) { -#ifdef WM_ACTIVATEAPP - case WM_ACTIVATEAPP: - { - int i, active; - - active = (wParam && (GetForegroundWindow() == hwnd)); - if (active) { - for (i = 0; SDL_DIdev[i]; ++i) { - IDirectInputDevice2_Acquire(SDL_DIdev[i]); - } - } else { - for (i = 0; SDL_DIdev[i]; ++i) { - IDirectInputDevice2_Unacquire(SDL_DIdev[i]); - } - mouse_lost = 1; - } - } - break; -#endif /* WM_ACTIVATEAPP */ - -#ifdef WM_DISPLAYCHANGE - case WM_DISPLAYCHANGE: - { - WPARAM BitsPerPixel; - WORD SizeX, SizeY; - - /* Ack! The display changed size and/or depth! */ - SizeX = LOWORD(lParam); - SizeY = HIWORD(lParam); - BitsPerPixel = wParam; - /* We cause this message when we go fullscreen */ - } - break; -#endif /* WM_DISPLAYCHANGE */ - - /* The keyboard is handled via DirectInput */ - case WM_SYSKEYUP: - case WM_SYSKEYDOWN: - { - /* Pass syskey to DefWindwoProc (ALT-F4, etc.) */ - } - break; - case WM_KEYUP: - case WM_KEYDOWN: - { - /* Ignore windows keyboard messages */ ; - } - return (0); - -#if defined(SC_SCREENSAVE) || defined(SC_MONITORPOWER) - /* Don't allow screen savers or monitor power downs. - This is because they quietly clear DirectX surfaces. - It would be better to allow the application to - decide whether or not to blow these off, but the - semantics of SDL_PrivateSysWMEvent() don't allow - the application that choice. - */ - case WM_SYSCOMMAND: - { - if ((wParam & 0xFFF0) == SC_SCREENSAVE || - (wParam & 0xFFF0) == SC_MONITORPOWER) - return (0); - } - /* Fall through to default processing */ - -#endif /* SC_SCREENSAVE || SC_MONITORPOWER */ - - default: - { - /* Only post the event if we're watching for it */ - if (SDL_ProcessEvents[SDL_SYSWMEVENT] == SDL_ENABLE) { - SDL_SysWMmsg wmmsg; - - SDL_VERSION(&wmmsg.version); - wmmsg.hwnd = hwnd; - wmmsg.msg = msg; - wmmsg.wParam = wParam; - wmmsg.lParam = lParam; - posted = SDL_PrivateSysWMEvent(&wmmsg); - - /* DJM: If the user isn't watching for private - messages in her SDL event loop, then pass it - along to any win32 specific window proc. - */ - } else if (userWindowProc) { - return CallWindowProc(userWindowProc, hwnd, msg, wParam, - lParam); - } - } - break; - } - return (DefWindowProc(hwnd, msg, wParam, lParam)); -} - -/* This function checks the windows message queue and DirectInput and returns - 1 if there was input, 0 if there was no input, or -1 if the application has - posted a quit message. -*/ -static int -DX5_CheckInput(_THIS, int timeout, BOOL processInput) -{ - MSG msg; - int i; - HRESULT result; - DWORD event; - - /* Check the normal windows queue (highest preference) */ - posted = 0; - while (!posted && PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) { - if (GetMessage(&msg, NULL, 0, 0) > 0) { - DispatchMessage(&msg); - } else { - return (-1); - } - } - if (posted) { - return (1); - } - - /* Pump the DirectInput flow */ - if (SDL_GetAppState() & SDL_APPINPUTFOCUS) { - for (i = 0; i < SDL_DIndev; ++i) { - result = IDirectInputDevice2_Poll(SDL_DIdev[i]); - if ((result == DIERR_INPUTLOST) || (result == DIERR_NOTACQUIRED)) { - if (SDL_strcmp(inputs[i].name, "mouse") == 0) { - mouse_lost = 1; - } - IDirectInputDevice2_Acquire(SDL_DIdev[i]); - IDirectInputDevice2_Poll(SDL_DIdev[i]); - } - } - } - - /* Wait for messages and input events */ - event = MsgWaitForMultipleObjects(SDL_DIndev, SDL_DIevt, FALSE, - timeout, QS_ALLEVENTS); - if ((event >= WAIT_OBJECT_0) && (event < (WAIT_OBJECT_0 + SDL_DIndev))) { - DWORD numevents; - static DIDEVICEOBJECTDATA evtbuf[INPUT_QSIZE]; - - event -= WAIT_OBJECT_0; - numevents = INPUT_QSIZE; - result = - IDirectInputDevice2_GetDeviceData(SDL_DIdev[event], - sizeof(DIDEVICEOBJECTDATA), - evtbuf, &numevents, 0); - if ((result == DIERR_INPUTLOST) || (result == DIERR_NOTACQUIRED)) { - if (SDL_strcmp(inputs[event].name, "mouse") == 0) { - mouse_lost = 1; - } - IDirectInputDevice2_Acquire(SDL_DIdev[event]); - result = - IDirectInputDevice2_GetDeviceData(SDL_DIdev[event], - sizeof - (DIDEVICEOBJECTDATA), - evtbuf, &numevents, 0); - } - /* Handle the events */ - if (result == DI_OK && processInput) { - /* Note: This can post multiple events to event queue - */ - (*SDL_DIfun[event]) ((int) numevents, evtbuf); - return (1); - } - } - if (event != WAIT_TIMEOUT) { - /* Maybe there was a windows message? */ - if (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) { - if (GetMessage(&msg, NULL, 0, 0) > 0) { - DispatchMessage(&msg); - } else { - return (-1); - } - return (1); - } - } - return (0); -} - -/* Change cooperative level based on whether or not we are fullscreen */ -void -DX5_DInputReset(_THIS, int fullscreen) -{ - DWORD level; - int i; - HRESULT result; - HWND topwnd; - - for (i = 0; i < MAX_INPUTS; ++i) { - if (SDL_DIdev[i] != NULL) { - if (fullscreen) { - level = inputs[i].raw_level; - } else { - level = inputs[i].win_level; - } - IDirectInputDevice2_Unacquire(SDL_DIdev[i]); - topwnd = GetTopLevelParent(SDL_Window); - result = - IDirectInputDevice2_SetCooperativeLevel(SDL_DIdev[i], - topwnd, level); - IDirectInputDevice2_Acquire(SDL_DIdev[i]); - if (result != DI_OK) { - SetDIerror("DirectInputDevice::SetCooperativeLevel", result); - } - } - } - mouse_lost = 1; - - /* Flush pending input */ - DX5_CheckInput(this, 0, FALSE); -} - -void -DX5_PumpEvents(_THIS) -{ - /* Wait for messages and DirectInput */ - while (DX5_CheckInput(this, 0, TRUE) > 0) { - /* Loop and check again */ ; - } -} - -void -DX5_InitOSKeymap(_THIS) -{ -#ifndef DIK_PAUSE -#define DIK_PAUSE 0xC5 -#endif -#ifndef DIK_OEM_102 -#define DIK_OEM_102 0x56 /* < > | on UK/Germany keyboards */ -#endif - int i; - - /* Map the DIK scancodes to SDL keysyms */ - for (i = 0; i < SDL_arraysize(DIK_keymap); ++i) - DIK_keymap[i] = 0; - - /* Defined DIK_* constants */ - DIK_keymap[DIK_ESCAPE] = SDLK_ESCAPE; - DIK_keymap[DIK_1] = SDLK_1; - DIK_keymap[DIK_2] = SDLK_2; - DIK_keymap[DIK_3] = SDLK_3; - DIK_keymap[DIK_4] = SDLK_4; - DIK_keymap[DIK_5] = SDLK_5; - DIK_keymap[DIK_6] = SDLK_6; - DIK_keymap[DIK_7] = SDLK_7; - DIK_keymap[DIK_8] = SDLK_8; - DIK_keymap[DIK_9] = SDLK_9; - DIK_keymap[DIK_0] = SDLK_0; - DIK_keymap[DIK_MINUS] = SDLK_MINUS; - DIK_keymap[DIK_EQUALS] = SDLK_EQUALS; - DIK_keymap[DIK_BACK] = SDLK_BACKSPACE; - DIK_keymap[DIK_TAB] = SDLK_TAB; - DIK_keymap[DIK_Q] = SDLK_q; - DIK_keymap[DIK_W] = SDLK_w; - DIK_keymap[DIK_E] = SDLK_e; - DIK_keymap[DIK_R] = SDLK_r; - DIK_keymap[DIK_T] = SDLK_t; - DIK_keymap[DIK_Y] = SDLK_y; - DIK_keymap[DIK_U] = SDLK_u; - DIK_keymap[DIK_I] = SDLK_i; - DIK_keymap[DIK_O] = SDLK_o; - DIK_keymap[DIK_P] = SDLK_p; - DIK_keymap[DIK_LBRACKET] = SDLK_LEFTBRACKET; - DIK_keymap[DIK_RBRACKET] = SDLK_RIGHTBRACKET; - DIK_keymap[DIK_RETURN] = SDLK_RETURN; - DIK_keymap[DIK_LCONTROL] = SDLK_LCTRL; - DIK_keymap[DIK_A] = SDLK_a; - DIK_keymap[DIK_S] = SDLK_s; - DIK_keymap[DIK_D] = SDLK_d; - DIK_keymap[DIK_F] = SDLK_f; - DIK_keymap[DIK_G] = SDLK_g; - DIK_keymap[DIK_H] = SDLK_h; - DIK_keymap[DIK_J] = SDLK_j; - DIK_keymap[DIK_K] = SDLK_k; - DIK_keymap[DIK_L] = SDLK_l; - DIK_keymap[DIK_SEMICOLON] = SDLK_SEMICOLON; - DIK_keymap[DIK_APOSTROPHE] = SDLK_QUOTE; - DIK_keymap[DIK_GRAVE] = SDLK_BACKQUOTE; - DIK_keymap[DIK_LSHIFT] = SDLK_LSHIFT; - DIK_keymap[DIK_BACKSLASH] = SDLK_BACKSLASH; - DIK_keymap[DIK_OEM_102] = SDLK_BACKSLASH; - DIK_keymap[DIK_Z] = SDLK_z; - DIK_keymap[DIK_X] = SDLK_x; - DIK_keymap[DIK_C] = SDLK_c; - DIK_keymap[DIK_V] = SDLK_v; - DIK_keymap[DIK_B] = SDLK_b; - DIK_keymap[DIK_N] = SDLK_n; - DIK_keymap[DIK_M] = SDLK_m; - DIK_keymap[DIK_COMMA] = SDLK_COMMA; - DIK_keymap[DIK_PERIOD] = SDLK_PERIOD; - DIK_keymap[DIK_SLASH] = SDLK_SLASH; - DIK_keymap[DIK_RSHIFT] = SDLK_RSHIFT; - DIK_keymap[DIK_MULTIPLY] = SDLK_KP_MULTIPLY; - DIK_keymap[DIK_LMENU] = SDLK_LALT; - DIK_keymap[DIK_SPACE] = SDLK_SPACE; - DIK_keymap[DIK_CAPITAL] = SDLK_CAPSLOCK; - DIK_keymap[DIK_F1] = SDLK_F1; - DIK_keymap[DIK_F2] = SDLK_F2; - DIK_keymap[DIK_F3] = SDLK_F3; - DIK_keymap[DIK_F4] = SDLK_F4; - DIK_keymap[DIK_F5] = SDLK_F5; - DIK_keymap[DIK_F6] = SDLK_F6; - DIK_keymap[DIK_F7] = SDLK_F7; - DIK_keymap[DIK_F8] = SDLK_F8; - DIK_keymap[DIK_F9] = SDLK_F9; - DIK_keymap[DIK_F10] = SDLK_F10; - DIK_keymap[DIK_NUMLOCK] = SDLK_NUMLOCK; - DIK_keymap[DIK_SCROLL] = SDLK_SCROLLOCK; - DIK_keymap[DIK_NUMPAD7] = SDLK_KP7; - DIK_keymap[DIK_NUMPAD8] = SDLK_KP8; - DIK_keymap[DIK_NUMPAD9] = SDLK_KP9; - DIK_keymap[DIK_SUBTRACT] = SDLK_KP_MINUS; - DIK_keymap[DIK_NUMPAD4] = SDLK_KP4; - DIK_keymap[DIK_NUMPAD5] = SDLK_KP5; - DIK_keymap[DIK_NUMPAD6] = SDLK_KP6; - DIK_keymap[DIK_ADD] = SDLK_KP_PLUS; - DIK_keymap[DIK_NUMPAD1] = SDLK_KP1; - DIK_keymap[DIK_NUMPAD2] = SDLK_KP2; - DIK_keymap[DIK_NUMPAD3] = SDLK_KP3; - DIK_keymap[DIK_NUMPAD0] = SDLK_KP0; - DIK_keymap[DIK_DECIMAL] = SDLK_KP_PERIOD; - DIK_keymap[DIK_F11] = SDLK_F11; - DIK_keymap[DIK_F12] = SDLK_F12; - - DIK_keymap[DIK_F13] = SDLK_F13; - DIK_keymap[DIK_F14] = SDLK_F14; - DIK_keymap[DIK_F15] = SDLK_F15; - - DIK_keymap[DIK_NUMPADEQUALS] = SDLK_KP_EQUALS; - DIK_keymap[DIK_NUMPADENTER] = SDLK_KP_ENTER; - DIK_keymap[DIK_RCONTROL] = SDLK_RCTRL; - DIK_keymap[DIK_DIVIDE] = SDLK_KP_DIVIDE; - DIK_keymap[DIK_SYSRQ] = SDLK_PRINT; - DIK_keymap[DIK_RMENU] = SDLK_RALT; - DIK_keymap[DIK_PAUSE] = SDLK_PAUSE; - DIK_keymap[DIK_HOME] = SDLK_HOME; - DIK_keymap[DIK_UP] = SDLK_UP; - DIK_keymap[DIK_PRIOR] = SDLK_PAGEUP; - DIK_keymap[DIK_LEFT] = SDLK_LEFT; - DIK_keymap[DIK_RIGHT] = SDLK_RIGHT; - DIK_keymap[DIK_END] = SDLK_END; - DIK_keymap[DIK_DOWN] = SDLK_DOWN; - DIK_keymap[DIK_NEXT] = SDLK_PAGEDOWN; - DIK_keymap[DIK_INSERT] = SDLK_INSERT; - DIK_keymap[DIK_DELETE] = SDLK_DELETE; - DIK_keymap[DIK_LWIN] = SDLK_LMETA; - DIK_keymap[DIK_RWIN] = SDLK_RMETA; - DIK_keymap[DIK_APPS] = SDLK_MENU; -} - -static SDL_keysym * -TranslateKey(UINT scancode, SDL_keysym * keysym, int pressed) -{ - /* Set the keysym information */ - keysym->scancode = (unsigned char) scancode; - keysym->sym = DIK_keymap[scancode]; - keysym->mod = KMOD_NONE; - keysym->unicode = 0; - if (pressed && SDL_TranslateUNICODE) { - UINT vkey; -#ifndef NO_GETKEYBOARDSTATE - BYTE keystate[256]; - Uint16 wchars[2]; -#endif - - vkey = MapVirtualKey(scancode, 1); -#ifdef NO_GETKEYBOARDSTATE - /* Uh oh, better hope the vkey is close enough.. */ - keysym->unicode = vkey; -#else - GetKeyboardState(keystate); - if (SDL_ToUnicode - (vkey, scancode, keystate, wchars, - sizeof(wchars) / sizeof(wchars[0]), 0) == 1) { - keysym->unicode = wchars[0]; - } -#endif /* NO_GETKEYBOARDSTATE */ - } - return (keysym); -} - -int -DX5_CreateWindow(_THIS) -{ - char *windowid = SDL_getenv("SDL_WINDOWID"); - int i; - - /* Clear out DirectInput variables in case we fail */ - for (i = 0; i < MAX_INPUTS; ++i) { - SDL_DIdev[i] = NULL; - SDL_DIevt[i] = NULL; - SDL_DIfun[i] = NULL; - } - - SDL_RegisterApp(NULL, 0, 0); - - SDL_windowid = (windowid != NULL); - if (SDL_windowid) { - SDL_Window = (HWND) SDL_strtoull(windowid, NULL, 0); - if (SDL_Window == NULL) { - SDL_SetError("Couldn't get user specified window"); - return (-1); - } - - /* DJM: we want all event's for the user specified - window to be handled by SDL. - */ - userWindowProc = - (WNDPROCTYPE) GetWindowLongPtr(SDL_Window, GWLP_WNDPROC); - SetWindowLongPtr(SDL_Window, GWLP_WNDPROC, (LONG_PTR) WinMessage); - } else { - SDL_Window = CreateWindow(SDL_Appname, SDL_Appname, - (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU - | WS_MINIMIZEBOX), CW_USEDEFAULT, - CW_USEDEFAULT, 0, 0, NULL, NULL, - SDL_Instance, NULL); - if (SDL_Window == NULL) { - SDL_SetError("Couldn't create window"); - return (-1); - } - ShowWindow(SDL_Window, SW_HIDE); - } - - /* Initialize DirectInput */ - if (DX5_DInputInit(this) < 0) { - return (-1); - } - - /* JC 14 Mar 2006 - Flush the message loop or this can cause big problems later - Especially if the user decides to use dialog boxes or assert()! - */ - WIN_FlushMessageQueue(); - - /* Ready to roll */ - return (0); -} - -void -DX5_DestroyWindow(_THIS) -{ - /* Close down DirectInput */ - DX5_DInputQuit(this); - - /* Destroy our window */ - if (SDL_windowid) { - SetWindowLongPtr(SDL_Window, GWLP_WNDPROC, (LONG_PTR) userWindowProc); - } else { - DestroyWindow(SDL_Window); - } - SDL_UnregisterApp(); - - /* JC 14 Mar 2006 - Flush the message loop or this can cause big problems later - Especially if the user decides to use dialog boxes or assert()! - */ - WIN_FlushMessageQueue(); -} - -/* vi: set ts=4 sw=4 expandtab: */ diff -r 4371d679ee12 -r 7d642361ef0f src/video/windx5/SDL_dx5events_c.h --- a/src/video/windx5/SDL_dx5events_c.h Wed Jul 26 03:12:05 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,37 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ -#include "SDL_config.h" - -#include "../wincommon/SDL_lowvideo.h" - -/* Variables and functions exported by SDL_dx5events.c to other parts - of the native video subsystem (SDL_dx5video.c) -*/ -extern LONG -DX5_HandleMessage(_THIS, HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); -extern int DX5_CreateWindow(_THIS); -extern void DX5_DestroyWindow(_THIS); - -extern void DX5_PumpEvents(_THIS); -extern void DX5_InitOSKeymap(_THIS); -extern void DX5_DInputReset(_THIS, int fullscreen); -/* vi: set ts=4 sw=4 expandtab: */ diff -r 4371d679ee12 -r 7d642361ef0f src/video/windx5/SDL_dx5video.c --- a/src/video/windx5/SDL_dx5video.c Wed Jul 26 03:12:05 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2579 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ -#include "SDL_config.h" - -#include "directx.h" - -/* Not yet in the mingw32 cross-compile headers */ -#ifndef CDS_FULLSCREEN -#define CDS_FULLSCREEN 4 -#endif - -#include "SDL_timer.h" -#include "SDL_events.h" -#include "SDL_syswm.h" -#include "../SDL_sysvideo.h" -#include "../SDL_blit.h" -#include "../SDL_pixels_c.h" -#include "SDL_dx5video.h" -#include "../wincommon/SDL_syswm_c.h" -#include "../wincommon/SDL_sysmouse_c.h" -#include "SDL_dx5events_c.h" -#include "SDL_dx5yuv_c.h" -#include "../wincommon/SDL_wingl_c.h" - -#ifdef _WIN32_WCE -#define NO_CHANGEDISPLAYSETTINGS -#endif -#ifndef WS_MAXIMIZE -#define WS_MAXIMIZE 0 -#endif -#ifndef SWP_NOCOPYBITS -#define SWP_NOCOPYBITS 0 -#endif -#ifndef PC_NOCOLLAPSE -#define PC_NOCOLLAPSE 0 -#endif - - -/* DirectX function pointers for video and events */ -HRESULT(WINAPI * DDrawCreate) (GUID FAR * lpGUID, LPDIRECTDRAW FAR * lplpDD, - IUnknown FAR * pUnkOuter); -HRESULT(WINAPI * DInputCreate) (HINSTANCE hinst, DWORD dwVersion, - LPDIRECTINPUT * ppDI, LPUNKNOWN punkOuter); - -/* This is the rect EnumModes2 uses */ -struct DX5EnumRect -{ - SDL_Rect r; - int refreshRate; - struct DX5EnumRect *next; -}; -static struct DX5EnumRect *enumlists[NUM_MODELISTS]; - -/* - * Experimentally determined values for c_cfDI* constants used in DirectX 5.0 - */ - -/* Keyboard */ - -static DIOBJECTDATAFORMAT KBD_fmt[] = { - {&GUID_Key, 0, 0x8000000C, 0x00000000}, - {&GUID_Key, 1, 0x8000010C, 0x00000000}, - {&GUID_Key, 2, 0x8000020C, 0x00000000}, - {&GUID_Key, 3, 0x8000030C, 0x00000000}, - {&GUID_Key, 4, 0x8000040C, 0x00000000}, - {&GUID_Key, 5, 0x8000050C, 0x00000000}, - {&GUID_Key, 6, 0x8000060C, 0x00000000}, - {&GUID_Key, 7, 0x8000070C, 0x00000000}, - {&GUID_Key, 8, 0x8000080C, 0x00000000}, - {&GUID_Key, 9, 0x8000090C, 0x00000000}, - {&GUID_Key, 10, 0x80000A0C, 0x00000000}, - {&GUID_Key, 11, 0x80000B0C, 0x00000000}, - {&GUID_Key, 12, 0x80000C0C, 0x00000000}, - {&GUID_Key, 13, 0x80000D0C, 0x00000000}, - {&GUID_Key, 14, 0x80000E0C, 0x00000000}, - {&GUID_Key, 15, 0x80000F0C, 0x00000000}, - {&GUID_Key, 16, 0x8000100C, 0x00000000}, - {&GUID_Key, 17, 0x8000110C, 0x00000000}, - {&GUID_Key, 18, 0x8000120C, 0x00000000}, - {&GUID_Key, 19, 0x8000130C, 0x00000000}, - {&GUID_Key, 20, 0x8000140C, 0x00000000}, - {&GUID_Key, 21, 0x8000150C, 0x00000000}, - {&GUID_Key, 22, 0x8000160C, 0x00000000}, - {&GUID_Key, 23, 0x8000170C, 0x00000000}, - {&GUID_Key, 24, 0x8000180C, 0x00000000}, - {&GUID_Key, 25, 0x8000190C, 0x00000000}, - {&GUID_Key, 26, 0x80001A0C, 0x00000000}, - {&GUID_Key, 27, 0x80001B0C, 0x00000000}, - {&GUID_Key, 28, 0x80001C0C, 0x00000000}, - {&GUID_Key, 29, 0x80001D0C, 0x00000000}, - {&GUID_Key, 30, 0x80001E0C, 0x00000000}, - {&GUID_Key, 31, 0x80001F0C, 0x00000000}, - {&GUID_Key, 32, 0x8000200C, 0x00000000}, - {&GUID_Key, 33, 0x8000210C, 0x00000000}, - {&GUID_Key, 34, 0x8000220C, 0x00000000}, - {&GUID_Key, 35, 0x8000230C, 0x00000000}, - {&GUID_Key, 36, 0x8000240C, 0x00000000}, - {&GUID_Key, 37, 0x8000250C, 0x00000000}, - {&GUID_Key, 38, 0x8000260C, 0x00000000}, - {&GUID_Key, 39, 0x8000270C, 0x00000000}, - {&GUID_Key, 40, 0x8000280C, 0x00000000}, - {&GUID_Key, 41, 0x8000290C, 0x00000000}, - {&GUID_Key, 42, 0x80002A0C, 0x00000000}, - {&GUID_Key, 43, 0x80002B0C, 0x00000000}, - {&GUID_Key, 44, 0x80002C0C, 0x00000000}, - {&GUID_Key, 45, 0x80002D0C, 0x00000000}, - {&GUID_Key, 46, 0x80002E0C, 0x00000000}, - {&GUID_Key, 47, 0x80002F0C, 0x00000000}, - {&GUID_Key, 48, 0x8000300C, 0x00000000}, - {&GUID_Key, 49, 0x8000310C, 0x00000000}, - {&GUID_Key, 50, 0x8000320C, 0x00000000}, - {&GUID_Key, 51, 0x8000330C, 0x00000000}, - {&GUID_Key, 52, 0x8000340C, 0x00000000}, - {&GUID_Key, 53, 0x8000350C, 0x00000000}, - {&GUID_Key, 54, 0x8000360C, 0x00000000}, - {&GUID_Key, 55, 0x8000370C, 0x00000000}, - {&GUID_Key, 56, 0x8000380C, 0x00000000}, - {&GUID_Key, 57, 0x8000390C, 0x00000000}, - {&GUID_Key, 58, 0x80003A0C, 0x00000000}, - {&GUID_Key, 59, 0x80003B0C, 0x00000000}, - {&GUID_Key, 60, 0x80003C0C, 0x00000000}, - {&GUID_Key, 61, 0x80003D0C, 0x00000000}, - {&GUID_Key, 62, 0x80003E0C, 0x00000000}, - {&GUID_Key, 63, 0x80003F0C, 0x00000000}, - {&GUID_Key, 64, 0x8000400C, 0x00000000}, - {&GUID_Key, 65, 0x8000410C, 0x00000000}, - {&GUID_Key, 66, 0x8000420C, 0x00000000}, - {&GUID_Key, 67, 0x8000430C, 0x00000000}, - {&GUID_Key, 68, 0x8000440C, 0x00000000}, - {&GUID_Key, 69, 0x8000450C, 0x00000000}, - {&GUID_Key, 70, 0x8000460C, 0x00000000}, - {&GUID_Key, 71, 0x8000470C, 0x00000000}, - {&GUID_Key, 72, 0x8000480C, 0x00000000}, - {&GUID_Key, 73, 0x8000490C, 0x00000000}, - {&GUID_Key, 74, 0x80004A0C, 0x00000000}, - {&GUID_Key, 75, 0x80004B0C, 0x00000000}, - {&GUID_Key, 76, 0x80004C0C, 0x00000000}, - {&GUID_Key, 77, 0x80004D0C, 0x00000000}, - {&GUID_Key, 78, 0x80004E0C, 0x00000000}, - {&GUID_Key, 79, 0x80004F0C, 0x00000000}, - {&GUID_Key, 80, 0x8000500C, 0x00000000}, - {&GUID_Key, 81, 0x8000510C, 0x00000000}, - {&GUID_Key, 82, 0x8000520C, 0x00000000}, - {&GUID_Key, 83, 0x8000530C, 0x00000000}, - {&GUID_Key, 84, 0x8000540C, 0x00000000}, - {&GUID_Key, 85, 0x8000550C, 0x00000000}, - {&GUID_Key, 86, 0x8000560C, 0x00000000}, - {&GUID_Key, 87, 0x8000570C, 0x00000000}, - {&GUID_Key, 88, 0x8000580C, 0x00000000}, - {&GUID_Key, 89, 0x8000590C, 0x00000000}, - {&GUID_Key, 90, 0x80005A0C, 0x00000000}, - {&GUID_Key, 91, 0x80005B0C, 0x00000000}, - {&GUID_Key, 92, 0x80005C0C, 0x00000000}, - {&GUID_Key, 93, 0x80005D0C, 0x00000000}, - {&GUID_Key, 94, 0x80005E0C, 0x00000000}, - {&GUID_Key, 95, 0x80005F0C, 0x00000000}, - {&GUID_Key, 96, 0x8000600C, 0x00000000}, - {&GUID_Key, 97, 0x8000610C, 0x00000000}, - {&GUID_Key, 98, 0x8000620C, 0x00000000}, - {&GUID_Key, 99, 0x8000630C, 0x00000000}, - {&GUID_Key, 100, 0x8000640C, 0x00000000}, - {&GUID_Key, 101, 0x8000650C, 0x00000000}, - {&GUID_Key, 102, 0x8000660C, 0x00000000}, - {&GUID_Key, 103, 0x8000670C, 0x00000000}, - {&GUID_Key, 104, 0x8000680C, 0x00000000}, - {&GUID_Key, 105, 0x8000690C, 0x00000000}, - {&GUID_Key, 106, 0x80006A0C, 0x00000000}, - {&GUID_Key, 107, 0x80006B0C, 0x00000000}, - {&GUID_Key, 108, 0x80006C0C, 0x00000000}, - {&GUID_Key, 109, 0x80006D0C, 0x00000000}, - {&GUID_Key, 110, 0x80006E0C, 0x00000000}, - {&GUID_Key, 111, 0x80006F0C, 0x00000000}, - {&GUID_Key, 112, 0x8000700C, 0x00000000}, - {&GUID_Key, 113, 0x8000710C, 0x00000000}, - {&GUID_Key, 114, 0x8000720C, 0x00000000}, - {&GUID_Key, 115, 0x8000730C, 0x00000000}, - {&GUID_Key, 116, 0x8000740C, 0x00000000}, - {&GUID_Key, 117, 0x8000750C, 0x00000000}, - {&GUID_Key, 118, 0x8000760C, 0x00000000}, - {&GUID_Key, 119, 0x8000770C, 0x00000000}, - {&GUID_Key, 120, 0x8000780C, 0x00000000}, - {&GUID_Key, 121, 0x8000790C, 0x00000000}, - {&GUID_Key, 122, 0x80007A0C, 0x00000000}, - {&GUID_Key, 123, 0x80007B0C, 0x00000000}, - {&GUID_Key, 124, 0x80007C0C, 0x00000000}, - {&GUID_Key, 125, 0x80007D0C, 0x00000000}, - {&GUID_Key, 126, 0x80007E0C, 0x00000000}, - {&GUID_Key, 127, 0x80007F0C, 0x00000000}, - {&GUID_Key, 128, 0x8000800C, 0x00000000}, - {&GUID_Key, 129, 0x8000810C, 0x00000000}, - {&GUID_Key, 130, 0x8000820C, 0x00000000}, - {&GUID_Key, 131, 0x8000830C, 0x00000000}, - {&GUID_Key, 132, 0x8000840C, 0x00000000}, - {&GUID_Key, 133, 0x8000850C, 0x00000000}, - {&GUID_Key, 134, 0x8000860C, 0x00000000}, - {&GUID_Key, 135, 0x8000870C, 0x00000000}, - {&GUID_Key, 136, 0x8000880C, 0x00000000}, - {&GUID_Key, 137, 0x8000890C, 0x00000000}, - {&GUID_Key, 138, 0x80008A0C, 0x00000000}, - {&GUID_Key, 139, 0x80008B0C, 0x00000000}, - {&GUID_Key, 140, 0x80008C0C, 0x00000000}, - {&GUID_Key, 141, 0x80008D0C, 0x00000000}, - {&GUID_Key, 142, 0x80008E0C, 0x00000000}, - {&GUID_Key, 143, 0x80008F0C, 0x00000000}, - {&GUID_Key, 144, 0x8000900C, 0x00000000}, - {&GUID_Key, 145, 0x8000910C, 0x00000000}, - {&GUID_Key, 146, 0x8000920C, 0x00000000}, - {&GUID_Key, 147, 0x8000930C, 0x00000000}, - {&GUID_Key, 148, 0x8000940C, 0x00000000}, - {&GUID_Key, 149, 0x8000950C, 0x00000000}, - {&GUID_Key, 150, 0x8000960C, 0x00000000}, - {&GUID_Key, 151, 0x8000970C, 0x00000000}, - {&GUID_Key, 152, 0x8000980C, 0x00000000}, - {&GUID_Key, 153, 0x8000990C, 0x00000000}, - {&GUID_Key, 154, 0x80009A0C, 0x00000000}, - {&GUID_Key, 155, 0x80009B0C, 0x00000000}, - {&GUID_Key, 156, 0x80009C0C, 0x00000000}, - {&GUID_Key, 157, 0x80009D0C, 0x00000000}, - {&GUID_Key, 158, 0x80009E0C, 0x00000000}, - {&GUID_Key, 159, 0x80009F0C, 0x00000000}, - {&GUID_Key, 160, 0x8000A00C, 0x00000000}, - {&GUID_Key, 161, 0x8000A10C, 0x00000000}, - {&GUID_Key, 162, 0x8000A20C, 0x00000000}, - {&GUID_Key, 163, 0x8000A30C, 0x00000000}, - {&GUID_Key, 164, 0x8000A40C, 0x00000000}, - {&GUID_Key, 165, 0x8000A50C, 0x00000000}, - {&GUID_Key, 166, 0x8000A60C, 0x00000000}, - {&GUID_Key, 167, 0x8000A70C, 0x00000000}, - {&GUID_Key, 168, 0x8000A80C, 0x00000000}, - {&GUID_Key, 169, 0x8000A90C, 0x00000000}, - {&GUID_Key, 170, 0x8000AA0C, 0x00000000}, - {&GUID_Key, 171, 0x8000AB0C, 0x00000000}, - {&GUID_Key, 172, 0x8000AC0C, 0x00000000}, - {&GUID_Key, 173, 0x8000AD0C, 0x00000000}, - {&GUID_Key, 174, 0x8000AE0C, 0x00000000}, - {&GUID_Key, 175, 0x8000AF0C, 0x00000000}, - {&GUID_Key, 176, 0x8000B00C, 0x00000000}, - {&GUID_Key, 177, 0x8000B10C, 0x00000000}, - {&GUID_Key, 178, 0x8000B20C, 0x00000000}, - {&GUID_Key, 179, 0x8000B30C, 0x00000000}, - {&GUID_Key, 180, 0x8000B40C, 0x00000000}, - {&GUID_Key, 181, 0x8000B50C, 0x00000000}, - {&GUID_Key, 182, 0x8000B60C, 0x00000000}, - {&GUID_Key, 183, 0x8000B70C, 0x00000000}, - {&GUID_Key, 184, 0x8000B80C, 0x00000000}, - {&GUID_Key, 185, 0x8000B90C, 0x00000000}, - {&GUID_Key, 186, 0x8000BA0C, 0x00000000}, - {&GUID_Key, 187, 0x8000BB0C, 0x00000000}, - {&GUID_Key, 188, 0x8000BC0C, 0x00000000}, - {&GUID_Key, 189, 0x8000BD0C, 0x00000000}, - {&GUID_Key, 190, 0x8000BE0C, 0x00000000}, - {&GUID_Key, 191, 0x8000BF0C, 0x00000000}, - {&GUID_Key, 192, 0x8000C00C, 0x00000000}, - {&GUID_Key, 193, 0x8000C10C, 0x00000000}, - {&GUID_Key, 194, 0x8000C20C, 0x00000000}, - {&GUID_Key, 195, 0x8000C30C, 0x00000000}, - {&GUID_Key, 196, 0x8000C40C, 0x00000000}, - {&GUID_Key, 197, 0x8000C50C, 0x00000000}, - {&GUID_Key, 198, 0x8000C60C, 0x00000000}, - {&GUID_Key, 199, 0x8000C70C, 0x00000000}, - {&GUID_Key, 200, 0x8000C80C, 0x00000000}, - {&GUID_Key, 201, 0x8000C90C, 0x00000000}, - {&GUID_Key, 202, 0x8000CA0C, 0x00000000}, - {&GUID_Key, 203, 0x8000CB0C, 0x00000000}, - {&GUID_Key, 204, 0x8000CC0C, 0x00000000}, - {&GUID_Key, 205, 0x8000CD0C, 0x00000000}, - {&GUID_Key, 206, 0x8000CE0C, 0x00000000}, - {&GUID_Key, 207, 0x8000CF0C, 0x00000000}, - {&GUID_Key, 208, 0x8000D00C, 0x00000000}, - {&GUID_Key, 209, 0x8000D10C, 0x00000000}, - {&GUID_Key, 210, 0x8000D20C, 0x00000000}, - {&GUID_Key, 211, 0x8000D30C, 0x00000000}, - {&GUID_Key, 212, 0x8000D40C, 0x00000000}, - {&GUID_Key, 213, 0x8000D50C, 0x00000000}, - {&GUID_Key, 214, 0x8000D60C, 0x00000000}, - {&GUID_Key, 215, 0x8000D70C, 0x00000000}, - {&GUID_Key, 216, 0x8000D80C, 0x00000000}, - {&GUID_Key, 217, 0x8000D90C, 0x00000000}, - {&GUID_Key, 218, 0x8000DA0C, 0x00000000}, - {&GUID_Key, 219, 0x8000DB0C, 0x00000000}, - {&GUID_Key, 220, 0x8000DC0C, 0x00000000}, - {&GUID_Key, 221, 0x8000DD0C, 0x00000000}, - {&GUID_Key, 222, 0x8000DE0C, 0x00000000}, - {&GUID_Key, 223, 0x8000DF0C, 0x00000000}, - {&GUID_Key, 224, 0x8000E00C, 0x00000000}, - {&GUID_Key, 225, 0x8000E10C, 0x00000000}, - {&GUID_Key, 226, 0x8000E20C, 0x00000000}, - {&GUID_Key, 227, 0x8000E30C, 0x00000000}, - {&GUID_Key, 228, 0x8000E40C, 0x00000000}, - {&GUID_Key, 229, 0x8000E50C, 0x00000000}, - {&GUID_Key, 230, 0x8000E60C, 0x00000000}, - {&GUID_Key, 231, 0x8000E70C, 0x00000000}, - {&GUID_Key, 232, 0x8000E80C, 0x00000000}, - {&GUID_Key, 233, 0x8000E90C, 0x00000000}, - {&GUID_Key, 234, 0x8000EA0C, 0x00000000}, - {&GUID_Key, 235, 0x8000EB0C, 0x00000000}, - {&GUID_Key, 236, 0x8000EC0C, 0x00000000}, - {&GUID_Key, 237, 0x8000ED0C, 0x00000000}, - {&GUID_Key, 238, 0x8000EE0C, 0x00000000}, - {&GUID_Key, 239, 0x8000EF0C, 0x00000000}, - {&GUID_Key, 240, 0x8000F00C, 0x00000000}, - {&GUID_Key, 241, 0x8000F10C, 0x00000000}, - {&GUID_Key, 242, 0x8000F20C, 0x00000000}, - {&GUID_Key, 243, 0x8000F30C, 0x00000000}, - {&GUID_Key, 244, 0x8000F40C, 0x00000000}, - {&GUID_Key, 245, 0x8000F50C, 0x00000000}, - {&GUID_Key, 246, 0x8000F60C, 0x00000000}, - {&GUID_Key, 247, 0x8000F70C, 0x00000000}, - {&GUID_Key, 248, 0x8000F80C, 0x00000000}, - {&GUID_Key, 249, 0x8000F90C, 0x00000000}, - {&GUID_Key, 250, 0x8000FA0C, 0x00000000}, - {&GUID_Key, 251, 0x8000FB0C, 0x00000000}, - {&GUID_Key, 252, 0x8000FC0C, 0x00000000}, - {&GUID_Key, 253, 0x8000FD0C, 0x00000000}, - {&GUID_Key, 254, 0x8000FE0C, 0x00000000}, - {&GUID_Key, 255, 0x8000FF0C, 0x00000000}, -}; - -const DIDATAFORMAT c_dfDIKeyboard = { 24, 16, 0x00000002, 256, 256, KBD_fmt }; - - -/* Mouse */ - -static DIOBJECTDATAFORMAT PTR_fmt[] = { - {&GUID_XAxis, 0, 0x00FFFF03, 0x00000000}, - {&GUID_YAxis, 4, 0x00FFFF03, 0x00000000}, - {&GUID_ZAxis, 8, 0x80FFFF03, 0x00000000}, - {NULL, 12, 0x00FFFF0C, 0x00000000}, - {NULL, 13, 0x00FFFF0C, 0x00000000}, - {NULL, 14, 0x80FFFF0C, 0x00000000}, - {NULL, 15, 0x80FFFF0C, 0x00000000}, -}; - -const DIDATAFORMAT c_dfDIMouse = { 24, 16, 0x00000002, 16, 7, PTR_fmt }; - - -/* Joystick */ - -static DIOBJECTDATAFORMAT JOY_fmt[] = { - {&GUID_XAxis, 0, 0x80FFFF03, 0x00000100}, - {&GUID_YAxis, 4, 0x80FFFF03, 0x00000100}, - {&GUID_ZAxis, 8, 0x80FFFF03, 0x00000100}, - {&GUID_RxAxis, 12, 0x80FFFF03, 0x00000100}, - {&GUID_RyAxis, 16, 0x80FFFF03, 0x00000100}, - {&GUID_RzAxis, 20, 0x80FFFF03, 0x00000100}, - {&GUID_Slider, 24, 0x80FFFF03, 0x00000100}, - {&GUID_Slider, 28, 0x80FFFF03, 0x00000100}, - {&GUID_POV, 32, 0x80FFFF10, 0x00000000}, - {&GUID_POV, 36, 0x80FFFF10, 0x00000000}, - {&GUID_POV, 40, 0x80FFFF10, 0x00000000}, - {&GUID_POV, 44, 0x80FFFF10, 0x00000000}, - {NULL, 48, 0x80FFFF0C, 0x00000000}, - {NULL, 49, 0x80FFFF0C, 0x00000000}, - {NULL, 50, 0x80FFFF0C, 0x00000000}, - {NULL, 51, 0x80FFFF0C, 0x00000000}, - {NULL, 52, 0x80FFFF0C, 0x00000000}, - {NULL, 53, 0x80FFFF0C, 0x00000000}, - {NULL, 54, 0x80FFFF0C, 0x00000000}, - {NULL, 55, 0x80FFFF0C, 0x00000000}, - {NULL, 56, 0x80FFFF0C, 0x00000000}, - {NULL, 57, 0x80FFFF0C, 0x00000000}, - {NULL, 58, 0x80FFFF0C, 0x00000000}, - {NULL, 59, 0x80FFFF0C, 0x00000000}, - {NULL, 60, 0x80FFFF0C, 0x00000000}, - {NULL, 61, 0x80FFFF0C, 0x00000000}, - {NULL, 62, 0x80FFFF0C, 0x00000000}, - {NULL, 63, 0x80FFFF0C, 0x00000000}, - {NULL, 64, 0x80FFFF0C, 0x00000000}, - {NULL, 65, 0x80FFFF0C, 0x00000000}, - {NULL, 66, 0x80FFFF0C, 0x00000000}, - {NULL, 67, 0x80FFFF0C, 0x00000000}, - {NULL, 68, 0x80FFFF0C, 0x00000000}, - {NULL, 69, 0x80FFFF0C, 0x00000000}, - {NULL, 70, 0x80FFFF0C, 0x00000000}, - {NULL, 71, 0x80FFFF0C, 0x00000000}, - {NULL, 72, 0x80FFFF0C, 0x00000000}, - {NULL, 73, 0x80FFFF0C, 0x00000000}, - {NULL, 74, 0x80FFFF0C, 0x00000000}, - {NULL, 75, 0x80FFFF0C, 0x00000000}, - {NULL, 76, 0x80FFFF0C, 0x00000000}, - {NULL, 77, 0x80FFFF0C, 0x00000000}, - {NULL, 78, 0x80FFFF0C, 0x00000000}, - {NULL, 79, 0x80FFFF0C, 0x00000000}, -}; - -const DIDATAFORMAT c_dfDIJoystick = { 24, 16, 0x00000001, 80, 44, JOY_fmt }; - - -/* Initialization/Query functions */ -static int DX5_VideoInit(_THIS, SDL_PixelFormat * vformat); -static SDL_Rect **DX5_ListModes(_THIS, SDL_PixelFormat * format, - Uint32 flags); -static SDL_Surface *DX5_SetVideoMode(_THIS, SDL_Surface * current, int width, - int height, int bpp, Uint32 flags); -static int DX5_SetColors(_THIS, int firstcolor, int ncolors, - SDL_Color * colors); -static int DX5_SetGammaRamp(_THIS, Uint16 * ramp); -static int DX5_GetGammaRamp(_THIS, Uint16 * ramp); -static void DX5_VideoQuit(_THIS); - -/* Hardware surface functions */ -static int DX5_AllocHWSurface(_THIS, SDL_Surface * surface); -static int DX5_CheckHWBlit(_THIS, SDL_Surface * src, SDL_Surface * dst); -static int DX5_FillHWRect(_THIS, SDL_Surface * dst, SDL_Rect * dstrect, - Uint32 color); -static int DX5_SetHWColorKey(_THIS, SDL_Surface * surface, Uint32 key); -static int DX5_SetHWAlpha(_THIS, SDL_Surface * surface, Uint8 alpha); -static int DX5_LockHWSurface(_THIS, SDL_Surface * surface); -static void DX5_UnlockHWSurface(_THIS, SDL_Surface * surface); -static int DX5_FlipHWSurface(_THIS, SDL_Surface * surface); -static void DX5_FreeHWSurface(_THIS, SDL_Surface * surface); - -static int DX5_AllocDDSurface(_THIS, SDL_Surface * surface, - LPDIRECTDRAWSURFACE3 requested, Uint32 flag); - -/* Windows message handling functions */ -static void DX5_RealizePalette(_THIS); -static void DX5_PaletteChanged(_THIS, HWND window); -static void DX5_WinPAINT(_THIS, HDC hdc); - -/* WinDIB driver functions for manipulating gamma ramps */ -extern int DIB_SetGammaRamp(_THIS, Uint16 * ramp); -extern int DIB_GetGammaRamp(_THIS, Uint16 * ramp); -extern void DIB_QuitGamma(_THIS); - -/* Functions for loading the DirectX functions dynamically */ -static int DX5_loaded = 0; -static HINSTANCE DDrawDLL = NULL; -static HINSTANCE DInputDLL = NULL; - -void -DX5_Unload(void) -{ - if (--DX5_loaded == 0) { - if (DDrawDLL != NULL) { - FreeLibrary(DDrawDLL); - DDrawCreate = NULL; - DDrawDLL = NULL; - } - if (DInputDLL != NULL) { - FreeLibrary(DInputDLL); - DInputCreate = NULL; - DInputDLL = NULL; - } - } -} -int -DX5_Load(void) -{ - int status = 0; - - if (++DX5_loaded == 1) { - DDrawDLL = LoadLibrary(TEXT("DDRAW.DLL")); - if (DDrawDLL != NULL) { - DDrawCreate = (void *) GetProcAddress(DDrawDLL, - TEXT("DirectDrawCreate")); - } - DInputDLL = LoadLibrary(TEXT("DINPUT.DLL")); - if (DInputDLL != NULL) { - DInputCreate = (void *) GetProcAddress(DInputDLL, - TEXT - ("DirectInputCreateA")); - } - if (DDrawDLL && DDrawCreate && DInputDLL && DInputCreate) { - status = 0; - } else { - DX5_Unload(); - status = -1; - } - } - return status; -} - -/* DX5 driver bootstrap functions */ - -static int -DX5_Available(void) -{ - int ddraw_ok = 0; - HRESULT(WINAPI * DDrawCreate) (GUID *, LPDIRECTDRAW *, IUnknown *); - LPDIRECTDRAW DDraw; - - /* Version check DINPUT.DLL and DDRAW.DLL (Is DirectX okay?) */ - if (DX5_Load() < 0) { - return -1; - } - - /* Try to create a valid DirectDraw object */ - DDrawCreate = (void *) GetProcAddress(DDrawDLL, TEXT("DirectDrawCreate")); - if ((DDrawCreate != NULL) && !FAILED(DDrawCreate(NULL, &DDraw, NULL))) { - if (!FAILED(IDirectDraw_SetCooperativeLevel(DDraw, - NULL, DDSCL_NORMAL))) { - DDSURFACEDESC desc; - LPDIRECTDRAWSURFACE DDrawSurf; - LPDIRECTDRAWSURFACE3 DDrawSurf3; - - /* Try to create a DirectDrawSurface3 object */ - SDL_memset(&desc, 0, sizeof(desc)); - desc.dwSize = sizeof(desc); - desc.dwFlags = DDSD_CAPS; - desc.ddsCaps.dwCaps = - DDSCAPS_PRIMARYSURFACE | DDSCAPS_VIDEOMEMORY; - if (!FAILED - (IDirectDraw_CreateSurface(DDraw, &desc, &DDrawSurf, NULL))) { - if (!FAILED - (IDirectDrawSurface_QueryInterface - (DDrawSurf, &IID_IDirectDrawSurface3, - (LPVOID *) & DDrawSurf3))) { - /* Yay! */ - ddraw_ok = 1; - - /* Clean up.. */ - IDirectDrawSurface3_Release(DDrawSurf3); - } - IDirectDrawSurface_Release(DDrawSurf); - } - } - IDirectDraw_Release(DDraw); - } - - DX5_Unload(); - - return ddraw_ok; -} - -static void -DX5_DeleteDevice(SDL_VideoDevice * this) -{ - /* Free DirectDraw object */ - if (ddraw2 != NULL) { - IDirectDraw2_Release(ddraw2); - } - DX5_Unload(); - - if (this) { - if (this->hidden) { - SDL_free(this->hidden); - } - if (this->gl_data) { - SDL_free(this->gl_data); - } - SDL_free(this); - } -} - -static SDL_VideoDevice * -DX5_CreateDevice(int devindex) -{ - SDL_VideoDevice *device; - - /* Load DirectX */ - if (DX5_Load() < 0) { - return (NULL); - } - - /* Initialize all variables that we clean on shutdown */ - device = (SDL_VideoDevice *) SDL_malloc(sizeof(SDL_VideoDevice)); - if (device) { - SDL_memset(device, 0, (sizeof *device)); - device->hidden = (struct SDL_PrivateVideoData *) - SDL_malloc((sizeof *device->hidden)); - device->gl_data = (struct SDL_PrivateGLData *) - SDL_malloc((sizeof *device->gl_data)); - } - if ((device == NULL) || (device->hidden == NULL) || - (device->gl_data == NULL)) { - SDL_OutOfMemory(); - DX5_DeleteDevice(device); - return (NULL); - } - SDL_memset(device->hidden, 0, (sizeof *device->hidden)); - SDL_memset(device->gl_data, 0, (sizeof *device->gl_data)); - - /* Set the function pointers */ - device->VideoInit = DX5_VideoInit; - device->ListModes = DX5_ListModes; - device->SetVideoMode = DX5_SetVideoMode; - device->UpdateMouse = WIN_UpdateMouse; - device->CreateYUVOverlay = DX5_CreateYUVOverlay; - device->SetColors = DX5_SetColors; - device->UpdateRects = NULL; - device->VideoQuit = DX5_VideoQuit; - device->AllocHWSurface = DX5_AllocHWSurface; - device->CheckHWBlit = DX5_CheckHWBlit; - device->FillHWRect = DX5_FillHWRect; - device->SetHWColorKey = DX5_SetHWColorKey; - device->SetHWAlpha = DX5_SetHWAlpha; - device->LockHWSurface = DX5_LockHWSurface; - device->UnlockHWSurface = DX5_UnlockHWSurface; - device->FlipHWSurface = DX5_FlipHWSurface; - device->FreeHWSurface = DX5_FreeHWSurface; - device->SetGammaRamp = DX5_SetGammaRamp; - device->GetGammaRamp = DX5_GetGammaRamp; -#if SDL_VIDEO_OPENGL - device->GL_LoadLibrary = WIN_GL_LoadLibrary; - device->GL_GetProcAddress = WIN_GL_GetProcAddress; - device->GL_GetAttribute = WIN_GL_GetAttribute; - device->GL_MakeCurrent = WIN_GL_MakeCurrent; - device->GL_SwapBuffers = WIN_GL_SwapBuffers; -#endif - device->SetCaption = WIN_SetWMCaption; - device->SetIcon = WIN_SetWMIcon; - device->IconifyWindow = WIN_IconifyWindow; - device->GrabInput = WIN_GrabInput; - device->GetWMInfo = WIN_GetWMInfo; - device->FreeWMCursor = WIN_FreeWMCursor; - device->CreateWMCursor = WIN_CreateWMCursor; - device->ShowWMCursor = WIN_ShowWMCursor; - device->WarpWMCursor = WIN_WarpWMCursor; - device->CheckMouseMode = WIN_CheckMouseMode; - device->InitOSKeymap = DX5_InitOSKeymap; - device->PumpEvents = DX5_PumpEvents; - - /* Set up the windows message handling functions */ - WIN_RealizePalette = DX5_RealizePalette; - WIN_PaletteChanged = DX5_PaletteChanged; - WIN_WinPAINT = DX5_WinPAINT; - HandleMessage = DX5_HandleMessage; - - device->free = DX5_DeleteDevice; - - /* We're finally ready */ - return device; -} - -VideoBootStrap DIRECTX_bootstrap = { - "directx", "Win95/98/2000 DirectX", - DX5_Available, DX5_CreateDevice -}; - -static int -cmpmodes(const void *va, const void *vb) -{ - SDL_Rect *a = *(SDL_Rect **) va; - SDL_Rect *b = *(SDL_Rect **) vb; - if (a->w == b->w) - return b->h - a->h; - else - return b->w - a->w; -} - -static HRESULT WINAPI -EnumModes2(DDSURFACEDESC * desc, VOID * udata) -{ - SDL_VideoDevice *this = (SDL_VideoDevice *) udata; - struct DX5EnumRect *enumrect; -#if defined(NONAMELESSUNION) - int bpp = desc->ddpfPixelFormat.u1.dwRGBBitCount; - int refreshRate = desc->u2.dwRefreshRate; -#else - int bpp = desc->ddpfPixelFormat.dwRGBBitCount; - int refreshRate = desc->dwRefreshRate; -#endif - int maxRefreshRate; - - if (desc->dwWidth <= SDL_desktop_mode.dmPelsWidth && - desc->dwHeight <= SDL_desktop_mode.dmPelsHeight) { - maxRefreshRate = SDL_desktop_mode.dmDisplayFrequency; - } else { - maxRefreshRate = 85; /* safe value? */ - } - - switch (bpp) { - case 8: - case 16: - case 24: - case 32: - bpp /= 8; - --bpp; - if (enumlists[bpp] && - enumlists[bpp]->r.w == (Uint16) desc->dwWidth && - enumlists[bpp]->r.h == (Uint16) desc->dwHeight) { - if (refreshRate > enumlists[bpp]->refreshRate && - refreshRate <= maxRefreshRate) { - enumlists[bpp]->refreshRate = refreshRate; -#ifdef DDRAW_DEBUG - fprintf(stderr, - "New refresh rate for %d bpp: %dx%d at %d Hz\n", - (bpp + 1) * 8, (int) desc->dwWidth, - (int) desc->dwHeight, refreshRate); -#endif - } - break; - } - ++SDL_nummodes[bpp]; - enumrect = - (struct DX5EnumRect *) SDL_malloc(sizeof(struct DX5EnumRect)); - if (!enumrect) { - SDL_OutOfMemory(); - return (DDENUMRET_CANCEL); - } - enumrect->refreshRate = refreshRate; - enumrect->r.x = 0; - enumrect->r.y = 0; - enumrect->r.w = (Uint16) desc->dwWidth; - enumrect->r.h = (Uint16) desc->dwHeight; - enumrect->next = enumlists[bpp]; - enumlists[bpp] = enumrect; -#ifdef DDRAW_DEBUG - fprintf(stderr, "New mode for %d bpp: %dx%d at %d Hz\n", - (bpp + 1) * 8, (int) desc->dwWidth, (int) desc->dwHeight, - refreshRate); -#endif - break; - } - - return (DDENUMRET_OK); -} - -void -SetDDerror(const char *function, int code) -{ - static char *error; - static char errbuf[1024]; - - errbuf[0] = 0; - switch (code) { - case DDERR_GENERIC: - error = "Undefined error!"; - break; - case DDERR_EXCEPTION: - error = "Exception encountered"; - break; - case DDERR_INVALIDOBJECT: - error = "Invalid object"; - break; - case DDERR_INVALIDPARAMS: - error = "Invalid parameters"; - break; - case DDERR_NOTFOUND: - error = "Object not found"; - break; - case DDERR_INVALIDRECT: - error = "Invalid rectangle"; - break; - case DDERR_INVALIDCAPS: - error = "Invalid caps member"; - break; - case DDERR_INVALIDPIXELFORMAT: - error = "Invalid pixel format"; - break; - case DDERR_OUTOFMEMORY: - error = "Out of memory"; - break; - case DDERR_OUTOFVIDEOMEMORY: - error = "Out of video memory"; - break; - case DDERR_SURFACEBUSY: - error = "Surface busy"; - break; - case DDERR_SURFACELOST: - error = "Surface was lost"; - break; - case DDERR_WASSTILLDRAWING: - error = "DirectDraw is still drawing"; - break; - case DDERR_INVALIDSURFACETYPE: - error = "Invalid surface type"; - break; - case DDERR_NOEXCLUSIVEMODE: - error = "Not in exclusive access mode"; - break; - case DDERR_NOPALETTEATTACHED: - error = "No palette attached"; - break; - case DDERR_NOPALETTEHW: - error = "No palette hardware"; - break; - case DDERR_NOT8BITCOLOR: - error = "Not 8-bit color"; - break; - case DDERR_EXCLUSIVEMODEALREADYSET: - error = "Exclusive mode was already set"; - break; - case DDERR_HWNDALREADYSET: - error = "Window handle already set"; - break; - case DDERR_HWNDSUBCLASSED: - error = "Window handle is subclassed"; - break; - case DDERR_NOBLTHW: - error = "No blit hardware"; - break; - case DDERR_IMPLICITLYCREATED: - error = "Surface was implicitly created"; - break; - case DDERR_INCOMPATIBLEPRIMARY: - error = "Incompatible primary surface"; - break; - case DDERR_NOCOOPERATIVELEVELSET: - error = "No cooperative level set"; - break; - case DDERR_NODIRECTDRAWHW: - error = "No DirectDraw hardware"; - break; - case DDERR_NOEMULATION: - error = "No emulation available"; - break; - case DDERR_NOFLIPHW: - error = "No flip hardware"; - break; - case DDERR_NOTFLIPPABLE: - error = "Surface not flippable"; - break; - case DDERR_PRIMARYSURFACEALREADYEXISTS: - error = "Primary surface already exists"; - break; - case DDERR_UNSUPPORTEDMODE: - error = "Unsupported mode"; - break; - case DDERR_WRONGMODE: - error = "Surface created in different mode"; - break; - case DDERR_UNSUPPORTED: - error = "Operation not supported"; - break; - case E_NOINTERFACE: - error = "Interface not present"; - break; - default: - SDL_snprintf(errbuf, SDL_arraysize(errbuf), - "%s: Unknown DirectDraw error: 0x%x", function, code); - break; - } - if (!errbuf[0]) { - SDL_snprintf(errbuf, SDL_arraysize(errbuf), "%s: %s", function, - error); - } - SDL_SetError("%s", errbuf); - return; -} - - -static int -DX5_UpdateVideoInfo(_THIS) -{ - /* This needs to be DDCAPS_DX5 for the DirectDraw2 interface */ -#if DIRECTDRAW_VERSION <= 0x300 -#error Your version of DirectX must be greater than or equal to 5.0 -#endif -#ifndef IDirectDrawGammaControl_SetGammaRamp - /*if gamma is undefined then we really have directx <= 0x500 */ - DDCAPS DDCaps; -#else - DDCAPS_DX5 DDCaps; -#endif - HRESULT result; - - /* Fill in our hardware acceleration capabilities */ - SDL_memset(&DDCaps, 0, sizeof(DDCaps)); - DDCaps.dwSize = sizeof(DDCaps); - result = IDirectDraw2_GetCaps(ddraw2, (DDCAPS *) & DDCaps, NULL); - if (result != DD_OK) { - SetDDerror("DirectDraw2::GetCaps", result); - return (-1); - } - this->info.hw_available = 1; - if ((DDCaps.dwCaps & DDCAPS_BLT) == DDCAPS_BLT) { - this->info.blit_hw = 1; - } - if (((DDCaps.dwCaps & DDCAPS_COLORKEY) == DDCAPS_COLORKEY) && - ((DDCaps.dwCKeyCaps & DDCKEYCAPS_SRCBLT) == DDCKEYCAPS_SRCBLT)) { - this->info.blit_hw_CC = 1; - } - if ((DDCaps.dwCaps & DDCAPS_ALPHA) == DDCAPS_ALPHA) { - /* This is only for alpha channel, and DirectX 6 - doesn't support 2D alpha blits yet, so set it 0 - */ - this->info.blit_hw_A = 0; - } - if ((DDCaps.dwCaps & DDCAPS_CANBLTSYSMEM) == DDCAPS_CANBLTSYSMEM) { - this->info.blit_sw = 1; - /* This isn't necessarily true, but the HEL will cover us */ - this->info.blit_sw_CC = this->info.blit_hw_CC; - this->info.blit_sw_A = this->info.blit_hw_A; - } - if ((DDCaps.dwCaps & DDCAPS_BLTCOLORFILL) == DDCAPS_BLTCOLORFILL) { - this->info.blit_fill = 1; - } - - /* Find out how much video memory is available */ - { - DDSCAPS ddsCaps; - DWORD total_mem; - ddsCaps.dwCaps = DDSCAPS_VIDEOMEMORY; - result = IDirectDraw2_GetAvailableVidMem(ddraw2, - &ddsCaps, &total_mem, NULL); - if (result != DD_OK) { - total_mem = DDCaps.dwVidMemTotal; - } - this->info.video_mem = total_mem / 1024; - } - return (0); -} - -int -DX5_VideoInit(_THIS, SDL_PixelFormat * vformat) -{ - HRESULT result; - LPDIRECTDRAW ddraw; - int i, j; - HDC hdc; - - /* Intialize everything */ - ddraw2 = NULL; - SDL_primary = NULL; - SDL_clipper = NULL; - SDL_palette = NULL; - for (i = 0; i < NUM_MODELISTS; ++i) { - SDL_nummodes[i] = 0; - SDL_modelist[i] = NULL; - SDL_modeindex[i] = 0; - } - colorchange_expected = 0; - - /* Create the window */ - if (DX5_CreateWindow(this) < 0) { - return (-1); - } -#if !SDL_AUDIO_DISABLED - DX5_SoundFocus(SDL_Window); -#endif - - /* Create the DirectDraw object */ - result = DDrawCreate(NULL, &ddraw, NULL); - if (result != DD_OK) { - SetDDerror("DirectDrawCreate", result); - return (-1); - } - result = IDirectDraw_QueryInterface(ddraw, &IID_IDirectDraw2, - (LPVOID *) & ddraw2); - IDirectDraw_Release(ddraw); - if (result != DD_OK) { - SetDDerror("DirectDraw::QueryInterface", result); - return (-1); - } - - /* Determine the screen depth */ - hdc = GetDC(SDL_Window); - vformat->BitsPerPixel = GetDeviceCaps(hdc, PLANES) * - GetDeviceCaps(hdc, BITSPIXEL); - ReleaseDC(SDL_Window, hdc); - -#ifndef NO_CHANGEDISPLAYSETTINGS - /* Query for the desktop resolution */ - EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &SDL_desktop_mode); - this->info.current_w = SDL_desktop_mode.dmPelsWidth; - this->info.current_h = SDL_desktop_mode.dmPelsHeight; -#endif - - /* Enumerate the available fullscreen modes */ - for (i = 0; i < NUM_MODELISTS; ++i) - enumlists[i] = NULL; - - result = - IDirectDraw2_EnumDisplayModes(ddraw2, DDEDM_REFRESHRATES, NULL, this, - EnumModes2); - if (result != DD_OK) { - SetDDerror("DirectDraw2::EnumDisplayModes", result); - return (-1); - } - for (i = 0; i < NUM_MODELISTS; ++i) { - struct DX5EnumRect *rect; - SDL_modelist[i] = (SDL_Rect **) - SDL_malloc((SDL_nummodes[i] + 1) * sizeof(SDL_Rect *)); - if (SDL_modelist[i] == NULL) { - SDL_OutOfMemory(); - return (-1); - } - for (j = 0, rect = enumlists[i]; rect; ++j, rect = rect->next) { - SDL_modelist[i][j] = &rect->r; - } - SDL_modelist[i][j] = NULL; - - if (SDL_nummodes[i] > 0) { - SDL_qsort(SDL_modelist[i], SDL_nummodes[i], - sizeof *SDL_modelist[i], cmpmodes); - } - } - - /* Fill in some window manager capabilities */ - this->info.wm_available = 1; - - /* Fill in the video hardware capabilities */ - DX5_UpdateVideoInfo(this); - - return (0); -} - -SDL_Rect ** -DX5_ListModes(_THIS, SDL_PixelFormat * format, Uint32 flags) -{ - int bpp; - - bpp = format->BitsPerPixel; - if ((flags & SDL_FULLSCREEN) == SDL_FULLSCREEN) { - /* FIXME: No support for 1 bpp or 4 bpp formats */ - switch (bpp) { /* Does windows support other BPP? */ - case 8: - case 16: - case 24: - case 32: - bpp = (bpp / 8) - 1; - if (SDL_nummodes[bpp] > 0) - return (SDL_modelist[bpp]); - /* Fall through */ - default: - return ((SDL_Rect **) 0); - } - } else { - if (this->screen->format->BitsPerPixel == bpp) { - return ((SDL_Rect **) - 1); - } else { - return ((SDL_Rect **) 0); - } - } -} - -/* Various screen update functions available */ -static void DX5_WindowUpdate(_THIS, int numrects, SDL_Rect * rects); -static void DX5_DirectUpdate(_THIS, int numrects, SDL_Rect * rects); - -SDL_Surface * -DX5_SetVideoMode(_THIS, SDL_Surface * current, - int width, int height, int bpp, Uint32 flags) -{ - SDL_Surface *video; - HRESULT result; - DWORD sharemode; - DWORD style; - const DWORD directstyle = (WS_POPUP); - const DWORD windowstyle = - (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX); - const DWORD resizestyle = (WS_THICKFRAME | WS_MAXIMIZEBOX); - DDSURFACEDESC ddsd; - LPDIRECTDRAWSURFACE dd_surface1; - LPDIRECTDRAWSURFACE3 dd_surface3; - - SDL_resizing = 1; -#ifdef DDRAW_DEBUG - fprintf(stderr, "Setting %dx%dx%d video mode\n", width, height, bpp); -#endif - /* Clean up any previous DirectDraw surfaces */ - if (current->hwdata) { - this->FreeHWSurface(this, current); - current->hwdata = NULL; - } - if (SDL_primary != NULL) { - IDirectDrawSurface3_Release(SDL_primary); - SDL_primary = NULL; - } -#ifndef NO_CHANGEDISPLAYSETTINGS - /* Unset any previous OpenGL fullscreen mode */ - if ((current->flags & (SDL_INTERNALOPENGL | SDL_FULLSCREEN)) == - (SDL_INTERNALOPENGL | SDL_FULLSCREEN)) { - ChangeDisplaySettings(NULL, 0); - } -#endif - - /* Clean up any GL context that may be hanging around */ - if (current->flags & SDL_INTERNALOPENGL) { - WIN_GL_ShutDown(this); - } - - /* If we are setting a GL mode, use GDI, not DirectX (yuck) */ - if (flags & SDL_INTERNALOPENGL) { - Uint32 Rmask, Gmask, Bmask; - - /* Recalculate the bitmasks if necessary */ - if (bpp == current->format->BitsPerPixel) { - video = current; - } else { - switch (bpp) { - case 15: - case 16: - if (0 /*DIB_SussScreenDepth() == 15 */ ) { - /* 5-5-5 */ - Rmask = 0x00007c00; - Gmask = 0x000003e0; - Bmask = 0x0000001f; - } else { - /* 5-6-5 */ - Rmask = 0x0000f800; - Gmask = 0x000007e0; - Bmask = 0x0000001f; - } - break; - case 24: - case 32: - /* GDI defined as 8-8-8 */ - Rmask = 0x00ff0000; - Gmask = 0x0000ff00; - Bmask = 0x000000ff; - break; - default: - Rmask = 0x00000000; - Gmask = 0x00000000; - Bmask = 0x00000000; - break; - } - video = SDL_CreateRGBSurface(SDL_SWSURFACE, 0, 0, bpp, - Rmask, Gmask, Bmask, 0); - if (video == NULL) { - SDL_OutOfMemory(); - return (NULL); - } - } - - /* Fill in part of the video surface */ - video->flags = 0; /* Clear flags */ - video->w = width; - video->h = height; - video->pitch = SDL_CalculatePitch(video); - -#ifndef NO_CHANGEDISPLAYSETTINGS - /* Set fullscreen mode if appropriate. - Ugh, since our list of valid video modes comes from - the DirectX driver, we may not actually be able to - change to the desired resolution here. - FIXME: Should we do a closest match? - */ - if ((flags & SDL_FULLSCREEN) == SDL_FULLSCREEN) { - DEVMODE settings; - BOOL changed; - - SDL_memset(&settings, 0, sizeof(DEVMODE)); - settings.dmSize = sizeof(DEVMODE); - settings.dmBitsPerPel = video->format->BitsPerPixel; - settings.dmPelsWidth = width; - settings.dmPelsHeight = height; - settings.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL; - if (width <= (int) SDL_desktop_mode.dmPelsWidth - && height <= (int) SDL_desktop_mode.dmPelsHeight) { - settings.dmDisplayFrequency = - SDL_desktop_mode.dmDisplayFrequency; - settings.dmFields |= DM_DISPLAYFREQUENCY; - } - changed = - (ChangeDisplaySettings(&settings, CDS_FULLSCREEN) == - DISP_CHANGE_SUCCESSFUL); - if (!changed && (settings.dmFields & DM_DISPLAYFREQUENCY)) { - settings.dmFields &= ~DM_DISPLAYFREQUENCY; - changed = (ChangeDisplaySettings(&settings, CDS_FULLSCREEN) - == DISP_CHANGE_SUCCESSFUL); - } - if (changed) { - video->flags |= SDL_FULLSCREEN; - SDL_fullscreen_mode = settings; - } - } -#endif /* !NO_CHANGEDISPLAYSETTINGS */ - - style = GetWindowLong(SDL_Window, GWL_STYLE); - style &= ~(resizestyle | WS_MAXIMIZE); - if (video->flags & SDL_FULLSCREEN) { - style &= ~windowstyle; - style |= directstyle; - } else { - if (flags & SDL_NOFRAME) { - style &= ~windowstyle; - style |= directstyle; - video->flags |= SDL_NOFRAME; - } else { - style &= ~directstyle; - style |= windowstyle; - if (flags & SDL_RESIZABLE) { - style |= resizestyle; - video->flags |= SDL_RESIZABLE; - } - } -#if WS_MAXIMIZE - if (IsZoomed(SDL_Window)) - style |= WS_MAXIMIZE; -#endif - } - - /* DJM: Don't piss of anyone who has setup his own window */ - if (!SDL_windowid) - SetWindowLong(SDL_Window, GWL_STYLE, style); - - /* Resize the window (copied from SDL WinDIB driver) */ - if (!SDL_windowid && !IsZoomed(SDL_Window)) { - RECT bounds; - int x, y; - HWND top; - UINT swp_flags; - const char *window = NULL; - const char *center = NULL; - - if (!SDL_windowX && !SDL_windowY) { - window = SDL_getenv("SDL_VIDEO_WINDOW_POS"); - center = SDL_getenv("SDL_VIDEO_CENTERED"); - if (window) { - if (SDL_sscanf(window, "%d,%d", &x, &y) == 2) { - SDL_windowX = x; - SDL_windowY = y; - } - if (SDL_strcmp(window, "center") == 0) { - center = window; - } - } - } - swp_flags = (SWP_NOCOPYBITS | SWP_SHOWWINDOW); - - bounds.left = SDL_windowX; - bounds.top = SDL_windowY; - bounds.right = SDL_windowX + video->w; - bounds.bottom = SDL_windowY + video->h; - AdjustWindowRectEx(&bounds, GetWindowLong(SDL_Window, GWL_STYLE), - (GetMenu(SDL_Window) != NULL), 0); - width = bounds.right - bounds.left; - height = bounds.bottom - bounds.top; - if ((flags & SDL_FULLSCREEN)) { - x = (GetSystemMetrics(SM_CXSCREEN) - width) / 2; - y = (GetSystemMetrics(SM_CYSCREEN) - height) / 2; - } else if (center) { - x = (GetSystemMetrics(SM_CXSCREEN) - width) / 2; - y = (GetSystemMetrics(SM_CYSCREEN) - height) / 2; - } else if (SDL_windowX || SDL_windowY || window) { - x = bounds.left; - y = bounds.top; - } else { - x = y = -1; - swp_flags |= SWP_NOMOVE; - } - if (flags & SDL_FULLSCREEN) { - top = HWND_TOPMOST; - } else { - top = HWND_NOTOPMOST; - } - SetWindowPos(SDL_Window, top, x, y, width, height, swp_flags); - if (!(flags & SDL_FULLSCREEN)) { - SDL_windowX = SDL_bounds.left; - SDL_windowY = SDL_bounds.top; - } - SetForegroundWindow(SDL_Window); - } - SDL_resizing = 0; - - /* Set up for OpenGL */ - if (WIN_GL_SetupWindow(this) < 0) { - return (NULL); - } - video->flags |= SDL_INTERNALOPENGL; - return (video); - } - - /* Set the appropriate window style */ - style = GetWindowLong(SDL_Window, GWL_STYLE); - style &= ~(resizestyle | WS_MAXIMIZE); - if ((flags & SDL_FULLSCREEN) == SDL_FULLSCREEN) { - style &= ~windowstyle; - style |= directstyle; - } else { - if (flags & SDL_NOFRAME) { - style &= ~windowstyle; - style |= directstyle; - } else { - style &= ~directstyle; - style |= windowstyle; - if (flags & SDL_RESIZABLE) { - style |= resizestyle; - } - } -#if WS_MAXIMIZE - if (IsZoomed(SDL_Window)) - style |= WS_MAXIMIZE; -#endif - } - /* DJM: Don't piss of anyone who has setup his own window */ - if (!SDL_windowid) - SetWindowLong(SDL_Window, GWL_STYLE, style); - - /* Set DirectDraw sharing mode.. exclusive when fullscreen */ - if ((flags & SDL_FULLSCREEN) == SDL_FULLSCREEN) { - sharemode = DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT; - } else { - sharemode = DDSCL_NORMAL; - } - result = IDirectDraw2_SetCooperativeLevel(ddraw2, SDL_Window, sharemode); - if (result != DD_OK) { - SetDDerror("DirectDraw2::SetCooperativeLevel", result); - return (NULL); - } - - /* Set the display mode, if we are in fullscreen mode */ - if ((flags & SDL_FULLSCREEN) == SDL_FULLSCREEN) { - RECT bounds; - struct DX5EnumRect *rect; - int maxRefreshRate; - - /* Cover up desktop during mode change */ - bounds.left = 0; - bounds.top = 0; - bounds.right = GetSystemMetrics(SM_CXSCREEN); - bounds.bottom = GetSystemMetrics(SM_CYSCREEN); - AdjustWindowRectEx(&bounds, GetWindowLong(SDL_Window, GWL_STYLE), - (GetMenu(SDL_Window) != NULL), 0); - SetWindowPos(SDL_Window, HWND_TOPMOST, bounds.left, bounds.top, - bounds.right - bounds.left, bounds.bottom - bounds.top, - SWP_NOCOPYBITS); - ShowWindow(SDL_Window, SW_SHOW); - while (GetForegroundWindow() != SDL_Window) { - SetForegroundWindow(SDL_Window); - SDL_Delay(100); - } - - /* find maximum monitor refresh rate for this resolution */ - /* Dmitry Yakimov ftech@tula.net */ - maxRefreshRate = 0; /* system default */ - for (rect = enumlists[bpp / 8 - 1]; rect; rect = rect->next) { - if ((width == rect->r.w) && (height == rect->r.h)) { - maxRefreshRate = rect->refreshRate; - break; - } - } -#ifdef DDRAW_DEBUG - fprintf(stderr, "refresh rate = %d Hz\n", maxRefreshRate); -#endif - - result = - IDirectDraw2_SetDisplayMode(ddraw2, width, height, bpp, - maxRefreshRate, 0); - if (result != DD_OK) { - result = - IDirectDraw2_SetDisplayMode(ddraw2, width, height, bpp, 0, 0); - if (result != DD_OK) { - /* We couldn't set fullscreen mode, try window */ - return (DX5_SetVideoMode - (this, current, width, height, bpp, - flags & ~SDL_FULLSCREEN)); - } - } - DX5_DInputReset(this, 1); - } else { - DX5_DInputReset(this, 0); - } - DX5_UpdateVideoInfo(this); - - /* Create a primary DirectDraw surface */ - SDL_memset(&ddsd, 0, sizeof(ddsd)); - ddsd.dwSize = sizeof(ddsd); - ddsd.dwFlags = DDSD_CAPS; - ddsd.ddsCaps.dwCaps = (DDSCAPS_PRIMARYSURFACE | DDSCAPS_VIDEOMEMORY); - if ((flags & SDL_FULLSCREEN) != SDL_FULLSCREEN) { - /* There's no windowed double-buffering */ - flags &= ~SDL_DOUBLEBUF; - } - if ((flags & SDL_DOUBLEBUF) == SDL_DOUBLEBUF) { - ddsd.dwFlags |= DDSD_BACKBUFFERCOUNT; - ddsd.ddsCaps.dwCaps |= (DDSCAPS_COMPLEX | DDSCAPS_FLIP); - ddsd.dwBackBufferCount = 1; - } - result = IDirectDraw2_CreateSurface(ddraw2, &ddsd, &dd_surface1, NULL); - if ((result != DD_OK) && ((flags & SDL_DOUBLEBUF) == SDL_DOUBLEBUF)) { - ddsd.dwFlags &= ~DDSD_BACKBUFFERCOUNT; - ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_COMPLEX | DDSCAPS_FLIP); - ddsd.dwBackBufferCount = 0; - result = IDirectDraw2_CreateSurface(ddraw2, - &ddsd, &dd_surface1, NULL); - } - if (result != DD_OK) { - SetDDerror("DirectDraw2::CreateSurface(PRIMARY)", result); - return (NULL); - } - result = IDirectDrawSurface_QueryInterface(dd_surface1, - &IID_IDirectDrawSurface3, - (LPVOID *) & SDL_primary); - if (result != DD_OK) { - SetDDerror("DirectDrawSurface::QueryInterface", result); - return (NULL); - } - IDirectDrawSurface_Release(dd_surface1); - - /* Get the format of the primary DirectDraw surface */ - SDL_memset(&ddsd, 0, sizeof(ddsd)); - ddsd.dwSize = sizeof(ddsd); - ddsd.dwFlags = DDSD_PIXELFORMAT | DDSD_CAPS; - result = IDirectDrawSurface3_GetSurfaceDesc(SDL_primary, &ddsd); - if (result != DD_OK) { - SetDDerror("DirectDrawSurface::GetSurfaceDesc", result); - return (NULL); - } - if (!(ddsd.ddpfPixelFormat.dwFlags & DDPF_RGB)) { - SDL_SetError("Primary DDRAW surface is not RGB format"); - return (NULL); - } - - /* Free old palette and create a new one if we're in 8-bit mode */ - if (SDL_palette != NULL) { - IDirectDrawPalette_Release(SDL_palette); - SDL_palette = NULL; - } -#if defined(NONAMELESSUNION) - if (ddsd.ddpfPixelFormat.u1.dwRGBBitCount == 8) { -#else - if (ddsd.ddpfPixelFormat.dwRGBBitCount == 8) { -#endif - int i; - - if ((flags & SDL_FULLSCREEN) == SDL_FULLSCREEN) { - /* We have access to the entire palette */ - for (i = 0; i < 256; ++i) { - SDL_colors[i].peFlags = (PC_NOCOLLAPSE | PC_RESERVED); - SDL_colors[i].peRed = 0; - SDL_colors[i].peGreen = 0; - SDL_colors[i].peBlue = 0; - } - } else { - /* First 10 colors are reserved by Windows */ - for (i = 0; i < 10; ++i) { - SDL_colors[i].peFlags = PC_EXPLICIT; - SDL_colors[i].peRed = i; - SDL_colors[i].peGreen = 0; - SDL_colors[i].peBlue = 0; - } - for (i = 10; i < (10 + 236); ++i) { - SDL_colors[i].peFlags = PC_NOCOLLAPSE; - SDL_colors[i].peRed = 0; - SDL_colors[i].peGreen = 0; - SDL_colors[i].peBlue = 0; - } - /* Last 10 colors are reserved by Windows */ - for (i = 246; i < 256; ++i) { - SDL_colors[i].peFlags = PC_EXPLICIT; - SDL_colors[i].peRed = i; - SDL_colors[i].peGreen = 0; - SDL_colors[i].peBlue = 0; - } - } - result = IDirectDraw2_CreatePalette(ddraw2, - (DDPCAPS_8BIT | - DDPCAPS_ALLOW256), SDL_colors, - &SDL_palette, NULL); - if (result != DD_OK) { - SetDDerror("DirectDraw2::CreatePalette", result); - return (NULL); - } - result = IDirectDrawSurface3_SetPalette(SDL_primary, SDL_palette); - if (result != DD_OK) { - SetDDerror("DirectDrawSurface3::SetPalette", result); - return (NULL); - } - } - - /* Create our video surface using the same pixel format */ - video = current; - if ((width != video->w) || (height != video->h) - || (video->format->BitsPerPixel != -#if defined(NONAMELESSUNION) - ddsd.ddpfPixelFormat.u1.dwRGBBitCount)) { -#else - ddsd.ddpfPixelFormat.dwRGBBitCount)) { -#endif - SDL_FreeSurface(video); - video = SDL_CreateRGBSurface(SDL_SWSURFACE, 0, 0, -#if defined(NONAMELESSUNION) - ddsd.ddpfPixelFormat.u1.dwRGBBitCount, - ddsd.ddpfPixelFormat.u2.dwRBitMask, - ddsd.ddpfPixelFormat.u3.dwGBitMask, - ddsd.ddpfPixelFormat.u4.dwBBitMask, -#else - ddsd.ddpfPixelFormat.dwRGBBitCount, - ddsd.ddpfPixelFormat.dwRBitMask, - ddsd.ddpfPixelFormat.dwGBitMask, - ddsd.ddpfPixelFormat.dwBBitMask, -#endif - 0); - if (video == NULL) { - SDL_OutOfMemory(); - return (NULL); - } - video->w = width; - video->h = height; - video->pitch = 0; - } - video->flags = 0; /* Clear flags */ - - /* If not fullscreen, locking is possible, but it doesn't do what - the caller really expects -- if the locked surface is written to, - the appropriate portion of the entire screen is modified, not - the application window, as we would like. - Note that it is still possible to write directly to display - memory, but the application must respect the clip list of - the surface. There might be some odd timing interactions - involving clip list updates and background refreshing as - Windows moves other windows across our window. - We currently don't support this, even though it might be a - good idea since BeOS has an implementation of BDirectWindow - that does the same thing. This would be most useful for - applications that do complete screen updates every frame. - -- Fixme? - */ - if ((flags & SDL_FULLSCREEN) != SDL_FULLSCREEN) { - /* Necessary if we're going from fullscreen to window */ - if (video->pixels == NULL) { - video->pitch = (width * video->format->BytesPerPixel); - /* Pitch needs to be QWORD (8-byte) aligned */ - video->pitch = (video->pitch + 7) & ~7; - video->pixels = (void *) SDL_malloc(video->h * video->pitch); - if (video->pixels == NULL) { - if (video != current) { - SDL_FreeSurface(video); - } - SDL_OutOfMemory(); - return (NULL); - } - } - dd_surface3 = NULL; -#if 0 /* FIXME: enable this when SDL consistently reports lost surfaces */ - if ((flags & SDL_HWSURFACE) == SDL_HWSURFACE) { - video->flags |= SDL_HWSURFACE; - } else { - video->flags |= SDL_SWSURFACE; - } -#else - video->flags |= SDL_SWSURFACE; -#endif - if ((flags & SDL_RESIZABLE) && !(flags & SDL_NOFRAME)) { - video->flags |= SDL_RESIZABLE; - } - if (flags & SDL_NOFRAME) { - video->flags |= SDL_NOFRAME; - } - } else { - /* Necessary if we're going from window to fullscreen */ - if (video->pixels != NULL) { - SDL_free(video->pixels); - video->pixels = NULL; - } - dd_surface3 = SDL_primary; - video->flags |= SDL_HWSURFACE; - } - - /* See if the primary surface has double-buffering enabled */ - if ((ddsd.ddsCaps.dwCaps & DDSCAPS_FLIP) == DDSCAPS_FLIP) { - video->flags |= SDL_DOUBLEBUF; - } - - /* Allocate the SDL surface associated with the primary surface */ - if (DX5_AllocDDSurface(this, video, dd_surface3, - video->flags & SDL_HWSURFACE) < 0) { - if (video != current) { - SDL_FreeSurface(video); - } - return (NULL); - } - - /* Use the appropriate blitting function */ - if ((flags & SDL_FULLSCREEN) == SDL_FULLSCREEN) { - video->flags |= SDL_FULLSCREEN; - if (video->format->palette != NULL) { - video->flags |= SDL_HWPALETTE; - } - this->UpdateRects = DX5_DirectUpdate; - } else { - this->UpdateRects = DX5_WindowUpdate; - } - - /* Make our window the proper size, set the clipper, then show it */ - if ((flags & SDL_FULLSCREEN) != SDL_FULLSCREEN) { - /* Create and set a clipper on our primary surface */ - if (SDL_clipper == NULL) { - result = IDirectDraw2_CreateClipper(ddraw2, - 0, &SDL_clipper, NULL); - if (result != DD_OK) { - if (video != current) { - SDL_FreeSurface(video); - } - SetDDerror("DirectDraw2::CreateClipper", result); - return (NULL); - } - } - result = IDirectDrawClipper_SetHWnd(SDL_clipper, 0, SDL_Window); - if (result != DD_OK) { - if (video != current) { - SDL_FreeSurface(video); - } - SetDDerror("DirectDrawClipper::SetHWnd", result); - return (NULL); - } - result = IDirectDrawSurface3_SetClipper(SDL_primary, SDL_clipper); - if (result != DD_OK) { - if (video != current) { - SDL_FreeSurface(video); - } - SetDDerror("DirectDrawSurface3::SetClipper", result); - return (NULL); - } - - /* Resize the window (copied from SDL WinDIB driver) */ - if (!SDL_windowid && !IsZoomed(SDL_Window)) { - RECT bounds; - int x, y; - UINT swp_flags; - const char *window = NULL; - const char *center = NULL; - - if (!SDL_windowX && !SDL_windowY) { - window = SDL_getenv("SDL_VIDEO_WINDOW_POS"); - center = SDL_getenv("SDL_VIDEO_CENTERED"); - if (window) { - if (SDL_sscanf(window, "%d,%d", &x, &y) == 2) { - SDL_windowX = x; - SDL_windowY = y; - } - if (SDL_strcmp(window, "center") == 0) { - center = window; - } - } - } - swp_flags = SWP_NOCOPYBITS; - - bounds.left = SDL_windowX; - bounds.top = SDL_windowY; - bounds.right = SDL_windowX + video->w; - bounds.bottom = SDL_windowY + video->h; - AdjustWindowRectEx(&bounds, GetWindowLong(SDL_Window, GWL_STYLE), - (GetMenu(SDL_Window) != NULL), 0); - width = bounds.right - bounds.left; - height = bounds.bottom - bounds.top; - if (center) { - x = (GetSystemMetrics(SM_CXSCREEN) - width) / 2; - y = (GetSystemMetrics(SM_CYSCREEN) - height) / 2; - } else if (SDL_windowX || SDL_windowY || window) { - x = bounds.left; - y = bounds.top; - } else { - x = y = -1; - swp_flags |= SWP_NOMOVE; - } - SetWindowPos(SDL_Window, HWND_NOTOPMOST, x, y, width, height, - swp_flags); - SDL_windowX = SDL_bounds.left; - SDL_windowY = SDL_bounds.top; - } - - } - ShowWindow(SDL_Window, SW_SHOW); - SetForegroundWindow(SDL_Window); - SDL_resizing = 0; - - /* JC 14 Mar 2006 - Flush the message loop or this can cause big problems later - Especially if the user decides to use dialog boxes or assert()! - */ - WIN_FlushMessageQueue(); - - /* We're live! */ - return (video); -} - -struct private_hwdata -{ - LPDIRECTDRAWSURFACE3 dd_surface; - LPDIRECTDRAWSURFACE3 dd_writebuf; -}; - -static int -DX5_AllocDDSurface(_THIS, SDL_Surface * surface, - LPDIRECTDRAWSURFACE3 requested, Uint32 flag) -{ - LPDIRECTDRAWSURFACE dd_surface1; - LPDIRECTDRAWSURFACE3 dd_surface3; - DDSURFACEDESC ddsd; - HRESULT result; - - /* Clear the hardware flag, in case we fail */ - surface->flags &= ~flag; - - /* Allocate the hardware acceleration data */ - surface->hwdata = (struct private_hwdata *) - SDL_malloc(sizeof(*surface->hwdata)); - if (surface->hwdata == NULL) { - SDL_OutOfMemory(); - return (-1); - } - dd_surface3 = NULL; - - /* Set up the surface description */ - SDL_memset(&ddsd, 0, sizeof(ddsd)); - ddsd.dwSize = sizeof(ddsd); - ddsd.dwFlags = (DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS | - DDSD_PITCH | DDSD_PIXELFORMAT); - ddsd.dwWidth = surface->w; - ddsd.dwHeight = surface->h; -#if defined(NONAMELESSUNION) - ddsd.u1.lPitch = surface->pitch; -#else - ddsd.lPitch = surface->pitch; -#endif - if ((flag & SDL_HWSURFACE) == SDL_HWSURFACE) { - ddsd.ddsCaps.dwCaps = (DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY); - } else { - ddsd.ddsCaps.dwCaps = (DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY); - } - ddsd.ddpfPixelFormat.dwSize = sizeof(ddsd.ddpfPixelFormat); - ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB; - if (surface->format->palette) { - ddsd.ddpfPixelFormat.dwFlags |= DDPF_PALETTEINDEXED8; - } -#if defined(NONAMELESSUNION) - ddsd.ddpfPixelFormat.u1.dwRGBBitCount = surface->format->BitsPerPixel; - ddsd.ddpfPixelFormat.u2.dwRBitMask = surface->format->Rmask; - ddsd.ddpfPixelFormat.u3.dwGBitMask = surface->format->Gmask; - ddsd.ddpfPixelFormat.u4.dwBBitMask = surface->format->Bmask; -#else - ddsd.ddpfPixelFormat.dwRGBBitCount = surface->format->BitsPerPixel; - ddsd.ddpfPixelFormat.dwRBitMask = surface->format->Rmask; - ddsd.ddpfPixelFormat.dwGBitMask = surface->format->Gmask; - ddsd.ddpfPixelFormat.dwBBitMask = surface->format->Bmask; -#endif - - /* Create the DirectDraw video surface */ - if (requested != NULL) { - dd_surface3 = requested; - } else { - result = IDirectDraw2_CreateSurface(ddraw2, - &ddsd, &dd_surface1, NULL); - if (result != DD_OK) { - SetDDerror("DirectDraw2::CreateSurface", result); - goto error_end; - } - result = IDirectDrawSurface_QueryInterface(dd_surface1, - &IID_IDirectDrawSurface3, - (LPVOID *) & dd_surface3); - IDirectDrawSurface_Release(dd_surface1); - if (result != DD_OK) { - SetDDerror("DirectDrawSurface::QueryInterface", result); - goto error_end; - } - } - - if ((flag & SDL_HWSURFACE) == SDL_HWSURFACE) { - /* Check to see whether the surface actually ended up - in video memory, and fail if not. We expect the - surfaces we create here to actually be in hardware! - */ - result = IDirectDrawSurface3_GetCaps(dd_surface3, &ddsd.ddsCaps); - if (result != DD_OK) { - SetDDerror("DirectDrawSurface3::GetCaps", result); - goto error_end; - } - if ((ddsd.ddsCaps.dwCaps & DDSCAPS_VIDEOMEMORY) != - DDSCAPS_VIDEOMEMORY) { - SDL_SetError("No room in video memory"); - goto error_end; - } - } else { - /* Try to hook our surface memory */ - ddsd.dwFlags = DDSD_LPSURFACE; - ddsd.lpSurface = surface->pixels; - result = IDirectDrawSurface3_SetSurfaceDesc(dd_surface3, &ddsd, 0); - if (result != DD_OK) { - SetDDerror("DirectDraw2::SetSurfaceDesc", result); - goto error_end; - } - - } - - /* Make sure the surface format was set properly */ - SDL_memset(&ddsd, 0, sizeof(ddsd)); - ddsd.dwSize = sizeof(ddsd); - result = IDirectDrawSurface3_Lock(dd_surface3, NULL, - &ddsd, - (DDLOCK_NOSYSLOCK | DDLOCK_WAIT), NULL); - if (result != DD_OK) { - SetDDerror("DirectDrawSurface3::Lock", result); - goto error_end; - } - IDirectDrawSurface3_Unlock(dd_surface3, NULL); - - if ((flag & SDL_HWSURFACE) == SDL_SWSURFACE) { - if (ddsd.lpSurface != surface->pixels) { - SDL_SetError("DDraw didn't use SDL surface memory"); - goto error_end; - } - if ( -#if defined(NONAMELESSUNION) - ddsd.u1.lPitch -#else - ddsd.lPitch -#endif - != (LONG) surface->pitch) { - SDL_SetError("DDraw created surface with wrong pitch"); - goto error_end; - } - } else { -#if defined(NONAMELESSUNION) - surface->pitch = (Uint16) ddsd.u1.lPitch; -#else - surface->pitch = (Uint16) ddsd.lPitch; -#endif - } -#if defined(NONAMELESSUNION) - if ((ddsd.ddpfPixelFormat.u1.dwRGBBitCount != - surface->format->BitsPerPixel) || - (ddsd.ddpfPixelFormat.u2.dwRBitMask != surface->format->Rmask) || - (ddsd.ddpfPixelFormat.u3.dwGBitMask != surface->format->Gmask) || - (ddsd.ddpfPixelFormat.u4.dwBBitMask != surface->format->Bmask)) { -#else - if ((ddsd.ddpfPixelFormat.dwRGBBitCount != - surface->format->BitsPerPixel) || - (ddsd.ddpfPixelFormat.dwRBitMask != surface->format->Rmask) || - (ddsd.ddpfPixelFormat.dwGBitMask != surface->format->Gmask) || - (ddsd.ddpfPixelFormat.dwBBitMask != surface->format->Bmask)) { -#endif - SDL_SetError("DDraw didn't use SDL surface description"); - goto error_end; - } - if ((ddsd.dwWidth != (DWORD) surface->w) || - (ddsd.dwHeight != (DWORD) surface->h)) { - SDL_SetError("DDraw created surface with wrong size"); - goto error_end; - } - - /* Set the surface private data */ - surface->flags |= flag; - surface->hwdata->dd_surface = dd_surface3; - if ((surface->flags & SDL_DOUBLEBUF) == SDL_DOUBLEBUF) { - LPDIRECTDRAWSURFACE3 dd_writebuf; - - ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER; - result = IDirectDrawSurface3_GetAttachedSurface(dd_surface3, - &ddsd.ddsCaps, - &dd_writebuf); - if (result != DD_OK) { - SetDDerror("DirectDrawSurface3::GetAttachedSurface", result); - } else { - dd_surface3 = dd_writebuf; - } - } - surface->hwdata->dd_writebuf = dd_surface3; - - /* We're ready to go! */ - return (0); - - /* Okay, so goto's are cheesy, but there are so many possible - errors in this function, and the cleanup is the same in - every single case. Is there a better way, other than deeply - nesting the code? - */ - error_end: - if ((dd_surface3 != NULL) && (dd_surface3 != requested)) { - IDirectDrawSurface_Release(dd_surface3); - } - SDL_free(surface->hwdata); - surface->hwdata = NULL; - return (-1); -} - -static int -DX5_AllocHWSurface(_THIS, SDL_Surface * surface) -{ - /* DDraw limitation -- you need to set cooperative level first */ - if (SDL_primary == NULL) { - SDL_SetError("You must set a non-GL video mode first"); - return (-1); - } - return (DX5_AllocDDSurface(this, surface, NULL, SDL_HWSURFACE)); -} - -#ifdef DDRAW_DEBUG -void -PrintSurface(char *title, LPDIRECTDRAWSURFACE3 surface, Uint32 flags) -{ - DDSURFACEDESC ddsd; - - /* Lock and load! */ - SDL_memset(&ddsd, 0, sizeof(ddsd)); - ddsd.dwSize = sizeof(ddsd); - if (IDirectDrawSurface3_Lock(surface, NULL, &ddsd, - (DDLOCK_NOSYSLOCK | DDLOCK_WAIT), - NULL) != DD_OK) { - return; - } - IDirectDrawSurface3_Unlock(surface, NULL); - - fprintf(stderr, "%s:\n", title); - fprintf(stderr, "\tSize: %dx%d in %s at %ld bpp (pitch = %ld)\n", - ddsd.dwWidth, ddsd.dwHeight, - (flags & SDL_HWSURFACE) ? "hardware" : "software", -#if defined(NONAMELESSUNION) - ddsd.ddpfPixelFormat.u1.dwRGBBitCount, ddsd.u1.lPitch); -#else - ddsd.ddpfPixelFormat.dwRGBBitCount, ddsd.lPitch); -#endif - fprintf(stderr, "\tR = 0x%X, G = 0x%X, B = 0x%X\n", -#if defined(NONAMELESSUNION) - ddsd.ddpfPixelFormat.u2.dwRBitMask, - ddsd.ddpfPixelFormat.u3.dwGBitMask, - ddsd.ddpfPixelFormat.u4.dwBBitMask); -#else - ddsd.ddpfPixelFormat.dwRBitMask, - ddsd.ddpfPixelFormat.dwGBitMask, ddsd.ddpfPixelFormat.dwBBitMask); -#endif -} -#endif /* DDRAW_DEBUG */ - -static int -DX5_HWAccelBlit(SDL_Surface * src, SDL_Rect * srcrect, - SDL_Surface * dst, SDL_Rect * dstrect) -{ - LPDIRECTDRAWSURFACE3 src_surface; - LPDIRECTDRAWSURFACE3 dst_surface; - DWORD flags; - RECT rect; - HRESULT result; - - /* Set it up.. the desination must have a DDRAW surface */ - src_surface = src->hwdata->dd_writebuf; - dst_surface = dst->hwdata->dd_writebuf; - rect.top = (LONG) srcrect->y; - rect.bottom = (LONG) srcrect->y + srcrect->h; - rect.left = (LONG) srcrect->x; - rect.right = (LONG) srcrect->x + srcrect->w; - if ((src->flags & SDL_SRCCOLORKEY) == SDL_SRCCOLORKEY) - flags = DDBLTFAST_SRCCOLORKEY; - else - flags = DDBLTFAST_NOCOLORKEY; - /* FIXME: We can remove this flag for _really_ fast blit queuing, - but it will affect the return values of locks and flips. - */ - flags |= DDBLTFAST_WAIT; - - /* Do the blit! */ - result = IDirectDrawSurface3_BltFast(dst_surface, - dstrect->x, dstrect->y, src_surface, - &rect, flags); - if (result != DD_OK) { - if (result == DDERR_SURFACELOST) { - result = IDirectDrawSurface3_Restore(src_surface); - result = IDirectDrawSurface3_Restore(dst_surface); - /* The surfaces need to be reloaded with artwork */ - SDL_SetError("Blit surfaces were lost, reload them"); - return (-2); - } - SetDDerror("IDirectDrawSurface3::BltFast", result); -#ifdef DDRAW_DEBUG - fprintf(stderr, "Original dest rect: %dx%d at %d,%d\n", dstrect->w, - dstrect->h, dstrect->x, dstrect->y); - fprintf(stderr, - "HW accelerated %sblit to from 0x%p to 0x%p at (%d,%d)\n", - (src->flags & SDL_SRCCOLORKEY) ? "colorkey " : "", src, - dst, dstrect->x, dstrect->y); - PrintSurface("SRC", src_surface, src->flags); - PrintSurface("DST", dst_surface, dst->flags); - fprintf(stderr, "Source rectangle: (%d,%d) - (%d,%d)\n", - rect.left, rect.top, rect.right, rect.bottom); -#endif - /* Unexpected error, fall back to software blit */ - return (src->map->sw_blit(src, srcrect, dst, dstrect)); - } - return (0); -} - -static int -DX5_CheckHWBlit(_THIS, SDL_Surface * src, SDL_Surface * dst) -{ - int accelerated; - - /* We need to have a DDraw surface for HW blits */ - if ((src->flags & SDL_HWSURFACE) == SDL_SWSURFACE) { - /* Allocate a DDraw surface for the blit */ - if (src->hwdata == NULL) { - DX5_AllocDDSurface(this, src, NULL, SDL_SWSURFACE); - } - } - if (src->hwdata == NULL) { - return (0); - } - - /* Set initial acceleration on */ - src->flags |= SDL_HWACCEL; - - /* Set the surface attributes */ - if ((src->flags & SDL_SRCCOLORKEY) == SDL_SRCCOLORKEY) { - if (DX5_SetHWColorKey(this, src, src->format->colorkey) < 0) { - src->flags &= ~SDL_HWACCEL; - } - } - if ((src->flags & SDL_SRCALPHA) == SDL_SRCALPHA) { - if (DX5_SetHWAlpha(this, src, src->format->alpha) < 0) { - src->flags &= ~SDL_HWACCEL; - } - } - - /* Check to see if final surface blit is accelerated */ - accelerated = !!(src->flags & SDL_HWACCEL); - if (accelerated) { -#ifdef DDRAW_DEBUG - fprintf(stderr, "Setting accelerated blit on 0x%p\n", src); -#endif - src->map->hw_blit = DX5_HWAccelBlit; - } - return (accelerated); -} - -static int -DX5_FillHWRect(_THIS, SDL_Surface * dst, SDL_Rect * dstrect, Uint32 color) -{ - LPDIRECTDRAWSURFACE3 dst_surface; - RECT area; - DDBLTFX bltfx; - HRESULT result; - -#ifdef DDRAW_DEBUG - fprintf(stderr, "HW accelerated fill at (%d,%d)\n", dstrect->x, - dstrect->y); -#endif - dst_surface = dst->hwdata->dd_writebuf; - area.top = (LONG) dstrect->y; - area.bottom = (LONG) dstrect->y + dstrect->h; - area.left = (LONG) dstrect->x; - area.right = (LONG) dstrect->x + dstrect->w; - bltfx.dwSize = sizeof(bltfx); -#if defined(NONAMELESSUNION) - bltfx.u5.dwFillColor = color; -#else - bltfx.dwFillColor = color; -#endif - result = IDirectDrawSurface3_Blt(dst_surface, - &area, NULL, NULL, - DDBLT_COLORFILL | DDBLT_WAIT, &bltfx); - if (result == DDERR_SURFACELOST) { - IDirectDrawSurface3_Restore(dst_surface); - result = IDirectDrawSurface3_Blt(dst_surface, - &area, NULL, NULL, - DDBLT_COLORFILL | DDBLT_WAIT, - &bltfx); - } - if (result != DD_OK) { - SetDDerror("IDirectDrawSurface3::Blt", result); - return (-1); - } - return (0); -} - -static int -DX5_SetHWColorKey(_THIS, SDL_Surface * surface, Uint32 key) -{ - DDCOLORKEY colorkey; - HRESULT result; - - /* Set the surface colorkey */ - colorkey.dwColorSpaceLowValue = key; - colorkey.dwColorSpaceHighValue = key; - result = - IDirectDrawSurface3_SetColorKey(surface->hwdata->dd_surface, - DDCKEY_SRCBLT, &colorkey); - if (result != DD_OK) { - SetDDerror("IDirectDrawSurface3::SetColorKey", result); - return (-1); - } - return (0); -} -static int -DX5_SetHWAlpha(_THIS, SDL_Surface * surface, Uint8 alpha) -{ - return (-1); -} - -static int -DX5_LockHWSurface(_THIS, SDL_Surface * surface) -{ - HRESULT result; - LPDIRECTDRAWSURFACE3 dd_surface; - DDSURFACEDESC ddsd; - - /* Lock and load! */ - dd_surface = surface->hwdata->dd_writebuf; - SDL_memset(&ddsd, 0, sizeof(ddsd)); - ddsd.dwSize = sizeof(ddsd); - result = IDirectDrawSurface3_Lock(dd_surface, NULL, &ddsd, - (DDLOCK_NOSYSLOCK | DDLOCK_WAIT), NULL); - if (result == DDERR_SURFACELOST) { - result = IDirectDrawSurface3_Restore(surface->hwdata->dd_surface); - result = IDirectDrawSurface3_Lock(dd_surface, NULL, &ddsd, - (DDLOCK_NOSYSLOCK | DDLOCK_WAIT), - NULL); - } - if (result != DD_OK) { - SetDDerror("DirectDrawSurface3::Lock", result); - return (-1); - } - /* Pitch might have changed -- recalculate pitch and offset */ -#if defined(NONAMELESSUNION) - if (surface->pitch != ddsd.u1.lPitch) { - surface->pitch = ddsd.u1.lPitch; -#else - if (surface->pitch != ddsd.lPitch) { - surface->pitch = (Uint16) ddsd.lPitch; -#endif - surface->offset = - ((ddsd.dwHeight - surface->h) / 2) * surface->pitch + - ((ddsd.dwWidth - surface->w) / 2) * - surface->format->BytesPerPixel; - } - surface->pixels = ddsd.lpSurface; - return (0); -} - -static void -DX5_UnlockHWSurface(_THIS, SDL_Surface * surface) -{ - IDirectDrawSurface3_Unlock(surface->hwdata->dd_writebuf, NULL); - surface->pixels = NULL; -} - -static int -DX5_FlipHWSurface(_THIS, SDL_Surface * surface) -{ - HRESULT result; - LPDIRECTDRAWSURFACE3 dd_surface; - - dd_surface = surface->hwdata->dd_surface; - - /* to prevent big slowdown on fast computers, wait here instead of driver ring 0 code */ - /* Dmitry Yakimov (ftech@tula.net) */ - while (IDirectDrawSurface3_GetFlipStatus(dd_surface, DDGBS_ISBLTDONE) == - DDERR_WASSTILLDRAWING); - - result = IDirectDrawSurface3_Flip(dd_surface, NULL, DDFLIP_WAIT); - if (result == DDERR_SURFACELOST) { - result = IDirectDrawSurface3_Restore(surface->hwdata->dd_surface); - while (IDirectDrawSurface3_GetFlipStatus - (dd_surface, DDGBS_ISBLTDONE) == DDERR_WASSTILLDRAWING); - result = IDirectDrawSurface3_Flip(dd_surface, NULL, DDFLIP_WAIT); - } - if (result != DD_OK) { - SetDDerror("DirectDrawSurface3::Flip", result); - return (-1); - } - return (0); -} - -static void -DX5_FreeHWSurface(_THIS, SDL_Surface * surface) -{ - if (surface->hwdata) { - if (surface->hwdata->dd_surface != SDL_primary) { - IDirectDrawSurface3_Release(surface->hwdata->dd_surface); - } - SDL_free(surface->hwdata); - surface->hwdata = NULL; - } -} - -void -DX5_WindowUpdate(_THIS, int numrects, SDL_Rect * rects) -{ - HRESULT result; - int i; - RECT src, dst; - - for (i = 0; i < numrects; ++i) { - src.top = (LONG) rects[i].y; - src.bottom = (LONG) rects[i].y + rects[i].h; - src.left = (LONG) rects[i].x; - src.right = (LONG) rects[i].x + rects[i].w; - dst.top = SDL_bounds.top + src.top; - dst.left = SDL_bounds.left + src.left; - dst.bottom = SDL_bounds.top + src.bottom; - dst.right = SDL_bounds.left + src.right; - result = IDirectDrawSurface3_Blt(SDL_primary, &dst, - this->screen->hwdata->dd_surface, - &src, DDBLT_WAIT, NULL); - /* Doh! Check for lost surface and restore it */ - if (result == DDERR_SURFACELOST) { - IDirectDrawSurface3_Restore(SDL_primary); - IDirectDrawSurface3_Blt(SDL_primary, &dst, - this->screen->hwdata->dd_surface, - &src, DDBLT_WAIT, NULL); - } - } -} - -void -DX5_DirectUpdate(_THIS, int numrects, SDL_Rect * rects) -{ -} - -/* Compress a full palette into the limited number of colors given to us - by windows. - - The "best" way to do this is to sort the colors by diversity and place - the most diverse colors into the limited palette. Unfortunately this - results in widely varying colors being displayed in the interval during - which the windows palette has been set, and the mapping of the shadow - surface to the new palette. This is especially noticeable during fades. - - To deal with this problem, we can copy a predetermined portion of the - full palette, and use that as the limited palette. This allows colors - to fade smoothly as the remapping is very similar on each palette change. - Unfortunately, this breaks applications which partition the palette into - distinct and widely varying areas, expecting all colors to be available. - - I'm making them both available, chosen at compile time. - If you want the chunk-o-palette algorithm, define SIMPLE_COMPRESSION, - otherwise the sort-by-diversity algorithm will be used. -*/ -#define SIMPLE_COMPRESSION -#define CS_CS_DIST(A, B) ({ \ - int r = (A.r - B.r); \ - int g = (A.g - B.g); \ - int b = (A.b - B.b); \ - (r*r + g*g + b*b); \ -}) -static void -DX5_CompressPalette(_THIS, SDL_Color * colors, int ncolors, int maxcolors) -{ -#ifdef SIMPLE_COMPRESSION - int i, j; -#else - static SDL_Color zero = { 0, 0, 0, 0 }; - int i, j; - int max, dist; - int prev, next; - int *pool; - int *seen, *order; -#endif - - /* Does this happen? */ - if (maxcolors > ncolors) { - maxcolors = ncolors; - } -#ifdef SIMPLE_COMPRESSION - /* Just copy the first "maxcolors" colors */ - for (j = 10, i = 0; i < maxcolors; ++i, ++j) { - SDL_colors[j].peRed = colors[i].r; - SDL_colors[j].peGreen = colors[i].g; - SDL_colors[j].peBlue = colors[i].b; - } -#else - /* Allocate memory for the arrays we use */ - pool = SDL_stack_alloc(int, 2 * ncolors); - if (pool == NULL) { - /* No worries, just return */ ; - return; - } - seen = pool; - SDL_memset(seen, 0, ncolors * sizeof(int)); - order = pool + ncolors; - - /* Start with the brightest color */ - max = 0; - for (i = 0; i < ncolors; ++i) { - dist = CS_CS_DIST(zero, colors[i]); - if (dist >= max) { - max = dist; - next = i; - } - } - j = 0; - order[j++] = next; - seen[next] = 1; - prev = next; - - /* Keep going through all the colors */ - while (j < maxcolors) { - max = 0; - for (i = 0; i < ncolors; ++i) { - if (seen[i]) { - continue; - } - dist = CS_CS_DIST(colors[i], colors[prev]); - if (dist >= max) { - max = dist; - next = i; - } - } - order[j++] = next; - seen[next] = 1; - prev = next; - } - - /* Compress the colors to the palette */ - for (j = 10, i = 0; i < maxcolors; ++i, ++j) { - SDL_colors[j].peRed = colors[order[i]].r; - SDL_colors[j].peGreen = colors[order[i]].g; - SDL_colors[j].peBlue = colors[order[i]].b; - } - SDL_stack_free(pool); -#endif /* SIMPLE_COMPRESSION */ -} - -/* Set the system colormap in both fullscreen and windowed modes */ -int -DX5_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color * colors) -{ - int i; - int alloct_all; - - /* Copy palette colors into display palette */ - alloct_all = 0; - if (SDL_palette != NULL) { - if ((this->screen->flags & SDL_FULLSCREEN) == SDL_FULLSCREEN) { - /* We can set all entries explicitly */ - for (i = 0; i < ncolors; ++i) { - int j = firstcolor + i; - SDL_colors[j].peRed = colors[i].r; - SDL_colors[j].peGreen = colors[i].g; - SDL_colors[j].peBlue = colors[i].b; - } - IDirectDrawPalette_SetEntries(SDL_palette, 0, - firstcolor, ncolors, - &SDL_colors[firstcolor]); - alloct_all = 1; - } else { - /* Grab the 236 most diverse colors in the palette */ - DX5_CompressPalette(this, colors, ncolors, 236); - /* This sends an WM_PALETTECHANGED message to us */ - colorchange_expected = 1; - IDirectDrawPalette_SetEntries(SDL_palette, 0, 0, 256, SDL_colors); - } - } - return (alloct_all); -} - -/* Gamma code is only available on DirectX 7 and newer */ -static int -DX5_SetGammaRamp(_THIS, Uint16 * ramp) -{ -#ifdef IDirectDrawGammaControl_SetGammaRamp - LPDIRECTDRAWGAMMACONTROL gamma; - DDGAMMARAMP gamma_ramp; - HRESULT result; -#endif - - /* In windowed or OpenGL mode, use windib gamma code */ - if (!DDRAW_FULLSCREEN()) { - return DIB_SetGammaRamp(this, ramp); - } -#ifndef IDirectDrawGammaControl_SetGammaRamp - SDL_SetError("SDL compiled without DirectX gamma ramp support"); - return -1; -#else - /* Check for a video mode! */ - if (!SDL_primary) { - SDL_SetError("A video mode must be set for gamma correction"); - return (-1); - } - - /* Get the gamma control object */ - result = IDirectDrawSurface3_QueryInterface(SDL_primary, - &IID_IDirectDrawGammaControl, - (LPVOID *) & gamma); - if (result != DD_OK) { - SetDDerror("DirectDrawSurface3::QueryInterface(GAMMA)", result); - return (-1); - } - - /* Set up the gamma ramp */ - SDL_memcpy(gamma_ramp.red, &ramp[0 * 256], 256 * sizeof(*ramp)); - SDL_memcpy(gamma_ramp.green, &ramp[1 * 256], 256 * sizeof(*ramp)); - SDL_memcpy(gamma_ramp.blue, &ramp[2 * 256], 256 * sizeof(*ramp)); - result = IDirectDrawGammaControl_SetGammaRamp(gamma, 0, &gamma_ramp); - if (result != DD_OK) { - SetDDerror("DirectDrawGammaControl::SetGammaRamp()", result); - } - - /* Release the interface and return */ - IDirectDrawGammaControl_Release(gamma); - return (result == DD_OK) ? 0 : -1; -#endif /* !IDirectDrawGammaControl_SetGammaRamp */ -} - -static int -DX5_GetGammaRamp(_THIS, Uint16 * ramp) -{ -#ifdef IDirectDrawGammaControl_SetGammaRamp - LPDIRECTDRAWGAMMACONTROL gamma; - DDGAMMARAMP gamma_ramp; - HRESULT result; -#endif - - /* In windowed or OpenGL mode, use windib gamma code */ - if (!DDRAW_FULLSCREEN()) { - return DIB_GetGammaRamp(this, ramp); - } -#ifndef IDirectDrawGammaControl_SetGammaRamp - SDL_SetError("SDL compiled without DirectX gamma ramp support"); - return -1; -#else - /* Check for a video mode! */ - if (!SDL_primary) { - SDL_SetError("A video mode must be set for gamma correction"); - return (-1); - } - - /* Get the gamma control object */ - result = IDirectDrawSurface3_QueryInterface(SDL_primary, - &IID_IDirectDrawGammaControl, - (LPVOID *) & gamma); - if (result != DD_OK) { - SetDDerror("DirectDrawSurface3::QueryInterface(GAMMA)", result); - return (-1); - } - - /* Set up the gamma ramp */ - result = IDirectDrawGammaControl_GetGammaRamp(gamma, 0, &gamma_ramp); - if (result == DD_OK) { - SDL_memcpy(&ramp[0 * 256], gamma_ramp.red, 256 * sizeof(*ramp)); - SDL_memcpy(&ramp[1 * 256], gamma_ramp.green, 256 * sizeof(*ramp)); - SDL_memcpy(&ramp[2 * 256], gamma_ramp.blue, 256 * sizeof(*ramp)); - } else { - SetDDerror("DirectDrawGammaControl::GetGammaRamp()", result); - } - - /* Release the interface and return */ - IDirectDrawGammaControl_Release(gamma); - return (result == DD_OK) ? 0 : -1; -#endif /* !IDirectDrawGammaControl_SetGammaRamp */ -} - -void -DX5_VideoQuit(_THIS) -{ - int i, j; - - /* If we're fullscreen GL, we need to reset the display */ - if (this->screen != NULL) { -#ifndef NO_CHANGEDISPLAYSETTINGS - if ((this->screen->flags & (SDL_INTERNALOPENGL | SDL_FULLSCREEN)) == - (SDL_INTERNALOPENGL | SDL_FULLSCREEN)) { - ChangeDisplaySettings(NULL, 0); - ShowWindow(SDL_Window, SW_HIDE); - } -#endif - if (this->screen->flags & SDL_INTERNALOPENGL) { - WIN_GL_ShutDown(this); - } - } - - /* Free any palettes we used */ - if (SDL_palette != NULL) { - IDirectDrawPalette_Release(SDL_palette); - SDL_palette = NULL; - } - - /* Allow the primary surface to be freed */ - if (SDL_primary != NULL) { - SDL_primary = NULL; - } - - /* Free video mode lists */ - for (i = 0; i < NUM_MODELISTS; ++i) { - if (SDL_modelist[i] != NULL) { - for (j = 0; SDL_modelist[i][j]; ++j) - SDL_free(SDL_modelist[i][j]); - SDL_free(SDL_modelist[i]); - SDL_modelist[i] = NULL; - } - } - - /* Free the window */ - DIB_QuitGamma(this); - if (SDL_Window) { - DX5_DestroyWindow(this); - } - - /* Free our window icon */ - if (screen_icn) { - DestroyIcon(screen_icn); - screen_icn = NULL; - } -} - -/* Exported for the windows message loop only */ -void -DX5_RealizePalette(_THIS) -{ - if (SDL_palette) { - IDirectDrawSurface3_SetPalette(SDL_primary, SDL_palette); - } -} -static void -DX5_Recolor8Bit(_THIS, SDL_Surface * surface, Uint8 * mapping) -{ - int row, col; - Uint8 *pixels; - - if (surface->w && surface->h) { - if ((surface->flags & SDL_HWSURFACE) == SDL_HWSURFACE) { - if (this->LockHWSurface(this, surface) < 0) { - return; - } - } - for (row = 0; row < surface->h; ++row) { - pixels = (Uint8 *) surface->pixels + row * surface->pitch; - for (col = 0; col < surface->w; ++col, ++pixels) { - *pixels = mapping[*pixels]; - } - } - if ((surface->flags & SDL_HWSURFACE) == SDL_HWSURFACE) { - this->UnlockHWSurface(this, surface); - } - SDL_UpdateRect(surface, 0, 0, 0, 0); - } -} -void -DX5_PaletteChanged(_THIS, HWND window) -{ - SDL_Palette *palette; - SDL_Color *saved = NULL; - HDC hdc; - int i; - PALETTEENTRY *entries; - - /* This is true when the window is closing */ - if ((SDL_primary == NULL) || (SDL_VideoSurface == NULL)) - return; - - /* We need to get the colors as they were set */ - palette = this->physpal; - if (!palette) - palette = SDL_VideoSurface->format->palette; - if (palette == NULL) { /* Sometimes we don't have a palette */ - return; - } - entries = SDL_stack_alloc(PALETTEENTRY, palette->ncolors); - hdc = GetDC(window); - GetSystemPaletteEntries(hdc, 0, palette->ncolors, entries); - ReleaseDC(window, hdc); - if (!colorchange_expected) { - saved = SDL_stack_alloc(SDL_Color, palette->ncolors); - SDL_memcpy(saved, palette->colors, - palette->ncolors * sizeof(SDL_Color)); - } - for (i = 0; i < palette->ncolors; ++i) { - palette->colors[i].r = entries[i].peRed; - palette->colors[i].g = entries[i].peGreen; - palette->colors[i].b = entries[i].peBlue; - } - SDL_stack_free(entries); - if (!colorchange_expected) { - Uint8 mapping[256]; - - SDL_memset(mapping, 0, sizeof(mapping)); - for (i = 0; i < palette->ncolors; ++i) { - mapping[i] = SDL_FindColor(palette, - saved[i].r, saved[i].g, saved[i].b); - } - DX5_Recolor8Bit(this, SDL_VideoSurface, mapping); - SDL_stack_free(saved); - } - colorchange_expected = 0; - - /* Notify all mapped surfaces of the change */ - SDL_FormatChanged(SDL_VideoSurface); -} - -/* Exported for the windows message loop only */ -void -DX5_WinPAINT(_THIS, HDC hdc) -{ - SDL_UpdateRect(SDL_PublicSurface, 0, 0, 0, 0); -} - -/* vi: set ts=4 sw=4 expandtab: */ diff -r 4371d679ee12 -r 7d642361ef0f src/video/windx5/SDL_dx5video.h --- a/src/video/windx5/SDL_dx5video.h Wed Jul 26 03:12:05 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,67 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ -#include "SDL_config.h" - -#ifndef _SDL_dx5video_h -#define _SDL_dx5video_h - -#include "directx.h" - -/* Private display data */ -struct SDL_PrivateVideoData -{ - LPDIRECTDRAW2 ddraw2; - LPDIRECTDRAWSURFACE3 SDL_primary; - LPDIRECTDRAWCLIPPER SDL_clipper; - LPDIRECTDRAWPALETTE SDL_palette; - PALETTEENTRY SDL_colors[256]; - int colorchange_expected; - -#define NUM_MODELISTS 4 /* 8, 16, 24, and 32 bits-per-pixel */ - int SDL_nummodes[NUM_MODELISTS]; - SDL_Rect **SDL_modelist[NUM_MODELISTS]; - int SDL_modeindex[NUM_MODELISTS]; -}; -/* Old variable names */ -#define ddraw2 (this->hidden->ddraw2) -#define SDL_primary (this->hidden->SDL_primary) -#define SDL_clipper (this->hidden->SDL_clipper) -#define SDL_palette (this->hidden->SDL_palette) -#define SDL_colors (this->hidden->SDL_colors) -#define colorchange_expected (this->hidden->colorchange_expected) -#define SDL_nummodes (this->hidden->SDL_nummodes) -#define SDL_modelist (this->hidden->SDL_modelist) -#define SDL_modeindex (this->hidden->SDL_modeindex) - -/* DirectX function pointers for video and events */ -extern HRESULT(WINAPI * DDrawCreate) (GUID FAR * lpGUID, - LPDIRECTDRAW FAR * lplpDD, - IUnknown FAR * pUnkOuter); -extern HRESULT(WINAPI * DInputCreate) (HINSTANCE hinst, DWORD dwVersion, - LPDIRECTINPUT * ppDI, - LPUNKNOWN punkOuter); - -/* DirectDraw error reporting function */ -extern void SetDDerror(const char *function, int code); - -#endif /* _SDL_dx5video_h */ -/* vi: set ts=4 sw=4 expandtab: */ diff -r 4371d679ee12 -r 7d642361ef0f src/video/windx5/SDL_dx5yuv.c --- a/src/video/windx5/SDL_dx5yuv.c Wed Jul 26 03:12:05 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,309 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ -#include "SDL_config.h" - -/* This is the DirectDraw implementation of YUV video overlays */ - -#include "SDL_video.h" -#include "SDL_dx5yuv_c.h" -#include "../SDL_yuvfuncs.h" - -//#define USE_DIRECTX_OVERLAY - -/* The functions used to manipulate software video overlays */ -static struct private_yuvhwfuncs dx5_yuvfuncs = { - DX5_LockYUVOverlay, - DX5_UnlockYUVOverlay, - DX5_DisplayYUVOverlay, - DX5_FreeYUVOverlay -}; - -struct private_yuvhwdata -{ - LPDIRECTDRAWSURFACE3 surface; - - /* These are just so we don't have to allocate them separately */ - Uint16 pitches[3]; - Uint8 *planes[3]; -}; - - -static LPDIRECTDRAWSURFACE3 -CreateYUVSurface(_THIS, int width, int height, Uint32 format) -{ - HRESULT result; - LPDIRECTDRAWSURFACE dd_surface1; - LPDIRECTDRAWSURFACE3 dd_surface3; - DDSURFACEDESC ddsd; - - /* Set up the surface description */ - SDL_memset(&ddsd, 0, sizeof(ddsd)); - ddsd.dwSize = sizeof(ddsd); - ddsd.dwFlags = (DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS | DDSD_PIXELFORMAT); - ddsd.dwWidth = width; - ddsd.dwHeight = height; -#ifdef USE_DIRECTX_OVERLAY - ddsd.ddsCaps.dwCaps = (DDSCAPS_OVERLAY | DDSCAPS_VIDEOMEMORY); -#else - ddsd.ddsCaps.dwCaps = (DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY); -#endif - ddsd.ddpfPixelFormat.dwSize = sizeof(ddsd.ddpfPixelFormat); - ddsd.ddpfPixelFormat.dwFlags = DDPF_FOURCC; - ddsd.ddpfPixelFormat.dwFourCC = format; - - /* Create the DirectDraw video surface */ - result = IDirectDraw2_CreateSurface(ddraw2, &ddsd, &dd_surface1, NULL); - if (result != DD_OK) { - SetDDerror("DirectDraw2::CreateSurface", result); - return (NULL); - } - result = IDirectDrawSurface_QueryInterface(dd_surface1, - &IID_IDirectDrawSurface3, - (LPVOID *) & dd_surface3); - IDirectDrawSurface_Release(dd_surface1); - if (result != DD_OK) { - SetDDerror("DirectDrawSurface::QueryInterface", result); - return (NULL); - } - - /* Make sure the surface format was set properly */ - SDL_memset(&ddsd, 0, sizeof(ddsd)); - ddsd.dwSize = sizeof(ddsd); - result = IDirectDrawSurface3_Lock(dd_surface3, NULL, - &ddsd, DDLOCK_NOSYSLOCK, NULL); - if (result != DD_OK) { - SetDDerror("DirectDrawSurface3::Lock", result); - IDirectDrawSurface_Release(dd_surface3); - return (NULL); - } - IDirectDrawSurface3_Unlock(dd_surface3, NULL); - - if (!(ddsd.ddpfPixelFormat.dwFlags & DDPF_FOURCC) || - (ddsd.ddpfPixelFormat.dwFourCC != format)) { - SDL_SetError("DDraw didn't use requested FourCC format"); - IDirectDrawSurface_Release(dd_surface3); - return (NULL); - } - - /* We're ready to go! */ - return (dd_surface3); -} - -#ifdef DEBUG_YUV -static char * -PrintFOURCC(Uint32 code) -{ - static char buf[5]; - - buf[3] = code >> 24; - buf[2] = (code >> 16) & 0xFF; - buf[1] = (code >> 8) & 0xFF; - buf[0] = (code & 0xFF); - return (buf); -} -#endif - -SDL_Overlay * -DX5_CreateYUVOverlay(_THIS, int width, int height, Uint32 format, - SDL_Surface * display) -{ - SDL_Overlay *overlay; - struct private_yuvhwdata *hwdata; - -#ifdef DEBUG_YUV - DWORD numcodes; - DWORD *codes; - - printf("FOURCC format requested: 0x%x\n", PrintFOURCC(format)); - IDirectDraw2_GetFourCCCodes(ddraw2, &numcodes, NULL); - if (numcodes) { - DWORD i; - codes = SDL_malloc(numcodes * sizeof(*codes)); - if (codes) { - IDirectDraw2_GetFourCCCodes(ddraw2, &numcodes, codes); - for (i = 0; i < numcodes; ++i) { - fprintf(stderr, "Code %d: 0x%x\n", i, PrintFOURCC(codes[i])); - } - SDL_free(codes); - } - } else { - fprintf(stderr, "No FOURCC codes supported\n"); - } -#endif - - /* Create the overlay structure */ - overlay = (SDL_Overlay *) SDL_malloc(sizeof *overlay); - if (overlay == NULL) { - SDL_OutOfMemory(); - return (NULL); - } - SDL_memset(overlay, 0, (sizeof *overlay)); - - /* Fill in the basic members */ - overlay->format = format; - overlay->w = width; - overlay->h = height; - - /* Set up the YUV surface function structure */ - overlay->hwfuncs = &dx5_yuvfuncs; - - /* Create the pixel data and lookup tables */ - hwdata = (struct private_yuvhwdata *) SDL_malloc(sizeof *hwdata); - overlay->hwdata = hwdata; - if (hwdata == NULL) { - SDL_OutOfMemory(); - SDL_FreeYUVOverlay(overlay); - return (NULL); - } - hwdata->surface = CreateYUVSurface(this, width, height, format); - if (hwdata->surface == NULL) { - SDL_FreeYUVOverlay(overlay); - return (NULL); - } - overlay->hw_overlay = 1; - - /* Set up the plane pointers */ - overlay->pitches = hwdata->pitches; - overlay->pixels = hwdata->planes; - switch (format) { - case SDL_YV12_OVERLAY: - case SDL_IYUV_OVERLAY: - overlay->planes = 3; - break; - default: - overlay->planes = 1; - break; - } - - /* We're all done.. */ - return (overlay); -} - -int -DX5_LockYUVOverlay(_THIS, SDL_Overlay * overlay) -{ - HRESULT result; - LPDIRECTDRAWSURFACE3 surface; - DDSURFACEDESC ddsd; - - surface = overlay->hwdata->surface; - SDL_memset(&ddsd, 0, sizeof(ddsd)); - ddsd.dwSize = sizeof(ddsd); - result = IDirectDrawSurface3_Lock(surface, NULL, - &ddsd, DDLOCK_NOSYSLOCK, NULL); - if (result == DDERR_SURFACELOST) { - result = IDirectDrawSurface3_Restore(surface); - result = IDirectDrawSurface3_Lock(surface, NULL, &ddsd, - (DDLOCK_NOSYSLOCK | DDLOCK_WAIT), - NULL); - } - if (result != DD_OK) { - SetDDerror("DirectDrawSurface3::Lock", result); - return (-1); - } - - /* Find the pitch and offset values for the overlay */ -#if defined(NONAMELESSUNION) - overlay->pitches[0] = (Uint16) ddsd.u1.lPitch; -#else - overlay->pitches[0] = (Uint16) ddsd.lPitch; -#endif - overlay->pixels[0] = (Uint8 *) ddsd.lpSurface; - switch (overlay->format) { - case SDL_YV12_OVERLAY: - case SDL_IYUV_OVERLAY: - /* Add the two extra planes */ - overlay->pitches[1] = overlay->pitches[0] / 2; - overlay->pitches[2] = overlay->pitches[0] / 2; - overlay->pixels[1] = overlay->pixels[0] + - overlay->pitches[0] * overlay->h; - overlay->pixels[2] = overlay->pixels[1] + - overlay->pitches[1] * overlay->h / 2; - break; - default: - /* Only one plane, no worries */ - break; - } - return (0); -} - -void -DX5_UnlockYUVOverlay(_THIS, SDL_Overlay * overlay) -{ - LPDIRECTDRAWSURFACE3 surface; - - surface = overlay->hwdata->surface; - IDirectDrawSurface3_Unlock(surface, NULL); -} - -int -DX5_DisplayYUVOverlay(_THIS, SDL_Overlay * overlay, SDL_Rect * src, - SDL_Rect * dst) -{ - HRESULT result; - LPDIRECTDRAWSURFACE3 surface; - RECT srcrect, dstrect; - - surface = overlay->hwdata->surface; - srcrect.top = src->y; - srcrect.bottom = srcrect.top + src->h; - srcrect.left = src->x; - srcrect.right = srcrect.left + src->w; - dstrect.top = SDL_bounds.top + dst->y; - dstrect.left = SDL_bounds.left + dst->x; - dstrect.bottom = dstrect.top + dst->h; - dstrect.right = dstrect.left + dst->w; -#ifdef USE_DIRECTX_OVERLAY - result = IDirectDrawSurface3_UpdateOverlay(surface, &srcrect, - SDL_primary, &dstrect, - DDOVER_SHOW, NULL); - if (result != DD_OK) { - SetDDerror("DirectDrawSurface3::UpdateOverlay", result); - return (-1); - } -#else - result = - IDirectDrawSurface3_Blt(SDL_primary, &dstrect, surface, &srcrect, - DDBLT_WAIT, NULL); - if (result != DD_OK) { - SetDDerror("DirectDrawSurface3::Blt", result); - return (-1); - } -#endif - return (0); -} - -void -DX5_FreeYUVOverlay(_THIS, SDL_Overlay * overlay) -{ - struct private_yuvhwdata *hwdata; - - hwdata = overlay->hwdata; - if (hwdata) { - if (hwdata->surface) { - IDirectDrawSurface_Release(hwdata->surface); - } - SDL_free(hwdata); - } -} - -/* vi: set ts=4 sw=4 expandtab: */ diff -r 4371d679ee12 -r 7d642361ef0f src/video/windx5/SDL_dx5yuv_c.h --- a/src/video/windx5/SDL_dx5yuv_c.h Wed Jul 26 03:12:05 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,42 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ -#include "SDL_config.h" - -/* This is the DirectDraw implementation of YUV video overlays */ - -#include "SDL_video.h" -#include "../wincommon/SDL_lowvideo.h" -#include "SDL_dx5video.h" - -extern SDL_Overlay *DX5_CreateYUVOverlay(_THIS, int width, int height, - Uint32 format, - SDL_Surface * display); - -extern int DX5_LockYUVOverlay(_THIS, SDL_Overlay * overlay); - -extern void DX5_UnlockYUVOverlay(_THIS, SDL_Overlay * overlay); - -extern int DX5_DisplayYUVOverlay(_THIS, SDL_Overlay * overlay, - SDL_Rect * src, SDL_Rect * dst); - -extern void DX5_FreeYUVOverlay(_THIS, SDL_Overlay * overlay); -/* vi: set ts=4 sw=4 expandtab: */ diff -r 4371d679ee12 -r 7d642361ef0f src/video/windx5/directx.h --- a/src/video/windx5/directx.h Wed Jul 26 03:12:05 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,85 +0,0 @@ - -#ifndef _directx_h -#define _directx_h - -/* Include all of the DirectX 5.0 headers and adds any necessary tweaks */ - -#define WIN32_LEAN_AND_MEAN -#include -#include -#ifndef WIN32 -#define WIN32 -#endif -#undef WINNT - -/* Far pointers don't exist in 32-bit code */ -#ifndef FAR -#define FAR -#endif - -/* Error codes not yet included in Win32 API header files */ -#ifndef MAKE_HRESULT -#define MAKE_HRESULT(sev,fac,code) \ - ((HRESULT)(((unsigned long)(sev)<<31) | ((unsigned long)(fac)<<16) | ((unsigned long)(code)))) -#endif - -#ifndef S_OK -#define S_OK (HRESULT)0x00000000L -#endif - -#ifndef SUCCEEDED -#define SUCCEEDED(x) ((HRESULT)(x) >= 0) -#endif -#ifndef FAILED -#define FAILED(x) ((HRESULT)(x)<0) -#endif - -#ifndef E_FAIL -#define E_FAIL (HRESULT)0x80000008L -#endif -#ifndef E_NOINTERFACE -#define E_NOINTERFACE (HRESULT)0x80004002L -#endif -#ifndef E_OUTOFMEMORY -#define E_OUTOFMEMORY (HRESULT)0x8007000EL -#endif -#ifndef E_INVALIDARG -#define E_INVALIDARG (HRESULT)0x80070057L -#endif -#ifndef E_NOTIMPL -#define E_NOTIMPL (HRESULT)0x80004001L -#endif -#ifndef REGDB_E_CLASSNOTREG -#define REGDB_E_CLASSNOTREG (HRESULT)0x80040154L -#endif - -/* Severity codes */ -#ifndef SEVERITY_ERROR -#define SEVERITY_ERROR 1 -#endif - -/* Error facility codes */ -#ifndef FACILITY_WIN32 -#define FACILITY_WIN32 7 -#endif - -#ifndef FIELD_OFFSET -#define FIELD_OFFSET(type, field) ((LONG)&(((type *)0)->field)) -#endif - -/* DirectX headers (if it isn't included, I haven't tested it yet) - */ -/* We need these defines to mark what version of DirectX API we use */ -#define DIRECTDRAW_VERSION 0x0700 -#define DIRECTSOUND_VERSION 0x0500 -#define DIRECTINPUT_VERSION 0x0500 - -#ifdef __GNUC__ -#define NONAMELESSUNION -#endif -#include -#include -#include - -#endif /* _directx_h */ -/* vi: set ts=4 sw=4 expandtab: */