wayland: fix num/caps lock handling in events
authorMike Blumenkrantz <zmike@osg.samsung.com>
Fri, 18 Aug 2017 19:24:51 +0000 (15:24 -0400)
committerMike Blumenkrantz <zmike@osg.samsung.com>
Fri, 18 Aug 2017 19:24:37 +0000 (15:24 -0400)
locks are not the same as modifiers, and the corresponding event flag must
be set based on whichever value(s) are set instead of yolo mixing and matching

@fix

ref T5737

src/lib/ecore_wl2/ecore_wl2_input.c
src/lib/elput/elput_evdev.c
src/lib/elput/elput_private.h

index da6fe7c..d20849e 100644 (file)
@@ -1152,14 +1152,23 @@ _keyboard_cb_modifiers(void *data, struct wl_keyboard *keyboard EINA_UNUSED, uns
      input->keyboard.modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
    if (mask & input->xkb.win_mask)
      input->keyboard.modifiers |= ECORE_EVENT_MODIFIER_WIN;
+   if (mask & input->xkb.altgr_mask)
+     input->keyboard.modifiers |= ECORE_EVENT_MODIFIER_ALTGR;
+   if (mask & input->xkb.scroll_mask)
+     input->keyboard.modifiers |= ECORE_EVENT_MODIFIER_SCROLL;
+   if (mask & input->xkb.num_mask)
+     input->keyboard.modifiers |= ECORE_EVENT_MODIFIER_NUM;
+   if (mask & input->xkb.caps_mask)
+     input->keyboard.modifiers |= ECORE_EVENT_MODIFIER_CAPS;
+
+
+   mask = xkb_state_serialize_mods(input->xkb.state, XKB_STATE_MODS_LOCKED);
    if (mask & input->xkb.scroll_mask)
      input->keyboard.modifiers |= ECORE_EVENT_LOCK_SCROLL;
    if (mask & input->xkb.num_mask)
      input->keyboard.modifiers |= ECORE_EVENT_LOCK_NUM;
    if (mask & input->xkb.caps_mask)
      input->keyboard.modifiers |= ECORE_EVENT_LOCK_CAPS;
-   if (mask & input->xkb.altgr_mask)
-     input->keyboard.modifiers |= ECORE_EVENT_MODIFIER_ALTGR;
 }
 
 static void
index 1199a09..09d7593 100644 (file)
@@ -82,6 +82,13 @@ _keyboard_modifiers_update(Elput_Keyboard *kbd, Elput_Seat *seat)
      seat->modifiers |= ECORE_EVENT_MODIFIER_ALTGR;
    if (mask & kbd->info->mods.caps)
      seat->modifiers |= ECORE_EVENT_MODIFIER_CAPS;
+   if (mask & kbd->info->mods.num)
+     seat->modifiers |= ECORE_EVENT_MODIFIER_NUM;
+
+   if (kbd->mods.locked & kbd->info->mods.caps)
+     seat->modifiers |= ECORE_EVENT_LOCK_CAPS;
+   if (kbd->mods.locked & kbd->info->mods.num)
+     seat->modifiers |= ECORE_EVENT_LOCK_NUM;
 
    if (xkb_state_led_index_is_active(kbd->state, kbd->info->leds.num))
      leds |= ELPUT_LED_NUM;
@@ -121,6 +128,8 @@ _keyboard_info_create(struct xkb_keymap *keymap)
      1 << xkb_keymap_mod_get_index(info->keymap.map, XKB_MOD_NAME_SHIFT);
    info->mods.caps =
      1 << xkb_keymap_mod_get_index(info->keymap.map, XKB_MOD_NAME_CAPS);
+   info->mods.num =
+     1 << xkb_keymap_mod_get_index(info->keymap.map, "Mod2");
    info->mods.ctrl =
      1 << xkb_keymap_mod_get_index(info->keymap.map, XKB_MOD_NAME_CTRL);
    info->mods.alt =
index f5bc425..a4ea37b 100644 (file)
@@ -106,6 +106,7 @@ typedef struct _Elput_Keyboard_Info
      {
         xkb_mod_index_t shift;
         xkb_mod_index_t caps;
+        xkb_mod_index_t num;
         xkb_mod_index_t ctrl;
         xkb_mod_index_t alt;
         xkb_mod_index_t altgr;