diff --git a/gdk/wayland/gdkdevice-wayland.c b/gdk/wayland/gdkdevice-wayland.c index cd7e5e3b65..b793b92241 100644 --- a/gdk/wayland/gdkdevice-wayland.c +++ b/gdk/wayland/gdkdevice-wayland.c @@ -1032,10 +1032,9 @@ deliver_key_event(GdkWaylandDeviceData *device, event->button.time = time; event->key.state = device->modifiers; event->key.group = 0; - event->key.hardware_keycode = sym; + event->key.hardware_keycode = key; event->key.keyval = sym; - - event->key.is_modifier = device->modifiers > 0; + event->key.is_modifier = _gdk_wayland_keymap_key_is_modifier (keymap, key); translate_keyboard_string (&event->key); diff --git a/gdk/wayland/gdkkeys-wayland.c b/gdk/wayland/gdkkeys-wayland.c index a7427045af..2670700e11 100644 --- a/gdk/wayland/gdkkeys-wayland.c +++ b/gdk/wayland/gdkkeys-wayland.c @@ -432,3 +432,23 @@ struct xkb_state *_gdk_wayland_keymap_get_xkb_state (GdkKeymap *keymap) { return GDK_WAYLAND_KEYMAP (keymap)->xkb_state; } + +gboolean +_gdk_wayland_keymap_key_is_modifier (GdkKeymap *keymap, + guint keycode) +{ + struct xkb_keymap *xkb_keymap = GDK_WAYLAND_KEYMAP (keymap)->xkb_keymap; + struct xkb_state *xkb_state; + gboolean is_modifier; + + is_modifier = FALSE; + + xkb_state = xkb_state_new (xkb_keymap); + + if (xkb_state_update_key (xkb_state, keycode, XKB_KEY_DOWN) & XKB_STATE_MODS_EFFECTIVE) + is_modifier = TRUE; + + xkb_state_unref (xkb_state); + + return is_modifier; +} diff --git a/gdk/wayland/gdkprivate-wayland.h b/gdk/wayland/gdkprivate-wayland.h index 8421043506..e078952572 100644 --- a/gdk/wayland/gdkprivate-wayland.h +++ b/gdk/wayland/gdkprivate-wayland.h @@ -55,6 +55,8 @@ void _gdk_wayland_keymap_update_from_fd (GdkKeymap *keymap, uint32_t size); struct xkb_state *_gdk_wayland_keymap_get_xkb_state (GdkKeymap *keymap); struct xkb_keymap *_gdk_wayland_keymap_get_xkb_keymap (GdkKeymap *keymap); +gboolean _gdk_wayland_keymap_key_is_modifier (GdkKeymap *keymap, + guint keycode); void _gdk_wayland_display_finalize_cursors (GdkWaylandDisplay *display); void _gdk_wayland_display_update_cursors (GdkWaylandDisplay *display,