Reduce the flicker when redrawing the toolbar and menubar.
authorJohn Darrington <john@darrington.wattle.id.au>
Thu, 5 Jul 2012 21:17:48 +0000 (23:17 +0200)
committerJohn Darrington <john@darrington.wattle.id.au>
Sun, 8 Jul 2012 10:00:15 +0000 (12:00 +0200)
src/ui/gui/pspp-sheet-view.c
src/ui/gui/psppire-data-editor.c
src/ui/gui/psppire-data-editor.h
src/ui/gui/psppire-data-window.c

index 8cf47564ae4e92642360cf869519ba836c4895d2..51ceafcc6f4333c052e6c6ba14b25bef6c88ef03 100644 (file)
@@ -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));
index 5fb04b7ea109656ddf2149516d6846472a43c716..f33a6425992093e5f5febaf04bf47c8b52d0d754 100644 (file)
@@ -696,6 +696,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);
 
@@ -814,12 +815,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,
index 879953d6d80aad2b43bf87e20a04e88735cdeb50..35666600decca02e6f3b06e471ff79422f974a3e 100644 (file)
@@ -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
index 3d9774579adead051376234fe0d4d5b63d426954..f64c334103a6cee30f44c01ae8d98c33313b68aa 100644 (file)
@@ -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*