[gnumeric] GUI: Improve workaround for scrollbar bug.



commit 541ea2bf7bcb350972e43f5ab9dd59046c667a28
Author: Morten Welinder <terra gnome org>
Date:   Thu Jan 11 09:30:08 2018 -0500

    GUI: Improve workaround for scrollbar bug.
    
    This prevents an update storm.

 ChangeLog               |    6 ++++++
 NEWS                    |    1 +
 src/sheet-control-gui.c |   30 ++++++++++++++++++++++++++++--
 3 files changed, 35 insertions(+), 2 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index b844101..821dd08 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2018-01-11  Morten Welinder  <terra gnome org>
+
+       * src/sheet-control-gui.c (scg_scrollbar_config_real): Be careful
+       not to trigger an update storm when nothing changes.  Fixes
+       #792417.
+
 2018-01-01  Morten Welinder  <terra gnome org>
 
        * src/expr.c (gnm_expr_simplify_if): Remove non-working,
diff --git a/NEWS b/NEWS
index 0a2781a..75ed6d5 100644
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,7 @@ Morten:
        * Fix ISREF.
        * Some internal array formula code cleanups.
        * Fix problem with stopping a glpk solver.
+       * Improve workaround for gtk+ scrollbar bug.  [#792417]
 
 --------------------------------------------------------------------------
 Gnumeric 1.12.38
diff --git a/src/sheet-control-gui.c b/src/sheet-control-gui.c
index f56ff1d..3b76fa3 100644
--- a/src/sheet-control-gui.c
+++ b/src/sheet-control-gui.c
@@ -455,6 +455,32 @@ scg_resize_virt (SheetControl *sc, gboolean force_scroll)
        scg_resize ((SheetControlGUI *)sc, force_scroll);
 }
 
+static void
+gnm_adjustment_configure (GtkAdjustment *adjustment,
+                          gdouble        value,
+                          gdouble        lower,
+                          gdouble        upper,
+                          gdouble        step_increment,
+                          gdouble        page_increment,
+                          gdouble        page_size)
+{
+       g_object_freeze_notify (G_OBJECT (adjustment));
+
+       // These do nothing if value isn't changed
+       gtk_adjustment_set_lower (adjustment, lower);
+       gtk_adjustment_set_upper (adjustment, upper);
+       gtk_adjustment_set_step_increment (adjustment, step_increment);
+       gtk_adjustment_set_page_increment (adjustment, page_increment);
+       gtk_adjustment_set_page_size (adjustment, page_size);
+
+       g_object_thaw_notify (G_OBJECT (adjustment));
+
+       // These fire signals if nothing changes, so check by hand
+       if (!(gtk_adjustment_get_value (adjustment) == value))
+               gtk_adjustment_set_value (adjustment, value);
+
+}
+
 /**
  * scg_scrollbar_config :
  * @sc:
@@ -492,7 +518,7 @@ scg_scrollbar_config_real (SheetControl const *sc)
                        max_row = sheet->rows.max_used;
                if (max_row < sheet->max_object_extent.row)
                        max_row = sheet->max_object_extent.row;
-               gtk_adjustment_configure
+               gnm_adjustment_configure
                        (va,
                         pane->first.row,
                         sv_is_frozen (sv) ? sv->unfrozen_top_left.row : 0,
@@ -505,7 +531,7 @@ scg_scrollbar_config_real (SheetControl const *sc)
                        max_col = sheet->cols.max_used;
                if (max_col < sheet->max_object_extent.col)
                        max_col = sheet->max_object_extent.col;
-               gtk_adjustment_configure
+               gnm_adjustment_configure
                        (ha,
                         pane->first.col,
                         sv_is_frozen (sv) ? sv->unfrozen_top_left.col : 0,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]