From 8ad17d3c96a14f98e82672327a507d2cc22e037b Mon Sep 17 00:00:00 2001 From: Sung-Jin Park Date: Thu, 17 Dec 2015 15:08:08 +0900 Subject: [PATCH] Add ecore_drm_evdev_key_remap_enable/set functions to support remapping key(s) in keycode level Change-Id: If64f779e13d0b5bb4707441b7ddc36eb093df8eb --- src/lib/ecore_drm/Ecore_Drm.h | 2 + src/lib/ecore_drm/ecore_drm_evdev.c | 75 ++++++++++++++++++++++++++++++++++- src/lib/ecore_drm/ecore_drm_private.h | 3 ++ 3 files changed, 79 insertions(+), 1 deletion(-) diff --git a/src/lib/ecore_drm/Ecore_Drm.h b/src/lib/ecore_drm/Ecore_Drm.h index 694992e..ff2ee14 100644 --- a/src/lib/ecore_drm/Ecore_Drm.h +++ b/src/lib/ecore_drm/Ecore_Drm.h @@ -970,6 +970,8 @@ EAPI Eina_Bool ecore_drm_output_mode_set(Ecore_Drm_Output *output, Ecore_Drm_Out EAPI Eina_List *ecore_drm_seat_evdev_list_get(Ecore_Drm_Seat *seat); EAPI const char *ecore_drm_evdev_name_get(Ecore_Drm_Evdev *evdev); EAPI const char *ecore_drm_evdev_sysname_get(Ecore_Drm_Evdev *evdev); +EAPI Eina_Bool ecore_drm_evdev_key_remap_enable(Ecore_Drm_Evdev *edev, Eina_Bool enable); +EAPI Eina_Bool ecore_drm_evdev_key_remap_set(Ecore_Drm_Evdev *edev, int *from_keys, int *to_keys, int num); typedef void (*Ecore_Drm_VBlank_Cb)(void *data); EAPI Eina_Bool ecore_drm_output_wait_vblank(Ecore_Drm_Output *output, int interval, Ecore_Drm_VBlank_Cb func, void *data); diff --git a/src/lib/ecore_drm/ecore_drm_evdev.c b/src/lib/ecore_drm/ecore_drm_evdev.c index 28efc77..6f64b1b 100644 --- a/src/lib/ecore_drm/ecore_drm_evdev.c +++ b/src/lib/ecore_drm/ecore_drm_evdev.c @@ -280,6 +280,22 @@ _device_modifiers_update(Ecore_Drm_Evdev *edev) } +static int +_device_remapped_key_get(Ecore_Drm_Evdev *edev, int code) +{ + void *ret = NULL; + + EINA_SAFETY_ON_NULL_RETURN_VAL(edev, code); + EINA_SAFETY_ON_TRUE_RETURN_VAL(!edev->key_remap_enabled, code); + EINA_SAFETY_ON_NULL_RETURN_VAL(edev->key_remap_hash, code); + + ret = eina_hash_find(edev->key_remap_hash, &code); + + if (ret) code = (int)(intptr_t)ret; + + return code; +} + static void _device_handle_key(struct libinput_device *device, struct libinput_event_keyboard *event) { @@ -300,7 +316,8 @@ _device_handle_key(struct libinput_device *device, struct libinput_event_keyboar if (!(input = edev->seat->input)) return; timestamp = libinput_event_keyboard_get_time(event); - code = libinput_event_keyboard_get_key(event) + 8; + code = libinput_event_keyboard_get_key(event); + code = _device_remapped_key_get(edev, code) + 8; state = libinput_event_keyboard_get_key_state(event); key_count = libinput_event_keyboard_get_seat_key_count(event); @@ -876,6 +893,7 @@ _ecore_drm_evdev_device_destroy(Ecore_Drm_Evdev *edev) if (edev->path) eina_stringshare_del(edev->path); if (edev->device) libinput_device_unref(edev->device); + if (edev->key_remap_hash) eina_hash_free(edev->key_remap_hash); free(edev); } @@ -1001,3 +1019,58 @@ ecore_drm_evdev_sysname_get(Ecore_Drm_Evdev *evdev) return libinput_device_get_sysname(evdev->device); } + +EAPI Eina_Bool +ecore_drm_evdev_key_remap_enable(Ecore_Drm_Evdev *edev, Eina_Bool enable) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(edev, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(edev->device, EINA_FALSE); + + edev->key_remap_enabled = enable; + + if (enable == EINA_FALSE && edev->key_remap_hash) + { + eina_hash_free(edev->key_remap_hash); + edev->key_remap_hash = NULL; + } + + return EINA_TRUE; +} + +EAPI Eina_Bool +ecore_drm_evdev_key_remap_set(Ecore_Drm_Evdev *edev, int *from_keys, int *to_keys, int num) +{ + int i; + + EINA_SAFETY_ON_NULL_RETURN_VAL(edev, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(edev->device, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(from_keys, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(to_keys, EINA_FALSE); + EINA_SAFETY_ON_TRUE_RETURN_VAL(num <= 0, EINA_FALSE); + EINA_SAFETY_ON_TRUE_RETURN_VAL(!edev->key_remap_enabled, EINA_FALSE); + + if (edev->key_remap_hash == NULL) + edev->key_remap_hash = eina_hash_int32_new(NULL); + + if (edev->key_remap_hash == NULL) + { + ERR("Failed to set remap key information : creating a hash is failed."); + return EINA_FALSE; + } + + for (i = 0; i < num ; i++) + { + if (!from_keys[i] || !to_keys[i]) + { + ERR("Failed to set remap key information : given arguments are invalid."); + return EINA_FALSE; + } + } + + for (i = 0; i < num ; i++) + { + eina_hash_add(edev->key_remap_hash, &from_keys[i], (void *)(intptr_t)to_keys[i]); + } + + return EINA_TRUE; +} diff --git a/src/lib/ecore_drm/ecore_drm_private.h b/src/lib/ecore_drm/ecore_drm_private.h index 3ca67e2..b457b47 100644 --- a/src/lib/ecore_drm/ecore_drm_private.h +++ b/src/lib/ecore_drm/ecore_drm_private.h @@ -237,6 +237,9 @@ struct _Ecore_Drm_Evdev unsigned int depressed, latched, locked, group; } xkb; + Eina_Hash *key_remap_hash; + Eina_Bool key_remap_enabled; + /* Ecore_Drm_Evdev_Capabilities caps; */ Ecore_Drm_Seat_Capabilities seat_caps; }; -- 2.7.4