From b4a0b4f09856da1127935af8226a31483476ad20 Mon Sep 17 00:00:00 2001 From: Christopher Lam Date: Tue, 12 Oct 2021 22:10:45 +0800 Subject: [PATCH 1/4] [dialog-custom-report] plug leaks - g_free gchar*, - guid_free GncGUID, - gtk_tree_path_free a GtkTreePath - don't guid_malloc a guid which will be overwritten --- gnucash/gnome/dialog-custom-report.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/gnucash/gnome/dialog-custom-report.c b/gnucash/gnome/dialog-custom-report.c index 4badfe983c..386189dcc4 100644 --- a/gnucash/gnome/dialog-custom-report.c +++ b/gnucash/gnome/dialog-custom-report.c @@ -343,25 +343,24 @@ get_custom_report_selection(CustomReportDialog *crd, GtkTreeSelection *sel; GtkTreeModel *model; GtkTreeIter iter; - GncGUID *guid = guid_malloc (); + GncGUID *guid; gchar *guid_str; + SCM scm_guid; sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(crd->reportview)); - if (gtk_tree_selection_get_selected(sel, &model, &iter)) - { - gtk_tree_model_get(model, &iter, COL_NUM, &guid, -1); - guid_str = g_new0 (gchar, GUID_ENCODING_LENGTH+1 ); - guid_to_string_buff (guid, guid_str); - } - else + if (!gtk_tree_selection_get_selected(sel, &model, &iter)) { /* no selection, notify user */ gnc_error_dialog (GTK_WINDOW (crd->dialog), "%s", message); return SCM_EOL; - } - return scm_from_utf8_string (guid_str); + + gtk_tree_model_get (model, &iter, COL_NUM, &guid, -1); + guid_str = guid_to_string (guid); + scm_guid = scm_from_utf8_string (guid_str); + g_free (guid_str); + return scm_guid; } /************************************************************** @@ -385,7 +384,7 @@ custom_report_list_view_row_activated_cb(GtkTreeView *view, GtkTreePath *path, { if (column == crd->namecol) { - GncGUID *guid = guid_malloc (); + GncGUID *guid; gchar *guid_str; gtk_tree_model_get(model, &iter, COL_NUM, &guid, -1); @@ -393,6 +392,7 @@ custom_report_list_view_row_activated_cb(GtkTreeView *view, GtkTreePath *path, guid_to_string_buff (guid, guid_str); custom_report_run_report(scm_from_utf8_string (guid_str), crd); + g_free (guid_str); } } } @@ -630,6 +630,7 @@ gnc_ui_custom_report_edit_name (GncMainWindow * window, SCM scm_guid) gtk_tree_view_set_cursor_on_cell (GTK_TREE_VIEW (crd->reportview), path, crd->namecol, crd->namerenderer, TRUE); + gtk_tree_path_free (path); break; } @@ -639,4 +640,5 @@ gnc_ui_custom_report_edit_name (GncMainWindow * window, SCM scm_guid) cleanup: guid_free (guid); + g_free (guid_str); } From 62368a45dcf80bfaf6273406dfaed902200e18bd Mon Sep 17 00:00:00 2001 From: Christopher Lam Date: Wed, 13 Oct 2021 06:32:37 +0800 Subject: [PATCH 2/4] [dialog-custom-report] refactor empty_tree_model into static fn to be reused by next commit --- gnucash/gnome/dialog-custom-report.c | 33 ++++++++++++++++------------ 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/gnucash/gnome/dialog-custom-report.c b/gnucash/gnome/dialog-custom-report.c index 386189dcc4..98a9f0834b 100644 --- a/gnucash/gnome/dialog-custom-report.c +++ b/gnucash/gnome/dialog-custom-report.c @@ -94,6 +94,24 @@ gboolean custom_report_query_tooltip_cb (GtkTreeView *view, GtkTooltip *tooltip, gpointer data); +static gboolean +tree_model_free_guid (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, + gpointer data) +{ + GncGUID *guid; + gtk_tree_model_get (model, iter, COL_NUM, &guid, -1); + guid_free (guid); + return FALSE; +} + +static void +empty_tree_model (GtkTreeModel *model) +{ + gtk_tree_model_foreach (model, (GtkTreeModelForeachFunc)tree_model_free_guid, + NULL); + gtk_list_store_clear (GTK_LIST_STORE (model)); +} + void custom_report_dialog_close_cb(GtkWidget* widget, gpointer data) { @@ -133,26 +151,13 @@ update_report_list(GtkListStore *store, CustomReportDialog *crd) int i; GtkTreeIter iter; GtkTreeModel *model = GTK_TREE_MODEL (store); - gboolean valid_iter; gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store), COL_NAME, GTK_SORT_ASCENDING); crd->reportlist = scm_call_0(get_rpt_guids); rpt_guids = crd->reportlist; - /* Empty current liststore */ - valid_iter = gtk_tree_model_get_iter_first (model, &iter); - while (valid_iter) - { - GValue value = { 0, }; - GncGUID *row_guid; - gtk_tree_model_get_value (model, &iter, COL_NUM, &value); - row_guid = (GncGUID *) g_value_get_pointer (&value); - guid_free (row_guid); - g_value_unset (&value); - valid_iter = gtk_tree_model_iter_next (model, &iter); - } - gtk_list_store_clear(store); + empty_tree_model (model); if (scm_is_list(rpt_guids)) { From 39060d8bde26402c0bee1f41fad3933cdaecf041 Mon Sep 17 00:00:00 2001 From: Christopher Lam Date: Wed, 13 Oct 2021 06:33:08 +0800 Subject: [PATCH 3/4] [dialog-custom-report] plug leaks when destroying dialog --- gnucash/gnome/dialog-custom-report.c | 36 +++++++++++++++---- gnucash/gtkbuilder/dialog-custom-report.glade | 1 + 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/gnucash/gnome/dialog-custom-report.c b/gnucash/gnome/dialog-custom-report.c index 98a9f0834b..67d80f78a7 100644 --- a/gnucash/gnome/dialog-custom-report.c +++ b/gnucash/gnome/dialog-custom-report.c @@ -80,6 +80,7 @@ typedef struct _CustomReportDialog } CustomReportDialog; +void custom_report_dialog_destroy_cb (GtkWidget* widget, gpointer data); void custom_report_dialog_close_cb(GtkWidget* widget, gpointer data); void custom_report_help_cb(GtkWidget* widget, gpointer data); void close_custom_report_clicked_cb(GtkWidget* widget, gpointer data); @@ -95,8 +96,8 @@ gboolean custom_report_query_tooltip_cb (GtkTreeView *view, gpointer data); static gboolean -tree_model_free_guid (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, - gpointer data) +tree_model_free (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, + gpointer data) { GncGUID *guid; gtk_tree_model_get (model, iter, COL_NUM, &guid, -1); @@ -107,9 +108,16 @@ tree_model_free_guid (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, static void empty_tree_model (GtkTreeModel *model) { - gtk_tree_model_foreach (model, (GtkTreeModelForeachFunc)tree_model_free_guid, - NULL); - gtk_list_store_clear (GTK_LIST_STORE (model)); + gtk_tree_model_foreach (model, (GtkTreeModelForeachFunc)tree_model_free, NULL); + gtk_list_store_clear (GTK_LIST_STORE (model)); +} + +void +custom_report_dialog_destroy_cb (GtkWidget* widget, gpointer data) +{ + CustomReportDialog *crd = data; + empty_tree_model (gtk_tree_view_get_model (GTK_TREE_VIEW(crd->reportview))); + g_free (crd); } void @@ -119,7 +127,6 @@ custom_report_dialog_close_cb(GtkWidget* widget, gpointer data) gnc_save_window_size(GNC_PREFS_GROUP_REPORT_SAVED_CONFIGS, GTK_WINDOW(crd->dialog)); gtk_widget_destroy(crd->dialog); - g_free(crd); } void @@ -508,6 +515,19 @@ custom_report_query_tooltip_cb (GtkTreeView *view, return FALSE; } +static gboolean +custom_report_event_cb (GtkWidget *widget, GdkEventKey *event, + gpointer user_data) +{ + if (event->keyval == GDK_KEY_Escape) + { + custom_report_dialog_close_cb (widget, user_data); + return TRUE; + } + return FALSE; +} + + /* Internal function that builds the dialog */ static CustomReportDialog * gnc_ui_custom_report_internal(GncMainWindow * window) @@ -553,6 +573,10 @@ gnc_ui_custom_report_internal(GncMainWindow * window) gtk_widget_show_all(crd->dialog); + // Use this event to capture the escape key being pressed + g_signal_connect (crd->dialog, "key_press_event", + G_CALLBACK(custom_report_event_cb), crd); + /* check if there are currently saved reports available * by checking if there is a first element */ model = gtk_tree_view_get_model (GTK_TREE_VIEW (crd->reportview)); diff --git a/gnucash/gtkbuilder/dialog-custom-report.glade b/gnucash/gtkbuilder/dialog-custom-report.glade index a2e1bdb696..08c1177420 100644 --- a/gnucash/gtkbuilder/dialog-custom-report.glade +++ b/gnucash/gtkbuilder/dialog-custom-report.glade @@ -11,6 +11,7 @@ dialog True True + From ca1636643a8ae649c092a5c9aaf92882b472d9ee Mon Sep 17 00:00:00 2001 From: Christopher Lam Date: Wed, 13 Oct 2021 07:13:12 +0800 Subject: [PATCH 4/4] [dialog-custom-report] don't allocate GValue receive GncGUID* directly from GtkTreeModel --- gnucash/gnome/dialog-custom-report.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/gnucash/gnome/dialog-custom-report.c b/gnucash/gnome/dialog-custom-report.c index 67d80f78a7..4ca9937bfb 100644 --- a/gnucash/gnome/dialog-custom-report.c +++ b/gnucash/gnome/dialog-custom-report.c @@ -640,10 +640,8 @@ gnc_ui_custom_report_edit_name (GncMainWindow * window, SCM scm_guid) while (valid_iter) { - GValue value = { 0, }; GncGUID *row_guid; - gtk_tree_model_get_value (model, &iter, COL_NUM, &value); - row_guid = (GncGUID *) g_value_get_pointer (&value); + gtk_tree_model_get (model, &iter, COL_NUM, &row_guid, -1); if (guid_equal (guid, row_guid)) { @@ -663,7 +661,6 @@ gnc_ui_custom_report_edit_name (GncMainWindow * window, SCM scm_guid) break; } - g_value_unset (&value); valid_iter = gtk_tree_model_iter_next (model, &iter); }