From 5778dd84e93598a7837b9ce2c62725c03bb3996a Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Thu, 1 Mar 2012 18:38:45 +0000 Subject: -LRN: Use destory signal to enforce ns manager singledness , NS manager button in namespace dropdown list --- contrib/gnunet_fs_gtk_main_window.glade | 80 ++++++++++++++-------- src/fs/gnunet-fs-gtk.c | 2 +- src/fs/gnunet-fs-gtk.h | 2 + .../gnunet-fs-gtk_main-window-namespace-dropdown.c | 7 ++ src/fs/gnunet-fs-gtk_namespace_manager.c | 63 ++++++++++------- 5 files changed, 102 insertions(+), 52 deletions(-) diff --git a/contrib/gnunet_fs_gtk_main_window.glade b/contrib/gnunet_fs_gtk_main_window.glade index fd46bceb..4bd06cc9 100644 --- a/contrib/gnunet_fs_gtk_main_window.glade +++ b/contrib/gnunet_fs_gtk_main_window.glade @@ -773,41 +773,65 @@ - - True - True - True - main_window_search_namespace_treestore - False - 0 - True - True - 3 - - + - - autosize - Name + + True + True + True + main_window_search_namespace_treestore + False + 0 + True + True + 3 + + + + + autosize + Name + + + + 0 + + + + - - - 0 - + + autosize + Root + + + + 2 + + + + + True + True + 0 + - - autosize - Root - - - - 2 - - + + _Manage namespaces + True + True + False + True + + + False + False + 1 + diff --git a/src/fs/gnunet-fs-gtk.c b/src/fs/gnunet-fs-gtk.c index 7cee7ac3..bbb94b13 100644 --- a/src/fs/gnunet-fs-gtk.c +++ b/src/fs/gnunet-fs-gtk.c @@ -173,7 +173,7 @@ shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) void GNUNET_GTK_quit_cb (GObject * object, gpointer user_data) { - struct GNUNET_GTK_MainWindowContext *main_context; + struct GNUNET_GTK_MainWindowContext *main_context = user_data; main_window_save_position (main_context->main_window); diff --git a/src/fs/gnunet-fs-gtk.h b/src/fs/gnunet-fs-gtk.h index af533fad..32b78d3d 100644 --- a/src/fs/gnunet-fs-gtk.h +++ b/src/fs/gnunet-fs-gtk.h @@ -56,6 +56,8 @@ struct GNUNET_GTK_MainWindowContext GtkTreeRowReference *ns_selector_pushed_row; GtkTreeRowReference *selected_ns_row; int ns_callback_registered; + GtkObject *ns_manager; + gulong ns_manager_delete_handler_id; }; /** diff --git a/src/fs/gnunet-fs-gtk_main-window-namespace-dropdown.c b/src/fs/gnunet-fs-gtk_main-window-namespace-dropdown.c index f5697ef1..3f5da1cd 100644 --- a/src/fs/gnunet-fs-gtk_main-window-namespace-dropdown.c +++ b/src/fs/gnunet-fs-gtk_main-window-namespace-dropdown.c @@ -25,6 +25,7 @@ */ #include "gnunet-fs-gtk_common.h" #include "gnunet-fs-gtk.h" +#include "gnunet-fs-gtk_event-handler.h" /** * How long until we automatically hide the drop-down if the cursor is outside the bounds? @@ -435,4 +436,10 @@ GNUNET_GTK_main_window_refresh_ns_list (struct GNUNET_GTK_MainWindowContext *mai GNUNET_free_non_null (selected_ns_id); } +void +namespace_selector_manage_namespaces_button_clicked_cb (GtkButton *button, gpointer user_data) +{ + GNUNET_GTK_open_ns_manager (user_data); +} + /* end of gnunet-fs-gtk_main-window-namespace-dropdown.c */ diff --git a/src/fs/gnunet-fs-gtk_namespace_manager.c b/src/fs/gnunet-fs-gtk_namespace_manager.c index 95763aef..69fe4969 100644 --- a/src/fs/gnunet-fs-gtk_namespace_manager.c +++ b/src/fs/gnunet-fs-gtk_namespace_manager.c @@ -50,15 +50,6 @@ struct GNUNET_GTK_NamespaceManagerContext struct GNUNET_GTK_MainWindowContext *main_ctx; }; -/** - * THIS IS EVIL! Used to avoid opening more than one ns manager - * at once. Could be fixed by saving a pointer to the ns manager window - * somewhere in the main gnunet-fs-gtk window, but main window does - * not have a context structure for such things at the moment, hence - * this VERY EVIL GLOBAL VARIABLE! - */ -static struct GNUNET_GTK_NamespaceManagerContext *ns_manager = NULL; - #define GNUNET_GTK_KNOWN_NAMESPACES_IS_MINE_COLUMN 0 #define GNUNET_GTK_KNOWN_NAMESPACES_RANK_COLUMN 1 #define GNUNET_GTK_KNOWN_NAMESPACES_NAME_COLUMN 2 @@ -763,7 +754,6 @@ GNUNET_GTK_namespace_manager_dialog_response_cb (GtkDialog *dialog, free_lists_contents (ctx); gtk_widget_destroy (GTK_WIDGET (ctx->namespace_manager)); GNUNET_free (ctx); - ns_manager = NULL; } } @@ -898,17 +888,10 @@ known_ns_selection_changed (GtkTreeSelection *treeselection, gtk_widget_set_sensitive (ctx->details_apply_button, FALSE); } - - -void -GNUNET_GTK_main_menu_file_manage_pseudonyms_activate_cb (GtkMenuItem *menuitem, - gpointer user_data) +GtkObject * +GNUNET_GTK_namespace_manager_open (struct GNUNET_GTK_MainWindowContext *main_ctx) { - struct GNUNET_GTK_MainWindowContext *main_ctx = user_data; - struct GNUNET_GTK_NamespaceManagerContext *ctx; - - if (ns_manager != NULL) - return; + struct GNUNET_GTK_NamespaceManagerContext *ctx; ctx = GNUNET_malloc (sizeof (struct GNUNET_GTK_NamespaceManagerContext)); ctx->builder = GNUNET_GTK_get_new_builder ("gnunet_fs_gtk_namespace_manager.glade", ctx); @@ -916,7 +899,7 @@ GNUNET_GTK_main_menu_file_manage_pseudonyms_activate_cb (GtkMenuItem *menuitem, { GNUNET_break (0); GNUNET_free (ctx); - return; + return NULL; } ctx->main_ctx = main_ctx; @@ -967,12 +950,46 @@ GNUNET_GTK_main_menu_file_manage_pseudonyms_activate_cb (GtkMenuItem *menuitem, /* sort namespace order list by rank (initially) */ sort_order_list (ctx, GNUNET_GTK_NAMESPACE_ORDER_RANK_COLUMN); - ns_manager = ctx; - gtk_widget_set_sensitive (ctx->details_apply_button, FALSE); /* show dialog */ gtk_window_present (GTK_WINDOW (ctx->namespace_manager)); + return GTK_OBJECT (ctx->namespace_manager); +} + +void +ns_manager_deleted (GtkObject *object, gpointer user_data) +{ + struct GNUNET_GTK_MainWindowContext *ctx = user_data; + g_signal_handler_disconnect (object, ctx->ns_manager_delete_handler_id); + g_object_unref (G_OBJECT (ctx->ns_manager)); + ctx->ns_manager = NULL; + ctx->ns_manager_delete_handler_id = 0; + return; +} + +void +GNUNET_GTK_open_ns_manager (struct GNUNET_GTK_MainWindowContext *ctx) +{ + if (ctx->ns_manager != NULL) + { + gtk_window_present (GTK_WINDOW (ctx->ns_manager)); + return; + } + + ctx->ns_manager = GNUNET_GTK_namespace_manager_open (ctx); + if (ctx->ns_manager == NULL) + return; + + g_object_ref (G_OBJECT (ctx->ns_manager)); + ctx->ns_manager_delete_handler_id = g_signal_connect (G_OBJECT (ctx->ns_manager), "destroy", G_CALLBACK (ns_manager_deleted), ctx); +} + +void +GNUNET_GTK_main_menu_file_manage_pseudonyms_activate_cb (GtkMenuItem *menuitem, + gpointer user_data) +{ + GNUNET_GTK_open_ns_manager (user_data); } /* end of gnunet-fs-gtk_namespace_manager.c */ -- cgit v1.2.3