summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Natterer <mitch@gimp.org>2018-06-11 18:36:50 +0200
committerMichael Natterer <mitch@gimp.org>2018-06-12 18:53:12 +0200
commitc0ba041c73214f82d2c32b2ca1fa8f3c388c6170 (patch)
tree5846a7db0a47ccab783df2cfcab9158921dff69a
parent2c8b95a518bea2192145efe11219f2e36091b37a (diff)
downloadgtk+-c0ba041c73214f82d2c32b2ca1fa8f3c388c6170.tar.gz
gtk: fix wheel scrolling for very small adjustment page_size
For very small page sizes of < 1.0, the effect of pow() is the opposite of what's intended and the scroll steps become unusably large, make sure we never get a scroll_unit larger than page_size / 2.0, which used to be the default before the pow() magic was introduced.
-rw-r--r--gtk/gtkrange.c12
-rw-r--r--gtk/gtkscrolledwindow.c6
2 files changed, 16 insertions, 2 deletions
diff --git a/gtk/gtkrange.c b/gtk/gtkrange.c
index dc495631cb..c106102929 100644
--- a/gtk/gtkrange.c
+++ b/gtk/gtkrange.c
@@ -3061,7 +3061,17 @@ _gtk_range_get_wheel_delta (GtkRange *range,
page_increment = gtk_adjustment_get_page_increment (adjustment);
if (GTK_IS_SCROLLBAR (range))
- scroll_unit = pow (page_size, 2.0 / 3.0);
+ {
+ gdouble pow_unit = pow (page_size, 2.0 / 3.0);
+
+ /* for very small page sizes of < 1.0, the effect of pow() is
+ * the opposite of what's intended and the scroll steps become
+ * unusably large, make sure we never get a scroll_unit larger
+ * than page_size / 2.0, which used to be the default before the
+ * pow() magic was introduced.
+ */
+ scroll_unit = MIN (pow_unit, page_size / 2.0);
+ }
else
scroll_unit = page_increment;
diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c
index 8112cfd8e3..b390f9d42e 100644
--- a/gtk/gtkscrolledwindow.c
+++ b/gtk/gtkscrolledwindow.c
@@ -1296,6 +1296,7 @@ get_scroll_unit (GtkScrolledWindow *sw,
GtkRange *scrollbar;
GtkAdjustment *adj;
gdouble page_size;
+ gdouble pow_unit;
if (orientation == GTK_ORIENTATION_HORIZONTAL)
scrollbar = GTK_RANGE (priv->hscrollbar);
@@ -1307,7 +1308,10 @@ get_scroll_unit (GtkScrolledWindow *sw,
adj = gtk_range_get_adjustment (scrollbar);
page_size = gtk_adjustment_get_page_size (adj);
- scroll_unit = pow (page_size, 2.0 / 3.0);
+
+ /* see comment in _gtk_range_get_wheel_delta() */
+ pow_unit = pow (page_size, 2.0 / 3.0);
+ scroll_unit = MIN (pow_unit, page_size / 2.0);
#else
scroll_unit = 1;
#endif