[gtk+] wayland: Fix up key event translation
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] wayland: Fix up key event translation
- Date: Sat, 6 Apr 2013 14:56:15 +0000 (UTC)
commit eb9ab7aad410fca19e2d6060937713a5a28648fc
Author: Matthias Clasen <mclasen redhat com>
Date: Sat Apr 6 10:40:56 2013 -0400
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 cd7e5e3..b793b92 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 a742704..2670700 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 8421043..e078952 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,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]