diff options
author | Jonathan Gray | 2003-07-28 01:47:41 +0000 |
---|---|---|
committer | Jonathan Gray | 2003-07-28 01:47:41 +0000 |
commit | dc6aa9912c73e1e03c32b6b214c5fbc46aa1eb57 (patch) | |
tree | 5c6bb0d5236aa9d5102d1cd7d6821fd3848086f8 /sword2/driver/rdwin.cpp | |
parent | f020d28b5e9297f93d5bedae62885b380c23f517 (diff) | |
download | scummvm-rg350-dc6aa9912c73e1e03c32b6b214c5fbc46aa1eb57.tar.gz scummvm-rg350-dc6aa9912c73e1e03c32b6b214c5fbc46aa1eb57.tar.bz2 scummvm-rg350-dc6aa9912c73e1e03c32b6b214c5fbc46aa1eb57.zip |
bs2 driver
svn-id: r9212
Diffstat (limited to 'sword2/driver/rdwin.cpp')
-rw-r--r-- | sword2/driver/rdwin.cpp | 627 |
1 files changed, 627 insertions, 0 deletions
diff --git a/sword2/driver/rdwin.cpp b/sword2/driver/rdwin.cpp new file mode 100644 index 0000000000..f945b3ca14 --- /dev/null +++ b/sword2/driver/rdwin.cpp @@ -0,0 +1,627 @@ +/* Copyright (C) 1994-2003 Revolution Software Ltd + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * $Header$ + */ + +#define WIN32_LEAN_AND_MEAN + +//#include <windows.h> +//#include <windowsx.h> +#include <stdio.h> + +#include "common/stdafx.h" +#include "engine.h" + +#include "driver96.h" + +#include "_mouse.h" +#include "keyboard.h" +#include "rdwin.h" +#include "d_draw.h" +#include "palette.h" +#include "render.h" +#include "menu.h" +#include "d_sound.h" +#include "../sword2.h" + + +#define MENUDEEP 40 // Temporary, until menu.h is written! + + + +static BOOL bMouseVisible = FALSE; +static BOOL controlKey = FALSE; +static BOOL altKey = FALSE; +static BOOL wasScreenSaverActive = FALSE; +static BOOL myAppClosed = FALSE; +static BOOL controlQDisabled = FALSE; +static uint8 gameName[80]; + + +//BOOL gotTheFocus = FALSE; +//assume we always have focus for the time being - khalek +BOOL gotTheFocus = TRUE; +//HWND hwnd; +//RECT rcWindow; + + + +//----------------------------------------------------------------------------- + +void Zdebug(char *format,...) { +#ifdef __PALM_OS__ + char buf[256]; // 1024 is too big overflow the stack +#else + char buf[1024]; +#endif + va_list va; + + va_start(va, format); + vsprintf(buf, format, va); + va_end(va); + +#ifdef __GP32__ //ph0x FIXME: implement fprint? + printf("ZDEBUG: %s\n", buf); +#else + fprintf(stderr, "ZDEBUG: %s!\n", buf); +#endif +#if defined( USE_WINDBG ) + strcat(buf, "\n"); +#if defined( _WIN32_WCE ) + TCHAR buf_unicode[1024]; + MultiByteToWideChar(CP_ACP, 0, buf, strlen(buf) + 1, buf_unicode, sizeof(buf_unicode)); + OutputDebugString(buf_unicode); +#else + OutputDebugString(buf); +#endif +#endif +} + +/* +void Zdebug(char *format,...) //Tony's special debug logging file March96 +{ + warning("stub Zdebug"); +// Write a printf type string to a debug file + + va_list arg_ptr; // Variable argument pointer + FILE * debug_filep=0; // Debug file pointer + static int first_debug = 1; // Flag for first time this is used + + va_start(arg_ptr,format); + + if (first_debug) //First time round delete any previous debug file + { + unlink("debug.txt"); + first_debug = 0; + } + + debug_filep = fopen("debug.txt","a+t"); + + if (debug_filep != NULL) // if it could be opened + { + vfprintf(debug_filep, format, arg_ptr); + fprintf(debug_filep,"\n"); + + fclose(debug_filep); + } +} +*/ +//----------------------------------------------------------------------------- + +/* +void Message(LPSTR fmt, ...) +{ + char buff[256]; + va_list va; + + + va_start(va, fmt); + + // + // format message with header + // + lstrcpy( buff, "DRIVER96:" ); + wvsprintf( &buff[lstrlen(buff)], fmt, va ); + lstrcat( buff, "\r\n" ); + + // + // To the debugger + // + OutputDebugString( buff ); + +} +*/ + +//----------------------------------------------------------------------------- +// OSystem Event Handler. Full of cross platform goodness and 99% fat free! +//----------------------------------------------------------------------------- +void BS2State::parseEvents() { + OSystem::Event event; + + while (_system->poll_event(&event)) { + switch(event.event_code) { + + case OSystem::EVENT_KEYDOWN: + Zdebug("key %d", event.kbd.keycode); + + if (event.kbd.flags==OSystem::KBD_CTRL) { + if (event.kbd.keycode == 'w') + GrabScreenShot(); + } + WriteKey(event.kbd.keycode); + + break; + case OSystem::EVENT_MOUSEMOVE: + mousex = event.mouse.x; + mousey = event.mouse.y; + _syst->set_mouse_pos(event.mouse.x, event.mouse.y); + break; + case OSystem::EVENT_LBUTTONDOWN: + LogMouseEvent(RD_LEFTBUTTONDOWN); + break; + case OSystem::EVENT_RBUTTONDOWN: + LogMouseEvent(RD_RIGHTBUTTONDOWN); + break; + case OSystem::EVENT_LBUTTONUP: + LogMouseEvent(RD_LEFTBUTTONUP); + break; + case OSystem::EVENT_RBUTTONUP: + LogMouseEvent(RD_RIGHTBUTTONUP); + break; + case OSystem::EVENT_QUIT: + Close_game(); + RestoreDisplay(); + CloseAppWindow(); + break; + default: + break; + } + } + +} + + +//----------------------------------------------------------------------------- +// Windows Message Handler. All keyboard and mouse input is handled here. +//----------------------------------------------------------------------------- +/* +long FAR PASCAL WindowsMessageHandler(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) +{ + + switch( message ) + { + + + case WM_TIMER: + switch (wParam) + { + case 25: + FadeServer(); + return(0); + case 1: + FxServer(); + return(0); + } + break; + + + case WM_CLOSE: + Zdebug("WM_CLOSE"); + break; + + case WM_SIZE: + case WM_MOVE: + if (IsIconic(hwnd)) + { + Message("minimising"); +// PauseGame(); + } + + if (bFullScreen) + { + SetRect(&rcWindow, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)); + } + else + { + GetClientRect(hwnd, &rcWindow); + ClientToScreen(hwnd, (LPPOINT)&rcWindow); + ClientToScreen(hwnd, (LPPOINT)&rcWindow+1); + } + Message("WINDOW RECT: [%d,%d,%d,%d]", rcWindow.left, rcWindow.top, rcWindow.right, rcWindow.bottom); + if (bFullScreen) + { + SetCapture(hwnd); + } + else + { + ReleaseCapture(); + } +// SetCursor(NULL); +// ShowCursor(FALSE); + break; + + + + case WM_ACTIVATEAPP: + gotTheFocus = wParam; + if (gotTheFocus) + { + Message("Got the focus"); + bMouseVisible = FALSE; + Message("Mouse invisible"); + ShowCursor(FALSE); + } + else + { + if (bMouseVisible == FALSE) + ShowCursor(TRUE); + Message("Lost the focus"); + bMouseVisible = TRUE; + Message("Mouse visible"); + } + break; + + + case WM_SYSKEYUP: + switch( wParam ) + { + +// int32 rv; + + // handle ALT+ENTER (fullscreen) + case VK_RETURN: + break; + } + break; + + + case WM_DISPLAYCHANGE: + break; + + case WM_CREATE: + SystemParametersInfo(SPI_GETSCREENSAVEACTIVE , 0 , &wasScreenSaverActive , 0); + if (wasScreenSaverActive) + { + SystemParametersInfo(SPI_SETSCREENSAVEACTIVE , FALSE , 0 , 0 ); + } + break; + + + case WM_QUERYNEWPALETTE: + // + // we are getting the palette focus, select our palette + // + if (!bFullScreen && lpPalette && lpPrimarySurface) + { + int32 hr; + + hr = IDirectDrawSurface_SetPalette(lpPrimarySurface, lpPalette); + if (hr == DDERR_SURFACELOST) + { + IDirectDrawSurface_Restore(lpPrimarySurface); + + hr= IDirectDrawSurface_SetPalette(lpPrimarySurface, lpPalette); + if(hr == DDERR_SURFACELOST) + { + Message("Failed to restore palette after second try"); + } + } + + // + // Restore normal title if palette is ours + // + if(hr == DD_OK) + { + SetWindowText(hwnd, gameName); + } + } + break; + + case WM_PALETTECHANGED: + // + // if another app changed the palette we dont have full control + // of the palette. NOTE this only applies for FoxBear in a window + // when we are fullscreen we get all the palette all of the time. + // + if ((HWND)wParam != hwnd) + { + if( !bFullScreen ) + { + Message("Lost palette but continuing"); + } + } + break; + + +// case WM_SETCURSOR: +// if (bMouseVisible) +// SetCursor(LoadCursor(NULL, IDC_ARROW)); +// else +// SetCursor(NULL); +// return TRUE; +// break; + + case WM_CHAR: + if (lParam & (1 << 30)) + return(0); + WriteKey((char) (wParam & 0xff)); + return(0); + + case WM_KEYDOWN: + + Zdebug("key %d", wParam); + + switch( wParam ) + { + case VK_CONTROL: + controlKey = TRUE; + break; + +// case VK_ALT: +// altKey = TRUE; +// break; + + case 'W': + if (controlKey) + GrabScreenShot(); + return 0; + + case 'Q': + if (controlKey && !controlQDisabled) + DestroyWindow( hWnd ); + return 0; + + case 'F4': + DestroyWindow( hWnd ); + return 0; + + } + break; + + + case WM_KEYUP: + switch(wParam) + { + case VK_CONTROL: + controlKey = FALSE; + break; + +// case VK_ALT: +// altKey = FALSE; +// break; + + } + break; + + + case WM_DESTROY: + Zdebug("*destroy*"); + + if (wasScreenSaverActive) + SystemParametersInfo(SPI_SETSCREENSAVEACTIVE , TRUE , 0 , 0 ); + PostQuitMessage( 0 ); + break; + + + case WM_MOUSEMOVE: + mousex = lParam & 0xffff; + + if (bFullScreen) + { + mousey = (uint16) (lParam >> 16) - MENUDEEP; + } + else + { + mousey = (uint16) (lParam >> 16) - MENUDEEP; + + if (mousex < 0) + mousex = 0; + if (mousex >= RENDERWIDE) + mousex = RENDERWIDE-1; + } + + if (mousey < -MENUDEEP) + mousey = -MENUDEEP; + if (mousey >= RENDERDEEP + MENUDEEP) + mousey = RENDERDEEP + MENUDEEP - 1; + + return(0); + + case WM_LBUTTONDOWN: + LogMouseEvent(RD_LEFTBUTTONDOWN); + return(0); + + case WM_LBUTTONUP: + LogMouseEvent(RD_LEFTBUTTONUP); + return(0); + + case WM_RBUTTONDOWN: + LogMouseEvent(RD_RIGHTBUTTONDOWN); + return(0); + + case WM_RBUTTONUP: + LogMouseEvent(RD_RIGHTBUTTONUP); + return(0); + + case WM_LBUTTONDBLCLK: + LogMouseEvent(RD_LEFTBUTTONDOWN); + return(0); + + case WM_RBUTTONDBLCLK: + LogMouseEvent(RD_RIGHTBUTTONDOWN); + + + case WM_SYSCOMMAND: + if (gotTheFocus) + return(0); + + + + + } + + return DefWindowProc(hWnd, message, wParam, lParam); + +} +*/ + + +/* +int32 InitialiseWindow(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow, char *gameName) + +{ + + WNDCLASS wc; +// uint32 err; + + +// hPrevInstance = hPrevInstance; + wc.style = CS_DBLCLKS; + wc.lpfnWndProc = WindowsMessageHandler; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = hInstance; + wc.hIcon = LoadIcon( hInstance, "resourc1"); //IDI_APPLICATION ); + wc.hCursor = LoadCursor( NULL, IDC_ARROW ); + wc.hbrBackground = GetStockObject(BLACK_BRUSH); + + wc.lpszMenuName = gameName; + wc.lpszClassName = gameName; + + RegisterClass( &wc ); + + // Create a window + hwnd = CreateWindowEx(WS_EX_APPWINDOW, gameName, gameName, WS_VISIBLE | WS_SYSMENU | WS_POPUP, 0, 0, + GetSystemMetrics( SM_CXSCREEN ), GetSystemMetrics( SM_CYSCREEN ), + NULL, NULL, hInstance, NULL ); + + if(!hwnd) + { + MessageBox(hwnd, "Failed to create window", gameName, MB_OK ); + DestroyWindow(hwnd); + return(RDERR_CREATEWINDOW); + } + +// ShowWindow(hwnd, nCmdShow); + UpdateWindow(hwnd); + SetFocus(hwnd); + + SetTimer(hwnd, 25, 1000 / 25, NULL); + SetTimer(hwnd, 1, 100, NULL); + + return(RD_OK); + +} +*/ + + +int32 CloseAppWindow(void) + +{ + warning("stub CloseAppWindow"); +/* + DestroyWindow(hwnd); +*/ + // just quit for now + g_bs2->_syst->quit(); + return(RD_OK); + +} + + + +int32 ServiceWindows(void) + +{ + g_bs2->parseEvents(); +// warning("stub ServiceWindows"); // too noisy +/* + MSG msg; + + if (myAppClosed) + return(RDERR_APPCLOSED); + + while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) + { + if (!GetMessage(&msg, NULL, 0, 0)) + { + myAppClosed = TRUE; + return(RDERR_APPCLOSED); + } + + TranslateMessage(&msg); + DispatchMessage(&msg); + } +*/ + return(RD_OK); + +} + + + + +int32 _ReportDriverError(int32 error, uint8 *filename, uint32 line) + +{ + warning("stub _ReportDriverError 0x%.8x file: %s, line: %d ", error, (char *) filename, line); +/* + + char errorText[128]; + char name[80]; + + + GetGameName(name); + sprintf(errorText, "Fatal error in %s, line %u! Code 0x%.8x", filename, line, error); + MessageBox(hwnd, errorText, name, MB_SYSTEMMODAL | MB_ICONHAND | MB_ABORTRETRYIGNORE); +*/ + return(RD_OK); + +} + + + +int32 _ReportFatalError(uint8 *error, uint8 *filename, uint32 line) + +{ + + warning("stub _ReportFatalError"); + char errorText[500]; + char name[80]; + + + GetGameName((uint8 *)name); + sprintf(errorText, "FATAL ERROR - GAME TERMINATED\n%s", error); + //MessageBox(hwnd, errorText, name, MB_SYSTEMMODAL | MB_ICONHAND | MB_ABORTRETRYIGNORE); + warning("%s", errorText); + + return(RD_OK); + +} + + +int32 DisableQuitKey(void) +{ + controlQDisabled = TRUE; + return(RD_OK); +} + +void SetWindowName(const char *windowName) +{ + warning("stub SetWindowName( %s )", windowName); +// SetWindowText(hwnd,windowName); +// strcpy(gameName,windowName); +} |