From 087da5cd9e96b15baac0bbfa6082c742cf36f593 Mon Sep 17 00:00:00 2001 From: David Boddie Date: Thu, 22 Aug 2019 17:13:25 +0200 Subject: [PATCH 1/3] Enable and respond to all touch events --- eek/eek-gtk-keyboard.c | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/eek/eek-gtk-keyboard.c b/eek/eek-gtk-keyboard.c index be018573..ac0a0af6 100644 --- a/eek/eek-gtk-keyboard.c +++ b/eek/eek-gtk-keyboard.c @@ -55,8 +55,6 @@ typedef struct _EekGtkKeyboardPrivate LevelKeyboard *keyboard; GtkCssProvider *css_provider; GtkStyleContext *scontext; - - GdkEventSequence *sequence; // unowned reference } EekGtkKeyboardPrivate; G_DEFINE_TYPE_WITH_PRIVATE (EekGtkKeyboard, eek_gtk_keyboard, GTK_TYPE_DRAWING_AREA) @@ -81,7 +79,8 @@ eek_gtk_keyboard_real_realize (GtkWidget *self) GDK_KEY_RELEASE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | - GDK_BUTTON_MOTION_MASK); + GDK_BUTTON_MOTION_MASK | + GDK_TOUCH_MASK); GTK_WIDGET_CLASS (eek_gtk_keyboard_parent_class)->realize (self); } @@ -253,26 +252,16 @@ handle_touch_event (GtkWidget *widget, EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self); if (event->type == GDK_TOUCH_BEGIN) { - if (priv->sequence) { - // Ignore second and following touch points - return FALSE; - } - priv->sequence = event->sequence; depress(self, event->x, event->y, event->time); return TRUE; } - if (priv->sequence != event->sequence) { - return FALSE; - } - if (event->type == GDK_TOUCH_UPDATE) { drag(self, event->x, event->y, event->time); } if (event->type == GDK_TOUCH_END || event->type == GDK_TOUCH_CANCEL) { // TODO: can the event have different coords than the previous update event? release(self, event->time); - priv->sequence = NULL; } return TRUE; } From e61a3a6fe81d2d159be599179620fc58cc9c8a0d Mon Sep 17 00:00:00 2001 From: David Boddie Date: Mon, 26 Aug 2019 21:13:04 +0000 Subject: [PATCH 2/3] Remove unnecessary assignment --- eek/eek-gtk-keyboard.c | 1 - 1 file changed, 1 deletion(-) diff --git a/eek/eek-gtk-keyboard.c b/eek/eek-gtk-keyboard.c index ac0a0af6..fb88a649 100644 --- a/eek/eek-gtk-keyboard.c +++ b/eek/eek-gtk-keyboard.c @@ -249,7 +249,6 @@ handle_touch_event (GtkWidget *widget, GdkEventTouch *event) { EekGtkKeyboard *self = EEK_GTK_KEYBOARD (widget); - EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self); if (event->type == GDK_TOUCH_BEGIN) { depress(self, event->x, event->y, event->time); From b9ab4288d78df725055addd1aed7fb8ebc4e6c6f Mon Sep 17 00:00:00 2001 From: David Boddie Date: Wed, 28 Aug 2019 15:53:57 +0000 Subject: [PATCH 3/3] Try releasing old touches and only letting new ones be dragged --- eek/eek-gtk-keyboard.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/eek/eek-gtk-keyboard.c b/eek/eek-gtk-keyboard.c index fb88a649..f1d84ee4 100644 --- a/eek/eek-gtk-keyboard.c +++ b/eek/eek-gtk-keyboard.c @@ -55,6 +55,8 @@ typedef struct _EekGtkKeyboardPrivate LevelKeyboard *keyboard; GtkCssProvider *css_provider; GtkStyleContext *scontext; + + GdkEventSequence *sequence; // unowned reference } EekGtkKeyboardPrivate; G_DEFINE_TYPE_WITH_PRIVATE (EekGtkKeyboard, eek_gtk_keyboard, GTK_TYPE_DRAWING_AREA) @@ -249,18 +251,29 @@ handle_touch_event (GtkWidget *widget, GdkEventTouch *event) { EekGtkKeyboard *self = EEK_GTK_KEYBOARD (widget); + EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self); + /* For each new touch, release the previous one and record the new event + sequence. */ if (event->type == GDK_TOUCH_BEGIN) { + release(self, event->time); + priv->sequence = event->sequence; depress(self, event->x, event->y, event->time); return TRUE; } - if (event->type == GDK_TOUCH_UPDATE) { + /* Only allow the latest touch point to be dragged. */ + if (event->type == GDK_TOUCH_UPDATE && event->sequence == priv->sequence) { drag(self, event->x, event->y, event->time); } - if (event->type == GDK_TOUCH_END || event->type == GDK_TOUCH_CANCEL) { + else if (event->type == GDK_TOUCH_END || event->type == GDK_TOUCH_CANCEL) { // TODO: can the event have different coords than the previous update event? - release(self, event->time); + /* Only respond to the release of the latest touch point. Previous + touches have already been released. */ + if (event->sequence == priv->sequence) { + release(self, event->time); + priv->sequence = NULL; + } } return TRUE; }