From eb9ab7aad410fca19e2d6060937713a5a28648fc Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 6 Apr 2013 10:40:56 -0400 Subject: [PATCH] wayland: Fix up key event translation The is_modifier field is supposed to be set if the key would act as a modifier, not if any modifiers are currently active. To fix this, introduce a private _gdk_wayland_keymap_key_is_modifier function. At the same time, make the hardware_keycode field in key events actually contain the hardware keycode, not a copy of the keyval. --- gdk/wayland/gdkdevice-wayland.c | 5 ++--- gdk/wayland/gdkkeys-wayland.c | 20 ++++++++++++++++++++ gdk/wayland/gdkprivate-wayland.h | 2 ++ 3 files changed, 24 insertions(+), 3 deletions(-) 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,