mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-14 21:59:17 +00:00
ANDROID: Support FireTV remote
This commit is contained in:
parent
528d7477e8
commit
16f626401e
@ -267,6 +267,7 @@ const HardwareInputTableEntry defaultJoystickButtons[] = {
|
||||
{ "JOY_DOWN", JOYSTICK_BUTTON_DPAD_DOWN, _s("D-pad Down") },
|
||||
{ "JOY_LEFT", JOYSTICK_BUTTON_DPAD_LEFT, _s("D-pad Left") },
|
||||
{ "JOY_RIGHT", JOYSTICK_BUTTON_DPAD_RIGHT, _s("D-pad Right") },
|
||||
{ "JOY_CENTER", JOYSTICK_BUTTON_DPAD_CENTER, _s("D-pad Center") },
|
||||
{ nullptr, 0, nullptr }
|
||||
};
|
||||
|
||||
|
@ -623,6 +623,22 @@ Common::KeymapperDefaultBindings *OSystem_Android::getKeymapperDefaultBindings()
|
||||
// See: backends/keymapper/remap-widget.cpp: kCloseCmd = 'CLOS'
|
||||
keymapperDefaultBindings->setDefaultBinding(Common::kGuiKeymapName, "CLOS", "AC_BACK");
|
||||
|
||||
// By default DPAD directions will be used for virtual mouse in GUI context
|
||||
// If the user wants to remap them, they will be able to navigate to Global Options -> Keymaps and do so.
|
||||
// In some devices (eg. Android TV) with only the remote control as input, it is impossible to navigate the launcher GUI,
|
||||
// if the DPAD actions are mapped to "up", "down", "left", "right" directions.
|
||||
// TODO If full key-based (ie. non-mouse) navigation of the ScummVM GUI is implemented,
|
||||
// we can revert back to the core behavior of DPAD being mapped to "up", "down", "left", "right" directions.
|
||||
keymapperDefaultBindings->setDefaultBinding(Common::kGlobalKeymapName, "VMOUSEUP", "JOY_UP");
|
||||
keymapperDefaultBindings->setDefaultBinding(Common::kGlobalKeymapName, "VMOUSEDOWN", "JOY_DOWN");
|
||||
keymapperDefaultBindings->setDefaultBinding(Common::kGlobalKeymapName, "VMOUSELEFT", "JOY_LEFT");
|
||||
keymapperDefaultBindings->setDefaultBinding(Common::kGlobalKeymapName, "VMOUSERIGHT", "JOY_RIGHT");
|
||||
//keymapperDefaultBindings->setDefaultBinding(Common::kGuiKeymapName, Common::kStandardActionInteract, "JOY_CENTER");
|
||||
keymapperDefaultBindings->setDefaultBinding(Common::kGuiKeymapName, Common::kStandardActionMoveUp, nullptr);
|
||||
keymapperDefaultBindings->setDefaultBinding(Common::kGuiKeymapName, Common::kStandardActionMoveDown, nullptr);
|
||||
keymapperDefaultBindings->setDefaultBinding(Common::kGuiKeymapName, Common::kStandardActionMoveLeft, nullptr);
|
||||
keymapperDefaultBindings->setDefaultBinding(Common::kGuiKeymapName, Common::kStandardActionMoveRight, nullptr);
|
||||
|
||||
return keymapperDefaultBindings;
|
||||
}
|
||||
|
||||
|
@ -76,6 +76,7 @@ enum {
|
||||
JE_BMB_UP = 19,
|
||||
JE_FMB_DOWN = 20,
|
||||
JE_FMB_UP = 21,
|
||||
JE_TV_REMOTE = 22,
|
||||
JE_QUIT = 0x1000,
|
||||
JE_MENU = 0x1001
|
||||
};
|
||||
@ -551,6 +552,7 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,
|
||||
case AKEYCODE_DPAD_LEFT:
|
||||
// fall through
|
||||
case AKEYCODE_DPAD_RIGHT:
|
||||
// Treat as mouse movement
|
||||
if (arg1 != AKEY_EVENT_ACTION_DOWN)
|
||||
return;
|
||||
|
||||
@ -586,6 +588,7 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,
|
||||
return;
|
||||
|
||||
case AKEYCODE_DPAD_CENTER:
|
||||
// Treat as mouse click (left click)
|
||||
switch (arg1) {
|
||||
case AKEY_EVENT_ACTION_DOWN:
|
||||
e.type = Common::EVENT_LBUTTONDOWN;
|
||||
@ -607,6 +610,73 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,
|
||||
return;
|
||||
}
|
||||
|
||||
case JE_TV_REMOTE:
|
||||
switch (arg1) {
|
||||
case AKEY_EVENT_ACTION_DOWN:
|
||||
e.type = Common::EVENT_KEYDOWN;
|
||||
break;
|
||||
|
||||
case AKEY_EVENT_ACTION_UP:
|
||||
e.type = Common::EVENT_KEYUP;
|
||||
break;
|
||||
|
||||
default:
|
||||
LOGE("unhandled jaction on key: %d", arg1);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (arg2) {
|
||||
case AKEYCODE_MEDIA_FAST_FORWARD:
|
||||
// fall through
|
||||
case AKEYCODE_MEDIA_REWIND:
|
||||
// fall through
|
||||
case AKEYCODE_MEDIA_PLAY_PAUSE:
|
||||
// Treat as keyboard presses, since they have equivalent hardware keyboard keys
|
||||
e.kbd.keycode = jkeymap[arg2];
|
||||
if (arg5 > 0) {
|
||||
e.kbdRepeat = true;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
// Unfortunately CHANNEL_UP or CHANNEL_DOWN do not trigger for the FireStick remote (3rd gen)
|
||||
// despite the documentation (https://developer.amazon.com/docs/fire-tv/remote-input.html)
|
||||
// so there's no way as of yet to test this. Also, using Channel up/down as mouse up/down
|
||||
// is not very useful anyway
|
||||
// case AKEYCODE_CHANNEL_UP:
|
||||
// // fall through
|
||||
// case AKEYCODE_CHANNEL_DOWN:
|
||||
// // Treat as mouse movement - only on Y axis
|
||||
// if (arg1 != AKEY_EVENT_ACTION_DOWN)
|
||||
// return;
|
||||
//
|
||||
// e.type = Common::EVENT_MOUSEMOVE;
|
||||
//
|
||||
// e.mouse = dynamic_cast<AndroidCommonGraphics *>(_graphicsManager)->getMousePosition();
|
||||
//
|
||||
// {
|
||||
// int16 *c;
|
||||
// int s;
|
||||
//
|
||||
// c = &e.mouse.y;
|
||||
// s = _eventScaleY;
|
||||
//
|
||||
// // the longer the button held, the faster the pointer is
|
||||
// // TODO put these values in some option dlg?
|
||||
// int f = CLIP(arg5, 1, 8) * _dpad_scale * 100 / s;
|
||||
//
|
||||
// if (arg2 == AKEYCODE_CHANNEL_UP) {
|
||||
// *c -= f;
|
||||
// } else {
|
||||
// *c += f;
|
||||
// }
|
||||
// }
|
||||
// break;
|
||||
}
|
||||
|
||||
pushEvent(e);
|
||||
return;
|
||||
|
||||
case JE_DOWN:
|
||||
// LOGD("JE_DOWN");
|
||||
_touch_pt_down = dynamic_cast<AndroidCommonGraphics *>(_graphicsManager)->getMousePosition();
|
||||
@ -1161,6 +1231,26 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,
|
||||
e.joystick.button = Common::JOYSTICK_BUTTON_RIGHT_STICK;
|
||||
break;
|
||||
|
||||
case AKEYCODE_DPAD_UP:
|
||||
e.joystick.button = Common::JOYSTICK_BUTTON_DPAD_UP;
|
||||
break;
|
||||
|
||||
case AKEYCODE_DPAD_DOWN:
|
||||
e.joystick.button = Common::JOYSTICK_BUTTON_DPAD_DOWN;
|
||||
break;
|
||||
|
||||
case AKEYCODE_DPAD_LEFT:
|
||||
e.joystick.button = Common::JOYSTICK_BUTTON_DPAD_LEFT;
|
||||
break;
|
||||
|
||||
case AKEYCODE_DPAD_RIGHT:
|
||||
e.joystick.button = Common::JOYSTICK_BUTTON_DPAD_RIGHT;
|
||||
break;
|
||||
|
||||
case AKEYCODE_DPAD_CENTER:
|
||||
e.joystick.button = Common::JOYSTICK_BUTTON_DPAD_CENTER;
|
||||
break;
|
||||
|
||||
default:
|
||||
LOGW("unmapped gamepad key: %d", arg2);
|
||||
return;
|
||||
|
@ -48,6 +48,9 @@ public class ScummVMEventsBase implements
|
||||
public static final int JE_BMB_UP = 19;
|
||||
public static final int JE_FMB_DOWN = 20;
|
||||
public static final int JE_FMB_UP = 21;
|
||||
|
||||
public static final int JE_TV_REMOTE = 22;
|
||||
|
||||
public static final int JE_QUIT = 0x1000;
|
||||
public static final int JE_MENU = 0x1001;
|
||||
|
||||
@ -369,17 +372,29 @@ public class ScummVMEventsBase implements
|
||||
case KeyEvent.KEYCODE_VOLUME_UP:
|
||||
// We ignore these so that they can be handled by Android.
|
||||
return false;
|
||||
|
||||
// case KeyEvent.KEYCODE_CHANNEL_UP:
|
||||
// case KeyEvent.KEYCODE_CHANNEL_DOWN:
|
||||
case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD:
|
||||
case KeyEvent.KEYCODE_MEDIA_REWIND:
|
||||
case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
|
||||
type = JE_TV_REMOTE;
|
||||
break;
|
||||
|
||||
case KeyEvent.KEYCODE_DPAD_UP:
|
||||
case KeyEvent.KEYCODE_DPAD_DOWN:
|
||||
case KeyEvent.KEYCODE_DPAD_LEFT:
|
||||
case KeyEvent.KEYCODE_DPAD_RIGHT:
|
||||
case KeyEvent.KEYCODE_DPAD_CENTER:
|
||||
if (e.getSource() == InputDevice.SOURCE_DPAD) {
|
||||
type = JE_DPAD;
|
||||
} else {
|
||||
type = JE_KEY;
|
||||
}
|
||||
break;
|
||||
// if (e.getSource() == InputDevice.SOURCE_DPAD) {
|
||||
// // When interpreted as JE_DPAD it will work as a mouse (translated in Android backend, events.cpp)
|
||||
// // TODO ASDF is this interfering with Joystick on-screen control?
|
||||
// type = JE_DPAD;
|
||||
// } else {
|
||||
// // When interpreted as JE_GAMEPAD it will be forwarder to ScummVM's keymapper
|
||||
// type = JE_GAMEPAD;
|
||||
// }
|
||||
// break;
|
||||
case KeyEvent.KEYCODE_BUTTON_A:
|
||||
case KeyEvent.KEYCODE_BUTTON_B:
|
||||
case KeyEvent.KEYCODE_BUTTON_C:
|
||||
@ -397,6 +412,7 @@ public class ScummVMEventsBase implements
|
||||
case KeyEvent.KEYCODE_BUTTON_MODE:
|
||||
type = JE_GAMEPAD;
|
||||
break;
|
||||
|
||||
case KeyEvent.KEYCODE_BUTTON_1:
|
||||
case KeyEvent.KEYCODE_BUTTON_2:
|
||||
case KeyEvent.KEYCODE_BUTTON_3:
|
||||
@ -404,6 +420,7 @@ public class ScummVMEventsBase implements
|
||||
// These are oddly detected with SOURCE_KEYBOARD for joystick so don't bother checking the e.getSource()
|
||||
type = JE_JOYSTICK;
|
||||
break;
|
||||
|
||||
default:
|
||||
if (e.isSystem()) {
|
||||
type = JE_SYS_KEY;
|
||||
@ -414,6 +431,7 @@ public class ScummVMEventsBase implements
|
||||
}
|
||||
|
||||
//_scummvm.displayMessageOnOSD("GetKey: " + keyCode + " unic=" + eventUnicodeChar+ " arg3= " + (eventUnicodeChar& KeyCharacterMap.COMBINING_ACCENT_MASK) + " meta: " + e.getMetaState());
|
||||
//_scummvm.displayMessageOnOSD("GetKey: " + keyCode + " type=" + type + " source=" + e.getSource() + " action= " + action + " arg5= " + e.getRepeatCount());
|
||||
//Log.d(ScummVM.LOG_TAG,"GetKey: " + keyCode + " unic=" + eventUnicodeChar+ " arg3= " + (eventUnicodeChar& KeyCharacterMap.COMBINING_ACCENT_MASK) + " meta: " + e.getMetaState());
|
||||
|
||||
// look in events.cpp for how this is handled
|
||||
|
@ -158,7 +158,8 @@ enum JoystickButton {
|
||||
JOYSTICK_BUTTON_DPAD_UP,
|
||||
JOYSTICK_BUTTON_DPAD_DOWN,
|
||||
JOYSTICK_BUTTON_DPAD_LEFT,
|
||||
JOYSTICK_BUTTON_DPAD_RIGHT
|
||||
JOYSTICK_BUTTON_DPAD_RIGHT,
|
||||
JOYSTICK_BUTTON_DPAD_CENTER
|
||||
};
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user