From 0057c80b2eade491f2057d1a6cad25782f219c2f Mon Sep 17 00:00:00 2001 From: David Boddie Date: Fri, 2 Aug 2019 15:31:18 +0000 Subject: [PATCH] Release pressed keys when dragging outside the keyboard If no keys are under the touch position when dragging then release all existing pressed keys. This fixes the problem where the last pressed key causes events to be sent while the touch position moves outside the keyboard extent. --- eek/eek-gtk-keyboard.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/eek/eek-gtk-keyboard.c b/eek/eek-gtk-keyboard.c index 135f0e96..c7d1a75d 100644 --- a/eek/eek-gtk-keyboard.c +++ b/eek/eek-gtk-keyboard.c @@ -174,16 +174,17 @@ static void drag(EekGtkKeyboard *self, gdouble x, gdouble y, guint32 time) { EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self); EekKey *key = eek_renderer_find_key_by_position (priv->renderer, x, y); + GList *list, *head; + + list = eek_keyboard_get_pressed_keys (priv->keyboard); if (key) { - GList *list, *head; gboolean found = FALSE; - list = eek_keyboard_get_pressed_keys (priv->keyboard); for (head = list; head; head = g_list_next (head)) { - if (head->data == key) + if (head->data == key) { found = TRUE; - else { + } else { eek_keyboard_release_key(priv->keyboard, EEK_KEY(head->data), time); on_key_released(key, self); } @@ -194,6 +195,12 @@ static void drag(EekGtkKeyboard *self, eek_keyboard_press_key(priv->keyboard, key, time); on_key_pressed(key, self); } + } else { + for (head = list; head; head = g_list_next (head)) { + eek_keyboard_release_key(priv->keyboard, EEK_KEY(head->data), time); + on_key_released(key, self); + } + g_list_free (list); } }