From 1bb03e26a44a58b8971a0933bf75a2288d8ff291 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Tue, 1 Nov 2011 12:55:06 +0100 Subject: [PATCH] scrolledwindow: add another shortcut to bypass event capture When clicked again close to the previous button press location (assuming it had ~0 movement), the scrolled window wil allow the child to handle the events immediately. This is so the user doesn't have to wait to the p-a-h timeout in order to operate on the scrolledwindow child. --- gtk/gtkscrolledwindow.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c index d4915484fc..f99a266848 100644 --- a/gtk/gtkscrolledwindow.c +++ b/gtk/gtkscrolledwindow.c @@ -125,6 +125,7 @@ #define DEFAULT_SCROLLBAR_SPACING 3 #define AUTO_HIDE_SCROLLBARS_TIMEOUT 1000 +#define TOUCH_BYPASS_CAPTURED_THRESHOLD 30 /* Kinetic scrolling */ #define FPS 60 @@ -184,6 +185,9 @@ struct _GtkScrolledWindowPrivate gdouble deceleration_rate; gdouble overshoot; guint accumulated_delta; + + gdouble last_button_event_x_root; + gdouble last_button_event_y_root; }; enum { @@ -607,6 +611,8 @@ gtk_scrolled_window_init (GtkScrolledWindow *scrolled_window) priv->min_content_width = -1; priv->min_content_height = -1; priv->deceleration_rate = 1.1f; + priv->last_button_event_x_root = -TOUCH_BYPASS_CAPTURED_THRESHOLD; + priv->last_button_event_y_root = -TOUCH_BYPASS_CAPTURED_THRESHOLD; } /** @@ -2953,6 +2959,12 @@ gtk_scrolled_window_button_release_event (GtkWidget *widget, distance = gtk_scrolled_window_get_deceleration_distance (scrolled_window, event->x_root, event->y_root); gtk_scrolled_window_start_deceleration (scrolled_window, distance); + if (distance == 0) + { + priv->last_button_event_x_root = event->x_root; + priv->last_button_event_y_root = event->y_root; + } + /* Reset motion event buffer */ motion_event_list_reset (&priv->motion_events); @@ -2994,6 +3006,9 @@ gtk_scrolled_window_motion_notify_event (GtkWidget *widget, return FALSE; } + priv->last_button_event_x_root = -TOUCH_BYPASS_CAPTURED_THRESHOLD; + priv->last_button_event_y_root = -TOUCH_BYPASS_CAPTURED_THRESHOLD; + if (priv->button_press_event) { gdk_event_free (priv->button_press_event); @@ -3052,6 +3067,20 @@ gtk_scrolled_window_button_press_event (GtkWidget *widget, event = (GdkEventButton *)_event; + /* Check whether the button press is close to the previous one, + * take that as a shortcut to get the child widget handle events + */ + if (ABS (event->x_root - priv->last_button_event_x_root) < TOUCH_BYPASS_CAPTURED_THRESHOLD && + ABS (event->y_root - priv->last_button_event_y_root) < TOUCH_BYPASS_CAPTURED_THRESHOLD) + { + priv->last_button_event_x_root = -TOUCH_BYPASS_CAPTURED_THRESHOLD; + priv->last_button_event_y_root = -TOUCH_BYPASS_CAPTURED_THRESHOLD; + return FALSE; + } + + priv->last_button_event_x_root = event->x_root; + priv->last_button_event_y_root = event->y_root; + if (event->button != 1) return FALSE;