[libhandy/swipe-tracker-public: 1/16] swipe-tracker: Move some event handling to bubble stage
- From: Alexander Mikhaylenko <alexm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libhandy/swipe-tracker-public: 1/16] swipe-tracker: Move some event handling to bubble stage
- Date: Sun, 14 Jun 2020 20:44:39 +0000 (UTC)
commit 9a4fb0257cbbcee507a92b1a4ef97fade8bd6d55
Author: Alexander Mikhaylenko <alexm gnome org>
Date: Sun Jun 14 21:23:42 2020 +0500
swipe-tracker: Move some event handling to bubble stage
The reason for using capture phase at first was because we don't get stop
events on the bubble phase. However, with capture phase we also invert the
nested widget handling.
Instead, try to still get scroll stop events on the capture phase, while
handling everything else on the bubble phase.
Signed-off-by: Alexander Mikhaylenko <alexm gnome org>
src/hdy-swipe-tracker.c | 156 +++++++++++++++++++++++++++---------------------
1 file changed, 87 insertions(+), 69 deletions(-)
---
diff --git a/src/hdy-swipe-tracker.c b/src/hdy-swipe-tracker.c
index 3d4ade50..29bd8dff 100644
--- a/src/hdy-swipe-tracker.c
+++ b/src/hdy-swipe-tracker.c
@@ -7,6 +7,7 @@
#include "config.h"
#include <glib/gi18n-lib.h>
+#include "hdy-leaflet.h"
#include "hdy-swipe-tracker-private.h"
#include "hdy-navigation-direction.h"
@@ -381,8 +382,9 @@ drag_cancel_cb (HdySwipeTracker *self,
}
static gboolean
-captured_scroll_event (HdySwipeTracker *self,
- GdkEvent *event)
+handle_scroll_event (HdySwipeTracker *self,
+ GdkEvent *event,
+ gboolean capture)
{
GdkDevice *source_device;
GdkInputSource input_source;
@@ -421,15 +423,16 @@ captured_scroll_event (HdySwipeTracker *self,
if (gdk_event_is_scroll_stop_event (event))
return GDK_EVENT_PROPAGATE;
- if (is_vertical == is_delta_vertical)
- gesture_prepare (self, delta > 0 ? HDY_NAVIGATION_DIRECTION_FORWARD : HDY_NAVIGATION_DIRECTION_BACK);
- else {
+ if (is_vertical == is_delta_vertical) {
+ if (!capture)
+ gesture_prepare (self, delta > 0 ? HDY_NAVIGATION_DIRECTION_FORWARD : HDY_NAVIGATION_DIRECTION_BACK);
+ } else {
self->is_scrolling = TRUE;
return GDK_EVENT_PROPAGATE;
}
}
- if (self->state == HDY_SWIPE_TRACKER_STATE_PENDING) {
+ if (!capture && self->state == HDY_SWIPE_TRACKER_STATE_PENDING) {
gboolean is_overshooting;
gdouble first_point, last_point;
@@ -453,12 +456,85 @@ captured_scroll_event (HdySwipeTracker *self,
}
}
- if (self->state == HDY_SWIPE_TRACKER_STATE_FINISHING)
+ if (!capture && self->state == HDY_SWIPE_TRACKER_STATE_FINISHING)
reset (self);
return GDK_EVENT_PROPAGATE;
}
+static gboolean
+is_window_handle (GtkWidget *widget)
+{
+ gboolean window_dragging;
+ GtkWidget *parent, *window, *titlebar;
+
+ gtk_widget_style_get (widget, "window-dragging", &window_dragging, NULL);
+
+ if (window_dragging)
+ return TRUE;
+
+ /* Window titlebar area is always draggable, so check if we're inside. */
+ window = gtk_widget_get_toplevel (widget);
+ if (!GTK_IS_WINDOW (window))
+ return FALSE;
+
+ titlebar = gtk_window_get_titlebar (GTK_WINDOW (window));
+ if (!titlebar)
+ return FALSE;
+
+ parent = widget;
+ while (parent && parent != titlebar)
+ parent = gtk_widget_get_parent (parent);
+
+ return parent == titlebar;
+}
+
+static gboolean
+handle_event_cb (HdySwipeTracker *self,
+ GdkEvent *event)
+{
+ GdkEventSequence *sequence;
+ gboolean retval;
+ GtkEventSequenceState state;
+ GtkWidget *widget;
+
+ if (!self->enabled && self->state != HDY_SWIPE_TRACKER_STATE_SCROLLING)
+ return GDK_EVENT_PROPAGATE;
+
+ if (event->type == GDK_SCROLL)
+ return handle_scroll_event (self, event, FALSE);
+
+ if (event->type != GDK_BUTTON_PRESS &&
+ event->type != GDK_BUTTON_RELEASE &&
+ event->type != GDK_MOTION_NOTIFY &&
+ event->type != GDK_TOUCH_BEGIN &&
+ event->type != GDK_TOUCH_END &&
+ event->type != GDK_TOUCH_UPDATE &&
+ event->type != GDK_TOUCH_CANCEL)
+ return GDK_EVENT_PROPAGATE;
+
+ widget = gtk_get_event_widget (event);
+ if (is_window_handle (widget))
+ return GDK_EVENT_PROPAGATE;
+
+ sequence = gdk_event_get_event_sequence (event);
+ retval = gtk_event_controller_handle_event (GTK_EVENT_CONTROLLER (self->touch_gesture), event);
+ state = gtk_gesture_get_sequence_state (self->touch_gesture, sequence);
+
+ if (state == GTK_EVENT_SEQUENCE_DENIED) {
+ gtk_event_controller_reset (GTK_EVENT_CONTROLLER (self->touch_gesture));
+ return GDK_EVENT_PROPAGATE;
+ }
+
+ if (self->state == HDY_SWIPE_TRACKER_STATE_SCROLLING) {
+ return GDK_EVENT_STOP;
+ } else if (self->state == HDY_SWIPE_TRACKER_STATE_FINISHING) {
+ reset (self);
+ return GDK_EVENT_STOP;
+ }
+ return retval;
+}
+
static void
hdy_swipe_tracker_constructed (GObject *object)
{
@@ -484,6 +560,8 @@ hdy_swipe_tracker_constructed (GObject *object)
g_signal_connect_swapped (self->touch_gesture, "drag-end", G_CALLBACK (drag_end_cb), self);
g_signal_connect_swapped (self->touch_gesture, "cancel", G_CALLBACK (drag_cancel_cb), self);
+ g_signal_connect_object (self->swipeable, "event", G_CALLBACK (handle_event_cb), self, G_CONNECT_SWAPPED);
+
G_OBJECT_CLASS (hdy_swipe_tracker_parent_class)->constructed (object);
}
@@ -820,33 +898,6 @@ hdy_swipe_tracker_set_allow_mouse_drag (HdySwipeTracker *self,
g_object_notify_by_pspec (G_OBJECT (self), props[PROP_ALLOW_MOUSE_DRAG]);
}
-static gboolean
-is_window_handle (GtkWidget *widget)
-{
- gboolean window_dragging;
- GtkWidget *parent, *window, *titlebar;
-
- gtk_widget_style_get (widget, "window-dragging", &window_dragging, NULL);
-
- if (window_dragging)
- return TRUE;
-
- /* Window titlebar area is always draggable, so check if we're inside. */
- window = gtk_widget_get_toplevel (widget);
- if (!GTK_IS_WINDOW (window))
- return FALSE;
-
- titlebar = gtk_window_get_titlebar (GTK_WINDOW (window));
- if (!titlebar)
- return FALSE;
-
- parent = widget;
- while (parent && parent != titlebar)
- parent = gtk_widget_get_parent (parent);
-
- return parent == titlebar;
-}
-
/**
* hdy_swipe_tracker_captured_event:
* @self: a #HdySwipeTracker
@@ -863,48 +914,15 @@ gboolean
hdy_swipe_tracker_captured_event (HdySwipeTracker *self,
GdkEvent *event)
{
- GdkEventSequence *sequence;
- gboolean retval;
- GtkEventSequenceState state;
- GtkWidget *widget;
-
g_return_val_if_fail (HDY_IS_SWIPE_TRACKER (self), GDK_EVENT_PROPAGATE);
if (!self->enabled && self->state != HDY_SWIPE_TRACKER_STATE_SCROLLING)
return GDK_EVENT_PROPAGATE;
- if (event->type == GDK_SCROLL)
- return captured_scroll_event (self, event);
-
- if (event->type != GDK_BUTTON_PRESS &&
- event->type != GDK_BUTTON_RELEASE &&
- event->type != GDK_MOTION_NOTIFY &&
- event->type != GDK_TOUCH_BEGIN &&
- event->type != GDK_TOUCH_END &&
- event->type != GDK_TOUCH_UPDATE &&
- event->type != GDK_TOUCH_CANCEL)
- return GDK_EVENT_PROPAGATE;
-
- widget = gtk_get_event_widget (event);
- if (is_window_handle (widget))
+ if (event->type != GDK_SCROLL)
return GDK_EVENT_PROPAGATE;
- sequence = gdk_event_get_event_sequence (event);
- retval = gtk_event_controller_handle_event (GTK_EVENT_CONTROLLER (self->touch_gesture), event);
- state = gtk_gesture_get_sequence_state (self->touch_gesture, sequence);
-
- if (state == GTK_EVENT_SEQUENCE_DENIED) {
- gtk_event_controller_reset (GTK_EVENT_CONTROLLER (self->touch_gesture));
- return GDK_EVENT_PROPAGATE;
- }
-
- if (self->state == HDY_SWIPE_TRACKER_STATE_SCROLLING) {
- return GDK_EVENT_STOP;
- } else if (self->state == HDY_SWIPE_TRACKER_STATE_FINISHING) {
- reset (self);
- return GDK_EVENT_STOP;
- }
- return retval;
+ return handle_scroll_event (self, event, TRUE);
}
void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]