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);
}
+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)
{
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);
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);
}
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;
+}