[libhandy/swipe-area] swipe-tracker: Don't discard swipes that start outside swipe area
- From: Alexander Mikhaylenko <alexm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libhandy/swipe-area] swipe-tracker: Don't discard swipes that start outside swipe area
- Date: Mon, 8 Mar 2021 13:01:11 +0000 (UTC)
commit dee1607ae4048e6a9f6cd555cf520cb03863516d
Author: Alexander Mikhaylenko <alexm gnome org>
Date: Mon Mar 8 03:28:35 2021 +0500
swipe-tracker: Don't discard swipes that start outside swipe area
While this makes perfect sense for touchpad, on touch it's useful to be
able to start a swipe outside the swipe area and move the finger over to
the swipe area.
This should make swipes more responsive in HdyFlap.
src/hdy-swipe-tracker.c | 61 ++++++++++++++++++++++++++++---------------------
1 file changed, 35 insertions(+), 26 deletions(-)
---
diff --git a/src/hdy-swipe-tracker.c b/src/hdy-swipe-tracker.c
index 1a2ff1dc..1b10d36a 100644
--- a/src/hdy-swipe-tracker.c
+++ b/src/hdy-swipe-tracker.c
@@ -74,8 +74,6 @@ struct _HdySwipeTracker
GArray *event_history;
- gint start_x;
- gint start_y;
gboolean use_capture_phase;
gdouble initial_progress;
@@ -168,8 +166,6 @@ reset (HdySwipeTracker *self)
g_array_remove_range (self->event_history, 0, self->event_history->len);
- self->start_x = 0;
- self->start_y = 0;
self->use_capture_phase = FALSE;
self->cancelled = FALSE;
@@ -194,25 +190,11 @@ get_range (HdySwipeTracker *self,
static void
gesture_prepare (HdySwipeTracker *self,
- HdyNavigationDirection direction,
- gboolean is_drag)
+ HdyNavigationDirection direction)
{
- GdkRectangle rect;
-
if (self->state != HDY_SWIPE_TRACKER_STATE_NONE)
return;
- hdy_swipeable_get_swipe_area (self->swipeable, direction, is_drag, &rect);
-
- if (self->start_x < rect.x ||
- self->start_x >= rect.x + rect.width ||
- self->start_y < rect.y ||
- self->start_y >= rect.y + rect.height) {
- self->state = HDY_SWIPE_TRACKER_STATE_REJECTED;
-
- return;
- }
-
hdy_swipe_tracker_emit_begin_swipe (self, direction, TRUE);
self->initial_progress = hdy_swipeable_get_progress (self->swipeable);
@@ -498,6 +480,21 @@ gesture_cancel (HdySwipeTracker *self,
gesture_end (self, distance, is_touchpad);
}
+static inline gboolean
+is_in_swipe_area (HdySwipeTracker *self,
+ gdouble x,
+ gdouble y,
+ HdyNavigationDirection direction,
+ gboolean is_drag)
+{
+ GdkRectangle rect;
+
+ hdy_swipeable_get_swipe_area (self->swipeable, direction, is_drag, &rect);
+
+ return x >= rect.x && x < rect.x + rect.width &&
+ y >= rect.y && y < rect.y + rect.height;
+}
+
static void
drag_begin_cb (HdySwipeTracker *self,
gdouble start_x,
@@ -506,9 +503,6 @@ drag_begin_cb (HdySwipeTracker *self,
{
if (self->state != HDY_SWIPE_TRACKER_STATE_NONE)
gtk_gesture_set_state (self->touch_gesture, GTK_EVENT_SEQUENCE_DENIED);
-
- self->start_x = start_x;
- self->start_y = start_y;
}
static void
@@ -542,7 +536,7 @@ drag_update_cb (HdySwipeTracker *self,
if (self->state == HDY_SWIPE_TRACKER_STATE_NONE) {
if (is_vertical == is_offset_vertical)
- gesture_prepare (self, offset > 0 ? HDY_NAVIGATION_DIRECTION_FORWARD : HDY_NAVIGATION_DIRECTION_BACK,
TRUE);
+ gesture_prepare (self, offset > 0 ? HDY_NAVIGATION_DIRECTION_FORWARD : HDY_NAVIGATION_DIRECTION_BACK);
else
gtk_gesture_set_state (self->touch_gesture, GTK_EVENT_SEQUENCE_DENIED);
return;
@@ -560,6 +554,16 @@ drag_update_cb (HdySwipeTracker *self,
(offset > 0 && self->progress >= last_point);
if (drag_distance >= DRAG_THRESHOLD_DISTANCE) {
+ gdouble start_x, start_y;
+ HdyNavigationDirection direction;
+
+ gtk_gesture_drag_get_start_point (gesture, &start_x, &start_y);
+ direction = offset > 0 ? HDY_NAVIGATION_DIRECTION_FORWARD : HDY_NAVIGATION_DIRECTION_BACK;
+
+ if (!is_in_swipe_area (self, start_x, start_y, direction, TRUE) &&
+ !is_in_swipe_area (self, start_x + offset_x, start_y + offset_y, direction, TRUE))
+ return;
+
if ((is_vertical == is_offset_vertical) && !is_overshooting) {
gesture_begin (self);
self->prev_offset = offset;
@@ -665,13 +669,18 @@ handle_scroll_event (HdySwipeTracker *self,
if (is_vertical == is_delta_vertical) {
if (!capture) {
gdouble event_x, event_y;
+ HdyNavigationDirection direction;
get_widget_coordinates (self, event, &event_x, &event_y);
- self->start_x = (gint) round (event_x);
- self->start_y = (gint) round (event_y);
+ direction = delta > 0 ? HDY_NAVIGATION_DIRECTION_FORWARD : HDY_NAVIGATION_DIRECTION_BACK;
+
+ if (!is_in_swipe_area (self, event_x, event_y, direction, FALSE)) {
+ self->state = HDY_SWIPE_TRACKER_STATE_REJECTED;
+ return GDK_EVENT_PROPAGATE;
+ }
- gesture_prepare (self, delta > 0 ? HDY_NAVIGATION_DIRECTION_FORWARD : HDY_NAVIGATION_DIRECTION_BACK,
FALSE);
+ gesture_prepare (self, delta > 0 ? HDY_NAVIGATION_DIRECTION_FORWARD : HDY_NAVIGATION_DIRECTION_BACK);
}
} else {
self->is_scrolling = TRUE;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]