summaryrefslogtreecommitdiff
path: root/gdk
diff options
context:
space:
mode:
authorDan Torop <dant@pnym.net>2017-04-13 10:37:22 -0400
committerOlivier Fourdan <ofourdan@redhat.com>2017-06-02 19:13:03 +0200
commita23ad61a25404ee7e8fe5492008365b76e4b5965 (patch)
tree62cd116f13f63293691cc518639010ff6cb84efa /gdk
parent24f9d2909393b8a2267e30d3f8b6e31d6aaee850 (diff)
downloadgtk+-a23ad61a25404ee7e8fe5492008365b76e4b5965.tar.gz
wayland: selectively cancel key repeat on key release
Under Wayland, when multiple keys are pressed and the user releases a key, key repeat should continue unless the key released is the one currently repeating. In the case of: - key1 press - key1 repeat - key2 press -> key1 repeat stopped - key2 repeat - key2 release The behavior should be to cancel keyboard repeat, though key1 is still held down. This is consistent with prior X11/XWayland behavior. The following also must work: - key1 press - key2 press - key2 release - key2 press - key1 release - key2 should continue to repeat The fix for bug #778019 should continue to work: - key1 press - key1 repeat - key2 press -> key1 repeat stopped - key1 release - key2 should repeat The choice to change the counter nkeys to the flag repeat_active helps to solve the second test case. https://bugzilla.gnome.org/show_bug.cgi?id=781285
Diffstat (limited to 'gdk')
-rw-r--r--gdk/wayland/gdkdevice-wayland.c18
1 files changed, 7 insertions, 11 deletions
diff --git a/gdk/wayland/gdkdevice-wayland.c b/gdk/wayland/gdkdevice-wayland.c
index d448aa5159..41daa35829 100644
--- a/gdk/wayland/gdkdevice-wayland.c
+++ b/gdk/wayland/gdkdevice-wayland.c
@@ -227,7 +227,6 @@ struct _GdkWaylandSeat
guint32 repeat_key;
guint32 repeat_count;
gint64 repeat_deadline;
- gint32 nkeys;
GSettings *keyboard_settings;
uint32_t keyboard_time;
uint32_t keyboard_key_serial;
@@ -1870,7 +1869,7 @@ keyboard_handle_enter (void *data,
seat->keyboard_focus = wl_surface_get_user_data (surface);
g_object_ref (seat->keyboard_focus);
- seat->nkeys = 0;
+ seat->repeat_key = 0;
event = gdk_event_new (GDK_FOCUS_CHANGE);
event->focus_change.window = g_object_ref (seat->keyboard_focus);
@@ -1927,7 +1926,7 @@ keyboard_handle_leave (void *data,
g_object_unref (seat->keyboard_focus);
seat->keyboard_focus = NULL;
- seat->nkeys = 0;
+ seat->repeat_key = 0;
GDK_NOTE (EVENTS,
g_message ("focus out, seat %p surface %p",
@@ -2127,12 +2126,11 @@ deliver_key_event (GdkWaylandSeat *seat,
GDK_NOTE (EVENTS,
g_message ("keyboard %s event%s, code %d, sym %d, "
- "string %s, mods 0x%x, with %i key%s pressed",
+ "string %s, mods 0x%x",
(state ? "press" : "release"),
(from_key_repeat ? " (repeat)" : ""),
event->key.hardware_keycode, event->key.keyval,
- event->key.string, event->key.state,
- seat->nkeys, (seat->nkeys > 1 ? "s" : "")));
+ event->key.string, event->key.state));
if (!xkb_keymap_key_repeats (xkb_keymap, key))
return;
@@ -2145,16 +2143,14 @@ deliver_key_event (GdkWaylandSeat *seat,
if (state) /* Another key is pressed */
{
seat->repeat_key = key;
- seat->nkeys++;
}
- else /* a key is released */
+ else if (seat->repeat_key == key) /* Repeated key is released */
{
- /* The compositor may send us more key releases than key presses */
- seat->nkeys = MAX (0, seat->nkeys - 1);
+ seat->repeat_key = 0;
}
}
- if (seat->nkeys == 0)
+ if (!seat->repeat_key)
return;
seat->repeat_count++;