297 lines
7.7 KiB
C++
297 lines
7.7 KiB
C++
/* ScummVM - Graphic Adventure Engine
|
||
*
|
||
* ScummVM is the legal property of its developers, whose names
|
||
* are too numerous to list here. Please refer to the COPYRIGHT
|
||
* file distributed with this source distribution.
|
||
*
|
||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||
*
|
||
* $URL$
|
||
* $Id$
|
||
*
|
||
*/
|
||
|
||
/*
|
||
* This code is based on Broken Sword 2.5 engine
|
||
*
|
||
* Copyright (c) Malte Thiesen, Daniel Queteschiner and Michael Elsdoerfer
|
||
*
|
||
* Licensed under GNU GPL v2
|
||
*
|
||
*/
|
||
|
||
#include "common/system.h"
|
||
#include "engines/util.h"
|
||
#include "graphics/pixelformat.h"
|
||
#include "sword25/kernel/scummvmwindow.h"
|
||
#include "sword25/kernel/kernel.h"
|
||
#include "sword25/input/inputengine.h"
|
||
|
||
#define BS_LOG_PREFIX "WIN32WINDOW"
|
||
|
||
namespace Sword25 {
|
||
|
||
bool ScummVMWindow::_classRegistered = false;
|
||
|
||
// Constructor / Destructor
|
||
// ------------------------
|
||
ScummVMWindow::ScummVMWindow(int x, int y, int width, int height, bool visible) {
|
||
// Presume that init will fail
|
||
_initSuccess = false;
|
||
|
||
// We don't support any window creation except at the origin 0,0
|
||
assert(x == 0);
|
||
assert(y == 0);
|
||
|
||
if (!_classRegistered) {
|
||
// Nothing here currently
|
||
|
||
_classRegistered = true;
|
||
}
|
||
|
||
// Fenstersichtbarkeit setzen
|
||
setVisible(visible);
|
||
|
||
// Indicate success
|
||
_initSuccess = true;
|
||
_windowAlive = true;
|
||
_closeWanted = false;
|
||
}
|
||
|
||
ScummVMWindow::~ScummVMWindow() {
|
||
}
|
||
|
||
// Get Methods
|
||
// ------------
|
||
int ScummVMWindow::getX() {
|
||
return 0;
|
||
}
|
||
|
||
int ScummVMWindow::getY() {
|
||
return 0;
|
||
}
|
||
|
||
int ScummVMWindow::getClientX() {
|
||
return 0;
|
||
}
|
||
|
||
int ScummVMWindow::getClientY() {
|
||
return 0;
|
||
}
|
||
|
||
int ScummVMWindow::getWidth() {
|
||
return g_system->getWidth();
|
||
}
|
||
|
||
int ScummVMWindow::getHeight() {
|
||
return g_system->getHeight();
|
||
}
|
||
|
||
Common::String ScummVMWindow::getTitle() {
|
||
return Common::String("");
|
||
}
|
||
|
||
bool ScummVMWindow::isVisible() {
|
||
return true;
|
||
}
|
||
|
||
bool ScummVMWindow::hasFocus() {
|
||
// FIXME: Is there a way to tell if ScummVM has the focus in Windowed mode?
|
||
return true;
|
||
}
|
||
|
||
uint ScummVMWindow::getWindowHandle() {
|
||
return 0;
|
||
}
|
||
|
||
void ScummVMWindow::setWindowAlive(bool v) {
|
||
_windowAlive = v;
|
||
}
|
||
|
||
|
||
// Set Methods
|
||
// ------------
|
||
|
||
void ScummVMWindow::setX(int X) {
|
||
// No implementation
|
||
}
|
||
|
||
void ScummVMWindow::setY(int Y) {
|
||
// No implementation
|
||
}
|
||
|
||
void ScummVMWindow::setWidth(int width) {
|
||
// No implementation
|
||
}
|
||
|
||
void ScummVMWindow::setHeight(int height) {
|
||
// No implementation
|
||
}
|
||
|
||
void ScummVMWindow::setVisible(bool visible) {
|
||
// No implementation
|
||
}
|
||
|
||
void ScummVMWindow::setTitle(const Common::String &title) {
|
||
// No implementation
|
||
}
|
||
|
||
bool ScummVMWindow::processMessages() {
|
||
// All messages are handled separately in the input manager. The only thing we
|
||
// need to do here is to keep returning whether the window/game is still alive
|
||
return _windowAlive;
|
||
}
|
||
|
||
bool ScummVMWindow::waitForFocus() {
|
||
// No implementation
|
||
return true;
|
||
}
|
||
|
||
// FIXME: Special keys detected here need to be moved into the Input Engine
|
||
/*
|
||
// Die WindowProc aller Fenster der Klasse
|
||
LRESULT CALLBACK BS_ScummVMWindow::WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||
{
|
||
switch(uMsg)
|
||
{
|
||
case WM_PAINT:
|
||
ValidateRect(hwnd, NULL);
|
||
break;
|
||
|
||
case WM_DESTROY:
|
||
// Das Fenster wird zerst<73>rt
|
||
PostQuitMessage(0);
|
||
break;
|
||
|
||
case WM_CLOSE:
|
||
{
|
||
BS_Window * WindowPtr = BS_Kernel::GetInstance()->GetWindow();
|
||
if (WindowPtr) {
|
||
WindowPtr->SetCloseWanted(true);
|
||
}
|
||
break;
|
||
}
|
||
|
||
case WM_KEYDOWN:
|
||
{
|
||
// Tastendr<64>cke, die f<>r das Inputmodul interessant sind, werden diesem gemeldet.
|
||
BS_InputEngine * InputPtr = BS_Kernel::GetInstance()->GetInput();
|
||
|
||
if (InputPtr)
|
||
{
|
||
switch (wParam)
|
||
{
|
||
case VK_RETURN:
|
||
InputPtr->ReportCommand(BS_InputEngine::KEY_COMMAND_ENTER);
|
||
break;
|
||
|
||
case VK_LEFT:
|
||
InputPtr->ReportCommand(BS_InputEngine::KEY_COMMAND_LEFT);
|
||
break;
|
||
|
||
case VK_RIGHT:
|
||
InputPtr->ReportCommand(BS_InputEngine::KEY_COMMAND_RIGHT);
|
||
break;
|
||
|
||
case VK_HOME:
|
||
InputPtr->ReportCommand(BS_InputEngine::KEY_COMMAND_HOME);
|
||
break;
|
||
|
||
case VK_END:
|
||
InputPtr->ReportCommand(BS_InputEngine::KEY_COMMAND_END);
|
||
break;
|
||
|
||
case VK_BACK:
|
||
InputPtr->ReportCommand(BS_InputEngine::KEY_COMMAND_BACKSPACE);
|
||
break;
|
||
|
||
case VK_TAB:
|
||
InputPtr->ReportCommand(BS_InputEngine::KEY_COMMAND_TAB);
|
||
break;
|
||
|
||
case VK_INSERT:
|
||
InputPtr->ReportCommand(BS_InputEngine::KEY_COMMAND_INSERT);
|
||
break;
|
||
|
||
case VK_DELETE:
|
||
InputPtr->ReportCommand(BS_InputEngine::KEY_COMMAND_DELETE);
|
||
break;
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
|
||
case WM_KEYUP:
|
||
case WM_SYSKEYUP:
|
||
// Alle Tastendr<64>cke werden ignoriert, damit Windows per DefWindowProc() nicht darauf
|
||
// reagieren kann und damit unerwartete Seiteneffekte ausl<73>st.
|
||
// Zum Beispiel w<>rden ALT und F10 Tastendr<64>cke das "Men<65>" aktivieren und somit den Message-Loop zum Stillstand bringen.
|
||
break;
|
||
|
||
case WM_SYSCOMMAND:
|
||
// Verhindern, dass der Bildschirmschoner aktiviert wird, w<>hrend das Spiel l<>uft
|
||
if (wParam != SC_SCREENSAVE) return DefWindowProc(hwnd,uMsg,wParam,lParam);
|
||
break;
|
||
|
||
case WM_CHAR:
|
||
{
|
||
byte theChar = static_cast<byte>(wParam & 0xff);
|
||
|
||
// Alle Zeichen, die keine Steuerzeichen sind, werden als Buchstaben dem Input-Service mitgeteilt.
|
||
if (theChar >= 32)
|
||
{
|
||
BS_InputEngine * InputPtr = BS_Kernel::GetInstance()->GetInput();
|
||
if (InputPtr) InputPtr->ReportCharacter(theChar);
|
||
}
|
||
}
|
||
break;
|
||
|
||
case WM_SETCURSOR:
|
||
{
|
||
// Der Systemcursor wird in der Client-Area des Fensters nicht angezeigt, jedoch in der nicht Client-Area, damit der Benutzer das Fenster wie gewohnt
|
||
// schlie<69>en und verschieben kann.
|
||
|
||
// Koordinaten des Cursors in der Client-Area berechnen.
|
||
POINT pt;
|
||
GetCursorPos(&pt);
|
||
ScreenToClient(hwnd, &pt);
|
||
|
||
// Feststellen, ob sich der Cursor in der Client-Area befindet.
|
||
// Get client rect
|
||
RECT rc;
|
||
GetClientRect(hwnd, &rc);
|
||
|
||
// See if cursor is in client area
|
||
if(PtInRect(&rc, pt))
|
||
// In der Client-Area keinen Cursor anzeigen.
|
||
SetCursor(NULL);
|
||
else
|
||
// Ausserhalb der Client-Area den Cursor anzeigen.
|
||
SetCursor(LoadCursor(NULL, IDC_ARROW));
|
||
|
||
return TRUE;
|
||
}
|
||
break;
|
||
|
||
default:
|
||
// Um alle anderen Vorkommnisse k<>mmert sich Windows
|
||
return DefWindowProc(hwnd,uMsg,wParam,lParam);
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
*/
|
||
|
||
} // End of namespace Sword25
|