[Top][All Lists]
[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [PATCH] gui: Do not use GtkRecentManager with GTK+ 2.22.,
Ben Pfaff <=