summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk/gtkscrolledwindow.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c
index bc48c6c6c7..3759c5b4b3 100644
--- a/gtk/gtkscrolledwindow.c
+++ b/gtk/gtkscrolledwindow.c
@@ -408,6 +408,10 @@ static void scrolled_window_scroll (GtkScrolledWindow *scrolled_window,
double delta_x,
double delta_y,
GtkEventControllerScroll *scroll);
+static gboolean scroll_controller_scroll (GtkEventControllerScroll *scroll,
+ double delta_x,
+ double delta_y,
+ GtkScrolledWindow *scrolled_window);
static guint signals[LAST_SIGNAL] = {0};
static GParamSpec *properties[NUM_PROPERTIES];
@@ -1229,6 +1233,19 @@ get_wheel_detent_scroll_step (GtkScrolledWindow *sw,
return scroll_step;
}
+/* Returns whether @window can currently be scrolled
+ * i.e. the scrollbars can move because the content excedes the page_size */
+static gboolean
+content_can_be_scrolled (GtkScrolledWindow *window)
+{
+ GtkAdjustment *vadj;
+ gdouble upper, page_size;
+
+ vadj = gtk_scrolled_window_get_vadjustment (window);
+ g_object_get (vadj, "upper", &upper, "page_size", &page_size, NULL);
+ return !G_APPROX_VALUE ((upper - page_size), 0.0, DBL_EPSILON);
+}
+
static gboolean
captured_scroll_cb (GtkEventControllerScroll *scroll,
double delta_x,
@@ -1246,6 +1263,12 @@ captured_scroll_cb (GtkEventControllerScroll *scroll,
return GDK_EVENT_STOP;
}
+ if (content_can_be_scrolled (scrolled_window))
+ {
+ scroll_controller_scroll (scroll, delta_x, delta_y, scrolled_window);
+ return GDK_EVENT_STOP;
+ }
+
return GDK_EVENT_PROPAGATE;
}