Merge pull request #5037 from casdevel/udev-drm

Fix DRM/KMS keyboard handling
This commit is contained in:
Jean-André Santoni 2017-06-07 13:29:22 +02:00 committed by GitHub
commit 0dd2304e7c

View File

@ -57,6 +57,10 @@
#include "../../verbosity.h"
#if defined(HAVE_XKBCOMMON) && defined(HAVE_PLAIN_DRM)
#define UDEV_XKB_HANDLING
#endif
#define UDEV_MAX_KEYS (KEY_MAX + 7) / 8
typedef struct udev_input udev_input_t;
@ -124,13 +128,27 @@ struct udev_input
int epfd;
udev_input_device_t **devices;
unsigned num_devices;
#ifdef UDEV_XKB_HANDLING
bool xkb_handling;
#endif
};
#ifdef UDEV_XKB_HANDLING
int init_xkb(int fd, size_t size);
void free_xkb(void);
int handle_xkb(int code, int value);
#endif
static uint8_t udev_key_state[UDEV_MAX_KEYS];
static void udev_handle_keyboard(void *data,
const struct input_event *event, udev_input_device_t *dev)
{
#ifdef UDEV_XKB_HANDLING
udev_input_t *udev = (udev_input_t*)data;
#endif
switch (event->type)
{
case EV_KEY:
@ -139,6 +157,11 @@ static void udev_handle_keyboard(void *data,
else
BIT_CLEAR(udev_key_state, event->code);
#ifdef UDEV_XKB_HANDLING
if (udev->xkb_handling && handle_xkb(event->code, event->value) == 0)
return;
#endif
input_keyboard_event(event->value,
input_keymaps_translate_keysym_to_rk(event->code),
0, 0, RETRO_DEVICE_KEYBOARD);
@ -155,6 +178,10 @@ static void udev_input_kb_free(void)
for (i = 0; i < UDEV_MAX_KEYS; i++)
udev_key_state[i] = 0;
#ifdef UDEV_XKB_HANDLING
free_xkb();
#endif
}
static void udev_handle_touchpad(void *data,
@ -798,6 +825,15 @@ static void *udev_input_init(const char *joypad_driver)
udev_monitor_enable_receiving(udev->monitor);
}
#ifdef UDEV_XKB_HANDLING
if (init_xkb(-1, 0) == -1)
goto error;
gfx_ctx_ident_t ctx_ident;
video_context_driver_get_ident(&ctx_ident);
udev->xkb_handling = string_is_equal_fast(ctx_ident.ident, "kms", 4);
#endif
if (!epoll_new(&udev->epfd))
{
RARCH_ERR("Failed to create epoll FD.\n");