mirror of
https://github.com/libretro/RetroArch
synced 2025-04-09 21:45:45 +00:00
Fix DRM/KMS keyboard handling
This commit is contained in:
parent
6c81007eb9
commit
ceca89e104
@ -57,6 +57,10 @@
|
|||||||
|
|
||||||
#include "../../verbosity.h"
|
#include "../../verbosity.h"
|
||||||
|
|
||||||
|
#if defined(HAVE_XKBCOMMON) && defined(HAVE_PLAIN_DRM)
|
||||||
|
#define UDEV_XKB_HANDLING
|
||||||
|
#endif
|
||||||
|
|
||||||
#define UDEV_MAX_KEYS (KEY_MAX + 7) / 8
|
#define UDEV_MAX_KEYS (KEY_MAX + 7) / 8
|
||||||
|
|
||||||
typedef struct udev_input udev_input_t;
|
typedef struct udev_input udev_input_t;
|
||||||
@ -124,13 +128,27 @@ struct udev_input
|
|||||||
int epfd;
|
int epfd;
|
||||||
udev_input_device_t **devices;
|
udev_input_device_t **devices;
|
||||||
unsigned num_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 uint8_t udev_key_state[UDEV_MAX_KEYS];
|
||||||
|
|
||||||
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
|
||||||
|
udev_input_t *udev = (udev_input_t*)data;
|
||||||
|
#endif
|
||||||
|
|
||||||
switch (event->type)
|
switch (event->type)
|
||||||
{
|
{
|
||||||
case EV_KEY:
|
case EV_KEY:
|
||||||
@ -139,6 +157,11 @@ static void udev_handle_keyboard(void *data,
|
|||||||
else
|
else
|
||||||
BIT_CLEAR(udev_key_state, event->code);
|
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_keyboard_event(event->value,
|
||||||
input_keymaps_translate_keysym_to_rk(event->code),
|
input_keymaps_translate_keysym_to_rk(event->code),
|
||||||
0, 0, RETRO_DEVICE_KEYBOARD);
|
0, 0, RETRO_DEVICE_KEYBOARD);
|
||||||
@ -155,6 +178,10 @@ static void udev_input_kb_free(void)
|
|||||||
|
|
||||||
for (i = 0; i < UDEV_MAX_KEYS; i++)
|
for (i = 0; i < UDEV_MAX_KEYS; i++)
|
||||||
udev_key_state[i] = 0;
|
udev_key_state[i] = 0;
|
||||||
|
|
||||||
|
#ifdef UDEV_XKB_HANDLING
|
||||||
|
free_xkb();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void udev_handle_touchpad(void *data,
|
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);
|
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))
|
if (!epoll_new(&udev->epfd))
|
||||||
{
|
{
|
||||||
RARCH_ERR("Failed to create epoll FD.\n");
|
RARCH_ERR("Failed to create epoll FD.\n");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user