scrolledwindow: Check the event widget on captured motion events
authorCarlos Garnacho <carlosg@gnome.org>
Tue, 31 Mar 2015 11:01:34 +0000 (13:01 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Tue, 31 Mar 2015 11:18:35 +0000 (13:18 +0200)
This path is only intended to be triggered on events directed towards the
child of the scrolledwindow, so make it explicitly so. This avoids scrollbar
"over" state flashing when dragging finishes within the slider.

https://bugzilla.gnome.org/show_bug.cgi?id=746961

gtk/gtkscrolledwindow.c

index 3bfbb3b33a2421a1fdd6dd8ed3bac584d59a4bf3..cb82e92ded9b36989bd43140e620bc1836d97f8f 100644 (file)
@@ -1067,6 +1067,8 @@ captured_event_cb (GtkWidget *widget,
   GtkScrolledWindow *sw;
   GdkInputSource input_source;
   GdkDevice *source_device;
+  GtkWidget *event_widget;
+  gboolean on_scrollbar;
 
   sw = GTK_SCROLLED_WINDOW (widget);
   priv = sw->priv;
@@ -1091,7 +1093,11 @@ captured_event_cb (GtkWidget *widget,
       input_source != GDK_SOURCE_TOUCHPAD)
     return GDK_EVENT_PROPAGATE;
 
-  if (event->type == GDK_MOTION_NOTIFY)
+  event_widget = gtk_get_event_widget (event);
+  on_scrollbar = (event_widget == priv->hindicator.scrollbar ||
+                  event_widget == priv->vindicator.scrollbar);
+
+  if (event->type == GDK_MOTION_NOTIFY && !on_scrollbar)
     {
       if (priv->hscrollbar_visible)
         indicator_start_fade (&priv->hindicator, 1.0);
@@ -1118,16 +1124,12 @@ captured_event_cb (GtkWidget *widget,
             indicator_set_over (&priv->hindicator, FALSE);
         }
     }
-  else if (event->type == GDK_LEAVE_NOTIFY &&
+  else if (event->type == GDK_LEAVE_NOTIFY && on_scrollbar &&
            event->crossing.mode == GDK_CROSSING_UNGRAB)
     {
-      GtkWidget *scrollbar;
-
-      scrollbar = gtk_get_event_widget (event);
-
-      if (scrollbar == priv->hindicator.scrollbar)
+      if (event_widget == priv->hindicator.scrollbar)
         check_update_scrollbar_proximity (sw, &priv->hindicator, event);
-      else if (scrollbar == priv->vindicator.scrollbar)
+      else if (event_widget == priv->vindicator.scrollbar)
         check_update_scrollbar_proximity (sw, &priv->vindicator, event);
     }