mirror of
https://github.com/libretro/RetroArch
synced 2025-04-01 04:20:27 +00:00
add support for remote control devices and other ID_INPUT_KEY devices
* the remote control presents itself as ID_INPUT_KEY, not ID_INPUT_KEYBOARD. However, ID_INPUT_KEYBOARD is a subset of ID_INPUT_KEY. * the remote control lacks the backspace and enter keys, which are hard coded in RetroArch. It has "back" and "ok" instead, so map those to RETROK_BACKSPACE and RETROK_ENTER as well. Remote controls also have no ESC key, but that one is customizable and I used the Power key of the remote (which already has a mapping to RETROK_POWER). The functionality provided is really the bare minimum, but it is enough to teach a kid "press the power button here to watch TV"; compared to pressing L1+R1+START+SELECT and navigating to the RetroArch's "quit" menu item, that hopefully has more chances of success.
This commit is contained in:
parent
b4b3887a1a
commit
d1dc2e9670
@ -140,28 +140,46 @@ int handle_xkb(int code, int value);
|
|||||||
|
|
||||||
static uint8_t udev_key_state[UDEV_MAX_KEYS];
|
static uint8_t udev_key_state[UDEV_MAX_KEYS];
|
||||||
|
|
||||||
|
static unsigned input_unify_ev_key_code(unsigned code)
|
||||||
|
{
|
||||||
|
/* input_keymaps_translate_keysym_to_rk does not support the case
|
||||||
|
where multiple keysyms translate to the same RETROK_* code,
|
||||||
|
so unify remote control keysyms to keyboard keysyms here. */
|
||||||
|
switch (code)
|
||||||
|
{
|
||||||
|
case KEY_OK:
|
||||||
|
return KEY_ENTER;
|
||||||
|
case KEY_BACK:
|
||||||
|
return KEY_BACKSPACE;
|
||||||
|
default:
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void udev_handle_keyboard(void *data,
|
static void udev_handle_keyboard(void *data,
|
||||||
const struct input_event *event, udev_input_device_t *dev)
|
const struct input_event *event, udev_input_device_t *dev)
|
||||||
{
|
{
|
||||||
#ifdef UDEV_XKB_HANDLING
|
#ifdef UDEV_XKB_HANDLING
|
||||||
udev_input_t *udev = (udev_input_t*)data;
|
udev_input_t *udev = (udev_input_t*)data;
|
||||||
#endif
|
#endif
|
||||||
|
unsigned keysym;
|
||||||
|
|
||||||
switch (event->type)
|
switch (event->type)
|
||||||
{
|
{
|
||||||
case EV_KEY:
|
case EV_KEY:
|
||||||
|
keysym = input_unify_ev_key_code(event->code);
|
||||||
if (event->value)
|
if (event->value)
|
||||||
BIT_SET(udev_key_state, event->code);
|
BIT_SET(udev_key_state, keysym);
|
||||||
else
|
else
|
||||||
BIT_CLEAR(udev_key_state, event->code);
|
BIT_CLEAR(udev_key_state, keysym);
|
||||||
|
|
||||||
#ifdef UDEV_XKB_HANDLING
|
#ifdef UDEV_XKB_HANDLING
|
||||||
if (udev->xkb_handling && handle_xkb(event->code, event->value) == 0)
|
if (udev->xkb_handling && handle_xkb(keysym, event->value) == 0)
|
||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
input_keyboard_event(event->value,
|
input_keyboard_event(event->value,
|
||||||
input_keymaps_translate_keysym_to_rk(event->code),
|
input_keymaps_translate_keysym_to_rk(keysym),
|
||||||
0, 0, RETRO_DEVICE_KEYBOARD);
|
0, 0, RETRO_DEVICE_KEYBOARD);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -392,7 +410,7 @@ static void udev_input_handle_hotplug(udev_input_t *udev)
|
|||||||
{
|
{
|
||||||
device_handle_cb cb;
|
device_handle_cb cb;
|
||||||
enum udev_input_dev_type dev_type = UDEV_INPUT_KEYBOARD;
|
enum udev_input_dev_type dev_type = UDEV_INPUT_KEYBOARD;
|
||||||
const char *val_keyboard = NULL;
|
const char *val_key = NULL;
|
||||||
const char *val_mouse = NULL;
|
const char *val_mouse = NULL;
|
||||||
const char *val_touchpad = NULL;
|
const char *val_touchpad = NULL;
|
||||||
const char *action = NULL;
|
const char *action = NULL;
|
||||||
@ -403,14 +421,15 @@ static void udev_input_handle_hotplug(udev_input_t *udev)
|
|||||||
if (!dev)
|
if (!dev)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
val_keyboard = udev_device_get_property_value(dev, "ID_INPUT_KEYBOARD");
|
val_key = udev_device_get_property_value(dev, "ID_INPUT_KEY");
|
||||||
val_mouse = udev_device_get_property_value(dev, "ID_INPUT_MOUSE");
|
val_mouse = udev_device_get_property_value(dev, "ID_INPUT_MOUSE");
|
||||||
val_touchpad = udev_device_get_property_value(dev, "ID_INPUT_TOUCHPAD");
|
val_touchpad = udev_device_get_property_value(dev, "ID_INPUT_TOUCHPAD");
|
||||||
action = udev_device_get_action(dev);
|
action = udev_device_get_action(dev);
|
||||||
devnode = udev_device_get_devnode(dev);
|
devnode = udev_device_get_devnode(dev);
|
||||||
|
|
||||||
if (val_keyboard && string_is_equal_fast(val_keyboard, "1", 1) && devnode)
|
if (val_key && string_is_equal_fast(val_key, "1", 1) && devnode)
|
||||||
{
|
{
|
||||||
|
/* EV_KEY device, can be a keyboard or a remote control device. */
|
||||||
dev_type = UDEV_INPUT_KEYBOARD;
|
dev_type = UDEV_INPUT_KEYBOARD;
|
||||||
cb = udev_handle_keyboard;
|
cb = udev_handle_keyboard;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user