diff options
author | Alejandro Marzini | 2010-06-30 04:46:55 +0000 |
---|---|---|
committer | Alejandro Marzini | 2010-06-30 04:46:55 +0000 |
commit | c174d5327bfaf55d998cf67f3e4f49a0eaf2ed39 (patch) | |
tree | b642082f28dd9de53c95f64aba19a4a789bd2bfc | |
parent | afd2a2c01d4bf3686a54c631d1cd4228ba1d710c (diff) | |
download | scummvm-rg350-c174d5327bfaf55d998cf67f3e4f49a0eaf2ed39.tar.gz scummvm-rg350-c174d5327bfaf55d998cf67f3e4f49a0eaf2ed39.tar.bz2 scummvm-rg350-c174d5327bfaf55d998cf67f3e4f49a0eaf2ed39.zip |
Modularized GP2XWIZ backend.
svn-id: r50514
-rw-r--r-- | backends/events/gp2xwizsdl/gp2xwizsdl-events.cpp | 336 | ||||
-rw-r--r-- | backends/events/gp2xwizsdl/gp2xwizsdl-events.h | 49 | ||||
-rw-r--r-- | backends/events/sdl/sdl-events.cpp | 24 | ||||
-rw-r--r-- | backends/events/sdl/sdl-events.h | 16 | ||||
-rw-r--r-- | backends/graphics/gp2xwizsdl/gp2xwizsdl-graphics.cpp (renamed from backends/platform/gp2xwiz/gp2xwiz-graphics.cpp) | 47 | ||||
-rw-r--r-- | backends/graphics/gp2xwizsdl/gp2xwizsdl-graphics.h | 58 | ||||
-rw-r--r-- | backends/graphics/sdl/sdl-graphics.h | 66 | ||||
-rw-r--r-- | backends/module.mk | 2 | ||||
-rw-r--r-- | backends/platform/gp2xwiz/gp2xwiz-events.cpp | 500 | ||||
-rw-r--r-- | backends/platform/gp2xwiz/gp2xwiz-main.cpp | 180 | ||||
-rw-r--r-- | backends/platform/gp2xwiz/gp2xwiz-sdl.cpp | 194 | ||||
-rw-r--r-- | backends/platform/gp2xwiz/gp2xwiz-sdl.h | 49 | ||||
-rw-r--r-- | backends/platform/gp2xwiz/module.mk | 5 | ||||
-rw-r--r-- | backends/platform/sdl/posix/posix-main.cpp | 2 |
14 files changed, 733 insertions, 795 deletions
diff --git a/backends/events/gp2xwizsdl/gp2xwizsdl-events.cpp b/backends/events/gp2xwizsdl/gp2xwizsdl-events.cpp new file mode 100644 index 0000000000..9ca1b4059e --- /dev/null +++ b/backends/events/gp2xwizsdl/gp2xwizsdl-events.cpp @@ -0,0 +1,336 @@ +/* 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$ + * + */ + +#ifdef GP2XWIZ + +#include "backends/events/gp2xwizsdl/gp2xwizsdl-events.h" +#include "backends/platform/gp2xwiz/gp2xwiz-hw.h" +#include "backends/platform/gp2xwiz/gp2xwiz-sdl.h" + +// FIXME move joystick defines out and replace with confile file options +// we should really allow users to map any key to a joystick button using the keymapper. +#define JOY_DEADZONE 2200 + +#define JOY_XAXIS 0 +#define JOY_YAXIS 1 + +/* GP2X Wiz: Main Joystick Mappings */ +enum { + GP2X_BUTTON_UP = 0, + GP2X_BUTTON_UPLEFT = 1, + GP2X_BUTTON_LEFT = 2, + GP2X_BUTTON_DOWNLEFT = 3, + GP2X_BUTTON_DOWN = 4, + GP2X_BUTTON_DOWNRIGHT = 5, + GP2X_BUTTON_RIGHT = 6, + GP2X_BUTTON_UPRIGHT = 7, + GP2X_BUTTON_MENU = 8, + GP2X_BUTTON_SELECT = 9, + GP2X_BUTTON_L = 10, + GP2X_BUTTON_R = 11, + GP2X_BUTTON_A = 12, + GP2X_BUTTON_B = 13, + GP2X_BUTTON_X = 14, + GP2X_BUTTON_Y = 15, + GP2X_BUTTON_VOLUP = 16, + GP2X_BUTTON_VOLDOWN = 17 +}; + +GP2XWIZSdlEventManager::GP2XWIZSdlEventManager(Common::EventSource *boss) + : + _buttonStateL(false), + SdlEventManager(boss) { + +} + +void GP2XWIZSdlEventManager::SDLModToOSystemKeyFlags(SDLMod mod, Common::Event &event) { + event.kbd.flags = 0; + + if (mod & KMOD_SHIFT) + event.kbd.flags |= Common::KBD_SHIFT; + if (mod & KMOD_ALT) + event.kbd.flags |= Common::KBD_ALT; + if (mod & KMOD_CTRL) + event.kbd.flags |= Common::KBD_CTRL; +} + +void GP2XWIZSdlEventManager::moveStick() { + bool stickBtn[32]; + + memcpy(stickBtn, _stickBtn, sizeof(stickBtn)); + + if ((stickBtn[0])||(stickBtn[2])||(stickBtn[4])||(stickBtn[6])) + stickBtn[1] = stickBtn[3] = stickBtn[5] = stickBtn[7] = 0; + + if ((stickBtn[1])||(stickBtn[2])||(stickBtn[3])) { + if (_km.x_down_count!=2) { + _km.x_vel = -1; + _km.x_down_count = 1; + } else + _km.x_vel = -4; + } else if ((stickBtn[5])||(stickBtn[6])||(stickBtn[7])) { + if (_km.x_down_count!=2) { + _km.x_vel = 1; + _km.x_down_count = 1; + } else + _km.x_vel = 4; + } else { + _km.x_vel = 0; + _km.x_down_count = 0; + } + + if ((stickBtn[0])||(stickBtn[1])||(stickBtn[7])) { + if (_km.y_down_count!=2) { + _km.y_vel = -1; + _km.y_down_count = 1; + } else + _km.y_vel = -4; + } else if ((stickBtn[3])||(stickBtn[4])||(stickBtn[5])) { + if (_km.y_down_count!=2) { + _km.y_vel = 1; + _km.y_down_count = 1; + } else + _km.y_vel = 4; + } else { + _km.y_vel = 0; + _km.y_down_count = 0; + } +} + +/* GP2X Wiz Input mappings. +Single Button + +Movement: + +GP2X_BUTTON_UP Cursor Up +GP2X_BUTTON_DOWN Cursor Down +GP2X_BUTTON_LEFT Cursor Left +GP2X_BUTTON_RIGHT Cursor Right + +GP2X_BUTTON_UPLEFT Cursor Up Left +GP2X_BUTTON_UPRIGHT Cursor Up Right +GP2X_BUTTON_DOWNLEFT Cursor Down Left +GP2X_BUTTON_DOWNRIGHT Cursor Down Right + +Button Emulation: + +GP2X_BUTTON_A . (Period) +GP2X_BUTTON_B Left Mouse Click +GP2X_BUTTON_Y Space Bar +GP2X_BUTTON_X Right Mouse Click +GP2X_BUTTON_L Combo Modifier (Left Trigger) +GP2X_BUTTON_R Return (Right Trigger) +GP2X_BUTTON_MENU F5 (Game Menu) +GP2X_BUTTON_SELECT Escape +GP2X_BUTTON_VOLUP /dev/mixer Global Volume Up +GP2X_BUTTON_VOLDOWN /dev/mixer Global Volume Down + +Combos: + +GP2X_BUTTON_VOLUP & GP2X_BUTTON_VOLDOWN 0 (For Monkey 2 CP) or Virtual Keyboard if enabled +GP2X_BUTTON_L & GP2X_BUTTON_SELECT Common::EVENT_QUIT (Calls Sync() to make sure SD is flushed) +GP2X_BUTTON_L & GP2X_BUTTON_MENU Common::EVENT_MAINMENU (ScummVM Global Main Menu) +GP2X_BUTTON_L & GP2X_BUTTON_A Common::EVENT_PREDICTIVE_DIALOG for predictive text entry box (AGI games) +*/ + +bool GP2XWIZSdlEventManager::handleKeyDown(SDL_Event &ev, Common::Event &event) { + SDLModToOSystemKeyFlags(SDL_GetModState(), event); + + if (remapKey(ev, event)) + return true; + + event.type = Common::EVENT_KEYDOWN; + event.kbd.keycode = (Common::KeyCode)ev.key.keysym.sym; + event.kbd.ascii = mapKey(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode); + + return true; +} + +bool GP2XWIZSdlEventManager::handleKeyUp(SDL_Event &ev, Common::Event &event) { + if (remapKey(ev, event)) + return true; + + event.type = Common::EVENT_KEYUP; + event.kbd.keycode = (Common::KeyCode)ev.key.keysym.sym; + event.kbd.ascii = mapKey(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode); + SDLModToOSystemKeyFlags(SDL_GetModState(), event); + + // Ctrl-Alt-<key> will change the GFX mode + if ((event.kbd.flags & (Common::KBD_CTRL | Common::KBD_ALT)) == (Common::KBD_CTRL | Common::KBD_ALT)) { + // Swallow these key up events + return false; + } + + return true; +} + +bool GP2XWIZSdlEventManager::handleJoyButtonDown(SDL_Event &ev, Common::Event &event) { + _stickBtn[ev.jbutton.button] = 1; + if (ev.jbutton.button == GP2X_BUTTON_B) { + event.type = Common::EVENT_LBUTTONDOWN; + fillMouseEvent(event, _km.x, _km.y); + } else if (ev.jbutton.button == GP2X_BUTTON_X) { + event.type = Common::EVENT_RBUTTONDOWN; + fillMouseEvent(event, _km.x, _km.y); + } else if (_stickBtn[GP2X_BUTTON_L] && (ev.jbutton.button == GP2X_BUTTON_SELECT)) { + event.type = Common::EVENT_QUIT; + } else if (ev.jbutton.button < 8) { + moveStick(); + event.type = Common::EVENT_MOUSEMOVE; + fillMouseEvent(event, _km.x, _km.y); + } else { + event.type = Common::EVENT_KEYDOWN; + event.kbd.flags = 0; + switch (ev.jbutton.button) { + case GP2X_BUTTON_L: + _buttonStateL = true; + break; + case GP2X_BUTTON_R: + if (_buttonStateL == true) { +#ifdef ENABLE_VKEYBD + event.kbd.keycode = Common::KEYCODE_F7; + event.kbd.ascii = mapKey(SDLK_F7, ev.key.keysym.mod, 0); +#else + event.kbd.keycode = Common::KEYCODE_0; + event.kbd.ascii = mapKey(SDLK_0, ev.key.keysym.mod, 0); +#endif + } else { + event.kbd.keycode = Common::KEYCODE_RETURN; + event.kbd.ascii = mapKey(SDLK_RETURN, ev.key.keysym.mod, 0); + } + break; + case GP2X_BUTTON_SELECT: + if (_buttonStateL == true) { + event.type = Common::EVENT_QUIT; + } else { + event.kbd.keycode = Common::KEYCODE_ESCAPE; + event.kbd.ascii = mapKey(SDLK_ESCAPE, ev.key.keysym.mod, 0); + } + break; + case GP2X_BUTTON_A: + if (_buttonStateL == true) { + event.type = Common::EVENT_PREDICTIVE_DIALOG; + } else { + event.kbd.keycode = Common::KEYCODE_PERIOD; + event.kbd.ascii = mapKey(SDLK_PERIOD, ev.key.keysym.mod, 0); + } + break; + case GP2X_BUTTON_Y: + event.kbd.keycode = Common::KEYCODE_SPACE; + event.kbd.ascii = mapKey(SDLK_SPACE, ev.key.keysym.mod, 0); + break; + case GP2X_BUTTON_MENU: + if (_buttonStateL == true) { + event.type = Common::EVENT_MAINMENU; + } else { + event.kbd.keycode = Common::KEYCODE_F5; + event.kbd.ascii = mapKey(SDLK_F5, ev.key.keysym.mod, 0); + } + break; + case GP2X_BUTTON_VOLUP: + WIZ_HW::mixerMoveVolume(2); + if (WIZ_HW::volumeLevel == 100) { + g_system->displayMessageOnOSD("Maximum Volume"); + } else { + g_system->displayMessageOnOSD("Increasing Volume"); + } + break; + + case GP2X_BUTTON_VOLDOWN: + WIZ_HW::mixerMoveVolume(1); + if (WIZ_HW::volumeLevel == 0) { + g_system->displayMessageOnOSD("Minimal Volume"); + } else { + g_system->displayMessageOnOSD("Decreasing Volume"); + } + break; + } + } + return true; +} + +bool GP2XWIZSdlEventManager::handleJoyButtonUp(SDL_Event &ev, Common::Event &event) { + _stickBtn[ev.jbutton.button] = 0; + if (ev.jbutton.button == GP2X_BUTTON_B) { + event.type = Common::EVENT_LBUTTONUP; + fillMouseEvent(event, _km.x, _km.y); + } else if (ev.jbutton.button == GP2X_BUTTON_X) { + event.type = Common::EVENT_RBUTTONUP; + fillMouseEvent(event, _km.x, _km.y); + } else if (ev.jbutton.button < 8) { + moveStick(); + event.type = Common::EVENT_MOUSEMOVE; + fillMouseEvent(event, _km.x, _km.y); + } else { + event.type = Common::EVENT_KEYUP; + event.kbd.flags = 0; + switch (ev.jbutton.button) { + case GP2X_BUTTON_SELECT: + event.kbd.keycode = Common::KEYCODE_ESCAPE; + event.kbd.ascii = mapKey(SDLK_ESCAPE, ev.key.keysym.mod, 0); + break; + case GP2X_BUTTON_A: + event.kbd.keycode = Common::KEYCODE_PERIOD; + event.kbd.ascii = mapKey(SDLK_PERIOD, ev.key.keysym.mod, 0); + break; + case GP2X_BUTTON_Y: + event.kbd.keycode = Common::KEYCODE_SPACE; + event.kbd.ascii = mapKey(SDLK_SPACE, ev.key.keysym.mod, 0); + break; + case GP2X_BUTTON_MENU: + if (_buttonStateL == true) { + event.type = Common::EVENT_MAINMENU; + } else { + event.kbd.keycode = Common::KEYCODE_F5; + event.kbd.ascii = mapKey(SDLK_F5, ev.key.keysym.mod, 0); + } + break; + case GP2X_BUTTON_L: + _buttonStateL = false; + break; + case GP2X_BUTTON_R: + if (_buttonStateL == true) { +#ifdef ENABLE_VKEYBD + event.kbd.keycode = Common::KEYCODE_F7; + event.kbd.ascii = mapKey(SDLK_F7, ev.key.keysym.mod, 0); +#else + event.kbd.keycode = Common::KEYCODE_0; + event.kbd.ascii = mapKey(SDLK_0, ev.key.keysym.mod, 0); +#endif + } else { + event.kbd.keycode = Common::KEYCODE_RETURN; + event.kbd.ascii = mapKey(SDLK_RETURN, ev.key.keysym.mod, 0); + } + break; + case GP2X_BUTTON_VOLUP: + break; + case GP2X_BUTTON_VOLDOWN: + break; + } + } + return true; +} + +#endif diff --git a/backends/events/gp2xwizsdl/gp2xwizsdl-events.h b/backends/events/gp2xwizsdl/gp2xwizsdl-events.h new file mode 100644 index 0000000000..ba706e20c1 --- /dev/null +++ b/backends/events/gp2xwizsdl/gp2xwizsdl-events.h @@ -0,0 +1,49 @@ +/* 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$ + * + */ + +#if !defined(BACKEND_EVENTS_SDL_GP2XWIZ_H) && !defined(DISABLE_DEFAULT_EVENTMANAGER) +#define BACKEND_EVENTS_SDL_GP2XWIZ_H + +#include "backends/events/sdl/sdl-events.h" + +class GP2XWIZSdlEventManager : public SdlEventManager { +public: + GP2XWIZSdlEventManager(Common::EventSource *boss); + +protected: + bool _stickBtn[32]; + bool _buttonStateL; + + void moveStick(); + + virtual bool handleKeyDown(SDL_Event &ev, Common::Event &event); + virtual bool handleKeyUp(SDL_Event &ev, Common::Event &event); + virtual bool handleJoyButtonDown(SDL_Event &ev, Common::Event &event); + virtual bool handleJoyButtonUp(SDL_Event &ev, Common::Event &event); + + virtual void SDLModToOSystemKeyFlags(SDLMod mod, Common::Event &event); +}; + +#endif diff --git a/backends/events/sdl/sdl-events.cpp b/backends/events/sdl/sdl-events.cpp index 8171929627..c66e45395b 100644 --- a/backends/events/sdl/sdl-events.cpp +++ b/backends/events/sdl/sdl-events.cpp @@ -55,23 +55,22 @@ SdlEventManager::SdlEventManager(Common::EventSource *boss) _lastScreenID(0), DefaultEventManager(boss) { - // reset mouse state + // Reset mouse state memset(&_km, 0, sizeof(_km)); int joystick_num = ConfMan.getInt("joystick_num"); - if (joystick_num > -1) { + // Initialize SDL joystick subsystem if (SDL_InitSubSystem(SDL_INIT_JOYSTICK) == -1) { error("Could not initialize SDL: %s", SDL_GetError()); } - } - // enable joystick - if (joystick_num > -1 && SDL_NumJoysticks() > 0) { - printf("Using joystick: %s\n", SDL_JoystickName(0)); - _joystick = SDL_JoystickOpen(joystick_num); + // Enable joystick + if (SDL_NumJoysticks() > 0) { + printf("Using joystick: %s\n", SDL_JoystickName(0)); + _joystick = SDL_JoystickOpen(joystick_num); + } } - } SdlEventManager::~SdlEventManager() { @@ -79,7 +78,7 @@ SdlEventManager::~SdlEventManager() { SDL_JoystickClose(_joystick); } -static int mapKey(SDLKey key, SDLMod mod, Uint16 unicode) { +int SdlEventManager::mapKey(SDLKey key, SDLMod mod, Uint16 unicode) { if (key >= SDLK_F1 && key <= SDLK_F9) { return key - SDLK_F1 + Common::ASCII_F1; } else if (key >= SDLK_KP0 && key <= SDLK_KP9) { @@ -177,7 +176,7 @@ void SdlEventManager::handleKbdMouse() { } } -static void SDLModToOSystemKeyFlags(SDLMod mod, Common::Event &event) { +void SdlEventManager::SDLModToOSystemKeyFlags(SDLMod mod, Common::Event &event) { event.kbd.flags = 0; @@ -203,8 +202,6 @@ static void SDLModToOSystemKeyFlags(SDLMod mod, Common::Event &event) { } bool SdlEventManager::pollSdlEvent(Common::Event &event) { - SDL_Event ev; - handleKbdMouse(); // If the screen changed, send an Common::EVENT_SCREEN_CHANGED @@ -215,6 +212,7 @@ bool SdlEventManager::pollSdlEvent(Common::Event &event) { return true; } + SDL_Event ev; while (SDL_PollEvent(&ev)) { preprocessEvents(&ev); if (dispatchSDLEvent(ev, event)) @@ -484,7 +482,7 @@ bool SdlEventManager::handleJoyAxisMotion(SDL_Event &ev, Common::Event &event) { if ( ev.jaxis.axis == JOY_XAXIS) { #ifdef JOY_ANALOG - _km.x_vel = axis/2000; + _km.x_vel = axis / 2000; _km.x_down_count = 0; #else if (axis != 0) { diff --git a/backends/events/sdl/sdl-events.h b/backends/events/sdl/sdl-events.h index 0f6cb998a8..3b3098dc29 100644 --- a/backends/events/sdl/sdl-events.h +++ b/backends/events/sdl/sdl-events.h @@ -46,8 +46,6 @@ public: virtual void toggleMouseGrab(); protected: - virtual void preprocessEvents(SDL_Event *event) {} - // Keyboard mouse emulation. Disabled by fingolfin 2004-12-18. // I am keeping the rest of the code in for now, since the joystick // code (or rather, "hack") uses it, too. @@ -55,19 +53,24 @@ protected: int16 x, y, x_vel, y_vel, x_max, y_max, x_down_count, y_down_count; uint32 last_time, delay_time, x_down_time, y_down_time; }; - KbdMouse _km; // Scroll lock state - since SDL doesn't track it bool _scrollLock; - // joystick + // Joystick SDL_Joystick *_joystick; + int _lastScreenID; + + // Pre process an event before it is dispatched. + virtual void preprocessEvents(SDL_Event *event) {} + + // Dispatchs SDL events for each handler. virtual bool dispatchSDLEvent(SDL_Event &ev, Common::Event &event); // Handlers for specific SDL events, called by pollEvent. - // This way, if a backend inherits fromt the SDL backend, it can + // This way, if a managers inherits fromt this SDL events manager, it can // change the behavior of only a single event, without having to override all // of pollEvent. virtual bool handleKeyDown(SDL_Event &ev, Common::Event &event); @@ -84,7 +87,8 @@ protected: virtual void handleKbdMouse(); virtual bool remapKey(SDL_Event &ev, Common::Event &event); - int _lastScreenID; + virtual int mapKey(SDLKey key, SDLMod mod, Uint16 unicode); + virtual void SDLModToOSystemKeyFlags(SDLMod mod, Common::Event &event); }; #endif diff --git a/backends/platform/gp2xwiz/gp2xwiz-graphics.cpp b/backends/graphics/gp2xwizsdl/gp2xwizsdl-graphics.cpp index 6abddd52f3..3131a7a3a9 100644 --- a/backends/platform/gp2xwiz/gp2xwiz-graphics.cpp +++ b/backends/graphics/gp2xwizsdl/gp2xwizsdl-graphics.cpp @@ -23,15 +23,14 @@ * */ -#include "backends/platform/gp2xwiz/gp2xwiz-sdl.h" +#ifndef GP2XWIZ + +#include "backends/graphics/gp2xwizsdl/gp2xwizsdl-graphics.h" +#include "backends/events/gp2xwizsdl/gp2xwizsdl-events.h" #include "common/mutex.h" -#include "graphics/font.h" -#include "graphics/fontman.h" -#include "graphics/scaler.h" #include "graphics/scaler/aspect.h" #include "graphics/scaler/downscaler.h" -#include "graphics/surface.h" static const OSystem::GraphicsMode s_supportedGraphicsModes[] = { {"1x", "Fullscreen", GFX_NORMAL}, @@ -39,16 +38,15 @@ static const OSystem::GraphicsMode s_supportedGraphicsModes[] = { {0, 0, 0} }; - -const OSystem::GraphicsMode *OSystem_GP2XWIZ::getSupportedGraphicsModes() const { +const OSystem::GraphicsMode *GP2XWIZSdlGraphicsManager::getSupportedGraphicsModes() const { return s_supportedGraphicsModes; } -int OSystem_GP2XWIZ::getDefaultGraphicsMode() const { +int GP2XWIZSdlGraphicsManager::getDefaultGraphicsMode() const { return GFX_NORMAL; } -bool OSystem_GP2XWIZ::setGraphicsMode(int mode) { +bool GP2XWIZSdlGraphicsManager::setGraphicsMode(int mode) { Common::StackLock lock(_graphicsMutex); assert(_transactionMode == kTransactionActive); @@ -82,7 +80,7 @@ bool OSystem_GP2XWIZ::setGraphicsMode(int mode) { return true; } -void OSystem_GP2XWIZ::setGraphicsModeIntern() { +void GP2XWIZSdlGraphicsManager::setGraphicsModeIntern() { Common::StackLock lock(_graphicsMutex); ScalerProc *newScalerProc = 0; @@ -111,8 +109,7 @@ void OSystem_GP2XWIZ::setGraphicsModeIntern() { blitCursor(); } - -void OSystem_GP2XWIZ::initSize(uint w, uint h) { +void GP2XWIZSdlGraphicsManager::initSize(uint w, uint h) { assert(_transactionMode == kTransactionActive); // Avoid redundant res changes @@ -124,13 +121,13 @@ void OSystem_GP2XWIZ::initSize(uint w, uint h) { if (w > 320 || h > 240){ setGraphicsMode(GFX_HALF); setGraphicsModeIntern(); - toggleMouseGrab(); + ((GP2XWIZSdlEventManager *)g_system->getEventManager())->toggleMouseGrab(); } _transactionDetails.sizeChanged = true; } -bool OSystem_GP2XWIZ::loadGFXMode() { +bool GP2XWIZSdlGraphicsManager::loadGFXMode() { _videoMode.overlayWidth = 320; _videoMode.overlayHeight = 240; _videoMode.fullscreen = true; @@ -138,10 +135,10 @@ bool OSystem_GP2XWIZ::loadGFXMode() { if (_videoMode.screenHeight != 200 && _videoMode.screenHeight != 400) _videoMode.aspectRatioCorrection = false; - OSystem_SDL::loadGFXMode(); + return SdlGraphicsManager::loadGFXMode(); } -void OSystem_GP2XWIZ::drawMouse() { +void GP2XWIZSdlGraphicsManager::drawMouse() { if (!_mouseVisible || !_mouseSurface) { _mouseBackup.x = _mouseBackup.y = _mouseBackup.w = _mouseBackup.h = 0; return; @@ -207,7 +204,7 @@ void OSystem_GP2XWIZ::drawMouse() { addDirtyRect(dst.x, dst.y, dst.w, dst.h, true); } -void OSystem_GP2XWIZ::undrawMouse() { +void GP2XWIZSdlGraphicsManager::undrawMouse() { const int x = _mouseBackup.x; const int y = _mouseBackup.y; @@ -225,7 +222,7 @@ void OSystem_GP2XWIZ::undrawMouse() { } } -void OSystem_GP2XWIZ::internUpdateScreen() { +void GP2XWIZSdlGraphicsManager::internUpdateScreen() { SDL_Surface *srcSurf, *origSurf; int height, width; ScalerProc *scalerProc; @@ -419,28 +416,30 @@ void OSystem_GP2XWIZ::internUpdateScreen() { _mouseNeedsRedraw = false; } -void OSystem_GP2XWIZ::showOverlay() { +void GP2XWIZSdlGraphicsManager::showOverlay() { if (_videoMode.mode == GFX_HALF){ _mouseCurState.x = _mouseCurState.x / 2; _mouseCurState.y = _mouseCurState.y / 2; } - OSystem_SDL::showOverlay(); + SdlGraphicsManager::showOverlay(); } -void OSystem_GP2XWIZ::hideOverlay() { +void GP2XWIZSdlGraphicsManager::hideOverlay() { if (_videoMode.mode == GFX_HALF){ _mouseCurState.x = _mouseCurState.x * 2; _mouseCurState.y = _mouseCurState.y * 2; } - OSystem_SDL::hideOverlay(); + SdlGraphicsManager::hideOverlay(); } -void OSystem_GP2XWIZ::warpMouse(int x, int y) { +void GP2XWIZSdlGraphicsManager::warpMouse(int x, int y) { if (_mouseCurState.x != x || _mouseCurState.y != y) { if (_videoMode.mode == GFX_HALF && !_overlayVisible){ x = x / 2; y = y / 2; } } - OSystem_SDL::warpMouse(x, y); + SdlGraphicsManager::warpMouse(x, y); } + +#endif diff --git a/backends/graphics/gp2xwizsdl/gp2xwizsdl-graphics.h b/backends/graphics/gp2xwizsdl/gp2xwizsdl-graphics.h new file mode 100644 index 0000000000..5f0c739379 --- /dev/null +++ b/backends/graphics/gp2xwizsdl/gp2xwizsdl-graphics.h @@ -0,0 +1,58 @@ +/* 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$ + * + */ + +#ifndef BACKENDS_GRAPHICS_SDL_GP2XWIZ_H +#define BACKENDS_GRAPHICS_SDL_GP2XWIZ_H + +#include "backends/graphics/sdl/sdl-graphics.h" + +// FIXME: For now keep hacks in this header to save polluting the SDL backend. +enum { + GFX_HALF = 12 +}; + +class GP2XWIZSdlGraphicsManager : public SdlGraphicsManager { +public: + virtual void setGraphicsModeIntern(); + virtual bool setGraphicsMode(int mode); + virtual const OSystem::GraphicsMode *getSupportedGraphicsModes() const; + virtual int getDefaultGraphicsMode() const; + + virtual void initSize(uint w, uint h); + + virtual void internUpdateScreen(); + + virtual bool loadGFXMode(); + + virtual void drawMouse(); + virtual void undrawMouse(); + + virtual void showOverlay(); + virtual void hideOverlay(); + + virtual void warpMouse(int x, int y); +}; + +#endif diff --git a/backends/graphics/sdl/sdl-graphics.h b/backends/graphics/sdl/sdl-graphics.h index 04f95ff721..4db8c338df 100644 --- a/backends/graphics/sdl/sdl-graphics.h +++ b/backends/graphics/sdl/sdl-graphics.h @@ -73,14 +73,14 @@ public: SdlGraphicsManager(); ~SdlGraphicsManager(); - bool hasFeature(OSystem::Feature f); - void setFeatureState(OSystem::Feature f, bool enable); - bool getFeatureState(OSystem::Feature f); - - const OSystem::GraphicsMode *getSupportedGraphicsModes() const; - int getDefaultGraphicsMode() const; - bool setGraphicsMode(int mode); - int getGraphicsMode() const; + virtual bool hasFeature(OSystem::Feature f); + virtual void setFeatureState(OSystem::Feature f, bool enable); + virtual bool getFeatureState(OSystem::Feature f); + + virtual const OSystem::GraphicsMode *getSupportedGraphicsModes() const; + virtual int getDefaultGraphicsMode() const; + virtual bool setGraphicsMode(int mode); + virtual int getGraphicsMode() const; #ifdef USE_RGB_COLOR virtual Graphics::PixelFormat getScreenFormat() const { return _screenFormat; } virtual Common::List<Graphics::PixelFormat> getSupportedFormats(); @@ -88,52 +88,52 @@ public: virtual void initSize(uint w, uint h, const Graphics::PixelFormat *format = NULL); virtual int getScreenChangeID() const { return _screenChangeCount; } - void beginGFXTransaction(); - OSystem::TransactionError endGFXTransaction(); + virtual void beginGFXTransaction(); + virtual OSystem::TransactionError endGFXTransaction(); virtual int16 getHeight(); virtual int16 getWidth(); - void setPalette(const byte *colors, uint start, uint num); - void grabPalette(byte *colors, uint start, uint num); + virtual void setPalette(const byte *colors, uint start, uint num); + virtual void grabPalette(byte *colors, uint start, uint num); virtual void copyRectToScreen(const byte *buf, int pitch, int x, int y, int w, int h); virtual Graphics::Surface *lockScreen(); virtual void unlockScreen(); - void fillScreen(uint32 col); - void updateScreen(); - void setShakePos(int shakeOffset); - void setFocusRectangle(const Common::Rect& rect) {} - void clearFocusRectangle() {} + virtual void fillScreen(uint32 col); + virtual void updateScreen(); + virtual void setShakePos(int shakeOffset); + virtual void setFocusRectangle(const Common::Rect& rect) {} + virtual void clearFocusRectangle() {} virtual void showOverlay(); virtual void hideOverlay(); virtual Graphics::PixelFormat getOverlayFormat() const { return _overlayFormat; } - void clearOverlay(); - void grabOverlay(OverlayColor *buf, int pitch); - void copyRectToOverlay(const OverlayColor *buf, int pitch, int x, int y, int w, int h); + virtual void clearOverlay(); + virtual void grabOverlay(OverlayColor *buf, int pitch); + virtual void copyRectToOverlay(const OverlayColor *buf, int pitch, int x, int y, int w, int h); virtual int16 getOverlayHeight() { return _videoMode.overlayHeight; } virtual int16 getOverlayWidth() { return _videoMode.overlayWidth; } - bool showMouse(bool visible); + virtual bool showMouse(bool visible); virtual void warpMouse(int x, int y); virtual void setMouseCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, uint32 keycolor, int cursorTargetScale = 1, const Graphics::PixelFormat *format = NULL); - void setCursorPalette(const byte *colors, uint start, uint num); - void disableCursorPalette(bool disable) { + virtual void setCursorPalette(const byte *colors, uint start, uint num); + virtual void disableCursorPalette(bool disable) { _cursorPaletteDisabled = disable; blitCursor(); } #ifdef USE_OSD - void displayMessageOnOSD(const char *msg); + virtual void displayMessageOnOSD(const char *msg); #endif - void forceFullRedraw(); + virtual void forceFullRedraw(); - bool handleScalerHotkeys(const SDL_KeyboardEvent &key); - bool isScalerHotkey(const Common::Event &event); + virtual bool handleScalerHotkeys(const SDL_KeyboardEvent &key); + virtual bool isScalerHotkey(const Common::Event &event); - void adjustMouseEvent(Common::Event &event); - void setMousePos(int x, int y); - void toggleFullScreen(); + virtual void adjustMouseEvent(Common::Event &event); + virtual void setMousePos(int x, int y); + virtual void toggleFullScreen(); virtual bool saveScreenshot(const char *filename); // overloaded by CE backend protected: @@ -299,10 +299,10 @@ protected: virtual void unloadGFXMode(); // overloaded by CE backend virtual bool hotswapGFXMode(); // overloaded by CE backend - void setFullscreenMode(bool enable); - void setAspectRatioCorrection(bool enable); + virtual void setFullscreenMode(bool enable); + virtual void setAspectRatioCorrection(bool enable); - int effectiveScreenHeight() const; + virtual int effectiveScreenHeight() const; }; #endif diff --git a/backends/module.mk b/backends/module.mk index d7ea193004..ff06c612ce 100644 --- a/backends/module.mk +++ b/backends/module.mk @@ -6,6 +6,7 @@ MODULE_OBJS := \ audiocd/default/default-audiocd.o \ audiocd/sdl/sdl-audiocd.o \ events/default/default-events.o \ + events/gp2xwizsdl/gp2xwizsdl-events.o \ events/linuxmotosdl/linuxmotosdl-events.o \ events/samsungtvsdl/samsungtvsdl-events.o \ events/sdl/sdl-events.o \ @@ -24,6 +25,7 @@ MODULE_OBJS := \ fs/wii/wii-fs-factory.o \ fs/n64/n64-fs-factory.o \ fs/n64/romfsstream.o \ + graphics/gp2xwizsdl/gp2xwizsdl-graphics.o \ graphics/linuxmotosdl/linuxmotosdl-graphics.o \ graphics/sdl/sdl-graphics.o \ graphics/symbiansdl/symbiansdl-graphics.o \ diff --git a/backends/platform/gp2xwiz/gp2xwiz-events.cpp b/backends/platform/gp2xwiz/gp2xwiz-events.cpp deleted file mode 100644 index a69aa42967..0000000000 --- a/backends/platform/gp2xwiz/gp2xwiz-events.cpp +++ /dev/null @@ -1,500 +0,0 @@ -/* 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$ - * - */ - -/* - * GP2X Wiz: Device Specific Event Handling. - * - */ - -#include "backends/platform/gp2xwiz/gp2xwiz-sdl.h" -#include "backends/platform/gp2xwiz/gp2xwiz-hw.h" -#include "graphics/scaler/aspect.h" - -#include "common/util.h" -#include "common/events.h" - -// FIXME move joystick defines out and replace with confile file options -// we should really allow users to map any key to a joystick button using the keymapper. -#define JOY_DEADZONE 2200 - -#define JOY_XAXIS 0 -#define JOY_YAXIS 1 - -/* GP2X Wiz: Main Joystick Mappings */ -enum { - GP2X_BUTTON_UP = 0, - GP2X_BUTTON_UPLEFT = 1, - GP2X_BUTTON_LEFT = 2, - GP2X_BUTTON_DOWNLEFT = 3, - GP2X_BUTTON_DOWN = 4, - GP2X_BUTTON_DOWNRIGHT = 5, - GP2X_BUTTON_RIGHT = 6, - GP2X_BUTTON_UPRIGHT = 7, - GP2X_BUTTON_MENU = 8, - GP2X_BUTTON_SELECT = 9, - GP2X_BUTTON_L = 10, - GP2X_BUTTON_R = 11, - GP2X_BUTTON_A = 12, - GP2X_BUTTON_B = 13, - GP2X_BUTTON_X = 14, - GP2X_BUTTON_Y = 15, - GP2X_BUTTON_VOLUP = 16, - GP2X_BUTTON_VOLDOWN = 17 -}; - -static int mapKey(SDLKey key, SDLMod mod, Uint16 unicode) { - if (key >= SDLK_F1 && key <= SDLK_F9) { - return key - SDLK_F1 + Common::ASCII_F1; - } else if (key >= SDLK_KP0 && key <= SDLK_KP9) { - return key - SDLK_KP0 + '0'; - } else if (key >= SDLK_UP && key <= SDLK_PAGEDOWN) { - return key; - } else if (unicode) { - return unicode; - } else if (key >= 'a' && key <= 'z' && (mod & KMOD_SHIFT)) { - return key & ~0x20; - } else if (key >= SDLK_NUMLOCK && key <= SDLK_EURO) { - return 0; - } - return key; -} - -void OSystem_GP2XWIZ::fillMouseEvent(Common::Event &event, int x, int y) { - if (_videoMode.mode == GFX_HALF && !_overlayVisible){ - event.mouse.x = x*2; - event.mouse.y = y*2; - } else { - event.mouse.x = x; - event.mouse.y = y; - } - - // Update the "keyboard mouse" coords - _km.x = x; - _km.y = y; - - // Adjust for the screen scaling - if (!_overlayVisible) { - event.mouse.x /= _videoMode.scaleFactor; - event.mouse.y /= _videoMode.scaleFactor; - if (_videoMode.aspectRatioCorrection) - event.mouse.y = aspect2Real(event.mouse.y); - } -} - -static byte SDLModToOSystemKeyFlags(SDLMod mod) { - byte b = 0; - if (mod & KMOD_SHIFT) - b |= Common::KBD_SHIFT; - if (mod & KMOD_ALT) - b |= Common::KBD_ALT; - if (mod & KMOD_CTRL) - b |= Common::KBD_CTRL; - - return b; -} - -void OSystem_GP2XWIZ::moveStick() { - bool stickBtn[32]; - - memcpy(stickBtn, _stickBtn, sizeof(stickBtn)); - - if ((stickBtn[0])||(stickBtn[2])||(stickBtn[4])||(stickBtn[6])) - stickBtn[1] = stickBtn[3] = stickBtn[5] = stickBtn[7] = 0; - - if ((stickBtn[1])||(stickBtn[2])||(stickBtn[3])) { - if (_km.x_down_count!=2) { - _km.x_vel = -1; - _km.x_down_count = 1; - } else - _km.x_vel = -4; - } else if ((stickBtn[5])||(stickBtn[6])||(stickBtn[7])) { - if (_km.x_down_count!=2) { - _km.x_vel = 1; - _km.x_down_count = 1; - } else - _km.x_vel = 4; - } else { - _km.x_vel = 0; - _km.x_down_count = 0; - } - - - if ((stickBtn[0])||(stickBtn[1])||(stickBtn[7])) { - if (_km.y_down_count!=2) { - _km.y_vel = -1; - _km.y_down_count = 1; - } else - _km.y_vel = -4; - } else if ((stickBtn[3])||(stickBtn[4])||(stickBtn[5])) { - if (_km.y_down_count!=2) { - _km.y_vel = 1; - _km.y_down_count = 1; - } else - _km.y_vel = 4; - } else { - _km.y_vel = 0; - _km.y_down_count = 0; - } -} - -/* Quick default button states for modifiers. */ -int GP2X_BUTTON_STATE_L = false; - -/* Override the SDL pollEvent with the Wiz's own event code. */ -bool OSystem_GP2XWIZ::pollEvent(Common::Event &event) { - SDL_Event ev; - int axis; - byte b = 0; - - handleKbdMouse(); - - // If the screen mode changed, send an Common::EVENT_SCREEN_CHANGED - if (_modeChanged) { - _modeChanged = false; - event.type = Common::EVENT_SCREEN_CHANGED; - return true; - } - - // GP2X Wiz Input mappings. - - /* - Single Button - - Movement: - - GP2X_BUTTON_UP Cursor Up - GP2X_BUTTON_DOWN Cursor Down - GP2X_BUTTON_LEFT Cursor Left - GP2X_BUTTON_RIGHT Cursor Right - - GP2X_BUTTON_UPLEFT Cursor Up Left - GP2X_BUTTON_UPRIGHT Cursor Up Right - GP2X_BUTTON_DOWNLEFT Cursor Down Left - GP2X_BUTTON_DOWNRIGHT Cursor Down Right - - Button Emulation: - - GP2X_BUTTON_A . (Period) - GP2X_BUTTON_B Left Mouse Click - GP2X_BUTTON_Y Space Bar - GP2X_BUTTON_X Right Mouse Click - GP2X_BUTTON_L Combo Modifier (Left Trigger) - GP2X_BUTTON_R Return (Right Trigger) - GP2X_BUTTON_MENU F5 (Game Menu) - GP2X_BUTTON_SELECT Escape - GP2X_BUTTON_VOLUP /dev/mixer Global Volume Up - GP2X_BUTTON_VOLDOWN /dev/mixer Global Volume Down - - Combos: - - GP2X_BUTTON_VOLUP & GP2X_BUTTON_VOLDOWN 0 (For Monkey 2 CP) or Virtual Keyboard if enabled - GP2X_BUTTON_L & GP2X_BUTTON_SELECT Common::EVENT_QUIT (Calls Sync() to make sure SD is flushed) - GP2X_BUTTON_L & GP2X_BUTTON_MENU Common::EVENT_MAINMENU (ScummVM Global Main Menu) - GP2X_BUTTON_L & GP2X_BUTTON_A Common::EVENT_PREDICTIVE_DIALOG for predictive text entry box (AGI games) - */ - - while (SDL_PollEvent(&ev)) { - - switch (ev.type) { - case SDL_KEYDOWN:{ - b = event.kbd.flags = SDLModToOSystemKeyFlags(SDL_GetModState()); - - const bool event_complete = remapKey(ev,event); - - if (event_complete) - return true; - - event.type = Common::EVENT_KEYDOWN; - event.kbd.keycode = (Common::KeyCode)ev.key.keysym.sym; - event.kbd.ascii = mapKey(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode); - - return true; - } - case SDL_KEYUP: - { - const bool event_complete = remapKey(ev,event); - - if (event_complete) - return true; - - event.type = Common::EVENT_KEYUP; - event.kbd.keycode = (Common::KeyCode)ev.key.keysym.sym; - event.kbd.ascii = mapKey(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode); - b = event.kbd.flags = SDLModToOSystemKeyFlags(SDL_GetModState()); - - // Ctrl-Alt-<key> will change the GFX mode - if ((b & (Common::KBD_CTRL|Common::KBD_ALT)) == (Common::KBD_CTRL|Common::KBD_ALT)) { - // Swallow these key up events - break; - } - - return true; - } - case SDL_MOUSEMOTION: - event.type = Common::EVENT_MOUSEMOVE; - fillMouseEvent(event, ev.motion.x, ev.motion.y); - - setMousePos(event.mouse.x, event.mouse.y); - return true; - - case SDL_MOUSEBUTTONDOWN: - if (ev.button.button == SDL_BUTTON_LEFT) - event.type = Common::EVENT_LBUTTONDOWN; - else if (ev.button.button == SDL_BUTTON_RIGHT) - event.type = Common::EVENT_RBUTTONDOWN; -#if defined(SDL_BUTTON_WHEELUP) && defined(SDL_BUTTON_WHEELDOWN) - else if (ev.button.button == SDL_BUTTON_WHEELUP) - event.type = Common::EVENT_WHEELUP; - else if (ev.button.button == SDL_BUTTON_WHEELDOWN) - event.type = Common::EVENT_WHEELDOWN; -#endif -#if defined(SDL_BUTTON_MIDDLE) - else if (ev.button.button == SDL_BUTTON_MIDDLE) - event.type = Common::EVENT_MBUTTONDOWN; -#endif - else - break; - - fillMouseEvent(event, ev.button.x, ev.button.y); - - return true; - - case SDL_MOUSEBUTTONUP: - if (ev.button.button == SDL_BUTTON_LEFT) - event.type = Common::EVENT_LBUTTONUP; - else if (ev.button.button == SDL_BUTTON_RIGHT) - event.type = Common::EVENT_RBUTTONUP; -#if defined(SDL_BUTTON_MIDDLE) - else if (ev.button.button == SDL_BUTTON_MIDDLE) - event.type = Common::EVENT_MBUTTONUP; -#endif - else - break; - fillMouseEvent(event, ev.button.x, ev.button.y); - - return true; - - case SDL_JOYBUTTONDOWN: - _stickBtn[ev.jbutton.button] = 1; - if (ev.jbutton.button == GP2X_BUTTON_B) { - event.type = Common::EVENT_LBUTTONDOWN; - fillMouseEvent(event, _km.x, _km.y); - } else if (ev.jbutton.button == GP2X_BUTTON_X) { - event.type = Common::EVENT_RBUTTONDOWN; - fillMouseEvent(event, _km.x, _km.y); - } else if (_stickBtn[GP2X_BUTTON_L] && (ev.jbutton.button == GP2X_BUTTON_SELECT)) { - event.type = Common::EVENT_QUIT; - } else if (ev.jbutton.button < 8) { - moveStick(); - event.type = Common::EVENT_MOUSEMOVE; - fillMouseEvent(event, _km.x, _km.y); - } else { - event.type = Common::EVENT_KEYDOWN; - event.kbd.flags = 0; - switch (ev.jbutton.button) { - case GP2X_BUTTON_L: - GP2X_BUTTON_STATE_L = true; - break; - case GP2X_BUTTON_R: - if (GP2X_BUTTON_STATE_L == true) { -#ifdef ENABLE_VKEYBD - event.kbd.keycode = Common::KEYCODE_F7; - event.kbd.ascii = mapKey(SDLK_F7, ev.key.keysym.mod, 0); -#else - event.kbd.keycode = Common::KEYCODE_0; - event.kbd.ascii = mapKey(SDLK_0, ev.key.keysym.mod, 0); -#endif - } else { - event.kbd.keycode = Common::KEYCODE_RETURN; - event.kbd.ascii = mapKey(SDLK_RETURN, ev.key.keysym.mod, 0); - } - break; - case GP2X_BUTTON_SELECT: - if (GP2X_BUTTON_STATE_L == true) { - event.type = Common::EVENT_QUIT; - } else { - event.kbd.keycode = Common::KEYCODE_ESCAPE; - event.kbd.ascii = mapKey(SDLK_ESCAPE, ev.key.keysym.mod, 0); - } - break; - case GP2X_BUTTON_A: - if (GP2X_BUTTON_STATE_L == true) { - event.type = Common::EVENT_PREDICTIVE_DIALOG; - } else { - event.kbd.keycode = Common::KEYCODE_PERIOD; - event.kbd.ascii = mapKey(SDLK_PERIOD, ev.key.keysym.mod, 0); - } - break; - case GP2X_BUTTON_Y: - event.kbd.keycode = Common::KEYCODE_SPACE; - event.kbd.ascii = mapKey(SDLK_SPACE, ev.key.keysym.mod, 0); - break; - case GP2X_BUTTON_MENU: - if (GP2X_BUTTON_STATE_L == true) { - event.type = Common::EVENT_MAINMENU; - } else { - event.kbd.keycode = Common::KEYCODE_F5; - event.kbd.ascii = mapKey(SDLK_F5, ev.key.keysym.mod, 0); - } - break; - case GP2X_BUTTON_VOLUP: - WIZ_HW::mixerMoveVolume(2); - if (WIZ_HW::volumeLevel == 100) { - displayMessageOnOSD("Maximum Volume"); - } else { - displayMessageOnOSD("Increasing Volume"); - } - break; - - case GP2X_BUTTON_VOLDOWN: - WIZ_HW::mixerMoveVolume(1); - if (WIZ_HW::volumeLevel == 0) { - displayMessageOnOSD("Minimal Volume"); - } else { - displayMessageOnOSD("Decreasing Volume"); - } - break; - } - } - return true; - - case SDL_JOYBUTTONUP: - _stickBtn[ev.jbutton.button] = 0; - if (ev.jbutton.button == GP2X_BUTTON_B) { - event.type = Common::EVENT_LBUTTONUP; - fillMouseEvent(event, _km.x, _km.y); - } else if (ev.jbutton.button == GP2X_BUTTON_X) { - event.type = Common::EVENT_RBUTTONUP; - fillMouseEvent(event, _km.x, _km.y); - } else if (ev.jbutton.button < 8) { - moveStick(); - event.type = Common::EVENT_MOUSEMOVE; - fillMouseEvent(event, _km.x, _km.y); - } else { - event.type = Common::EVENT_KEYUP; - event.kbd.flags = 0; - switch (ev.jbutton.button) { - case GP2X_BUTTON_SELECT: - event.kbd.keycode = Common::KEYCODE_ESCAPE; - event.kbd.ascii = mapKey(SDLK_ESCAPE, ev.key.keysym.mod, 0); - break; - case GP2X_BUTTON_A: - event.kbd.keycode = Common::KEYCODE_PERIOD; - event.kbd.ascii = mapKey(SDLK_PERIOD, ev.key.keysym.mod, 0); - break; - case GP2X_BUTTON_Y: - event.kbd.keycode = Common::KEYCODE_SPACE; - event.kbd.ascii = mapKey(SDLK_SPACE, ev.key.keysym.mod, 0); - break; - case GP2X_BUTTON_MENU: - if (GP2X_BUTTON_STATE_L == true) { - event.type = Common::EVENT_MAINMENU; - } else { - event.kbd.keycode = Common::KEYCODE_F5; - event.kbd.ascii = mapKey(SDLK_F5, ev.key.keysym.mod, 0); - } - break; - case GP2X_BUTTON_L: - GP2X_BUTTON_STATE_L = false; - break; - case GP2X_BUTTON_R: - if (GP2X_BUTTON_STATE_L == true) { -#ifdef ENABLE_VKEYBD - event.kbd.keycode = Common::KEYCODE_F7; - event.kbd.ascii = mapKey(SDLK_F7, ev.key.keysym.mod, 0); -#else - event.kbd.keycode = Common::KEYCODE_0; - event.kbd.ascii = mapKey(SDLK_0, ev.key.keysym.mod, 0); -#endif - } else { - event.kbd.keycode = Common::KEYCODE_RETURN; - event.kbd.ascii = mapKey(SDLK_RETURN, ev.key.keysym.mod, 0); - } - break; - case GP2X_BUTTON_VOLUP: - break; - case GP2X_BUTTON_VOLDOWN: - break; - } - } - return true; - - case SDL_JOYAXISMOTION: - axis = ev.jaxis.value; - if ( axis > JOY_DEADZONE) { - axis -= JOY_DEADZONE; - event.type = Common::EVENT_MOUSEMOVE; - } else if ( axis < -JOY_DEADZONE ) { - axis += JOY_DEADZONE; - event.type = Common::EVENT_MOUSEMOVE; - } else - axis = 0; - - if ( ev.jaxis.axis == JOY_XAXIS) { - if (axis != 0) { - _km.x_vel = (axis > 0) ? 1:-1; - _km.x_down_count = 1; - } else { - _km.x_vel = 0; - _km.x_down_count = 0; - } - - } else if (ev.jaxis.axis == JOY_YAXIS) { -#ifndef JOY_INVERT_Y - axis = -axis; -#endif -#ifdef JOY_ANALOG - _km.y_vel = -axis / 2000; - _km.y_down_count = 0; -#else - if (axis != 0) { - _km.y_vel = (-axis > 0) ? 1: -1; - _km.y_down_count = 1; - } else { - _km.y_vel = 0; - _km.y_down_count = 0; - } -#endif - } - - fillMouseEvent(event, _km.x, _km.y); - - return true; - - case SDL_VIDEOEXPOSE: - _forceFull = true; - break; - - case SDL_QUIT: - event.type = Common::EVENT_QUIT; - return true; - } - } - return false; -} - -bool OSystem_GP2XWIZ::remapKey(SDL_Event &ev,Common::Event &event) { - return false; -} diff --git a/backends/platform/gp2xwiz/gp2xwiz-main.cpp b/backends/platform/gp2xwiz/gp2xwiz-main.cpp index 394c3090c3..d6601f5250 100644 --- a/backends/platform/gp2xwiz/gp2xwiz-main.cpp +++ b/backends/platform/gp2xwiz/gp2xwiz-main.cpp @@ -23,194 +23,28 @@ * */ -#include "common/scummsys.h" -#include <SDL/SDL.h> - #include "backends/platform/gp2xwiz/gp2xwiz-sdl.h" -#include "backends/platform/gp2xwiz/gp2xwiz-hw.h" #include "backends/plugins/posix/posix-provider.h" #include "base/main.h" -#include "base/internal_version.h" - -#include "common/archive.h" -#include "common/config-manager.h" -#include "common/debug.h" -#include "common/events.h" -#include "common/util.h" - -#include "common/file.h" -#include "base/main.h" - -#include "backends/saves/default/default-saves.h" - -#include "backends/timer/default/default-timer.h" -#include "sound/mixer_intern.h" - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <limits.h> -#include <errno.h> -#include <sys/stat.h> -#include <time.h> // for getTimeAndDate() - -/* Dump console info to files. */ -// #define DUMP_STDOUT int main(int argc, char *argv[]) { + // Create our OSystem instance g_system = new OSystem_GP2XWIZ(); assert(g_system); + // Pre initialize the backend + ((OSystem_GP2XWIZ *)g_system)->init(); + #ifdef DYNAMIC_MODULES PluginManager::instance().addPluginProvider(new POSIXPluginProvider()); #endif // Invoke the actual ScummVM main entry point: int res = scummvm_main(argc, argv); - g_system->quit(); - - return res; -} - -void OSystem_GP2XWIZ::initBackend() { - - /* Setup default save path to be workingdir/saves */ - - char savePath[PATH_MAX+1]; - char workDirName[PATH_MAX+1]; - - if (getcwd(workDirName, PATH_MAX) == NULL) { - error("Could not obtain current working directory."); - } else { - printf("Current working directory: %s\n", workDirName); - } - - strcpy(savePath, workDirName); - strcat(savePath, "/saves"); - printf("Current save directory: %s\n", savePath); - struct stat sb; - if (stat(savePath, &sb) == -1) - if (errno == ENOENT) // Create the dir if it does not exist - if (mkdir(savePath, 0755) != 0) - warning("mkdir for '%s' failed!", savePath); - - _savefile = new DefaultSaveFileManager(savePath); - - #ifdef DUMP_STDOUT - // The GP2X Wiz has a serial console on the breakout board but most users do not use this so we - // output all our STDOUT and STDERR to files for debug purposes. - char STDOUT_FILE[PATH_MAX+1]; - char STDERR_FILE[PATH_MAX+1]; - - strcpy(STDOUT_FILE, workDirName); - strcpy(STDERR_FILE, workDirName); - strcat(STDOUT_FILE, "/scummvm.stdout.txt"); - strcat(STDERR_FILE, "/scummvm.stderr.txt"); - - // Flush the output in case anything is queued - fclose(stdout); - fclose(stderr); - - // Redirect standard input and standard output - FILE *newfp = freopen(STDOUT_FILE, "w", stdout); - if (newfp == NULL) { - #if !defined(stdout) - stdout = fopen(STDOUT_FILE, "w"); - #else - newfp = fopen(STDOUT_FILE, "w"); - if (newfp) { - *stdout = *newfp; - } - #endif - } - - newfp = freopen(STDERR_FILE, "w", stderr); - if (newfp == NULL) { - #if !defined(stderr) - stderr = fopen(STDERR_FILE, "w"); - #else - newfp = fopen(STDERR_FILE, "w"); - if (newfp) { - *stderr = *newfp; - } - #endif - } - - setbuf(stderr, NULL); - printf("%s\n", "Debug: STDOUT and STDERR redirected to text files."); - #endif /* DUMP_STDOUT */ - /* Initialise any GP2X Wiz specific stuff we may want (Batt Status, scaler etc.) */ - WIZ_HW::deviceInit(); + // Free OSystem + delete (OSystem_GP2XWIZ *)g_system; - /* Set Default hardware mixer volume to a preset level (VOLUME_INITIAL). This is done to 'reset' volume level if set by other apps. */ - WIZ_HW::mixerMoveVolume(0); - - /* Up default volume values as we use a seperate system level volume anyway. */ - ConfMan.registerDefault("music_volume", 192); - ConfMan.registerDefault("sfx_volume", 192); - ConfMan.registerDefault("speech_volume", 192); - - /* Trigger autosave every 4 minutes - On low batts 5 mins is about your warning time. */ - ConfMan.registerDefault("autosave_period", 4 * 60); - - /* Make sure that aspect ratio correction is enabled on the 1st run to stop users asking me what the 'wasted space' is ;-). */ - ConfMan.registerDefault("aspect_ratio", true); - - /* Make sure SDL knows that we have a joystick we want to use. */ - ConfMan.setInt("joystick_num", 0); - - printf("%s\n", "Passing to OSystem::SDL initBackend."); - - /* Pass to SDL backend to do the heavy lifting */ - OSystem_SDL::initBackend(); -} - -void OSystem_GP2XWIZ::addSysArchivesToSearchSet(Common::SearchSet &s, int priority) { - - /* Setup default extra data paths for engine data files and plugins */ - char workDirName[PATH_MAX+1]; - - if (getcwd(workDirName, PATH_MAX) == NULL) { - error("Error: Could not obtain current working directory."); - } - - Common::FSNode workdirNode(workDirName); - if (workdirNode.exists() && workdirNode.isDirectory()) { - s.add("__GP2XWIZ_WORKDIR__", new Common::FSDirectory(workDirName), priority); - } - - char enginedataPath[PATH_MAX+1]; - - strcpy(enginedataPath, workDirName); - strcat(enginedataPath, "/engine-data"); - - Common::FSNode engineNode(enginedataPath); - if (engineNode.exists() && engineNode.isDirectory()) { - s.add("__GP2XWIZ_ENGDATA__", new Common::FSDirectory(enginedataPath), priority); - } - - char pluginsPath[PATH_MAX+1]; - - strcpy(pluginsPath, workDirName); - strcat(pluginsPath, "/plugins"); - - Common::FSNode pluginsNode(pluginsPath); - if (pluginsNode.exists() && pluginsNode.isDirectory()) { - s.add("__GP2XWIZ_PLUGINS__", new Common::FSDirectory(pluginsPath), priority); - } -} - -void OSystem_GP2XWIZ::quit() { - - WIZ_HW::deviceDeinit(); - - #ifdef DUMP_STDOUT - printf("%s\n", "Debug: STDOUT and STDERR text files closed."); - fclose(stdout); - fclose(stderr); - #endif /* DUMP_STDOUT */ - - OSystem_SDL::quit(); + return res; } diff --git a/backends/platform/gp2xwiz/gp2xwiz-sdl.cpp b/backends/platform/gp2xwiz/gp2xwiz-sdl.cpp new file mode 100644 index 0000000000..f37f4dd64a --- /dev/null +++ b/backends/platform/gp2xwiz/gp2xwiz-sdl.cpp @@ -0,0 +1,194 @@ +/* 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$ + * + */ + +#include "backends/platform/gp2xwiz/gp2xwiz-sdl.h" +#include "backends/platform/gp2xwiz/gp2xwiz-hw.h" + +#include "backends/graphics/gp2xwizsdl/gp2xwizsdl-graphics.h" +#include "backends/events/gp2xwizsdl/gp2xwizsdl-events.h" +#include "backends/saves/default/default-saves.h" + +#include "common/config-manager.h" +#include "common/debug.h" + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <limits.h> +#include <errno.h> +#include <sys/stat.h> + +/* Dump console info to files. */ +// #define DUMP_STDOUT + +void OSystem_GP2XWIZ::initBackend() { + + /* Setup default save path to be workingdir/saves */ + + char savePath[PATH_MAX+1]; + char workDirName[PATH_MAX+1]; + + if (getcwd(workDirName, PATH_MAX) == NULL) { + error("Could not obtain current working directory."); + } else { + printf("Current working directory: %s\n", workDirName); + } + + strcpy(savePath, workDirName); + strcat(savePath, "/saves"); + printf("Current save directory: %s\n", savePath); + struct stat sb; + if (stat(savePath, &sb) == -1) + if (errno == ENOENT) // Create the dir if it does not exist + if (mkdir(savePath, 0755) != 0) + warning("mkdir for '%s' failed!", savePath); + + _savefileManager = new DefaultSaveFileManager(savePath); + + #ifdef DUMP_STDOUT + // The GP2X Wiz has a serial console on the breakout board but most users do not use this so we + // output all our STDOUT and STDERR to files for debug purposes. + char STDOUT_FILE[PATH_MAX+1]; + char STDERR_FILE[PATH_MAX+1]; + + strcpy(STDOUT_FILE, workDirName); + strcpy(STDERR_FILE, workDirName); + strcat(STDOUT_FILE, "/scummvm.stdout.txt"); + strcat(STDERR_FILE, "/scummvm.stderr.txt"); + + // Flush the output in case anything is queued + fclose(stdout); + fclose(stderr); + + // Redirect standard input and standard output + FILE *newfp = freopen(STDOUT_FILE, "w", stdout); + if (newfp == NULL) { + #if !defined(stdout) + stdout = fopen(STDOUT_FILE, "w"); + #else + newfp = fopen(STDOUT_FILE, "w"); + if (newfp) { + *stdout = *newfp; + } + #endif + } + + newfp = freopen(STDERR_FILE, "w", stderr); + if (newfp == NULL) { + #if !defined(stderr) + stderr = fopen(STDERR_FILE, "w"); + #else + newfp = fopen(STDERR_FILE, "w"); + if (newfp) { + *stderr = *newfp; + } + #endif + } + + setbuf(stderr, NULL); + printf("%s\n", "Debug: STDOUT and STDERR redirected to text files."); + #endif /* DUMP_STDOUT */ + + /* Initialise any GP2X Wiz specific stuff we may want (Batt Status, scaler etc.) */ + WIZ_HW::deviceInit(); + + /* Set Default hardware mixer volume to a preset level (VOLUME_INITIAL). This is done to 'reset' volume level if set by other apps. */ + WIZ_HW::mixerMoveVolume(0); + + /* Up default volume values as we use a seperate system level volume anyway. */ + ConfMan.registerDefault("music_volume", 192); + ConfMan.registerDefault("sfx_volume", 192); + ConfMan.registerDefault("speech_volume", 192); + + /* Trigger autosave every 4 minutes - On low batts 5 mins is about your warning time. */ + ConfMan.registerDefault("autosave_period", 4 * 60); + + /* Make sure that aspect ratio correction is enabled on the 1st run to stop users asking me what the 'wasted space' is ;-). */ + ConfMan.registerDefault("aspect_ratio", true); + + /* Make sure SDL knows that we have a joystick we want to use. */ + ConfMan.setInt("joystick_num", 0); + + // Create the events manager + if (_eventManager == 0) + _eventManager = new GP2XWIZSdlEventManager(this); + + // Create the graphics manager + if (_graphicsManager == 0) + _graphicsManager = new GP2XWIZSdlGraphicsManager(); + + printf("%s\n", "Passing to OSystem_POSIX initBackend."); + + /* Pass to SDL backend to do the heavy lifting */ + OSystem_POSIX::initBackend(); +} + +void OSystem_GP2XWIZ::addSysArchivesToSearchSet(Common::SearchSet &s, int priority) { + + /* Setup default extra data paths for engine data files and plugins */ + char workDirName[PATH_MAX + 1]; + + if (getcwd(workDirName, PATH_MAX) == NULL) { + error("Error: Could not obtain current working directory."); + } + + Common::FSNode workdirNode(workDirName); + if (workdirNode.exists() && workdirNode.isDirectory()) { + s.add("__GP2XWIZ_WORKDIR__", new Common::FSDirectory(workDirName), priority); + } + + char enginedataPath[PATH_MAX + 1]; + + strcpy(enginedataPath, workDirName); + strcat(enginedataPath, "/engine-data"); + + Common::FSNode engineNode(enginedataPath); + if (engineNode.exists() && engineNode.isDirectory()) { + s.add("__GP2XWIZ_ENGDATA__", new Common::FSDirectory(enginedataPath), priority); + } + + char pluginsPath[PATH_MAX + 1]; + + strcpy(pluginsPath, workDirName); + strcat(pluginsPath, "/plugins"); + + Common::FSNode pluginsNode(pluginsPath); + if (pluginsNode.exists() && pluginsNode.isDirectory()) { + s.add("__GP2XWIZ_PLUGINS__", new Common::FSDirectory(pluginsPath), priority); + } +} + +void OSystem_GP2XWIZ::quit() { + + WIZ_HW::deviceDeinit(); + + #ifdef DUMP_STDOUT + printf("%s\n", "Debug: STDOUT and STDERR text files closed."); + fclose(stdout); + fclose(stderr); + #endif /* DUMP_STDOUT */ + + OSystem_POSIX::quit(); +} diff --git a/backends/platform/gp2xwiz/gp2xwiz-sdl.h b/backends/platform/gp2xwiz/gp2xwiz-sdl.h index e312d0f26d..56ca883b02 100644 --- a/backends/platform/gp2xwiz/gp2xwiz-sdl.h +++ b/backends/platform/gp2xwiz/gp2xwiz-sdl.h @@ -23,55 +23,20 @@ * */ -#ifndef GP2XWIZ_SDL_H -#define GP2XWIZ_SDL_H +#ifndef PLATFORM_SDL_GP2XWIZ_H +#define PLATFORM_SDL_GP2XWIZ_H -#include "backends/platform/sdl/sdl.h" - -// FIXME: For now keep hacks in this header to save polluting the SDL backend. -enum { - GFX_HALF = 12 -}; - -#define __GP2XWIZ__ -#define MIXER_DOUBLE_BUFFERING 1 +#include "backends/platform/sdl/posix/posix.h" #ifndef PATH_MAX #define PATH_MAX 255 #endif -class OSystem_GP2XWIZ : public OSystem_SDL { +class OSystem_GP2XWIZ : public OSystem_POSIX { public: - OSystem_GP2XWIZ() {} - - /* Graphics */ - void initSize(uint w, uint h); - void setGraphicsModeIntern(); - bool setGraphicsMode(int mode); - void internUpdateScreen(); - const OSystem::GraphicsMode *getSupportedGraphicsModes() const; - bool setGraphicsMode(const char *name); - int getDefaultGraphicsMode() const; - bool loadGFXMode(); - void drawMouse(); - void undrawMouse(); - void showOverlay(); - void hideOverlay(); - - /* Event Stuff */ - bool pollEvent(Common::Event &event); - void moveStick(); - void fillMouseEvent(Common::Event&, int, int); - void warpMouse(int, int); - bool remapKey(SDL_Event&, Common::Event&); - - /* Platform Setup Stuff */ - void addSysArchivesToSearchSet(Common::SearchSet &s, int priority); - void initBackend(); - void quit(); - -protected: - bool _stickBtn[32]; + virtual void initBackend(); + virtual void quit(); + virtual void addSysArchivesToSearchSet(Common::SearchSet &s, int priority); }; #endif diff --git a/backends/platform/gp2xwiz/module.mk b/backends/platform/gp2xwiz/module.mk index f457d51615..9e66494f27 100644 --- a/backends/platform/gp2xwiz/module.mk +++ b/backends/platform/gp2xwiz/module.mk @@ -1,10 +1,9 @@ MODULE := backends/platform/gp2xwiz MODULE_OBJS := \ - gp2xwiz-events.o \ - gp2xwiz-graphics.o \ gp2xwiz-hw.o \ - gp2xwiz-main.o + gp2xwiz-main.o \ + gp2xwiz-sdl.o MODULE_DIRS += \ backends/platform/gp2xwiz/ diff --git a/backends/platform/sdl/posix/posix-main.cpp b/backends/platform/sdl/posix/posix-main.cpp index 85dd0750c9..e2bc2c8682 100644 --- a/backends/platform/sdl/posix/posix-main.cpp +++ b/backends/platform/sdl/posix/posix-main.cpp @@ -23,7 +23,7 @@ * */ -#if defined(UNIX) && !defined(MACOSX) && !defined(SAMSUNGTV) && !defined(LINUXMOTO) +#if defined(UNIX) && !defined(MACOSX) && !defined(SAMSUNGTV) && !defined(LINUXMOTO) && !defined(GP2XWIZ) #include "common/scummsys.h" |