gtk,scrolledwindow: Grab only after starting drag

This is so the grab doesn't break the implicit grab on the
child widget's window, which avoids that the button press and
release are possibly sent to different windows, and after the
grab was actually broken.
This commit is contained in:
Carlos Garnacho
2011-12-05 00:17:58 +01:00
parent fafb78e38e
commit ae2438df90

View File

@@ -2503,7 +2503,6 @@ gtk_scrolled_window_release_captured_events (GtkScrolledWindow *scrolled_window)
/* Cancel the scrolling and send the button press
* event to the child widget
*/
gdk_device_ungrab (priv->drag_device, GDK_CURRENT_TIME);
gtk_device_grab_remove (GTK_WIDGET (scrolled_window), priv->drag_device);
priv->drag_device = NULL;
@@ -2547,7 +2546,6 @@ gtk_scrolled_window_button_release_event (GtkWidget *widget,
if (priv->drag_device != gdk_event_get_device (_event))
return GTK_CAPTURED_EVENT_NONE;
gdk_device_ungrab (priv->drag_device, event->time);
gtk_device_grab_remove (widget, priv->drag_device);
priv->drag_device = NULL;
@@ -2567,7 +2565,9 @@ gtk_scrolled_window_button_release_event (GtkWidget *widget,
priv->release_timeout_id = 0;
}
if (!priv->in_drag)
if (priv->in_drag)
gdk_device_ungrab (event->device, event->time);
else
{
gtk_scrolled_window_auto_hide_scrollbars_start (scrolled_window,
AUTO_HIDE_SCROLLBARS_TIMEOUT);
@@ -2649,6 +2649,14 @@ gtk_scrolled_window_motion_notify_event (GtkWidget *widget,
return GTK_CAPTURED_EVENT_HANDLED;
}
gdk_device_grab (priv->drag_device,
gtk_widget_get_window (widget),
GDK_OWNERSHIP_WINDOW,
TRUE,
GDK_BUTTON_RELEASE_MASK | GDK_BUTTON1_MOTION_MASK,
NULL,
event->time);
priv->last_button_event_x_root = -TOUCH_BYPASS_CAPTURED_THRESHOLD;
priv->last_button_event_y_root = -TOUCH_BYPASS_CAPTURED_THRESHOLD;
@@ -2770,13 +2778,6 @@ gtk_scrolled_window_button_press_event (GtkWidget *widget,
return GTK_CAPTURED_EVENT_NONE;
priv->drag_device = gdk_event_get_device (_event);
gdk_device_grab (priv->drag_device,
gtk_widget_get_window (widget),
GDK_OWNERSHIP_WINDOW,
TRUE,
GDK_BUTTON_RELEASE_MASK | GDK_BUTTON1_MOTION_MASK,
NULL,
event->time);
gtk_device_grab_add (widget, priv->drag_device, TRUE);
gtk_scrolled_window_cancel_deceleration (scrolled_window);