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 da6fe7c..d20849e 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 1199a09..09d7593 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 f5bc425..a4ea37b 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; -- 2.7.4