From 41dc9700cba0a732514069e03ef9aca6a3530c4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20K=C3=B6hler?= Date: Sun, 2 Dec 2007 17:15:54 +0000 Subject: [PATCH] #501059: Clean up SLR dialog sx model and close with session. Avoid ref'ing the model underlying the dialog so that it will be freed correctly. Register the dialog as gui component to close it when the session closed. BP git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@16610 57a11ea4-9604-0410-9ed3-97b8803252fd --- src/gnome/dialog-sx-since-last-run.c | 107 ++++++++++++++++----------- 1 file changed, 65 insertions(+), 42 deletions(-) diff --git a/src/gnome/dialog-sx-since-last-run.c b/src/gnome/dialog-sx-since-last-run.c index 35ef80e160..d3e50f6476 100644 --- a/src/gnome/dialog-sx-since-last-run.c +++ b/src/gnome/dialog-sx-since-last-run.c @@ -50,15 +50,18 @@ #include "gnc-component-manager.h" #include "gnc-gconf-utils.h" #include "gnc-gui-query.h" +#include "gnc-session.h" #undef G_LOG_DOMAIN #define G_LOG_DOMAIN "gnc.gui.sx.slr" +#define DIALOG_SX_SINCE_LAST_RUN_CM_CLASS "dialog-sx-since-last-run" #define GCONF_SECTION "dialogs/scheduled_trans/since_last_run" struct _GncSxSinceLastRunDialog { GtkWidget *dialog; + gint component_id; GncSxSlrTreeModelAdapter *editing_model; GtkTreeView *instance_view; GtkToggleButton *review_created_txns_toggle; @@ -118,6 +121,8 @@ GtkTreeModel* gnc_sx_get_slr_state_model(void); static void _show_created_transactions(GncSxSinceLastRunDialog *app_dialog, GList *created_txn_guids); +static void close_handler(gpointer user_data); +static void dialog_destroy_cb(GtkObject *object, GncSxSinceLastRunDialog *app_dialog); static void dialog_response_cb(GtkDialog *dialog, gint response_id, GncSxSinceLastRunDialog *app_dialog); /* ------------------------------------------------------------ */ @@ -911,9 +916,6 @@ gnc_ui_sx_since_last_run_dialog(GncSxInstanceModel *sx_instances, GList *auto_cr dialog->dialog = glade_xml_get_widget(glade, "since-last-run-dialog"); dialog->editing_model = gnc_sx_slr_tree_model_adapter_new(sx_instances); - // gobject-2.10: g_object_ref_sink(G_OBJECT(dialog->editing_model)); - g_object_ref(G_OBJECT(dialog->editing_model)); - dialog->review_created_txns_toggle = GTK_TOGGLE_BUTTON(glade_xml_get_widget(glade, "review_txn_toggle")); dialog->created_txns = auto_created_txn_guids; @@ -971,9 +973,15 @@ gnc_ui_sx_since_last_run_dialog(GncSxInstanceModel *sx_instances, GList *auto_cr } g_signal_connect(G_OBJECT(dialog->dialog), "response", G_CALLBACK(dialog_response_cb), dialog); + g_signal_connect(G_OBJECT(dialog->dialog), "destroy", G_CALLBACK(dialog_destroy_cb), dialog); gnc_restore_window_size(GCONF_SECTION, GTK_WINDOW(dialog->dialog)); - + + dialog->component_id = gnc_register_gui_component + (DIALOG_SX_SINCE_LAST_RUN_CM_CLASS, NULL, close_handler, dialog); + gnc_gui_component_set_session(dialog->component_id, + gnc_get_current_session()); + gtk_widget_show_all(dialog->dialog); return dialog; @@ -1008,6 +1016,24 @@ _show_created_transactions(GncSxSinceLastRunDialog *app_dialog, GList *created_t xaccFreeQuery(guid_query); } +static void +close_handler(gpointer user_data) +{ + GncSxSinceLastRunDialog *app_dialog = user_data; + + gnc_save_window_size(GCONF_SECTION, GTK_WINDOW(app_dialog->dialog)); + gtk_widget_destroy(app_dialog->dialog); +} + +static void +dialog_destroy_cb(GtkObject *object, GncSxSinceLastRunDialog *app_dialog) +{ + gnc_unregister_gui_component(app_dialog->component_id); + + g_object_unref(G_OBJECT(app_dialog->editing_model)); + app_dialog->editing_model = NULL; +} + static void dialog_response_cb(GtkDialog *dialog, gint response_id, GncSxSinceLastRunDialog *app_dialog) { @@ -1018,49 +1044,46 @@ dialog_response_cb(GtkDialog *dialog, gint response_id, GncSxSinceLastRunDialog // - [ ] instance state constraints // - [x] required variable binding // - [?] ability to create transactions - { - GList *unbound_variables; - unbound_variables = gnc_sx_instance_model_check_variables(app_dialog->editing_model->instances); - g_message("%d variables unbound", g_list_length(unbound_variables)); - if (g_list_length(unbound_variables) > 0) { - // focus first variable - GncSxVariableNeeded *first_unbound; - GtkTreePath *variable_path; - GtkTreeViewColumn *variable_col; - gint variable_view_column = 2; - gboolean start_editing = TRUE; - - first_unbound = (GncSxVariableNeeded*)unbound_variables->data; - variable_path = _get_path_for_variable(app_dialog->editing_model, first_unbound->instance, first_unbound->variable); - variable_col = gtk_tree_view_get_column(app_dialog->instance_view, variable_view_column); - - gtk_tree_view_set_cursor(app_dialog->instance_view, variable_path, variable_col, start_editing); - - gtk_tree_path_free(variable_path); - g_list_foreach(unbound_variables, (GFunc)g_free, NULL); - g_list_free(unbound_variables); - return; + GList *unbound_variables; + unbound_variables = gnc_sx_instance_model_check_variables(app_dialog->editing_model->instances); + g_message("%d variables unbound", g_list_length(unbound_variables)); + if (g_list_length(unbound_variables) > 0) + { + // focus first variable + GncSxVariableNeeded *first_unbound; + GtkTreePath *variable_path; + GtkTreeViewColumn *variable_col; + gint variable_view_column = 2; + gboolean start_editing = TRUE; + + first_unbound = (GncSxVariableNeeded*)unbound_variables->data; + variable_path = _get_path_for_variable(app_dialog->editing_model, first_unbound->instance, first_unbound->variable); + variable_col = gtk_tree_view_get_column(app_dialog->instance_view, variable_view_column); + + gtk_tree_view_set_cursor(app_dialog->instance_view, variable_path, variable_col, start_editing); + + gtk_tree_path_free(variable_path); + g_list_foreach(unbound_variables, (GFunc)g_free, NULL); + g_list_free(unbound_variables); + return; + } } - } - gnc_suspend_gui_refresh(); - gnc_sx_slr_model_effect_change(app_dialog->editing_model, FALSE, &app_dialog->created_txns, NULL); - gnc_resume_gui_refresh(); - if (gtk_toggle_button_get_active(app_dialog->review_created_txns_toggle) - && g_list_length(app_dialog->created_txns) > 0) - { - _show_created_transactions(app_dialog, app_dialog->created_txns); - } - g_list_free(app_dialog->created_txns); - app_dialog->created_txns = NULL; + gnc_suspend_gui_refresh(); + gnc_sx_slr_model_effect_change(app_dialog->editing_model, FALSE, &app_dialog->created_txns, NULL); + gnc_resume_gui_refresh(); + if (gtk_toggle_button_get_active(app_dialog->review_created_txns_toggle) + && g_list_length(app_dialog->created_txns) > 0) + { + _show_created_transactions(app_dialog, app_dialog->created_txns); + } + g_list_free(app_dialog->created_txns); + app_dialog->created_txns = NULL; /* FALLTHROUGH */ - case GTK_RESPONSE_CANCEL: + case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_DELETE_EVENT: - gnc_save_window_size(GCONF_SECTION, GTK_WINDOW(app_dialog->dialog)); - gtk_widget_destroy(GTK_WIDGET(dialog)); - g_object_unref(G_OBJECT(app_dialog->editing_model)); - app_dialog->editing_model = NULL; + gnc_close_gui_component(app_dialog->component_id); break; default: g_error("unknown response id [%d]", response_id);