Add ecore_drm_evdev_key_remap_enable/set functions to support remapping key(s) in... 74/54674/1
authorSung-Jin Park <input.hacker@gmail.com>
Thu, 17 Dec 2015 06:08:08 +0000 (15:08 +0900)
committerSung-Jin Park <input.hacker@gmail.com>
Thu, 17 Dec 2015 06:08:48 +0000 (15:08 +0900)
Change-Id: If64f779e13d0b5bb4707441b7ddc36eb093df8eb

src/lib/ecore_drm/Ecore_Drm.h
src/lib/ecore_drm/ecore_drm_evdev.c
src/lib/ecore_drm/ecore_drm_private.h

index 694992e..ff2ee14 100644 (file)
@@ -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);
index 28efc77..6f64b1b 100644 (file)
@@ -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;
+}
index 3ca67e2..b457b47 100644 (file)
@@ -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;
 };