From dc073c1ea343e626e3a3a809245308034ed86f5e Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Fri, 18 Aug 2017 15:24:51 -0400 Subject: [PATCH] wayland: fix num/caps lock handling in events 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 | 13 +++++++++++-- src/lib/elput/elput_evdev.c | 9 +++++++++ src/lib/elput/elput_private.h | 1 + 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/lib/ecore_wl2/ecore_wl2_input.c b/src/lib/ecore_wl2/ecore_wl2_input.c index da6fe7cd59..d20849eda2 100644 --- a/src/lib/ecore_wl2/ecore_wl2_input.c +++ b/src/lib/ecore_wl2/ecore_wl2_input.c @@ -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 diff --git a/src/lib/elput/elput_evdev.c b/src/lib/elput/elput_evdev.c index 1199a09798..09d75932f8 100644 --- a/src/lib/elput/elput_evdev.c +++ b/src/lib/elput/elput_evdev.c @@ -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 = diff --git a/src/lib/elput/elput_private.h b/src/lib/elput/elput_private.h index f5bc425182..a4ea37b8a1 100644 --- a/src/lib/elput/elput_private.h +++ b/src/lib/elput/elput_private.h @@ -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;