ANDROID: Add basic keymapper support (#2026)

* ANDROID: Remove hard-coded key mappings

* ANDROID: Add default key bindings
This commit is contained in:
Cameron Cawley 2020-02-26 08:23:47 +00:00 committed by GitHub
parent 00a7626a8a
commit fffb25a47a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 23 additions and 111 deletions

View file

@ -60,6 +60,10 @@
#include "backends/saves/default/default-saves.h" #include "backends/saves/default/default-saves.h"
#include "backends/timer/default/default-timer.h" #include "backends/timer/default/default-timer.h"
#include "backends/keymapper/keymapper.h"
#include "backends/keymapper/keymapper-defaults.h"
#include "backends/keymapper/standard-actions.h"
#include "backends/platform/android/jni-android.h" #include "backends/platform/android/jni-android.h"
#include "backends/platform/android/android.h" #include "backends/platform/android/android.h"
#include "backends/platform/android/graphics.h" #include "backends/platform/android/graphics.h"
@ -101,8 +105,7 @@ OSystem_Android::OSystem_Android(int audio_sample_rate, int audio_buffer_size) :
_dpad_scale(4), _dpad_scale(4),
_fingersDown(0), _fingersDown(0),
_trackball_scale(2), _trackball_scale(2),
_joystick_scale(10), _joystick_scale(10) {
_swap_menu_and_back(false) {
_fsFactory = new POSIXFilesystemFactory(); _fsFactory = new POSIXFilesystemFactory();
@ -330,11 +333,6 @@ void OSystem_Android::initBackend() {
else else
ConfMan.setBool("onscreen_control", true); ConfMan.setBool("onscreen_control", true);
if (ConfMan.hasKey("swap_menu_and_back_buttons"))
_swap_menu_and_back = ConfMan.getBool("swap_menu_and_back_buttons");
else
ConfMan.setBool("swap_menu_and_back_buttons", false);
// BUG: "transient" ConfMan settings get nuked by the options // BUG: "transient" ConfMan settings get nuked by the options
// screen. Passing the savepath in this way makes it stick // screen. Passing the savepath in this way makes it stick
// (via ConfMan.registerDefault) // (via ConfMan.registerDefault)
@ -374,7 +372,6 @@ bool OSystem_Android::hasFeature(Feature f) {
f == kFeatureOpenUrl || f == kFeatureOpenUrl ||
f == kFeatureTouchpadMode || f == kFeatureTouchpadMode ||
f == kFeatureOnScreenControl || f == kFeatureOnScreenControl ||
f == kFeatureSwapMenuAndBackButtons ||
f == kFeatureClipboardSupport) { f == kFeatureClipboardSupport) {
return true; return true;
} }
@ -397,10 +394,6 @@ void OSystem_Android::setFeatureState(Feature f, bool enable) {
ConfMan.setBool("onscreen_control", enable); ConfMan.setBool("onscreen_control", enable);
JNI::showKeyboardControl(enable); JNI::showKeyboardControl(enable);
break; break;
case kFeatureSwapMenuAndBackButtons:
ConfMan.setBool("swap_menu_and_back_buttons", enable);
_swap_menu_and_back = enable;
break;
default: default:
ModularBackend::setFeatureState(f, enable); ModularBackend::setFeatureState(f, enable);
break; break;
@ -415,13 +408,27 @@ bool OSystem_Android::getFeatureState(Feature f) {
return ConfMan.getBool("touchpad_mouse_mode"); return ConfMan.getBool("touchpad_mouse_mode");
case kFeatureOnScreenControl: case kFeatureOnScreenControl:
return ConfMan.getBool("onscreen_control"); return ConfMan.getBool("onscreen_control");
case kFeatureSwapMenuAndBackButtons:
return ConfMan.getBool("swap_menu_and_back_buttons");
default: default:
return ModularBackend::getFeatureState(f); return ModularBackend::getFeatureState(f);
} }
} }
Common::KeymapperDefaultBindings *OSystem_Android::getKeymapperDefaultBindings() {
Common::KeymapperDefaultBindings *keymapperDefaultBindings = new Common::KeymapperDefaultBindings();
if (ConfMan.hasKey("swap_menu_and_back") && ConfMan.getBool("swap_menu_and_back")) {
keymapperDefaultBindings->setDefaultBinding(Common::kGlobalKeymapName, "MENU", "AC_BACK");
keymapperDefaultBindings->setDefaultBinding("engine-default", Common::kStandardActionSkip, "MENU");
keymapperDefaultBindings->setDefaultBinding(Common::kGuiKeymapName, "CLOS", "MENU");
} else {
keymapperDefaultBindings->setDefaultBinding(Common::kGlobalKeymapName, "MENU", "MENU");
keymapperDefaultBindings->setDefaultBinding("engine-default", Common::kStandardActionSkip, "AC_BACK");
keymapperDefaultBindings->setDefaultBinding(Common::kGuiKeymapName, "CLOS", "AC_BACK");
}
return keymapperDefaultBindings;
}
uint32 OSystem_Android::getMillis(bool skipRecord) { uint32 OSystem_Android::getMillis(bool skipRecord) {
timeval curTime; timeval curTime;

View file

@ -111,7 +111,6 @@ private:
int _dpad_scale; int _dpad_scale;
int _joystick_scale; int _joystick_scale;
int _fingersDown; int _fingersDown;
bool _swap_menu_and_back;
void clipMouse(Common::Point &p); void clipMouse(Common::Point &p);
void scaleMouse(Common::Point &p, int x, int y, bool deductDrawRect = true, bool touchpadMode = false); void scaleMouse(Common::Point &p, int x, int y, bool deductDrawRect = true, bool touchpadMode = false);
@ -119,6 +118,8 @@ private:
public: public:
virtual void pushEvent(const Common::Event &event); virtual void pushEvent(const Common::Event &event);
virtual bool pollEvent(Common::Event &event); virtual bool pollEvent(Common::Event &event);
virtual Common::KeymapperDefaultBindings *getKeymapperDefaultBindings();
virtual uint32 getMillis(bool skipRecord = false); virtual uint32 getMillis(bool skipRecord = false);
virtual void delayMillis(uint msecs); virtual void delayMillis(uint msecs);

View file

@ -58,76 +58,6 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,
switch (type) { switch (type) {
case JE_SYS_KEY: case JE_SYS_KEY:
switch (arg1) {
case JACTION_DOWN:
e.type = Common::EVENT_KEYDOWN;
break;
case JACTION_UP:
e.type = Common::EVENT_KEYUP;
break;
default:
LOGE("unhandled jaction on system key: %d", arg1);
return;
}
switch (arg2) {
case JKEYCODE_BACK:
if (_swap_menu_and_back) {
if (arg1 == JACTION_DOWN) {
e.type = Common::EVENT_MAINMENU;
pushEvent(e);
}
} else {
e.kbd.keycode = Common::KEYCODE_ESCAPE;
e.kbd.ascii = Common::ASCII_ESCAPE;
pushEvent(e);
}
return;
case JKEYCODE_MENU:
if (_swap_menu_and_back) {
e.kbd.keycode = Common::KEYCODE_ESCAPE;
e.kbd.ascii = Common::ASCII_ESCAPE;
pushEvent(e);
} else {
if (arg1 == JACTION_DOWN) {
e.type = Common::EVENT_MAINMENU;
pushEvent(e);
}
}
return;
case JKEYCODE_MEDIA_PAUSE:
case JKEYCODE_MEDIA_PLAY:
case JKEYCODE_MEDIA_PLAY_PAUSE:
if (arg1 == JACTION_DOWN) {
e.type = Common::EVENT_MAINMENU;
pushEvent(e);
}
return;
case JKEYCODE_CAMERA:
case JKEYCODE_SEARCH:
if (arg1 == JACTION_DOWN)
e.type = Common::EVENT_RBUTTONDOWN;
else
e.type = Common::EVENT_RBUTTONUP;
e.mouse = dynamic_cast<AndroidGraphicsManager *>(_graphicsManager)->getMousePosition();
pushEvent(e);
return;
default:
break;
}
// fall through
case JE_KEY: case JE_KEY:
switch (arg1) { switch (arg1) {
case JACTION_DOWN: case JACTION_DOWN:

View file

@ -62,32 +62,6 @@ enum {
JACTION_POINTER_UP = 6 JACTION_POINTER_UP = 6
}; };
// system keys
enum {
JKEYCODE_SOFT_RIGHT = 2,
JKEYCODE_HOME = 3,
JKEYCODE_BACK = 4,
JKEYCODE_CALL = 5,
JKEYCODE_ENDCALL = 6,
JKEYCODE_VOLUME_UP = 24,
JKEYCODE_VOLUME_DOWN = 25,
JKEYCODE_POWER = 26,
JKEYCODE_CAMERA = 27,
JKEYCODE_HEADSETHOOK = 79,
JKEYCODE_FOCUS = 80,
JKEYCODE_MENU = 82,
JKEYCODE_SEARCH = 84,
JKEYCODE_MUTE = 91,
JKEYCODE_MEDIA_PLAY_PAUSE = 85,
JKEYCODE_MEDIA_STOP = 86,
JKEYCODE_MEDIA_NEXT = 87,
JKEYCODE_MEDIA_PREVIOUS = 88,
JKEYCODE_MEDIA_REWIND = 89,
JKEYCODE_MEDIA_FAST_FORWARD = 90,
JKEYCODE_MEDIA_PLAY = 126,
JKEYCODE_MEDIA_PAUSE = 127
};
// five-way navigation control // five-way navigation control
enum { enum {
JKEYCODE_DPAD_UP = 19, JKEYCODE_DPAD_UP = 19,