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.
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user