File 4405.diff of Package gtk3

diff --git a/gtk/gtkcombobox.c b/gtk/gtkcombobox.c
index ef4996c0273ca8f298eda82569908d50e16eb837..57fbbd6e0cb5293b4737ceaae268271b918c2fec 100644
--- a/gtk/gtkcombobox.c
+++ b/gtk/gtkcombobox.c
@@ -2707,8 +2707,12 @@ gtk_combo_box_scroll_event (GtkWidget          *widget,
   GtkTreeIter iter;
   GtkTreeIter new_iter;
 
+  /* Scrolling the parent window/container takes precedence - Issue #3092 */
+  if (gtk_widget_inside_scrollable_container (widget))
+    return GDK_EVENT_PROPAGATE;
+
   if (!gtk_combo_box_get_active_iter (combo_box, &iter))
-    return TRUE;
+    return GDK_EVENT_STOP;
 
   if (event->direction == GDK_SCROLL_UP)
     found = tree_prev (combo_box, priv->model,
@@ -2720,7 +2724,7 @@ gtk_combo_box_scroll_event (GtkWidget          *widget,
   if (found)
     gtk_combo_box_set_active_iter (combo_box, &new_iter);
 
-  return TRUE;
+  return GDK_EVENT_STOP;
 }
 
 /*
diff --git a/gtk/gtkrange.c b/gtk/gtkrange.c
index 774174df52bf2bfe9a9eac033a166b793900be84..826e6c4aac684c880a77b7c5aa454c966683f9cd 100644
--- a/gtk/gtkrange.c
+++ b/gtk/gtkrange.c
@@ -3118,6 +3118,11 @@ gtk_range_scroll_event (GtkWidget      *widget,
   GtkRange *range = GTK_RANGE (widget);
   GtkRangePrivate *priv = range->priv;
   double delta = _gtk_range_get_wheel_delta (range, event);
+
+  /* Scrolling the parent window/container takes precedence - Issue #3092 */
+  if (gtk_widget_inside_scrollable_container (widget))
+    return GDK_EVENT_PROPAGATE;
+
   gboolean handled;
 
   g_signal_emit (range, signals[CHANGE_VALUE], 0,
diff --git a/gtk/gtkspinbutton.c b/gtk/gtkspinbutton.c
index 8e65d8a272cbbd1d39532b3cda48fe91aaa2dca2..878e8c2354ee71f3fffc74b9935bdb85fd1721f8 100644
--- a/gtk/gtkspinbutton.c
+++ b/gtk/gtkspinbutton.c
@@ -1335,6 +1335,10 @@ gtk_spin_button_scroll (GtkWidget      *widget,
   GtkSpinButton *spin = GTK_SPIN_BUTTON (widget);
   GtkSpinButtonPrivate *priv = spin->priv;
 
+  /* Scrolling the parent window/container takes precedence - Issue #3092 */
+  if (gtk_widget_inside_scrollable_container (widget))
+    return GDK_EVENT_PROPAGATE;
+
   if (event->direction == GDK_SCROLL_UP)
     {
       if (!gtk_widget_has_focus (widget))
@@ -1348,9 +1352,9 @@ gtk_spin_button_scroll (GtkWidget      *widget,
       gtk_spin_button_real_spin (spin, -gtk_adjustment_get_step_increment (priv->adjustment));
     }
   else
-    return FALSE;
+    return GDK_EVENT_PROPAGATE;
 
-  return TRUE;
+  return GDK_EVENT_STOP;
 }
 
 static gboolean
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index b6e00115bbdc1ea282f366e781fc2f3102ec3e96..f4b14de0ae2b4f3ad1930f3c189d2fa23f4d8df8 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -11661,6 +11661,36 @@ gtk_widget_get_ancestor (GtkWidget *widget,
   return widget;
 }
 
+/*< private >
+ * gtk_widget_inside_scrollable_container:
+ * @widget: a #GtkWidget
+ *
+ * Private function used by GtkComboBox, GtkRange, GtkSpinButton - See issue #3092
+ *
+ * Returns: whether @widget is inside a scrollable container (like eg.
+ * GtkScrolledWindow, GtkViewPort) and the view can currently be scrolled
+ * i.e. the scrollbars can move because the content excedes the page_size
+ */
+gboolean
+gtk_widget_inside_scrollable_container (GtkWidget *widget)
+{
+  GtkWidget *ancestor;
+  GtkAdjustment *vadj;
+  gdouble upper, page_size;
+
+  ancestor = gtk_widget_get_ancestor (gtk_widget_get_parent (widget), GTK_TYPE_SCROLLABLE);
+  if (ancestor)
+    {
+      vadj = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (ancestor));
+      g_object_get (vadj, "upper", &upper, "page_size", &page_size, NULL);
+
+      if (!G_APPROX_VALUE ((upper - page_size), 0.0, DBL_EPSILON))
+        return TRUE;
+    }
+
+  return FALSE;
+}
+
 /**
  * gtk_widget_set_visual:
  * @widget: a #GtkWidget
diff --git a/gtk/gtkwidgetprivate.h b/gtk/gtkwidgetprivate.h
index 1b7ddf2ff0843ff200f9caad9b48a128c9210ad1..722d8f7e1cd2c2d7104caa6c2ad5d450e282041e 100644
--- a/gtk/gtkwidgetprivate.h
+++ b/gtk/gtkwidgetprivate.h
@@ -282,6 +282,7 @@ GList *           _gtk_widget_list_controllers             (GtkWidget
                                                             GtkPropagationPhase  phase);
 gboolean          _gtk_widget_consumes_motion              (GtkWidget           *widget,
                                                             GdkEventSequence    *sequence);
+gboolean          gtk_widget_inside_scrollable_container   (GtkWidget *widget);
 
 gboolean          gtk_widget_has_tick_callback             (GtkWidget *widget);
 
openSUSE Build Service is sponsored by