pspp-dev
[Top][All Lists]
Advanced

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

[PATCH] gui: Do not use GtkRecentManager with GTK+ 2.22.


From: Ben Pfaff
Subject: [PATCH] gui: Do not use GtkRecentManager with GTK+ 2.22.
Date: Thu, 5 May 2011 19:13:10 -0700

With GTK+ 2.22, but not earlier or later versions of GTK+, PSPPIRE
tends to crash at startup when it instantiates the GtkRecentManager.
This commit fixes the problem by disabling the GtkRecentManager when
GTK+ 2.22 is used.

Bug #31511.
---
 src/ui/gui/psppire-data-window.c |  112 +++++++++++++++++++++-----------------
 src/ui/gui/psppire-window.c      |   24 +++++----
 src/ui/gui/psppire.c             |    7 ++-
 3 files changed, 80 insertions(+), 63 deletions(-)

diff --git a/src/ui/gui/psppire-data-window.c b/src/ui/gui/psppire-data-window.c
index c3886e1..bace095 100644
--- a/src/ui/gui/psppire-data-window.c
+++ b/src/ui/gui/psppire-data-window.c
@@ -880,6 +880,66 @@ psppire_data_window_init (PsppireDataWindow *de)
 }
 
 static void
+psppire_data_window_init_recent_items (PsppireDataWindow *de)
+{
+  GtkUIManager *uim = GTK_UI_MANAGER (get_object_assert (de->builder, 
"uimanager1", GTK_TYPE_UI_MANAGER));
+
+  GtkWidget *recent_data =
+    gtk_ui_manager_get_widget (uim,"/ui/menubar/file/file_recent-data");
+
+  GtkWidget *recent_files =
+    gtk_ui_manager_get_widget (uim,"/ui/menubar/file/file_recent-files");
+
+  GtkWidget *menu_data;
+  GtkWidget *menu_files;
+
+  if (the_recent_mgr == NULL)
+    {
+      GtkContainer *menu = GTK_CONTAINER (gtk_widget_get_parent (recent_data));
+      gtk_container_remove (menu, recent_data);
+      gtk_container_remove (menu, recent_files);
+      return;
+    }
+
+  menu_data = gtk_recent_chooser_menu_new_for_manager (the_recent_mgr);
+  menu_files = gtk_recent_chooser_menu_new_for_manager (the_recent_mgr);
+
+  {
+    GtkRecentFilter *filter = gtk_recent_filter_new ();
+
+    gtk_recent_filter_add_pattern (filter, "*.sav");
+    gtk_recent_filter_add_pattern (filter, "*.SAV");
+    gtk_recent_filter_add_pattern (filter, "*.por");
+    gtk_recent_filter_add_pattern (filter, "*.POR");
+
+    gtk_recent_chooser_set_sort_type (GTK_RECENT_CHOOSER (menu_data), 
GTK_RECENT_SORT_MRU);
+
+    gtk_recent_chooser_add_filter (GTK_RECENT_CHOOSER (menu_data), filter);
+  }
+
+  gtk_menu_item_set_submenu (GTK_MENU_ITEM (recent_data), menu_data);
+
+
+  g_signal_connect (menu_data, "selection-done", G_CALLBACK 
(on_recent_data_select), de);
+
+  {
+    GtkRecentFilter *filter = gtk_recent_filter_new ();
+
+    gtk_recent_filter_add_pattern (filter, "*.sps");
+    gtk_recent_filter_add_pattern (filter, "*.SPS");
+
+    gtk_recent_chooser_set_sort_type (GTK_RECENT_CHOOSER (menu_files), 
GTK_RECENT_SORT_MRU);
+
+    gtk_recent_chooser_add_filter (GTK_RECENT_CHOOSER (menu_files), filter);
+  }
+
+  gtk_menu_item_set_submenu (GTK_MENU_ITEM (recent_files), menu_files);
+
+  g_signal_connect (menu_files, "selection-done", G_CALLBACK 
(on_recent_files_select), de);
+
+}
+
+static void
 psppire_data_window_finish_init (PsppireDataWindow *de,
                                  struct dataset *ds)
 {
@@ -1061,58 +1121,8 @@ psppire_data_window_finish_init (PsppireDataWindow *de,
   connect_action (de, "binomial", G_CALLBACK (binomial_dialog));
 
   connect_action (de, "k-related-samples", G_CALLBACK (k_related_dialog));
- 
-
-  {
-    GtkUIManager *uim = GTK_UI_MANAGER (get_object_assert (de->builder, 
"uimanager1", GTK_TYPE_UI_MANAGER));
-
-    GtkWidget *recent_data =
-      gtk_ui_manager_get_widget (uim,"/ui/menubar/file/file_recent-data");
-
-    GtkWidget *recent_files =
-      gtk_ui_manager_get_widget (uim,"/ui/menubar/file/file_recent-files");
-
-
-    GtkWidget *menu_data =
-      gtk_recent_chooser_menu_new_for_manager (the_recent_mgr);
-
-    GtkWidget *menu_files =
-      gtk_recent_chooser_menu_new_for_manager (the_recent_mgr);
-
-    {
-      GtkRecentFilter *filter = gtk_recent_filter_new ();
-
-      gtk_recent_filter_add_pattern (filter, "*.sav");
-      gtk_recent_filter_add_pattern (filter, "*.SAV");
-      gtk_recent_filter_add_pattern (filter, "*.por");
-      gtk_recent_filter_add_pattern (filter, "*.POR");
-
-      gtk_recent_chooser_set_sort_type (GTK_RECENT_CHOOSER (menu_data), 
GTK_RECENT_SORT_MRU);
 
-      gtk_recent_chooser_add_filter (GTK_RECENT_CHOOSER (menu_data), filter);
-    }
-
-    gtk_menu_item_set_submenu (GTK_MENU_ITEM (recent_data), menu_data);
-
-
-    g_signal_connect (menu_data, "selection-done", G_CALLBACK 
(on_recent_data_select), de);
-
-    {
-      GtkRecentFilter *filter = gtk_recent_filter_new ();
-
-      gtk_recent_filter_add_pattern (filter, "*.sps");
-      gtk_recent_filter_add_pattern (filter, "*.SPS");
-
-      gtk_recent_chooser_set_sort_type (GTK_RECENT_CHOOSER (menu_files), 
GTK_RECENT_SORT_MRU);
-
-      gtk_recent_chooser_add_filter (GTK_RECENT_CHOOSER (menu_files), filter);
-    }
-
-    gtk_menu_item_set_submenu (GTK_MENU_ITEM (recent_files), menu_files);
-
-    g_signal_connect (menu_files, "selection-done", G_CALLBACK 
(on_recent_files_select), de);
-
-  }
+  psppire_data_window_init_recent_items (de);
 
   connect_action (de, "file_new_syntax", G_CALLBACK (create_syntax_window));
 
diff --git a/src/ui/gui/psppire-window.c b/src/ui/gui/psppire-window.c
index 399b020..406d0e4 100644
--- a/src/ui/gui/psppire-window.c
+++ b/src/ui/gui/psppire-window.c
@@ -860,27 +860,31 @@ psppire_window_open (PsppireWindow *de)
 static void
 add_most_recent (const char *file_name, GtkRecentManager *rm)
 {
-  gchar *uri = g_filename_to_uri  (file_name, NULL, NULL);
+  if (rm != NULL)
+    {
+      gchar *uri = g_filename_to_uri  (file_name, NULL, NULL);
 
-  if ( uri )
-    gtk_recent_manager_add_item (rm, uri);
+      if ( uri)
+        gtk_recent_manager_add_item (rm, uri);
 
-  g_free (uri);
+      g_free (uri);
+    }
 }
 
 
-
 /*
    If FILE_NAME exists in the recent list, then  delete it.
  */
 static void
 delete_recent (const char *file_name, GtkRecentManager *rm)
 {
-  gchar *uri = g_filename_to_uri  (file_name, NULL, NULL);
+  if (rm != NULL)
+    {
+      gchar *uri = g_filename_to_uri  (file_name, NULL, NULL);
 
-  if ( uri )
-    gtk_recent_manager_remove_item (rm, uri, NULL);
+      if ( uri )
+        gtk_recent_manager_remove_item (rm, uri, NULL);
 
-  g_free (uri);
+      g_free (uri);
+    }
 }
-
diff --git a/src/ui/gui/psppire.c b/src/ui/gui/psppire.c
index 5963803..3c01c7b 100644
--- a/src/ui/gui/psppire.c
+++ b/src/ui/gui/psppire.c
@@ -93,8 +93,11 @@ initialize (const char *data_file)
   journal_enable ();
   textdomain (PACKAGE);
 
-
-  the_recent_mgr = gtk_recent_manager_get_default ();
+  /* GTK+ version 2.22 has a buggy GtkRecentManager implementation that causes
+     segfaults at startup time.  Versions before or after 2.22 work OK.
+     See bug #31511. */
+  if (gtk_major_version != 2 || gtk_minor_version != 22)
+    the_recent_mgr = gtk_recent_manager_get_default ();
 
   psppire_selector_set_default_selection_func (GTK_TYPE_ENTRY, 
insert_source_row_into_entry);
   psppire_selector_set_default_selection_func (PSPPIRE_VAR_VIEW_TYPE, 
insert_source_row_into_tree_view);
-- 
1.7.2.5




reply via email to

[Prev in Thread] Current Thread [Next in Thread]