From 3ecf89ac7f5371f27da3ca0a25d51568d36f877a Mon Sep 17 00:00:00 2001 From: John Darrington Date: Thu, 5 Jul 2012 23:17:48 +0200 Subject: [PATCH 07/11] Reduce the flicker when redrawing the toolbar and menubar. --- src/ui/gui/pspp-sheet-view.c | 28 +++++++++++++++------------- src/ui/gui/psppire-data-editor.c | 8 +++++++- src/ui/gui/psppire-data-editor.h | 1 + src/ui/gui/psppire-data-window.c | 6 ------ 4 files changed, 23 insertions(+), 20 deletions(-) diff --git a/src/ui/gui/pspp-sheet-view.c b/src/ui/gui/pspp-sheet-view.c index 8cf4756..51ceafc 100644 --- a/src/ui/gui/pspp-sheet-view.c +++ b/src/ui/gui/pspp-sheet-view.c @@ -1276,18 +1276,6 @@ pspp_sheet_view_finalize (GObject *object) tree_view->priv->selected = NULL; } - if (tree_view->priv->columns != NULL) - { - list = tree_view->priv->columns; - while (list) - { - PsppSheetViewColumn *column; - column = PSPP_SHEET_VIEW_COLUMN (list->data); - list = list->next; - pspp_sheet_view_remove_column (tree_view, column); - } - tree_view->priv->columns = NULL; - } tree_view->priv->prelight_node = -1; @@ -1595,6 +1583,19 @@ pspp_sheet_view_unrealize (GtkWidget *widget) for (x = 0 ; x < 5 ; ++x) g_object_unref (priv->grid_line_gc[x]); + if (tree_view->priv->columns != NULL) + { + list = tree_view->priv->columns; + while (list) + { + PsppSheetViewColumn *column; + column = PSPP_SHEET_VIEW_COLUMN (list->data); + list = list->next; + pspp_sheet_view_remove_column (tree_view, column); + } + tree_view->priv->columns = NULL; + } + GTK_WIDGET_CLASS (pspp_sheet_view_parent_class)->unrealize (widget); } @@ -9233,7 +9234,8 @@ pspp_sheet_view_remove_column (PsppSheetView *tree_view, } if (tree_view->priv->n_columns == 0 && - pspp_sheet_view_get_headers_visible (tree_view)) + pspp_sheet_view_get_headers_visible (tree_view) && + tree_view->priv->header_window) gdk_window_hide (tree_view->priv->header_window); gtk_widget_queue_resize (GTK_WIDGET (tree_view)); diff --git a/src/ui/gui/psppire-data-editor.c b/src/ui/gui/psppire-data-editor.c index b5f2273..7db408b 100644 --- a/src/ui/gui/psppire-data-editor.c +++ b/src/ui/gui/psppire-data-editor.c @@ -695,6 +695,7 @@ psppire_data_editor_init (PsppireDataEditor *de) de->font = NULL; de->ui_manager = NULL; + de->old_vbox_widget = NULL; g_object_set (de, "tab-pos", GTK_POS_BOTTOM, NULL); @@ -813,12 +814,17 @@ psppire_data_editor_split_window (PsppireDataEditor *de, gboolean split) PSPP_SHEET_VIEW (de->data_sheets[0])); disconnect_data_sheets (de); - gtk_widget_destroy (de->datasheet_vbox_widget); + if (de->old_vbox_widget) + g_object_unref (de->old_vbox_widget); + de->old_vbox_widget = de->datasheet_vbox_widget; + g_object_ref (de->old_vbox_widget); + gtk_container_remove (de->vbox, de->datasheet_vbox_widget); if (split) de->datasheet_vbox_widget = make_split_datasheet (de, grid_lines); else de->datasheet_vbox_widget = make_single_datasheet (de, grid_lines); + psppire_data_editor_refresh_model (de); gtk_box_pack_start (GTK_BOX (de->vbox), de->datasheet_vbox_widget, diff --git a/src/ui/gui/psppire-data-editor.h b/src/ui/gui/psppire-data-editor.h index 879953d..3566660 100644 --- a/src/ui/gui/psppire-data-editor.h +++ b/src/ui/gui/psppire-data-editor.h @@ -72,6 +72,7 @@ struct _PsppireDataEditor /* UI manager for whichever var or data sheet is currently in use. */ GtkUIManager *ui_manager; + GtkWidget *old_vbox_widget; }; struct _PsppireDataEditorClass diff --git a/src/ui/gui/psppire-data-window.c b/src/ui/gui/psppire-data-window.c index 3d97745..f64c334 100644 --- a/src/ui/gui/psppire-data-window.c +++ b/src/ui/gui/psppire-data-window.c @@ -1176,12 +1176,6 @@ psppire_data_window_remove_ui (PsppireDataWindow *pdw, gtk_window_remove_accel_group (GTK_WINDOW (pdw), gtk_ui_manager_get_accel_group (uim)); - - /* Our caller unrefs 'uim', possibly causing 'uim' to be freed. The - following call appears to be necessary to ensure that pdw->ui_manager - drops all references to 'uim'. Otherwise, I get valgrind complaints about - access to freed memory (and segfaults) on e.g. Windows|Split View. */ - gtk_ui_manager_ensure_update (pdw->ui_manager); } GtkWidget* -- 1.7.2.5