diff options
Diffstat (limited to 'backends')
-rw-r--r-- | backends/events/androidsdl/androidsdl-events.cpp | 13 | ||||
-rw-r--r-- | backends/platform/androidsdl/androidsdl-sdl.cpp | 96 | ||||
-rw-r--r-- | backends/platform/androidsdl/androidsdl-sdl.h | 8 |
3 files changed, 106 insertions, 11 deletions
diff --git a/backends/events/androidsdl/androidsdl-events.cpp b/backends/events/androidsdl/androidsdl-events.cpp index 0adcff817e..125f411289 100644 --- a/backends/events/androidsdl/androidsdl-events.cpp +++ b/backends/events/androidsdl/androidsdl-events.cpp @@ -26,7 +26,6 @@ #include "backends/events/androidsdl/androidsdl-events.h" #include "backends/platform/androidsdl/androidsdl-sdl.h" -#include <SDL_screenkeyboard.h> bool AndroidSdlEventSource::handleMouseButtonDown(SDL_Event &ev, Common::Event &event) { if (ev.button.button == SDL_BUTTON_LEFT) @@ -43,16 +42,8 @@ bool AndroidSdlEventSource::handleMouseButtonDown(SDL_Event &ev, Common::Event & else if (ev.button.button == SDL_BUTTON_MIDDLE) { event.type = Common::EVENT_MBUTTONDOWN; - static int show_onscreen = 0; - if (show_onscreen == 0) { - SDL_ANDROID_SetScreenKeyboardShown(0); - show_onscreen++; - } else if (show_onscreen==1) { - SDL_ANDROID_SetScreenKeyboardShown(1); - show_onscreen++; - } - if (show_onscreen == 2) - show_onscreen = 0; + const bool show_onscreen = g_system->getFeatureState(OSystem::kFeatureOnScreenControl); + g_system->setFeatureState(OSystem::kFeatureOnScreenControl, !show_onscreen); } #endif else diff --git a/backends/platform/androidsdl/androidsdl-sdl.cpp b/backends/platform/androidsdl/androidsdl-sdl.cpp index d04512475a..920dad2234 100644 --- a/backends/platform/androidsdl/androidsdl-sdl.cpp +++ b/backends/platform/androidsdl/androidsdl-sdl.cpp @@ -27,6 +27,8 @@ #include "backends/platform/androidsdl/androidsdl-sdl.h" #include "backends/events/androidsdl/androidsdl-events.h" #include "backends/graphics/androidsdl/androidsdl-graphics.h" +#include <SDL_android.h> +#include <SDL_screenkeyboard.h> void OSystem_ANDROIDSDL::initBackend() { // Create the backend custom managers @@ -42,7 +44,101 @@ void OSystem_ANDROIDSDL::initBackend() { if (!ConfMan.hasKey("gfx_mode")) ConfMan.set("gfx_mode", "2x"); + + if (!ConfMan.hasKey("swap_menu_and_back_buttons")) + ConfMan.setBool("swap_menu_and_back_buttons", true); + else + swapMenuAndBackButtons(ConfMan.getBool("swap_menu_and_back_buttons")); + + if (!ConfMan.hasKey("touchpad_mouse_mode")) { + const bool enable = SDL_ANDROID_GetMouseEmulationMode(); + ConfMan.setBool("touchpad_mouse_mode", enable); + } else + touchpadMode(ConfMan.getBool("touchpad_mouse_mode")); + + if (!ConfMan.hasKey("onscreen_control")) { + const bool enable = SDL_ANDROID_GetScreenKeyboardShown(); + ConfMan.setBool("onscreen_control", enable); + } else + showOnScreenControl(ConfMan.getBool("onscreen_control")); // Call parent implementation of this method OSystem_POSIX::initBackend(); } + +void OSystem_ANDROIDSDL::showOnScreenControl(bool enable) { + if (enable) + SDL_ANDROID_SetScreenKeyboardShown(1); + else + SDL_ANDROID_SetScreenKeyboardShown(0); +} + +void OSystem_ANDROIDSDL::touchpadMode(bool enable) { + if (enable) + switchToRelativeMouseMode(); + else + switchToDirectMouseMode(); +} + +void OSystem_ANDROIDSDL::swapMenuAndBackButtons(bool enable) { + static int KEYCODE_MENU = 82; + static int KEYCODE_BACK = 4; + if (enable) { + SDL_ANDROID_SetAndroidKeycode(KEYCODE_BACK, SDLK_F13); + SDL_ANDROID_SetAndroidKeycode(KEYCODE_MENU, SDLK_ESCAPE); + } else { + SDL_ANDROID_SetAndroidKeycode(KEYCODE_BACK, SDLK_ESCAPE); + SDL_ANDROID_SetAndroidKeycode(KEYCODE_MENU, SDLK_F13); + } +} + +void OSystem_ANDROIDSDL::switchToDirectMouseMode() { + SDL_ANDROID_SetMouseEmulationMode(0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); +} + +void OSystem_ANDROIDSDL::switchToRelativeMouseMode() { + SDL_ANDROID_SetMouseEmulationMode(1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); +} + +void OSystem_ANDROIDSDL::setFeatureState(Feature f, bool enable) { + switch (f) { + case kFeatureTouchpadMode: + ConfMan.setBool("touchpad_mouse_mode", enable); + touchpadMode(enable); + break; + case kFeatureOnScreenControl: + ConfMan.setBool("onscreen_control", enable); + showOnScreenControl(enable); + break; + case kFeatureSwapMenuAndBackButtons: + ConfMan.setBool("swap_menu_and_back_buttons", enable); + swapMenuAndBackButtons(enable); + break; + } + + OSystem_POSIX::setFeatureState(f, enable); +} + +bool OSystem_ANDROIDSDL::getFeatureState(Feature f) { + switch (f) { + case kFeatureTouchpadMode: + return ConfMan.getBool("touchpad_mouse_mode"); + break; + case kFeatureOnScreenControl: + return ConfMan.getBool("onscreen_control"); + break; + case kFeatureSwapMenuAndBackButtons: + return ConfMan.getBool("swap_menu_and_back_buttons"); + break; + default: + return OSystem_POSIX::getFeatureState(f); + break; + } +} + +bool OSystem_ANDROIDSDL::hasFeature(Feature f) { + return (f == kFeatureTouchpadMode || + f == kFeatureOnScreenControl || + f == kFeatureSwapMenuAndBackButtons || + f == OSystem_POSIX::getFeatureState(f)); +} diff --git a/backends/platform/androidsdl/androidsdl-sdl.h b/backends/platform/androidsdl/androidsdl-sdl.h index 6ebe5022eb..e83f610d10 100644 --- a/backends/platform/androidsdl/androidsdl-sdl.h +++ b/backends/platform/androidsdl/androidsdl-sdl.h @@ -28,6 +28,14 @@ class OSystem_ANDROIDSDL : public OSystem_POSIX { public: virtual void initBackend(); + virtual void setFeatureState(Feature f, bool enable); + virtual bool getFeatureState(Feature f); + virtual bool hasFeature(Feature f); + void touchpadMode(bool enable); + void swapMenuAndBackButtons(bool enable); + void switchToDirectMouseMode(); + void switchToRelativeMouseMode(); + void showOnScreenControl(bool enable); #ifdef ENABLE_KEYMAPPER // FIXME: This just calls parent methods, is it needed? |