From fd407eeca3f2d50bc1a005bbcfd171369daa4f5f Mon Sep 17 00:00:00 2001 From: John Willis Date: Tue, 7 Sep 2010 14:17:31 +0000 Subject: GP2XWIZ: Refactor backend. * Add support for TouchScreen 'Tap Modes' Left Click, Right Click and Hover. * Rename OSystem_GP2XWIZ to OSystem_GPH to start the work on supporting a unified backend codebase for the GP2X, Wiz and Caanoo. * Sort out bugs in Caanoo input code. * Rework GP2XWiz input code to support switching new TouchScreen modes. svn-id: r52619 --- backends/platform/gp2xwiz/gp2xwiz-events.cpp | 463 ++++++++++++------------- backends/platform/gp2xwiz/gp2xwiz-graphics.cpp | 28 +- backends/platform/gp2xwiz/gp2xwiz-hw.cpp | 25 ++ backends/platform/gp2xwiz/gp2xwiz-hw.h | 17 + backends/platform/gp2xwiz/gp2xwiz-main.cpp | 8 +- backends/platform/gp2xwiz/gp2xwiz-sdl.h | 10 +- 6 files changed, 281 insertions(+), 270 deletions(-) (limited to 'backends/platform') diff --git a/backends/platform/gp2xwiz/gp2xwiz-events.cpp b/backends/platform/gp2xwiz/gp2xwiz-events.cpp index 19ef24ef58..1f603b4a3d 100644 --- a/backends/platform/gp2xwiz/gp2xwiz-events.cpp +++ b/backends/platform/gp2xwiz/gp2xwiz-events.cpp @@ -24,7 +24,7 @@ */ /* - * GP2X Wiz: Device Specific Event Handling. + * GPH: Device Specific Event Handling. * */ @@ -35,33 +35,91 @@ #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 */ +/* Quick default button states for modifiers. */ +int BUTTON_STATE_L = false; + +#if defined(CAANOO) + + /* Caanoo: Main Joystick Button Mappings */ + /* The Caanoo has an analogue stick so no digital DPAD */ + enum { + /* Joystick Buttons */ + BUTTON_A = 0, + BUTTON_X = 1, + BUTTON_B = 2, + BUTTON_Y = 3, + BUTTON_L = 4, + BUTTON_R = 5, + BUTTON_HOME = 6, // Home + BUTTON_HOLD = 7, // Hold (on Power) + BUTTON_HELP = 8, // Help I + BUTTON_HELP2 = 9, // Help II + BUTTON_CLICK = 10 // Stick Click + }; + + enum { + /* Unused Joystick Buttons on the Caanoo */ + BUTTON_VOLUP = 51, + BUTTON_VOLDOWN = 52, + BUTTON_UP = 53, + BUTTON_UPLEFT = 54, + BUTTON_LEFT = 55, + BUTTON_DOWNLEFT = 56, + BUTTON_DOWN = 57, + BUTTON_DOWNRIGHT = 58, + BUTTON_RIGHT = 59, + BUTTON_UPRIGHT = 60, + BUTTON_MENU = 61, + BUTTON_SELECT = 62 + }; + +#else + + /* Wiz: Main Joystick Mappings */ + enum { + /* DPAD */ + BUTTON_UP = 0, + BUTTON_UPLEFT = 1, + BUTTON_LEFT = 2, + BUTTON_DOWNLEFT = 3, + BUTTON_DOWN = 4, + BUTTON_DOWNRIGHT = 5, + BUTTON_RIGHT = 6, + BUTTON_UPRIGHT = 7, + /* Joystick Buttons */ + BUTTON_MENU = 8, + BUTTON_SELECT = 9, + BUTTON_L = 10, + BUTTON_R = 11, + BUTTON_A = 12, + BUTTON_B = 13, + BUTTON_X = 14, + BUTTON_Y = 15, + BUTTON_VOLUP = 16, + BUTTON_VOLDOWN = 17 + }; + + enum { + /* Unused Joystick Buttons on the Wiz */ + BUTTON_HOME = 51, + BUTTON_HOLD = 52, + BUTTON_CLICK = 53, + BUTTON_HELP = 54, + BUTTON_HELP2 = 55 + }; + +#endif + 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 + /* Touchscreen TapMode */ + TAPMODE_LEFT = 0, + TAPMODE_RIGHT = 1, + TAPMODE_HOVER = 2 }; static int mapKey(SDLKey key, SDLMod mod, Uint16 unicode) { @@ -81,7 +139,8 @@ static int mapKey(SDLKey key, SDLMod mod, Uint16 unicode) { return key; } -void OSystem_GP2XWIZ::fillMouseEvent(Common::Event &event, int x, int y) { + +void OSystem_GPH::fillMouseEvent(Common::Event &event, int x, int y) { if (_videoMode.mode == GFX_HALF && !_overlayVisible){ event.mouse.x = x*2; event.mouse.y = y*2; @@ -103,19 +162,8 @@ void OSystem_GP2XWIZ::fillMouseEvent(Common::Event &event, int x, int 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() { +void OSystem_GPH::moveStick() { bool stickBtn[32]; memcpy(stickBtn, _stickBtn, sizeof(stickBtn)); @@ -140,7 +188,6 @@ void OSystem_GP2XWIZ::moveStick() { _km.x_down_count = 0; } - if ((stickBtn[0])||(stickBtn[1])||(stickBtn[7])) { if (_km.y_down_count!=2) { _km.y_vel = -1; @@ -159,167 +206,99 @@ void OSystem_GP2XWIZ::moveStick() { } } -/* 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; - ev.type = SDL_NOEVENT; - 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- 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: +/* Custom handleMouseButtonDown/handleMouseButtonUp to deal with 'Tap Mode' for the touchscreen */ + +bool OSystem_GPH::handleMouseButtonDown(SDL_Event &ev, Common::Event &event) { + if (ev.button.button == SDL_BUTTON_LEFT){ + if (BUTTON_STATE_L == true) /* BUTTON_STATE_L = Left Trigger Held, force Right Click */ + event.type = Common::EVENT_RBUTTONDOWN; + else if (GPH::tapmodeLevel == TAPMODE_LEFT) /* TAPMODE_LEFT = Left Click Tap Mode */ + event.type = Common::EVENT_LBUTTONDOWN; + else if (GPH::tapmodeLevel == TAPMODE_RIGHT) /* TAPMODE_RIGHT = Right Click Tap Mode */ + event.type = Common::EVENT_RBUTTONDOWN; + else if (GPH::tapmodeLevel == TAPMODE_HOVER) /* TAPMODE_HOVER = Hover (No Click) Tap Mode */ 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; + else + event.type = Common::EVENT_LBUTTONDOWN; /* For normal mice etc. */ + } + 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; + 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; + else if (ev.button.button == SDL_BUTTON_MIDDLE) + event.type = Common::EVENT_MBUTTONDOWN; #endif - else - break; + else + return false; - fillMouseEvent(event, ev.button.x, ev.button.y); + fillMouseEvent(event, ev.button.x, ev.button.y); - return true; + 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; +bool OSystem_GPH::handleMouseButtonUp(SDL_Event &ev, Common::Event &event) { + if (ev.button.button == SDL_BUTTON_LEFT){ + if (BUTTON_STATE_L == true) /* BUTTON_STATE_L = Left Trigger Held, force Right Click */ + event.type = Common::EVENT_RBUTTONUP; + else if (GPH::tapmodeLevel == TAPMODE_LEFT) /* TAPMODE_LEFT = Left Click Tap Mode */ + event.type = Common::EVENT_LBUTTONUP; + else if (GPH::tapmodeLevel == TAPMODE_RIGHT) /* TAPMODE_RIGHT = Right Click Tap Mode */ + event.type = Common::EVENT_RBUTTONUP; + else if (GPH::tapmodeLevel == TAPMODE_HOVER) /* TAPMODE_HOVER = Hover (No Click) Tap Mode */ + event.type = Common::EVENT_MOUSEMOVE; + else + event.type = Common::EVENT_LBUTTONUP; /* For normal mice etc. */ + + } + 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; + else if (ev.button.button == SDL_BUTTON_MIDDLE) + event.type = Common::EVENT_MBUTTONUP; #endif - else - break; - fillMouseEvent(event, ev.button.x, ev.button.y); + else + return false; - return true; + fillMouseEvent(event, ev.button.x, ev.button.y); - case SDL_JOYBUTTONDOWN: + return true; +} + +/* Custom handleJoyButtonDown/handleJoyButtonUp to deal with the joystick buttons on GPH devices */ + +bool OSystem_GPH::handleJoyButtonDown(SDL_Event &ev, Common::Event &event) { _stickBtn[ev.jbutton.button] = 1; - if (ev.jbutton.button == GP2X_BUTTON_B) { + if (ev.jbutton.button == BUTTON_B) { + event.type = Common::EVENT_LBUTTONDOWN; + fillMouseEvent(event, _km.x, _km.y); + } else if (ev.jbutton.button == BUTTON_CLICK) { event.type = Common::EVENT_LBUTTONDOWN; fillMouseEvent(event, _km.x, _km.y); - } else if (ev.jbutton.button == GP2X_BUTTON_X) { + } else if (ev.jbutton.button == 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)) { + } else if (_stickBtn[BUTTON_L] && (ev.jbutton.button == BUTTON_SELECT)) { event.type = Common::EVENT_QUIT; +#if !defined (CAANOO) } else if (ev.jbutton.button < 8) { moveStick(); event.type = Common::EVENT_MOUSEMOVE; fillMouseEvent(event, _km.x, _km.y); +#endif } else { event.type = Common::EVENT_KEYDOWN; event.kbd.flags = 0; switch (ev.jbutton.button) { - case GP2X_BUTTON_L: - GP2X_BUTTON_STATE_L = true; + case BUTTON_L: + BUTTON_STATE_L = true; break; - case GP2X_BUTTON_R: - if (GP2X_BUTTON_STATE_L == true) { + case BUTTON_R: + if (BUTTON_STATE_L == true) { #ifdef ENABLE_VKEYBD event.kbd.keycode = Common::KEYCODE_F7; event.kbd.ascii = mapKey(SDLK_F7, ev.key.keysym.mod, 0); @@ -332,35 +311,48 @@ bool OSystem_GP2XWIZ::pollEvent(Common::Event &event) { event.kbd.ascii = mapKey(SDLK_RETURN, ev.key.keysym.mod, 0); } break; - case GP2X_BUTTON_SELECT: - if (GP2X_BUTTON_STATE_L == true) { + case BUTTON_SELECT: + case BUTTON_HELP2: + if (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) { + case BUTTON_A: + if (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); + case BUTTON_Y: + if (BUTTON_STATE_L == true) { + GPH::ToggleTapMode(); + if (GPH::tapmodeLevel == TAPMODE_LEFT) { + displayMessageOnOSD("Touchscreen 'Tap Mode': Left Click"); + } else if (GPH::tapmodeLevel == TAPMODE_RIGHT) { + displayMessageOnOSD("Touchscreen 'Tap Mode': Right Click"); + } else if (GPH::tapmodeLevel == TAPMODE_HOVER) { + displayMessageOnOSD("Touchscreen 'Tap Mode': Hover (No Click)"); + } + } else { + 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) { + case BUTTON_MENU: + case BUTTON_HELP: + if (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: + case BUTTON_VOLUP: WIZ_HW::mixerMoveVolume(2); if (WIZ_HW::volumeLevel == 100) { displayMessageOnOSD("Maximum Volume"); @@ -368,8 +360,7 @@ bool OSystem_GP2XWIZ::pollEvent(Common::Event &event) { displayMessageOnOSD("Increasing Volume"); } break; - - case GP2X_BUTTON_VOLDOWN: + case BUTTON_VOLDOWN: WIZ_HW::mixerMoveVolume(1); if (WIZ_HW::volumeLevel == 0) { displayMessageOnOSD("Minimal Volume"); @@ -377,51 +368,72 @@ bool OSystem_GP2XWIZ::pollEvent(Common::Event &event) { displayMessageOnOSD("Decreasing Volume"); } break; + case BUTTON_HOLD: + event.type = Common::EVENT_QUIT; + break; + case BUTTON_HOME: + GPH::ToggleTapMode(); + if (GPH::tapmodeLevel == TAPMODE_LEFT) { + displayMessageOnOSD("Touchscreen 'Tap Mode': Left Click"); + } else if (GPH::tapmodeLevel == TAPMODE_RIGHT) { + displayMessageOnOSD("Touchscreen 'Tap Mode': Right Click"); + } else if (GPH::tapmodeLevel == TAPMODE_HOVER) { + displayMessageOnOSD("Touchscreen 'Tap Mode': Hover (No Click)"); + } + break; } } return true; +} - case SDL_JOYBUTTONUP: +bool OSystem_GPH::handleJoyButtonUp(SDL_Event &ev, Common::Event &event) { _stickBtn[ev.jbutton.button] = 0; - if (ev.jbutton.button == GP2X_BUTTON_B) { + if (ev.jbutton.button == BUTTON_B) { + event.type = Common::EVENT_LBUTTONUP; + fillMouseEvent(event, _km.x, _km.y); + } else if (ev.jbutton.button == BUTTON_CLICK) { event.type = Common::EVENT_LBUTTONUP; fillMouseEvent(event, _km.x, _km.y); - } else if (ev.jbutton.button == GP2X_BUTTON_X) { + } else if (ev.jbutton.button == BUTTON_X) { event.type = Common::EVENT_RBUTTONUP; fillMouseEvent(event, _km.x, _km.y); +#if !defined (CAANOO) } else if (ev.jbutton.button < 8) { moveStick(); event.type = Common::EVENT_MOUSEMOVE; fillMouseEvent(event, _km.x, _km.y); +#endif } else { event.type = Common::EVENT_KEYUP; event.kbd.flags = 0; switch (ev.jbutton.button) { - case GP2X_BUTTON_SELECT: + case BUTTON_SELECT: + case BUTTON_HELP2: event.kbd.keycode = Common::KEYCODE_ESCAPE; event.kbd.ascii = mapKey(SDLK_ESCAPE, ev.key.keysym.mod, 0); break; - case GP2X_BUTTON_A: + case BUTTON_A: event.kbd.keycode = Common::KEYCODE_PERIOD; event.kbd.ascii = mapKey(SDLK_PERIOD, ev.key.keysym.mod, 0); break; - case GP2X_BUTTON_Y: + case 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) { + case BUTTON_MENU: + case BUTTON_HELP: + if (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; + case BUTTON_L: + BUTTON_STATE_L = false; break; - case GP2X_BUTTON_R: - if (GP2X_BUTTON_STATE_L == true) { + case BUTTON_R: + if (BUTTON_STATE_L == true) { #ifdef ENABLE_VKEYBD event.kbd.keycode = Common::KEYCODE_F7; event.kbd.ascii = mapKey(SDLK_F7, ev.key.keysym.mod, 0); @@ -434,68 +446,19 @@ bool OSystem_GP2XWIZ::pollEvent(Common::Event &event) { event.kbd.ascii = mapKey(SDLK_RETURN, ev.key.keysym.mod, 0); } break; - case GP2X_BUTTON_VOLUP: + case BUTTON_VOLUP: break; - case GP2X_BUTTON_VOLDOWN: + case BUTTON_VOLDOWN: + break; + case BUTTON_HOLD: + break; + case BUTTON_HOME: 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) { +bool OSystem_GPH::remapKey(SDL_Event &ev,Common::Event &event) { return false; } diff --git a/backends/platform/gp2xwiz/gp2xwiz-graphics.cpp b/backends/platform/gp2xwiz/gp2xwiz-graphics.cpp index 9b8a41a7cf..92329d7c40 100644 --- a/backends/platform/gp2xwiz/gp2xwiz-graphics.cpp +++ b/backends/platform/gp2xwiz/gp2xwiz-graphics.cpp @@ -38,15 +38,15 @@ static const OSystem::GraphicsMode s_supportedGraphicsModes[] = { {0, 0, 0} }; -const OSystem::GraphicsMode *OSystem_GP2XWIZ::getSupportedGraphicsModes() const { +const OSystem::GraphicsMode *OSystem_GPH::getSupportedGraphicsModes() const { return s_supportedGraphicsModes; } -int OSystem_GP2XWIZ::getDefaultGraphicsMode() const { +int OSystem_GPH::getDefaultGraphicsMode() const { return GFX_NORMAL; } -bool OSystem_GP2XWIZ::setGraphicsMode(int mode) { +bool OSystem_GPH::setGraphicsMode(int mode) { Common::StackLock lock(_graphicsMutex); assert(_transactionMode == kTransactionActive); @@ -80,7 +80,7 @@ bool OSystem_GP2XWIZ::setGraphicsMode(int mode) { return true; } -void OSystem_GP2XWIZ::setGraphicsModeIntern() { +void OSystem_GPH::setGraphicsModeIntern() { Common::StackLock lock(_graphicsMutex); ScalerProc *newScalerProc = 0; @@ -109,7 +109,7 @@ void OSystem_GP2XWIZ::setGraphicsModeIntern() { blitCursor(); } -void OSystem_GP2XWIZ::initSize(uint w, uint h) { +void OSystem_GPH::initSize(uint w, uint h) { assert(_transactionMode == kTransactionActive); // Avoid redundant res changes @@ -127,7 +127,7 @@ void OSystem_GP2XWIZ::initSize(uint w, uint h) { _transactionDetails.sizeChanged = true; } -bool OSystem_GP2XWIZ::loadGFXMode() { +bool OSystem_GPH::loadGFXMode() { if (_videoMode.screenWidth > 320 || _videoMode.screenHeight > 240) { _videoMode.aspectRatioCorrection = false; setGraphicsMode(GFX_HALF); @@ -155,7 +155,7 @@ bool OSystem_GP2XWIZ::loadGFXMode() { return OSystem_SDL::loadGFXMode(); } -void OSystem_GP2XWIZ::drawMouse() { +void OSystem_GPH::drawMouse() { if (!_mouseVisible || !_mouseSurface) { _mouseBackup.x = _mouseBackup.y = _mouseBackup.w = _mouseBackup.h = 0; return; @@ -226,7 +226,7 @@ void OSystem_GP2XWIZ::drawMouse() { addDirtyRect(dst.x, dst.y, dst.w, dst.h, true); } -void OSystem_GP2XWIZ::undrawMouse() { +void OSystem_GPH::undrawMouse() { const int x = _mouseBackup.x; const int y = _mouseBackup.y; @@ -244,7 +244,7 @@ void OSystem_GP2XWIZ::undrawMouse() { } } -void OSystem_GP2XWIZ::internUpdateScreen() { +void OSystem_GPH::internUpdateScreen() { SDL_Surface *srcSurf, *origSurf; int height, width; ScalerProc *scalerProc; @@ -256,7 +256,8 @@ void OSystem_GP2XWIZ::internUpdateScreen() { #endif // If the shake position changed, fill the dirty area with blackness - if (_currentShakePos != _newShakePos) { + if (_currentShakePos != _newShakePos || + (_mouseNeedsRedraw && _mouseBackup.y <= _currentShakePos)) { SDL_Rect blackrect = {0, 0, _videoMode.screenWidth * _videoMode.scaleFactor, _newShakePos * _videoMode.scaleFactor}; if (_videoMode.aspectRatioCorrection && !_overlayVisible) @@ -314,6 +315,7 @@ void OSystem_GP2XWIZ::internUpdateScreen() { width = _videoMode.overlayWidth; height = _videoMode.overlayHeight; scalerProc = Normal1x; + scale1 = 1; } @@ -441,7 +443,7 @@ void OSystem_GP2XWIZ::internUpdateScreen() { _mouseNeedsRedraw = false; } -void OSystem_GP2XWIZ::showOverlay() { +void OSystem_GPH::showOverlay() { if (_videoMode.mode == GFX_HALF){ _mouseCurState.x = _mouseCurState.x / 2; _mouseCurState.y = _mouseCurState.y / 2; @@ -449,7 +451,7 @@ void OSystem_GP2XWIZ::showOverlay() { OSystem_SDL::showOverlay(); } -void OSystem_GP2XWIZ::hideOverlay() { +void OSystem_GPH::hideOverlay() { if (_videoMode.mode == GFX_HALF){ _mouseCurState.x = _mouseCurState.x * 2; _mouseCurState.y = _mouseCurState.y * 2; @@ -457,7 +459,7 @@ void OSystem_GP2XWIZ::hideOverlay() { OSystem_SDL::hideOverlay(); } -void OSystem_GP2XWIZ::warpMouse(int x, int y) { +void OSystem_GPH::warpMouse(int x, int y) { if (_mouseCurState.x != x || _mouseCurState.y != y) { if (_videoMode.mode == GFX_HALF && !_overlayVisible){ x = x / 2; diff --git a/backends/platform/gp2xwiz/gp2xwiz-hw.cpp b/backends/platform/gp2xwiz/gp2xwiz-hw.cpp index bc1aa00ce4..f7cc716df0 100644 --- a/backends/platform/gp2xwiz/gp2xwiz-hw.cpp +++ b/backends/platform/gp2xwiz/gp2xwiz-hw.cpp @@ -82,3 +82,28 @@ void mixerMoveVolume(int direction) { } } /* namespace WIZ_HW */ + +namespace GPH { + +enum { + /* Touchscreen TapMode */ + TAPMODE_LEFT = 0, + TAPMODE_RIGHT = 1, + TAPMODE_HOVER = 2 +}; + +int tapmodeLevel = TAPMODE_LEFT; + +void ToggleTapMode() { + if (tapmodeLevel == TAPMODE_LEFT) { + tapmodeLevel = TAPMODE_RIGHT; + } else if (tapmodeLevel == TAPMODE_RIGHT) { + tapmodeLevel = TAPMODE_HOVER; + } else if (tapmodeLevel == TAPMODE_HOVER) { + tapmodeLevel = TAPMODE_LEFT; + } else { + tapmodeLevel = TAPMODE_LEFT; + } +} + +} /* namespace GPH */ diff --git a/backends/platform/gp2xwiz/gp2xwiz-hw.h b/backends/platform/gp2xwiz/gp2xwiz-hw.h index 507841e902..2fc7a85f5c 100644 --- a/backends/platform/gp2xwiz/gp2xwiz-hw.h +++ b/backends/platform/gp2xwiz/gp2xwiz-hw.h @@ -31,6 +31,14 @@ #ifndef GP2XWIZ_HW_H #define GP2XWIZ_HW_H +#if defined (CAANOO) + /* Vibrate features that GPH put in the */ + /* SDL port but did not define */ + extern void SDL_VibrateInit(); + extern void SDL_VibrateQuit(); + extern void SDL_VibratePlay(int); +#endif + namespace WIZ_HW { extern int volumeLevel; @@ -41,4 +49,13 @@ extern void mixerMoveVolume(int); } /* namespace WIZ_HW */ +namespace GPH { + +extern int tapmodeLevel; + +extern void ToggleTapMode(); +extern int GetTapMode(); + +} /* namespace GPH */ + #endif //GP2XWIZ_HW_H diff --git a/backends/platform/gp2xwiz/gp2xwiz-main.cpp b/backends/platform/gp2xwiz/gp2xwiz-main.cpp index 839afa6a95..a40b49ae18 100644 --- a/backends/platform/gp2xwiz/gp2xwiz-main.cpp +++ b/backends/platform/gp2xwiz/gp2xwiz-main.cpp @@ -57,7 +57,7 @@ #define DUMP_STDOUT int main(int argc, char *argv[]) { - g_system = new OSystem_GP2XWIZ(); + g_system = new OSystem_GPH(); assert(g_system); #ifdef DYNAMIC_MODULES PluginManager::instance().addPluginProvider(new POSIXPluginProvider()); @@ -70,7 +70,7 @@ int main(int argc, char *argv[]) { return res; } -void OSystem_GP2XWIZ::initBackend() { +void OSystem_GPH::initBackend() { /* Setup default save path to be workingdir/saves */ @@ -164,7 +164,7 @@ void OSystem_GP2XWIZ::initBackend() { OSystem_SDL::initBackend(); } -void OSystem_GP2XWIZ::addSysArchivesToSearchSet(Common::SearchSet &s, int priority) { +void OSystem_GPH::addSysArchivesToSearchSet(Common::SearchSet &s, int priority) { /* Setup default extra data paths for engine data files and plugins */ char workDirName[PATH_MAX+1]; @@ -199,7 +199,7 @@ void OSystem_GP2XWIZ::addSysArchivesToSearchSet(Common::SearchSet &s, int priori } } -void OSystem_GP2XWIZ::quit() { +void OSystem_GPH::quit() { WIZ_HW::deviceDeinit(); diff --git a/backends/platform/gp2xwiz/gp2xwiz-sdl.h b/backends/platform/gp2xwiz/gp2xwiz-sdl.h index e312d0f26d..bae9a87771 100644 --- a/backends/platform/gp2xwiz/gp2xwiz-sdl.h +++ b/backends/platform/gp2xwiz/gp2xwiz-sdl.h @@ -40,9 +40,9 @@ enum { #define PATH_MAX 255 #endif -class OSystem_GP2XWIZ : public OSystem_SDL { +class OSystem_GPH : public OSystem_SDL { public: - OSystem_GP2XWIZ() {} + OSystem_GPH() {} /* Graphics */ void initSize(uint w, uint h); @@ -59,7 +59,6 @@ public: void hideOverlay(); /* Event Stuff */ - bool pollEvent(Common::Event &event); void moveStick(); void fillMouseEvent(Common::Event&, int, int); void warpMouse(int, int); @@ -72,6 +71,11 @@ public: protected: bool _stickBtn[32]; + + bool handleMouseButtonDown(SDL_Event &ev, Common::Event &event); + bool handleMouseButtonUp(SDL_Event &ev, Common::Event &event); + bool handleJoyButtonDown(SDL_Event &ev, Common::Event &event); + bool handleJoyButtonUp(SDL_Event &ev, Common::Event &event); }; #endif -- cgit v1.2.3