gnucash maint: Multiple changes pushed

Christopher Lam clam at code.gnucash.org
Wed Oct 13 08:42:32 EDT 2021


Updated	 via  https://github.com/Gnucash/gnucash/commit/003b0a5d (commit)
	 via  https://github.com/Gnucash/gnucash/commit/ca163664 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/39060d8b (commit)
	 via  https://github.com/Gnucash/gnucash/commit/62368a45 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/b4a0b4f0 (commit)
	from  https://github.com/Gnucash/gnucash/commit/76378011 (commit)



commit 003b0a5deb5a1776bdc2e7781a0b9dd4a0185c4a
Merge: 763780114 ca1636643
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Wed Oct 13 20:25:26 2021 +0800

    Merge branch 'maint-leaks2' into maint #1166


commit ca1636643a8ae649c092a5c9aaf92882b472d9ee
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Wed Oct 13 07:13:12 2021 +0800

    [dialog-custom-report] don't allocate GValue
    
    receive GncGUID* directly from GtkTreeModel

diff --git a/gnucash/gnome/dialog-custom-report.c b/gnucash/gnome/dialog-custom-report.c
index 67d80f78a..4ca9937bf 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);
     }
 

commit 39060d8bde26402c0bee1f41fad3933cdaecf041
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Wed Oct 13 06:33:08 2021 +0800

    [dialog-custom-report] plug leaks when destroying dialog

diff --git a/gnucash/gnome/dialog-custom-report.c b/gnucash/gnome/dialog-custom-report.c
index 98a9f0834..67d80f78a 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 a2e1bdb69..08c117742 100644
--- a/gnucash/gtkbuilder/dialog-custom-report.glade
+++ b/gnucash/gtkbuilder/dialog-custom-report.glade
@@ -11,6 +11,7 @@
     <property name="type_hint">dialog</property>
     <property name="skip_taskbar_hint">True</property>
     <property name="skip_pager_hint">True</property>
+    <signal name="destroy" handler="custom_report_dialog_destroy_cb" swapped="no"/>
     <signal name="close" handler="custom_report_dialog_close_cb" swapped="no"/>
     <child internal-child="vbox">
       <object class="GtkBox" id="dialog-vbox1">

commit 62368a45dcf80bfaf6273406dfaed902200e18bd
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Wed Oct 13 06:32:37 2021 +0800

    [dialog-custom-report] refactor empty_tree_model into static fn
    
    to be reused by next commit

diff --git a/gnucash/gnome/dialog-custom-report.c b/gnucash/gnome/dialog-custom-report.c
index 386189dcc..98a9f0834 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))
     {

commit b4a0b4f09856da1127935af8226a31483476ad20
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Tue Oct 12 22:10:45 2021 +0800

    [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

diff --git a/gnucash/gnome/dialog-custom-report.c b/gnucash/gnome/dialog-custom-report.c
index 4badfe983..386189dcc 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);
 }



Summary of changes:
 gnucash/gnome/dialog-custom-report.c          | 88 ++++++++++++++++++---------
 gnucash/gtkbuilder/dialog-custom-report.glade |  1 +
 2 files changed, 59 insertions(+), 30 deletions(-)



More information about the gnucash-changes mailing list