gnucash maint: Multiple changes pushed

John Ralls jralls at code.gnucash.org
Mon Jul 23 17:57:27 EDT 2018


Updated	 via  https://github.com/Gnucash/gnucash/commit/216528c1 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/9cb00f8f (commit)
	 via  https://github.com/Gnucash/gnucash/commit/9993e0ce (commit)
	 via  https://github.com/Gnucash/gnucash/commit/1131aa6f (commit)
	 via  https://github.com/Gnucash/gnucash/commit/40680369 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/827c43d9 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/6d605762 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/773b0703 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/64778fca (commit)
	 via  https://github.com/Gnucash/gnucash/commit/5c90f677 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/5ad584ca (commit)
	 via  https://github.com/Gnucash/gnucash/commit/8edf4478 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/d3439341 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/1ea4310f (commit)
	 via  https://github.com/Gnucash/gnucash/commit/85bb7786 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/193176cc (commit)
	 via  https://github.com/Gnucash/gnucash/commit/93030c61 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/697d2a16 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/4c8f822c (commit)
	from  https://github.com/Gnucash/gnucash/commit/fa1b4c68 (commit)



commit 216528c130843010c2a4ef573e1ed5ccaa6f9f4f
Merge: 9cb00f8 64778fc
Author: John Ralls <jralls at ceridwen.us>
Date:   Mon Jul 23 14:51:01 2018 -0700

    Merge Bob Fewell's 'fixes8' into maint.


commit 9cb00f8fe447632e1bb38607e19e99b161107bd3
Merge: 9993e0c 697d2a1
Author: John Ralls <jralls at ceridwen.us>
Date:   Mon Jul 23 14:45:56 2018 -0700

    Merge Di Mang's 'maint-transfer-02' into maint.
    
    Leaving the MAX_TAB_COUNT at 6, so no "further expansion room".

diff --cc gnucash/gnome-utils/dialog-options.c
index f981c5b,d224a52..7301d19
--- a/gnucash/gnome-utils/dialog-options.c
+++ b/gnucash/gnome-utils/dialog-options.c
@@@ -74,7 -74,7 +74,7 @@@ static QofLogModule log_module = GNC_MO
   * Point where preferences switch control method from a set of
   * notebook tabs to a list.
   */
- #define MAX_TAB_COUNT 4
 -#define MAX_TAB_COUNT 8
++#define MAX_TAB_COUNT 6
  
  /* A pointer to the last selected filename */
  #define LAST_SELECTION "last-selection"

commit 9993e0ce2964d00083489dedb10eb6c0dc62544b
Author: John Ralls <jralls at ceridwen.us>
Date:   Mon Jul 23 14:39:20 2018 -0700

    Almost completely remove Timespec from import-export.
    
    KvpValue doesn't have a time64 type so aqb-kvp still needs to use
    Timespec internally.

diff --git a/gnucash/import-export/aqb/dialog-ab-daterange.c b/gnucash/import-export/aqb/dialog-ab-daterange.c
index 492e90a..8604a83 100644
--- a/gnucash/import-export/aqb/dialog-ab-daterange.c
+++ b/gnucash/import-export/aqb/dialog-ab-daterange.c
@@ -51,10 +51,10 @@ struct _DaterangeInfo
 gboolean
 gnc_ab_enter_daterange(GtkWidget *parent,
                        const char *heading,
-                       Timespec *from_date,
+                       time64 *from_date,
                        gboolean *last_retv_date,
                        gboolean *first_possible_date,
-                       Timespec *to_date,
+                       time64 *to_date,
                        gboolean *to_now)
 {
     GtkBuilder *builder;
@@ -86,12 +86,12 @@ gnc_ab_enter_daterange(GtkWidget *parent,
     now_button  = GTK_WIDGET(gtk_builder_get_object (builder, "now_button"));
     info.enter_to_button  = GTK_WIDGET(gtk_builder_get_object (builder, "enter_to_button"));
 
-    info.from_dateedit = gnc_date_edit_new_ts(*from_date, FALSE, FALSE);
+    info.from_dateedit = gnc_date_edit_new (*from_date, FALSE, FALSE);
     gtk_container_add(GTK_CONTAINER(gtk_builder_get_object (builder, "enter_from_box")),
                       info.from_dateedit);
     gtk_widget_show(info.from_dateedit);
 
-    info.to_dateedit = gnc_date_edit_new_ts(*to_date, FALSE, FALSE);
+    info.to_dateedit = gnc_date_edit_new (*to_date, FALSE, FALSE);
     gtk_container_add(GTK_CONTAINER(gtk_builder_get_object (builder, "enter_to_box")),
                       info.to_dateedit);
     gtk_widget_show(info.to_dateedit);
@@ -122,14 +122,12 @@ gnc_ab_enter_daterange(GtkWidget *parent,
 
     if (result == GTK_RESPONSE_OK)
     {
-        *from_date = gnc_date_edit_get_date_ts(
-                         GNC_DATE_EDIT(info.from_dateedit));
+        *from_date = gnc_date_edit_get_date(GNC_DATE_EDIT(info.from_dateedit));
         *last_retv_date = gtk_toggle_button_get_active(
                               GTK_TOGGLE_BUTTON(last_retrieval_button));
         *first_possible_date = gtk_toggle_button_get_active(
                                    GTK_TOGGLE_BUTTON(first_button));
-        *to_date = gnc_date_edit_get_date_ts(
-                       GNC_DATE_EDIT(info.to_dateedit));
+        *to_date = gnc_date_edit_get_date (GNC_DATE_EDIT(info.to_dateedit));
         *to_now = gtk_toggle_button_get_active(
                       GTK_TOGGLE_BUTTON(now_button));
     }
diff --git a/gnucash/import-export/aqb/dialog-ab-daterange.h b/gnucash/import-export/aqb/dialog-ab-daterange.h
index 957a64c..38ed426 100644
--- a/gnucash/import-export/aqb/dialog-ab-daterange.h
+++ b/gnucash/import-export/aqb/dialog-ab-daterange.h
@@ -56,10 +56,10 @@ G_BEGIN_DECLS
  */
 gboolean gnc_ab_enter_daterange(GtkWidget *parent,
                                 const char *heading,
-                                Timespec *from_date,
+                                time64 *from_date,
                                 gboolean *last_retv_date,
                                 gboolean *first_possible_date,
-                                Timespec *to_date,
+                                time64 *to_date,
                                 gboolean *to_now);
 
 G_END_DECLS
diff --git a/gnucash/import-export/aqb/gnc-ab-gettrans.c b/gnucash/import-export/aqb/gnc-ab-gettrans.c
index 8a7641f..92f02c7 100644
--- a/gnucash/import-export/aqb/gnc-ab-gettrans.c
+++ b/gnucash/import-export/aqb/gnc-ab-gettrans.c
@@ -50,8 +50,7 @@ static gboolean
 gettrans_dates(GtkWidget *parent, Account *gnc_acc,
                GWEN_TIME **from_date, GWEN_TIME **to_date)
 {
-    Timespec last_timespec, until_timespec;
-    time64 now = gnc_time (NULL);
+    time64 last, until;
     gboolean use_last_date = TRUE;
     gboolean use_earliest_date = TRUE;
     gboolean use_until_now = TRUE;
@@ -59,19 +58,19 @@ gettrans_dates(GtkWidget *parent, Account *gnc_acc,
     g_return_val_if_fail(from_date && to_date, FALSE);
 
     /* Get time of last retrieval */
-    last_timespec = gnc_ab_get_account_trans_retrieval(gnc_acc);
-    if (last_timespec.tv_sec == 0)
+    last = gnc_ab_get_account_trans_retrieval(gnc_acc);
+    if (last == 0)
     {
         use_last_date = FALSE;
-        timespecFromTime64 (&last_timespec, now);
+        last = gnc_time (NULL);
     }
-    timespecFromTime64 (&until_timespec, now);
+    until = gnc_time (NULL);
 
     /* Let the user choose the date range of retrieval */
     if (!gnc_ab_enter_daterange(parent, NULL,
-                                &last_timespec,
+                                &last,
                                 &use_last_date, &use_earliest_date,
-                                &until_timespec, &use_until_now))
+                                &until, &use_until_now))
         return FALSE;
 
     /* Now calculate from date */
@@ -82,14 +81,14 @@ gettrans_dates(GtkWidget *parent, Account *gnc_acc,
     else
     {
         if (use_last_date)
-            last_timespec = gnc_ab_get_account_trans_retrieval(gnc_acc);
-        *from_date = GWEN_Time_fromSeconds(timespecToTime64(last_timespec));
+            last = gnc_ab_get_account_trans_retrieval(gnc_acc);
+        *from_date = GWEN_Time_fromSeconds(last);
     }
 
     /* Now calculate to date */
     if (use_until_now)
-        timespecFromTime64(&until_timespec, now);
-    *to_date = GWEN_Time_fromSeconds(timespecToTime64(until_timespec));
+        until = gnc_time (NULL);
+    *to_date = GWEN_Time_fromSeconds(until);
 
     return TRUE;
 }
@@ -101,7 +100,7 @@ gnc_ab_gettrans(GtkWidget *parent, Account *gnc_acc)
     gboolean online = FALSE;
     AB_ACCOUNT *ab_acc;
     GWEN_TIME *from_date = NULL, *to_date = NULL;
-    Timespec until_timespec;
+    time64 until;
     AB_JOB *job = NULL;
     AB_JOB_LIST2 *job_list = NULL;
     GncGWENGui *gui = NULL;
@@ -145,7 +144,7 @@ gnc_ab_gettrans(GtkWidget *parent, Account *gnc_acc)
         goto cleanup;
     }
     /* Use this as a local storage for the until_time below. */
-    timespecFromTime64(&until_timespec, GWEN_Time_toTime_t(to_date));
+    until = GWEN_Time_toTime_t(to_date);
 
     /* Get a GetTransactions job and enqueue it */
     job = AB_JobGetTransactions_new(ab_acc);
@@ -217,7 +216,7 @@ gnc_ab_gettrans(GtkWidget *parent, Account *gnc_acc)
     }
 
     /* Store the date of this retrieval */
-    gnc_ab_set_account_trans_retrieval(gnc_acc, until_timespec);
+    gnc_ab_set_account_trans_retrieval(gnc_acc, until);
 
 cleanup:
     if (ieci)
diff --git a/gnucash/import-export/aqb/gnc-ab-kvp.c b/gnucash/import-export/aqb/gnc-ab-kvp.c
index 80be042..9d1988f 100644
--- a/gnucash/import-export/aqb/gnc-ab-kvp.c
+++ b/gnucash/import-export/aqb/gnc-ab-kvp.c
@@ -95,22 +95,23 @@ gnc_ab_set_account_uid(Account *a, guint32 uid)
     xaccAccountCommitEdit(a);
 }
 
-Timespec
+time64
 gnc_ab_get_account_trans_retrieval(const Account *a)
 {
     Timespec *t = NULL;
     qof_instance_get (QOF_INSTANCE (a),
 		      "ab-trans-retrieval", &t,
 		      NULL);
-    return t ? *t : (Timespec){0, 0};
+    return t ? t->tv_sec : 0;
 }
 
 void
-gnc_ab_set_account_trans_retrieval(Account *a, Timespec time)
+gnc_ab_set_account_trans_retrieval(Account *a, time64 time)
 {
     xaccAccountBeginEdit(a);
+    Timespec ts = {time, 0};
     qof_instance_set (QOF_INSTANCE (a),
-		      "ab-trans-retrieval", &time,
+		      "ab-trans-retrieval", &ts,
 		      NULL);
     xaccAccountCommitEdit(a);
 }
diff --git a/gnucash/import-export/aqb/gnc-ab-kvp.h b/gnucash/import-export/aqb/gnc-ab-kvp.h
index 1c21b28..44fe818 100644
--- a/gnucash/import-export/aqb/gnc-ab-kvp.h
+++ b/gnucash/import-export/aqb/gnc-ab-kvp.h
@@ -99,7 +99,7 @@ void gnc_ab_set_account_uid(Account *a, guint32 uid);
  * @param a Account
  * @return Retrieval time
  */
-Timespec gnc_ab_get_account_trans_retrieval(const Account *a);
+time64 gnc_ab_get_account_trans_retrieval(const Account *a);
 
 /**
  * Set the time of last online transaction retrieval for Account @a a.  The
@@ -108,7 +108,7 @@ Timespec gnc_ab_get_account_trans_retrieval(const Account *a);
  * @param a Account
  * @param time Retrieval time
  */
-void gnc_ab_set_account_trans_retrieval(Account *a, Timespec time);
+void gnc_ab_set_account_trans_retrieval(Account *a, time64 time);
 
 /** @} */
 
diff --git a/gnucash/import-export/aqb/test/test-kvp.c b/gnucash/import-export/aqb/test/test-kvp.c
index fc7fd60..29e7f85 100644
--- a/gnucash/import-export/aqb/test/test-kvp.c
+++ b/gnucash/import-export/aqb/test/test-kvp.c
@@ -150,7 +150,6 @@ test_qofsession_aqb_kvp( void )
             QofBook *book = qof_session_get_book(new_session);
             Account* account = gnc_book_get_root_account(book);
             struct tm *retrieved_date, *original_date;
-            gchar buff[MAX_DATE_LENGTH];
 
             g_assert(account);
 
@@ -158,10 +157,13 @@ test_qofsession_aqb_kvp( void )
             // from the xml file?
             if (1)
             {
-                Timespec retrieved_ts = gnc_ab_get_account_trans_retrieval(account);
-                g_test_message("retrieved_ts=%s\n", gnc_print_date(retrieved_ts));
+                time64 retrieved = gnc_ab_get_account_trans_retrieval(account);
+                char date_buf [MAX_DATE_LENGTH + 1];
+                memset (date_buf, 0, sizeof(date_buf));
+                qof_print_date_buff (date_buf, sizeof(date_buf), retrieved);
+                g_test_message("retrieved=%s\n", date_buf);
 
-                retrieved_date = gnc_gmtime (&retrieved_ts.tv_sec);
+                retrieved_date = gnc_gmtime (&retrieved);
                 g_assert_cmpint (retrieved_date->tm_year, ==, 114);
                 g_assert_cmpint (retrieved_date->tm_mon, ==, 7);
                 g_assert_cmpint (retrieved_date->tm_mday, ==, 29);
@@ -172,17 +174,23 @@ test_qofsession_aqb_kvp( void )
             // Account, just a general Account object.
             if (1)
             {
-                Timespec original_ts = timespec_now(), retrieved_ts;
+                time64 original = gnc_time (NULL), retrieved;
+                char date_buf_1 [MAX_DATE_LENGTH + 1];
+                char date_buf_2 [MAX_DATE_LENGTH + 1];
+                memset (date_buf_1, 0, sizeof(date_buf_1));
+                memset (date_buf_2, 0, sizeof(date_buf_2));
 
                 // Check whether the "ab-trans-retrieval" property of Account
                 // is written and read again correctly.
-                gnc_ab_set_account_trans_retrieval(account, original_ts);
-                retrieved_ts = gnc_ab_get_account_trans_retrieval(account);
-                g_test_message("original_ts=%s\n", gnc_print_date(original_ts));
-                g_test_message("retrieved_ts=%s\n", gnc_print_date(retrieved_ts));
-
-                original_date = gnc_gmtime (&original_ts.tv_sec);
-                retrieved_date = gnc_gmtime (&retrieved_ts.tv_sec);
+                gnc_ab_set_account_trans_retrieval(account, original);
+                retrieved = gnc_ab_get_account_trans_retrieval(account);
+                qof_print_date_buff(date_buf_1, sizeof(date_buf_1), original);
+                qof_print_date_buff(date_buf_2, sizeof(date_buf_2), retrieved);
+                g_test_message("original_ts=%s\n", date_buf_1);
+                g_test_message("retrieved_ts=%s\n", date_buf_2);
+
+                original_date = gnc_gmtime (&original);
+                retrieved_date = gnc_gmtime (&retrieved);
 
                 g_assert_cmpint (retrieved_date->tm_year, ==, original_date->tm_year);
                 g_assert_cmpint (retrieved_date->tm_mon, ==, original_date->tm_mon);
diff --git a/gnucash/import-export/csv-exp/csv-transactions-export.c b/gnucash/import-export/csv-exp/csv-transactions-export.c
index 5526362..393e0ed 100644
--- a/gnucash/import-export/csv-exp/csv-transactions-export.c
+++ b/gnucash/import-export/csv-exp/csv-transactions-export.c
@@ -148,10 +148,10 @@ add_reconcile_date (gchar *so_far, Split *split, CsvExportInfo *info)
 
     if (xaccSplitGetReconcile (split) == YREC)
     {
-        Timespec     ts = {0,0};
-        const gchar *str_rec_date;
-        xaccSplitGetDateReconciledTS (split, &ts);
-        str_rec_date = gnc_print_date (ts);
+        char str_rec_date[MAX_DATE_LENGTH + 1];
+        memset (str_rec_date, 0, sizeof(str_rec_date));
+        time64 t = xaccSplitGetDateReconciled (split);
+        qof_print_date_buff (str_rec_date, sizeof(str_rec_date), t);
         result = g_strconcat (so_far, str_rec_date, info->mid_sep, NULL);
     }
     else
diff --git a/gnucash/import-export/csv-imp/gnc-imp-props-price.cpp b/gnucash/import-export/csv-imp/gnc-imp-props-price.cpp
index 1a3ec7b..c989ae8 100644
--- a/gnucash/import-export/csv-imp/gnc-imp-props-price.cpp
+++ b/gnucash/import-export/csv-imp/gnc-imp-props-price.cpp
@@ -251,15 +251,14 @@ Result GncImportPrice::create_price (QofBook* book, GNCPriceDB *pdb, bool over)
         return FAILED;
     }
 
-    Timespec date;
-    timespecFromTime64 (&date, static_cast<time64>(GncDateTime(*m_date, DayPart::neutral)));
-    date.tv_nsec = 0;
+    auto date = static_cast<time64>(GncDateTime(*m_date, DayPart::neutral));
 
     bool rev = false;
     auto amount = *m_amount;
     Result ret_val = ADDED;
 
-    GNCPrice *old_price = gnc_pricedb_lookup_day (pdb, *m_from_commodity, *m_to_currency, date);
+    GNCPrice *old_price = gnc_pricedb_lookup_day_t64 (pdb, *m_from_commodity,
+                                                      *m_to_currency, date);
 
     // Should old price be over writen
     if ((old_price != nullptr) && (over == true))
@@ -287,10 +286,14 @@ Result GncImportPrice::create_price (QofBook* book, GNCPriceDB *pdb, bool over)
             rev = true;
 
     }
-    DEBUG("Date is %s, Rev is %d, Commodity from is '%s', Currency is '%s', Amount is %s", gnc_print_date (date),
-        rev, gnc_commodity_get_fullname (*m_from_commodity), gnc_commodity_get_fullname (*m_to_currency),
-        amount.to_string().c_str());
-
+    char date_str [MAX_DATE_LENGTH + 1];
+    memset (date_str, 0, sizeof(date_str));
+    qof_print_date_buff (date_str, sizeof(date_str), date);
+    DEBUG("Date is %s, Rev is %d, Commodity from is '%s', Currency is '%s', "
+          "Amount is %s", date_str, rev,
+          gnc_commodity_get_fullname (*m_from_commodity),
+          gnc_commodity_get_fullname (*m_to_currency),
+          amount.to_string().c_str());
     // Create the new price
     if (old_price == nullptr)
     {
@@ -311,7 +314,7 @@ Result GncImportPrice::create_price (QofBook* book, GNCPriceDB *pdb, bool over)
         auto amount_conv = amount.convert<RoundType::half_up>(CURRENCY_DENOM);
         gnc_price_set_value (price, static_cast<gnc_numeric>(amount_conv));
 
-        gnc_price_set_time (price, date);
+        gnc_price_set_time64 (price, date);
         gnc_price_set_source (price, PRICE_SOURCE_USER_PRICE);
 //FIXME Not sure which one        gnc_price_set_source (price, PRICE_SOURCE_FQ);
         gnc_price_set_typestr (price, PRICE_TYPE_LAST);
diff --git a/gnucash/import-export/csv-imp/gnc-imp-props-tx.cpp b/gnucash/import-export/csv-imp/gnc-imp-props-tx.cpp
index 7c4246d..7e0a35f 100644
--- a/gnucash/import-export/csv-imp/gnc-imp-props-tx.cpp
+++ b/gnucash/import-export/csv-imp/gnc-imp-props-tx.cpp
@@ -556,10 +556,11 @@ static void trans_add_split (Transaction* trans, Account* account, GncNumeric am
         value = amount * *price;
     else
     {
-        Timespec ts = {xaccTransRetDatePosted (trans), 0};
+        auto time = xaccTransRetDatePosted (trans);
         /* Import data didn't specify price, let's lookup the nearest in time */
-        auto nprice = gnc_pricedb_lookup_nearest_in_time(gnc_pricedb_get_db(book),
-                acct_comm, trans_curr, ts);
+        auto nprice =
+            gnc_pricedb_lookup_nearest_in_time64(gnc_pricedb_get_db(book),
+                                                 acct_comm, trans_curr, time);
         if (nprice)
         {
             /* Found a usable price. Let's check if the conversion direction is right */
diff --git a/gnucash/import-export/import-parse.c b/gnucash/import-export/import-parse.c
index e56480c..ca90430 100644
--- a/gnucash/import-export/import-parse.c
+++ b/gnucash/import-export/import-parse.c
@@ -292,7 +292,7 @@ fix_year(int y)
 }
 
 gboolean
-gnc_import_parse_date(const char *str, GncImportFormat fmt, Timespec *val)
+gnc_import_parse_date(const char *str, GncImportFormat fmt, time64 *val)
 {
     regmatch_t match[5];
     char temp[9];
@@ -405,7 +405,7 @@ gnc_import_parse_date(const char *str, GncImportFormat fmt, Timespec *val)
             return FALSE;
 
         y = fix_year(y);
-        *val = gnc_dmy2timespec(d, m, y);
+        *val = gnc_dmy2time64(d, m, y);
         return TRUE;
     }
 
diff --git a/gnucash/import-export/import-parse.h b/gnucash/import-export/import-parse.h
index d436d20..a6bc850 100644
--- a/gnucash/import-export/import-parse.h
+++ b/gnucash/import-export/import-parse.h
@@ -55,7 +55,7 @@ GncImportFormat gnc_import_choose_fmt(const char* msg, GncImportFormat fmts,
 gboolean gnc_import_parse_numeric(const char* str, GncImportFormat fmt,
                                   gnc_numeric *val);
 gboolean gnc_import_parse_date(const char *date, GncImportFormat fmt,
-                               Timespec *val);
+                               time64 *val);
 
 /* Set and clear flags in bit-flags */
 #define import_set_flag(i,f) (i |= f)
diff --git a/gnucash/import-export/log-replay/gnc-log-replay.c b/gnucash/import-export/log-replay/gnc-log-replay.c
index 00bbb2b..34d135a 100644
--- a/gnucash/import-export/log-replay/gnc-log-replay.c
+++ b/gnucash/import-export/log-replay/gnc-log-replay.c
@@ -71,11 +71,11 @@ typedef struct _split_record
     int trans_guid_present;
     GncGUID split_guid;
     int  split_guid_present;
-    Timespec log_date;
+    time64 log_date;
     int log_date_present;
-    Timespec date_entered;
+    time64 date_entered;
     int date_entered_present;
-    Timespec date_posted;
+    time64 date_posted;
     int date_posted_present;
     GncGUID acc_guid;
     int acc_guid_present;
@@ -97,7 +97,7 @@ typedef struct _split_record
     int amount_present;
     gnc_numeric value;
     int value_present;
-    Timespec date_reconciled;
+    time64 date_reconciled;
     int date_reconciled_present;
 } split_record;
 /********************************************************************\
@@ -181,20 +181,17 @@ static split_record interpret_split_record( char *record_line)
     }
     if (strlen(tok_ptr = my_strtok(NULL, "\t")) != 0)
     {
-        time64 secs = gnc_iso8601_to_time64_gmt(tok_ptr);
-        record.log_date.tv_sec = secs;
+        record.log_date = gnc_iso8601_to_time64_gmt(tok_ptr);
         record.log_date_present = TRUE;
     }
     if (strlen(tok_ptr = my_strtok(NULL, "\t")) != 0)
     {
-        time64 secs = gnc_iso8601_to_time64_gmt(tok_ptr);
-        record.date_entered.tv_sec = secs;
+        record.date_entered = gnc_iso8601_to_time64_gmt(tok_ptr);
         record.date_entered_present = TRUE;
     }
     if (strlen(tok_ptr = my_strtok(NULL, "\t")) != 0)
     {
-        time64 secs = gnc_iso8601_to_time64_gmt(tok_ptr);
-        record.date_posted.tv_sec = secs;
+        record.date_posted = gnc_iso8601_to_time64_gmt(tok_ptr);
         record.date_posted_present = TRUE;
     }
     if (strlen(tok_ptr = my_strtok(NULL, "\t")) != 0)
@@ -249,8 +246,7 @@ static split_record interpret_split_record( char *record_line)
     }
     if (strlen(tok_ptr = my_strtok(NULL, "\t")) != 0)
     {
-        time64 secs = gnc_iso8601_to_time64_gmt(tok_ptr);
-        record.date_reconciled.tv_sec = secs;
+        record.date_reconciled = gnc_iso8601_to_time64_gmt(tok_ptr);
         record.date_reconciled_present = TRUE;
     }
 
@@ -298,17 +294,17 @@ static void dump_split_record(split_record record)
     }
     if (record.log_date_present)
     {
-        gnc_timespec_to_iso8601_buff (record.log_date, string_buf);
+        gnc_time64_to_iso8601_buff (record.log_date, string_buf);
         DEBUG("Log entry date: %s", string_buf);
     }
     if (record.date_entered_present)
     {
-        gnc_timespec_to_iso8601_buff (record.date_entered, string_buf);
+        gnc_time64_to_iso8601_buff (record.date_entered, string_buf);
         DEBUG("Date entered: %s", string_buf);
     }
     if (record.date_posted_present)
     {
-        gnc_timespec_to_iso8601_buff (record.date_posted, string_buf);
+        gnc_time64_to_iso8601_buff (record.date_posted, string_buf);
         DEBUG("Date posted: %s", string_buf);
     }
     if (record.acc_guid_present)
@@ -358,7 +354,7 @@ static void dump_split_record(split_record record)
     }
     if (record.date_reconciled_present)
     {
-        gnc_timespec_to_iso8601_buff (record.date_reconciled, string_buf);
+        gnc_time64_to_iso8601_buff (record.date_reconciled, string_buf);
         DEBUG("Reconciled date: %s", string_buf);
     }
 }
@@ -452,11 +448,11 @@ static void  process_trans_record(  FILE *log_file)
                         /*Fill the transaction info*/
                         if (record.date_entered_present)
                         {
-                            xaccTransSetDateEnteredSecs(trans, record.date_entered.tv_sec);
+                            xaccTransSetDateEnteredSecs(trans, record.date_entered);
                         }
                         if (record.date_posted_present)
                         {
-                            xaccTransSetDatePostedSecs(trans, record.date_posted.tv_sec);
+                            xaccTransSetDatePostedSecs(trans, record.date_posted);
                         }
                         if (record.trans_num_present)
                         {
@@ -510,7 +506,7 @@ static void  process_trans_record(  FILE *log_file)
                         }
                         if (record.date_reconciled_present)
                         {
-                            xaccSplitSetDateReconciledTS (split, &(record.date_reconciled));
+                            xaccSplitSetDateReconciledSecs (split, record.date_reconciled);
                         }
                         if (record.split_reconcile_present)
                         {
diff --git a/gnucash/import-export/ofx/gnc-ofx-import.c b/gnucash/import-export/ofx/gnc-ofx-import.c
index cd4df57..aea382f 100644
--- a/gnucash/import-export/ofx/gnc-ofx-import.c
+++ b/gnucash/import-export/ofx/gnc-ofx-import.c
@@ -503,9 +503,8 @@ int ofx_proc_transaction_cb(struct OfxTransactionData data, void *user_data)
     }
     if (data.date_funds_available_valid)
     {
-        Timespec ts;
-        timespecFromTime64(&ts, data.date_funds_available);
-        gnc_timespec_to_iso8601_buff (ts, dest_string);
+        time64 time = data.date_funds_available;
+        gnc_time64_to_iso8601_buff (time, dest_string);
         tmp = notes;
         notes = g_strdup_printf("%s%s%s", tmp,
 				"|Date funds available:", dest_string);
diff --git a/gnucash/import-export/qif-imp/assistant-qif-import.c b/gnucash/import-export/qif-imp/assistant-qif-import.c
index 1ab3788..1d16f99 100644
--- a/gnucash/import-export/qif-imp/assistant-qif-import.c
+++ b/gnucash/import-export/qif-imp/assistant-qif-import.c
@@ -3137,7 +3137,9 @@ gnc_ui_qif_import_duplicates_match_prepare (GtkAssistant *assistant,
         duplicates = wind->match_transactions;
         while (!scm_is_null(duplicates))
         {
-            Timespec send_ts = {0,0};
+            time64 send_time = 0;
+            char date_buf[MAX_DATE_LENGTH + 1];
+            memset (date_buf, 0, sizeof(date_buf));
             current_xtn = SCM_CAAR(duplicates);
 #define FUNC_NAME "xaccTransCountSplits"
             gnc_xtn = SWIG_MustGetPtr(current_xtn,
@@ -3154,12 +3156,13 @@ gnc_ui_qif_import_duplicates_match_prepare (GtkAssistant *assistant,
                                     (xaccSplitGetAccount(gnc_split), TRUE));
             }
             gtk_list_store_append(store, &iter);
-            send_ts.tv_sec = xaccTransRetDatePosted(gnc_xtn);
+            send_time = xaccTransRetDatePosted(gnc_xtn);
+            qof_print_date_buff (date_buf, sizeof(date_buf), send_time);
             gtk_list_store_set
             (store, &iter,
              QIF_TRANS_COL_INDEX, rownum++,
              QIF_TRANS_COL_DATE,
-             gnc_print_date(send_ts),
+             date_buf,
              QIF_TRANS_COL_DESCRIPTION, xaccTransGetDescription(gnc_xtn),
              QIF_TRANS_COL_AMOUNT, amount_str,
              -1);
diff --git a/gnucash/import-export/test/test-import-parse.c b/gnucash/import-export/test/test-import-parse.c
index 3314f51..22d9880 100644
--- a/gnucash/import-export/test/test-import-parse.c
+++ b/gnucash/import-export/test/test-import-parse.c
@@ -137,11 +137,11 @@ test_parse_numeric(void)
 static void
 test_date(const char* str, GncImportFormat fmt, my_ymd_t date)
 {
-    Timespec ts, ts2;;
+    time64 t1, t2;
 
-    do_test(gnc_import_parse_date(str, fmt, &ts), "Parsing date");
-    ts2 = gnc_dmy2timespec(date.d, date.m, date.y);
-    do_test(timespec_equal(&ts, &ts2), "Date Equal");
+    do_test(gnc_import_parse_date(str, fmt, &t1), "Parsing date");
+    t2 = gnc_dmy2time64(date.d, date.m, date.y);
+    do_test(t1 == t2, "Date Equal");
 }
 
 static void

commit 1131aa6fc44e9d3902197fef37b99c42cbd12a7e
Author: John Ralls <jralls at ceridwen.us>
Date:   Mon Jul 23 12:48:52 2018 -0700

    Clean up jenny's whitespace.

diff --git a/borrowed/jenny/jenny.c b/borrowed/jenny/jenny.c
index 652dfd7..fb8254b 100644
--- a/borrowed/jenny/jenny.c
+++ b/borrowed/jenny/jenny.c
@@ -3,7 +3,7 @@
 By Bob Jenkins, March 2003.  Public domain.
 
 jenny.c -- jennyrate tests from m dimensions of features that cover all
-  n-tuples of features, n <= m, with each feature chosen from a different 
+  n-tuples of features, n <= m, with each feature chosen from a different
   dimension.  For example, given 10 dimensions (m=10) with 2 to 8 features
   apiece, cover all feature triplets (n=3).  A lower bound on the number
   of tests required is the product of the sizes of the largest n dimensions.
@@ -11,7 +11,7 @@ jenny.c -- jennyrate tests from m dimensions of features that cover all
 
 Arguments
   Arguments without a leading '-' : an integer in 2..52.  Represents a
-       dimension.  Dimensions are implicitly numbered 1..65535, in the 
+       dimension.  Dimensions are implicitly numbered 1..65535, in the
        order they appear.  Features in dimensions are always implicitly
        given 1-character names, which are in order a..z, A..Z .  It's a
        good idea to pass the output of jenny through a postprocessor that
@@ -37,7 +37,7 @@ Arguments
        number followed by a one-character feature name.  A single -w can
        disallow multiple features in a dimension.  For example, -w1a2cd4ac
        disallows the combinations (1a,2c,4a),(1a,2c,4c),(1a,2d,4a),(1a,2d,4c)
-       where 1a represents the first dimension's first feature, 2c is the 
+       where 1a represents the first dimension's first feature, 2c is the
        second dimension's third feature, and 4a is the fourth dimension's
        first feature.
 
@@ -227,14 +227,14 @@ wchain   *wc)                                                /* restrictions */
     while (i<w->len) {
       int dimension_match = FALSE;                /* match in this dimension */
       do {
-	if (t->f[w->fe[i].d] == w->fe[i].f) {
-	  dimension_match = TRUE;
-	}
-	++i;
+        if (t->f[w->fe[i].d] == w->fe[i].f) {
+          dimension_match = TRUE;
+        }
+        ++i;
       } while (i<w->len && (w->fe[i].d == w->fe[i-1].d));
       if (!dimension_match) {
-	match = FALSE;
-	break;
+        match = FALSE;
+        break;
       }
     }
     if (match) {
@@ -326,10 +326,10 @@ cleanup(state *s)
     ub2 d,f;
     for (d=0; d<s->ndim; ++d) {
       if (s->tu[d]) {
-	for (f=0; f<s->dim[d]; ++f) {
-	  truncate_tuple(&s->tu[d][f], &s->tc[d][f]);
-	}
-	my_free((char *)s->tu[d]);
+        for (f=0; f<s->dim[d]; ++f) {
+          truncate_tuple(&s->tu[d][f], &s->tc[d][f]);
+        }
+        my_free((char *)s->tu[d]);
       }
     }
     my_free((char *)s->tu);
@@ -340,7 +340,7 @@ cleanup(state *s)
     ub2 d;
     for (d=0; d<s->ndim; ++d) {
       if (s->n[d]) {
-	my_free((char *)s->n[d]);
+        my_free((char *)s->n[d]);
       }
     }
     my_free((char *)s->n);
@@ -351,7 +351,7 @@ cleanup(state *s)
     ub2 d;
     for (d=0; d<s->ndim; ++d) {
       if (s->tc[d]) {
-	my_free((char *)s->tc[d]);
+        my_free((char *)s->tc[d]);
       }
     }
     my_free((char *)s->tc);
@@ -362,9 +362,9 @@ cleanup(state *s)
     ub2 i;
     for (i=0; i<s->ndim; ++i) {
       while (s->wc[i]) {
-	wchain  *wc = s->wc[i];
-	s->wc[i] = s->wc[i]->next;
-	my_free((char *)wc);
+        wchain  *wc = s->wc[i];
+        s->wc[i] = s->wc[i]->next;
+        my_free((char *)wc);
       }
     }
     my_free((char *)s->wc);
@@ -431,7 +431,7 @@ my_alloc( state *s, size_t len)
   if (!(rsl = (char *)malloc(len+sizeof(size_t)))) {
     printf("jenny: could not allocate space\n");
     cleanup(s);
-    exit(0);  
+    exit(0);
   }
   memset(rsl, 0x00, len);
   return rsl;
@@ -571,7 +571,7 @@ subset_tuple( feature *t1, ub1 n1, feature *t2, ub1 n2)
   for (i=0, j=0; i<n1; ++i) {
     while (t1[i].d > t2[j].d) {
       if (++j == n2)
-	return FALSE;
+        return FALSE;
     }
     if (t1[i].d != t2[j].d || t1[i].f != t2[j].f) {
       return FALSE;
@@ -648,7 +648,7 @@ parse_token(char *inp, ub4 inl, ub4 *curr, ub4 *rsl)
     for (i=*curr+1; i < inl; ++i) {
       mychar = inp[i];
       if (!(mychar == ' ' || mychar == '\t' || mychar == '\n'))
-	break;
+        break;
     }
     *curr = i;
     return TOKEN_SPACE;
@@ -662,16 +662,16 @@ parse_token(char *inp, ub4 inl, ub4 *curr, ub4 *rsl)
     *rsl = number;
     return TOKEN_NUMBER;
   } else if ((mychar >= 'a' && mychar <= 'z') ||
-	     (mychar >= 'A' && mychar <= 'Z')) {
+             (mychar >= 'A' && mychar <= 'Z')) {
     /*------------------------------------------------- parse a feature name */
     ub4 i;
     for (i=0; i<MAX_FEATURES; ++i)
       if (feature_name[i] == mychar)
-	break;
+        break;
     if (i == MAX_FEATURES) {
       printf("jenny: the name '%c' is not used for any feature\n",
-	     mychar);
-	return TOKEN_ERROR;
+             mychar);
+        return TOKEN_ERROR;
     }
     *rsl = i;
     ++*curr;
@@ -688,7 +688,7 @@ load( state *s, char *testfile)
 {
   char  buf[BUFSIZE];            /* buffer holding a line read from the file */
   FILE *f;
-  
+
   if (testfile[0] == '\0') {
     f = stdin;
   } else {
@@ -715,25 +715,25 @@ load( state *s, char *testfile)
 
     for (i=0; i<s->ndim; ++i) {
       if (parse_token(buf, UB4MAXVAL, &curr, &value) != TOKEN_SPACE) {
-	printf("jenny: -o, non-space found where space expected\n");
-	goto failure;
+        printf("jenny: -o, non-space found where space expected\n");
+        goto failure;
       }
       if (parse_token(buf, UB4MAXVAL, &curr, &value) != TOKEN_NUMBER) {
-	printf("jenny: -o, non-number found where number expected\n");
-	goto failure;
+        printf("jenny: -o, non-number found where number expected\n");
+        goto failure;
       }
       if (value-1 != i) {
-	printf("jenny: -o, number %lu found out-of-place\n", value);
-	goto failure;
+        printf("jenny: -o, number %lu found out-of-place\n", value);
+        goto failure;
       }
       if (parse_token(buf, UB4MAXVAL, &curr, &value) != TOKEN_FEATURE) {
-	printf("jenny: -o, non-feature found where feature expected\n");
-	goto failure;
+        printf("jenny: -o, non-feature found where feature expected\n");
+        goto failure;
       }
       if (value >= s->dim[i]) {
-	printf("jenny: -o, feature %c does not exist in dimension %lu\n", 
-	       feature_name[value], i+1);
-	goto failure;
+        printf("jenny: -o, feature %c does not exist in dimension %lu\n",
+               feature_name[value], i+1);
+        goto failure;
       }
       t->f[i] = value;
     }
@@ -809,14 +809,14 @@ parse_n( state *s, char *myarg)
     printf("jenny: -n should be followed by just an integer\n");
     return FALSE;
   }
-  
+
   if ((temp < 1) || (temp > 32)) {
     printf("jenny: -n says all n-tuples should be covered.\n");
     return FALSE;
   }
   if (temp > s->ndim) {
     printf("jenny: -n, %ld-tuples are impossible with only %d dimensions\n",
-	   temp, s->ndim);
+           temp, s->ndim);
     return FALSE;
   }
   s->n_final = (ub2)temp;
@@ -839,7 +839,7 @@ parse_w( state *s, sb1 *myarg)
   ub4        i, j, k;
   size_t     len = strlen(myarg);
   token_type t = parse_token(myarg, len, &curr, &value);
-  
+
   for (i=0; i<s->ndim; ++i)
     used[i] = FALSE;
   if (t != TOKEN_NUMBER) {
@@ -848,7 +848,7 @@ parse_w( state *s, sb1 *myarg)
     return FALSE;
   }
   fe_len=0;
-  
+
  number:
   dimension_number = --value;
   if (dimension_number >= s->ndim) {
@@ -858,12 +858,12 @@ parse_w( state *s, sb1 *myarg)
   }
   if (used[dimension_number]) {
     printf("jenny: -w, dimension %lu was given twice in a single without\n",
-	   dimension_number+1);
+           dimension_number+1);
     return FALSE;
   }
   used[dimension_number] = TRUE;
-  
-  
+
+
   switch (parse_token(myarg, len, &curr, &value)) {
   case TOKEN_FEATURE: goto feature;
   case TOKEN_END:
@@ -874,22 +874,22 @@ parse_w( state *s, sb1 *myarg)
     printf("jenny: proper withouts look like -w2a1bc99a\n");
     return FALSE;
   }
-  
+
  feature:
   if (value >= s->dim[dimension_number]) {
     printf("jenny: -w, there is no feature '%c' in dimension %lu\n",
-	   feature_name[value], dimension_number+1);
+           feature_name[value], dimension_number+1);
     return FALSE;
   }
   fe[fe_len].d = dimension_number;
   fe[fe_len].f = value;
   if (++fe_len >= MAX_WITHOUT) {
     printf("jenny: -w, at most %d features in a single without\n",
-	   MAX_WITHOUT);
+           MAX_WITHOUT);
     return FALSE;
   }
 
-  
+
   switch (parse_token(myarg, len, &curr, &value)) {
   case TOKEN_FEATURE: goto feature;
   case TOKEN_NUMBER: goto number;
@@ -899,21 +899,21 @@ parse_w( state *s, sb1 *myarg)
     printf("jenny: proper withouts look like -w2a1bc99a\n");
     return FALSE;
   }
-  
+
  end:
 
   /* sort the dimensions and features in this restriction */
   for (i=0; i<fe_len; ++i) {
     for (j=i+1; j<fe_len; ++j) {
       if ((fe[i].d > fe[j].d) ||
-	  ((fe[i].d == fe[j].d) && (fe[i].f > fe[j].f))) {
-	ub2 fe_temp;
-	fe_temp = fe[i].d;
-	fe[i].d = fe[j].d;
-	fe[j].d = fe_temp;
-	fe_temp = fe[i].f;
-	fe[i].f = fe[j].f;
-	fe[j].f = fe_temp;
+          ((fe[i].d == fe[j].d) && (fe[i].f > fe[j].f))) {
+        ub2 fe_temp;
+        fe_temp = fe[i].d;
+        fe[i].d = fe[j].d;
+        fe[j].d = fe_temp;
+        fe_temp = fe[i].f;
+        fe[i].f = fe[j].f;
+        fe[j].f = fe_temp;
       }
     }
   }
@@ -1002,11 +1002,11 @@ preliminary( state *s)
     int      i;
     for (i=0; i<w->len; ++i) {
       if (w->fe[i].d != old) {
-	wchain *wcx = (wchain *)my_alloc( s, sizeof(wchain));
-	wcx->w = w;
-	wcx->next = s->wc[w->fe[i].d];
-	s->wc[w->fe[i].d] = wcx;
-	old = w->fe[i].d;
+        wchain *wcx = (wchain *)my_alloc( s, sizeof(wchain));
+        wcx->w = w;
+        wcx->next = s->wc[w->fe[i].d];
+        s->wc[w->fe[i].d] = wcx;
+        old = w->fe[i].d;
       }
     }
   }
@@ -1034,7 +1034,7 @@ parse( int argc, char *argv[], state *s)
   }
   if (temp > MAX_DIMENSIONS) {
     printf("jenny: maximum number of dimensions is %d.  %ld is too many.\n",
-	   MAX_DIMENSIONS, temp);
+           MAX_DIMENSIONS, temp);
     return FALSE;
   }
   s->ndim = (ub2)temp;
@@ -1049,18 +1049,18 @@ parse( int argc, char *argv[], state *s)
 
       (void)parse_token(myarg, UB4MAXVAL, &curr, &temp);
       if (parse_token(myarg, UB4MAXVAL, &curr, &dummy) != TOKEN_END) {
-	printf("jenny: something was trailing a dimension number\n");
-	return FALSE;
+        printf("jenny: something was trailing a dimension number\n");
+        return FALSE;
       }
       if (temp > MAX_FEATURES) {
-	printf("jenny: dimensions must be smaller than %d.  %ld is too big.\n",
-	       MAX_FEATURES, temp);
-	return FALSE;
+        printf("jenny: dimensions must be smaller than %d.  %ld is too big.\n",
+               MAX_FEATURES, temp);
+        return FALSE;
       }
       if (temp < 2) {
-	printf("jenny: a dimension must have at least 2 features, not %lu\n",
-	       temp);
-	return FALSE;
+        printf("jenny: a dimension must have at least 2 features, not %lu\n",
+               temp);
+        return FALSE;
       }
       s->dim[j++] = (ub2)temp;
     } else if (argv[i][1] == 'h') {
@@ -1092,14 +1092,14 @@ parse( int argc, char *argv[], state *s)
       break;
     default:
       printf("jenny: legal arguments are numbers, -n, -s, -w, -h, not -%c\n",
-	     argv[i][1]);
+             argv[i][1]);
       return FALSE;
     }
   }                                            /* for (each argument) if '-' */
 
   if (s->n_final > s->ndim) {
     printf("jenny: %hhu-tuples are impossible with only %hu dimensions\n",
-	   s->n_final, s->ndim);
+           s->n_final, s->ndim);
     return FALSE;
   }
 
@@ -1153,8 +1153,8 @@ next_builder( state *s, feature *tuple, ub1 n)
   sb4 i = n;
 
   while (i-- &&
-	 tuple[i].d == s->ndim-n+i &&
-	 tuple[i].f == s->dim[tuple[i].d]-1)
+         tuple[i].d == s->ndim-n+i &&
+         tuple[i].f == s->dim[tuple[i].d]-1)
     ;
   if (i == -1)
     return FALSE;
@@ -1221,19 +1221,19 @@ build_tuples( state *s, ub2 d, ub2 f)
       s->tuple_tester->f[tuple[i].d] = tuple[i].f;
     }
     if (count_withouts(s->tuple_tester, s->wc2) ||
-	count_withouts(s->tuple_tester, s->wc3))
+        count_withouts(s->tuple_tester, s->wc3))
       goto make_next_tuple;
 
     /* is this tuple covered by the existing tests? */
     for (j=0; j<s->ntests; ++j) {
       test *t = s->t[j];
       for (i=0; i<n; ++i) {
-	if (t->f[tuple[i].d] != tuple[i].f) {
-	  break;
-	}
+        if (t->f[tuple[i].d] != tuple[i].f) {
+          break;
+        }
       }
       if (i == n) {
-	goto make_next_tuple;
+        goto make_next_tuple;
       }
     }
 
@@ -1301,7 +1301,7 @@ ub1   *mut)              /* mut[i] = 1 if I am allowed to adjust dimension i */
     ub4     j;
     ub2     best[MAX_FEATURES];                      /* best features so far */
     ub1     ok = TRUE;
-    
+
     for (j=ndim; j>0; --j) {
       ub2 fcount = 0;                    /* count of filled elements of best */
       ub2 mydim;                                    /* the current dimension */
@@ -1319,31 +1319,31 @@ ub1   *mut)              /* mut[i] = 1 if I am allowed to adjust dimension i */
 
       /* test every feature of this dimension, trying to make progress */
       for (k=0; k<s->dim[mydim]; ++k) {
-	ub2 newcount;
-	t->f[mydim] = k;
-	newcount = count_withouts(t, s->wc[mydim]);
-	if (newcount <= count) {
-	  if (newcount < count) {
-	    i = 0;                                      /* partial progress! */
-	    fcount = 0;
-	    count = newcount;
-	  }
-	  best[fcount++] = k;
-	}
+        ub2 newcount;
+        t->f[mydim] = k;
+        newcount = count_withouts(t, s->wc[mydim]);
+        if (newcount <= count) {
+          if (newcount < count) {
+            i = 0;                                      /* partial progress! */
+            fcount = 0;
+            count = newcount;
+          }
+          best[fcount++] = k;
+        }
       }
 
       /* choose one of the best features for this dimension at random */
       if (fcount == 0) {
-	printf("jenny: internal error a\n");
+        printf("jenny: internal error a\n");
       } else if (fcount == 1) {
-	t->f[mydim] = best[0];
+        t->f[mydim] = best[0];
       } else {
-	temp = (flearand(&s->r) % fcount);
-	t->f[mydim] = best[temp];
+        temp = (flearand(&s->r) % fcount);
+        t->f[mydim] = best[temp];
       }
 
       if (count > 0)
-	ok = FALSE;
+        ok = FALSE;
     }
     if (ok) {                                       /* no withouts disobeyed */
       return TRUE;
@@ -1367,7 +1367,7 @@ count_tuples( state *s, test *t, int d, int f)
 }
 
 static ub4
-maximize_coverage( 
+maximize_coverage(
 state *s,                                                    /* global state */
 test  *t,            /* testcase being built, already obeys all restrictions */
 ub1   *mut,                        /* mut[i] = 1 if I can adjust dimension i */
@@ -1409,41 +1409,41 @@ ub1    n)                            /* size of smallest tuple left to cover */
 
       /* for every feature in mydim, see if using it would improve coverage */
       for (f=0; f<s->dim[d]; ++f) {
-	t->f[d] = f;                            /* switch to the new feature */
-	if (!count_withouts(t, s->wc[d])) {         /* need to obey withouts */
-	  ub4 new_coverage = count_tuples(s, t, d, f);
-	  if (s->n[d][f] < best_n) {
-	    best_n = s->n[d][f];
-	    progress = TRUE;
-	    coverage = new_coverage;
-	    count = 0;
-	    best[count++] = f;
-	  } else if (s->n[d][f] == best_n && new_coverage >= coverage) {
-	    if (new_coverage > coverage) {
-	      progress = TRUE;
-	      coverage = new_coverage;
-	      count = 0;
-	    }
-	    best[count++] = f;
-	  }
-	}
+        t->f[d] = f;                            /* switch to the new feature */
+        if (!count_withouts(t, s->wc[d])) {         /* need to obey withouts */
+          ub4 new_coverage = count_tuples(s, t, d, f);
+          if (s->n[d][f] < best_n) {
+            best_n = s->n[d][f];
+            progress = TRUE;
+            coverage = new_coverage;
+            count = 0;
+            best[count++] = f;
+          } else if (s->n[d][f] == best_n && new_coverage >= coverage) {
+            if (new_coverage > coverage) {
+              progress = TRUE;
+              coverage = new_coverage;
+              count = 0;
+            }
+            best[count++] = f;
+          }
+        }
       }
 
-      /* 
+      /*
        * Change this dimension to the best features seen.
        * Worst case, everyone was worse than the old value, so best[0] will
        * be the old value.  Coverage will be the same and still no withouts
        * will be hit.
        */
       if (count == 0) {
-	printf("jenny: internal error b\n");
+        printf("jenny: internal error b\n");
       } else if (count == 1) {
-	t->f[d] = best[0];
+        t->f[d] = best[0];
       } else {
-	t->f[d] = best[flearand(&s->r) % count];
+        t->f[d] = best[flearand(&s->r) % count];
       }
       if (s->n[d][t->f[d]] == n)
-	total += coverage;
+        total += coverage;
     }
 
   } while (progress);
@@ -1452,7 +1452,7 @@ ub1    n)                            /* size of smallest tuple left to cover */
 
 
 /*
- * Generate one test that obeys all the restrictions and covers at 
+ * Generate one test that obeys all the restrictions and covers at
  * least one tuple.  Do not add it to the list of tests yet.  Return FALSE
  * if we couldn't satisfy the withouts while covering this tuple.
  */
@@ -1467,13 +1467,13 @@ generate_test( state *s, test *t, feature *tuple, ub1 n)
   /* mut[i] = 1 if I can modify dimension i */
   for (i=0; i<s->ndim; ++i) mut[i] = 1;
   for (i=0; i<n; ++i) mut[tuple[i].d] = 0;
-  
+
   for (iter=0; iter<MAX_ITERS; ++iter) {
     /* Produce a totally random testcase */
     for (i=0; i<s->ndim; ++i) {
       t->f[i] = flearand(&s->r) % (s->dim[i]);
     }
-    
+
     /* Plug in the chosen new tuple */
     for (i=0; i<n; ++i){
       t->f[tuple[i].d] = tuple[i].f;
@@ -1482,7 +1482,7 @@ generate_test( state *s, test *t, feature *tuple, ub1 n)
     /* If we can get all the withouts obeyed, break, success */
     if (!s->wc2 || obey_withouts(s, t, mut)) {
       if (count_withouts(t, s->wc2)) {
-	printf("internal error without %p\n", s->wc2);
+        printf("internal error without %p\n", s->wc2);
       }
       break;
     }
@@ -1526,27 +1526,27 @@ cover_tuples( state *s)
     for (d=0; d<s->ndim; ++d) {
       ub2 f;
       for (f=0; f<s->dim[d]; ++f) {
-	build_tuples(s, d, f);
-	if (s->n[d][f] < tuple_n) {
-	  tuple_n = s->n[d][f];
-	  tuple_count = s->tc[d][f];
-	  tuple = s->tu[d][f]->fe;
-	  tuple_f = f;
-	  tuple_d = d;
-	} else if (s->n[d][f] == tuple_n && s->tc[d][f] > tuple_count) {
-	  tuple_count = s->tc[d][f];
-	  tuple = s->tu[d][f]->fe;
-	  tuple_f = f;
-	  tuple_d = d;
-	}
+        build_tuples(s, d, f);
+        if (s->n[d][f] < tuple_n) {
+          tuple_n = s->n[d][f];
+          tuple_count = s->tc[d][f];
+          tuple = s->tu[d][f]->fe;
+          tuple_f = f;
+          tuple_d = d;
+        } else if (s->n[d][f] == tuple_n && s->tc[d][f] > tuple_count) {
+          tuple_count = s->tc[d][f];
+          tuple = s->tu[d][f]->fe;
+          tuple_f = f;
+          tuple_d = d;
+        }
       }
     }
 
     if (tuple_count == 0) {
       if (tuple_n == s->n_final)
-	break;                             /* no more tuples to cover, done! */
+        break;                             /* no more tuples to cover, done! */
       else
-	continue;
+        continue;
     }
 
 
@@ -1560,17 +1560,17 @@ cover_tuples( state *s)
 
       /* generate a test that covers the first tuple */
       if (!(this_count = generate_test(s, curr_test, tuple, tuple_n))) {
-	continue;
+        continue;
       }
       covered = TRUE;
 
       /* see how many tuples are covered altogether */
       if (this_count > best_count) {
-	test *temp = best_test;
-	best_test = curr_test;
-	curr_test = temp;
+        test *temp = best_test;
+        best_test = curr_test;
+        curr_test = temp;
 
-	best_count = this_count;
+        best_count = this_count;
       }
     }
 
@@ -1581,8 +1581,8 @@ cover_tuples( state *s)
 
       /* make a copy of tuple, because we'll be deleting it */
       for (i=0; i<tuple_n; ++i) {
-	extra[i].d = tuple[i].d;
-	extra[i].f = tuple[i].f;
+        extra[i].d = tuple[i].d;
+        extra[i].f = tuple[i].f;
       }
 
       printf("Could not cover tuple ");
@@ -1596,56 +1596,56 @@ cover_tuples( state *s)
       w->len = tuple_n;
       w->fe = (feature *)my_alloc( s, sizeof(feature)*tuple_n);
       for (i=0; i<tuple_n; ++i) {
-	w->fe[i].d = extra[i].d;
-	w->fe[i].f = extra[i].f;
+        w->fe[i].d = extra[i].d;
+        w->fe[i].f = extra[i].f;
       }
-      
+
       for (d=0; d<s->ndim; ++d) {
-	ub2      f;
-	tu_iter  ctx;
-	for (f=0; f<s->dim[d]; ++f) {
-	  ub1      n = s->n[d][f];
-	  feature *this = start_tuple(&ctx, &s->tu[d][f], n, &s->tc[d][f]);
-	
-	  /* remove all the tuples covered by it */
-	  while (this) {
-	    if (subset_tuple(extra, tuple_n, this, n)) {
-	      this = delete_tuple(&ctx);
-	    } else {
-	      this = next_tuple(&ctx);
-	    }
-	  }
-	}
+        ub2      f;
+        tu_iter  ctx;
+        for (f=0; f<s->dim[d]; ++f) {
+          ub1      n = s->n[d][f];
+          feature *this = start_tuple(&ctx, &s->tu[d][f], n, &s->tc[d][f]);
+
+          /* remove all the tuples covered by it */
+          while (this) {
+            if (subset_tuple(extra, tuple_n, this, n)) {
+              this = delete_tuple(&ctx);
+            } else {
+              this = next_tuple(&ctx);
+            }
+          }
+        }
       }
       my_free((char *)best_test->f);
       my_free((char *)best_test);
     } else {
       ub2      d;
       for (d=0; d<s->ndim; ++d) {
-	tu_iter  ctx;
-	ub2      f = best_test->f[d];
-	ub1      n = s->n[d][f];
-	feature *this = start_tuple(&ctx, &s->tu[d][f], n, &s->tc[d][f]);
-	
-	/* remove all the tuples covered by it */
-	while (this) {
-	  if (test_tuple(best_test->f, this, n)) {
-	    this = delete_tuple(&ctx);
-	  } else {
-	    this = next_tuple(&ctx);
-	  }
-	}
+        tu_iter  ctx;
+        ub2      f = best_test->f[d];
+        ub1      n = s->n[d][f];
+        feature *this = start_tuple(&ctx, &s->tu[d][f], n, &s->tc[d][f]);
+
+        /* remove all the tuples covered by it */
+        while (this) {
+          if (test_tuple(best_test->f, this, n)) {
+            this = delete_tuple(&ctx);
+          } else {
+            this = next_tuple(&ctx);
+          }
+        }
       }
 
       /* add it to the list of tests */
       if (!add_test(s, best_test)) {
-	printf("jenny: exceeded maximum number of tests\n");
-	my_free((char *)curr_test->f);
-	my_free((char *)curr_test);
-	my_free((char *)best_test->f);
-	my_free((char *)best_test);
-	cleanup(s);
-	exit(0);
+        printf("jenny: exceeded maximum number of tests\n");
+        my_free((char *)curr_test->f);
+        my_free((char *)curr_test);
+        my_free((char *)best_test->f);
+        my_free((char *)best_test);
+        cleanup(s);
+        exit(0);
       }
     }
   }
@@ -1655,7 +1655,7 @@ cover_tuples( state *s)
 }
 
 static void
-prepare_reduce( state *s) 
+prepare_reduce( state *s)
 {
   feature tuple[MAX_N];
   ub1     n = s->n_final;
@@ -1678,16 +1678,16 @@ prepare_reduce( state *s)
       s->tuple_tester->f[tuple[i].d] = tuple[i].f;
     }
     if (count_withouts(s->tuple_tester, s->wc2) ||
-	count_withouts(s->tuple_tester, s->wc3))
+        count_withouts(s->tuple_tester, s->wc3))
       goto make_next_tuple;
 
     for (i=0; i<s->ntests; ++i) {
       ub1 j;
       for (j=0; j<n; ++j)
-	if (s->t[i]->f[tuple[j].d] != tuple[j].f)
-	  break;
+        if (s->t[i]->f[tuple[j].d] != tuple[j].f)
+          break;
       if (j == n)
-	break;                              /* this test contains this tuple */
+        break;                              /* this test contains this tuple */
     }
 
     /* no tests cover this tuple */
@@ -1696,21 +1696,21 @@ prepare_reduce( state *s)
     } else {
       thistest = i;
       for (++i; i<s->ntests; ++i) {
-	ub1 j;
-	for (j=0; j<n; ++j)
-	  if (s->t[i]->f[tuple[j].d] != tuple[j].f)
-	    break;
-	if (j == n)
-	  break;                            /* this test contains this tuple */
+        ub1 j;
+        for (j=0; j<n; ++j)
+          if (s->t[i]->f[tuple[j].d] != tuple[j].f)
+            break;
+        if (j == n)
+          break;                            /* this test contains this tuple */
       }
       if (i == s->ntests) {
-	ub1 j;
-	for (j=0; j<n; ++j) {
-	  tu_iter ctx;
-	  (void)start_tuple(&ctx, &s->one[thistest][tuple[j].d], n, 
-			    &s->onec[thistest][tuple[j].d]);
-	  (void)insert_tuple(s, &ctx, tuple);
-	}
+        ub1 j;
+        for (j=0; j<n; ++j) {
+          tu_iter ctx;
+          (void)start_tuple(&ctx, &s->one[thistest][tuple[j].d], n,
+                            &s->onec[thistest][tuple[j].d]);
+          (void)insert_tuple(s, &ctx, tuple);
+        }
       }
     }
 
@@ -1744,7 +1744,7 @@ which_test( state *s)
 }
 
 static void
-reduce_tests( state *s) 
+reduce_tests( state *s)
 {
   ub4 t;
   prepare_reduce( s);
@@ -1769,19 +1769,19 @@ confirm( state *s)
       s->tuple_tester->f[offset[i].d] = offset[i].f;
     }
     if (count_withouts(s->tuple_tester, s->wc2) ||
-	count_withouts(s->tuple_tester, s->wc3))
+        count_withouts(s->tuple_tester, s->wc3))
       goto make_next_tuple;
 
     /* is this tuple covered by the existing tests? */
     for (j=0; j<s->ntests; ++j) {
       test *t = s->t[j];
       for (i=0; i<n; ++i) {
-	if (t->f[offset[i].d] != offset[i].f) {
-	  break;
-	}
+        if (t->f[offset[i].d] != offset[i].f) {
+          break;
+        }
       }
       if (i == n) {
-	goto make_next_tuple;
+        goto make_next_tuple;
       }
     }
 
@@ -1794,24 +1794,24 @@ confirm( state *s)
     }
     i=n;
     while (i-- &&
-	   offset[i].d == s->ndim-n+i &&
-	   offset[i].f == s->dim[offset[i].d]-1)
+           offset[i].d == s->ndim-n+i &&
+           offset[i].f == s->dim[offset[i].d]-1)
       ;
     if (i == -1)
       break;                                                         /* done */
     else if (offset[i].f < s->dim[offset[i].d]-1) {
       ++offset[i].f;                                    /* increment feature */
       for (i; i<n-1; ++i) {          /* reset all less significant positions */
-	offset[i+1].d = offset[i].d+1;
-	offset[i+1].f = 0;
+        offset[i+1].d = offset[i].d+1;
+        offset[i+1].f = 0;
       }
     }
     else {
       ++offset[i].d;   /* increment least significant non-maxed-out position */
       offset[i].f = (ub2)0;                             /* reset its feature */
       for (i; i<n-1; ++i) {          /* reset all less significant positions */
-	offset[i+1].d = offset[i].d+1;
-	offset[i+1].f = 0;
+        offset[i+1].d = offset[i].d+1;
+        offset[i+1].f = 0;
       }
     }
   }

commit 40680369f6899a41f283594e0b0c0d4c7bc9194f
Author: John Ralls <jralls at ceridwen.us>
Date:   Mon Jul 23 12:47:54 2018 -0700

    Fix up jenny so that it complies with std=C11.

diff --git a/borrowed/jenny/jenny.c b/borrowed/jenny/jenny.c
index 721b021..652dfd7 100644
--- a/borrowed/jenny/jenny.c
+++ b/borrowed/jenny/jenny.c
@@ -105,7 +105,8 @@ typedef  struct flearandctx {
 } flearandctx;
 
 /* Pseudorandom numbers, courtesy of FLEA */
-void flearand_batch( flearandctx *x) {
+static void
+flearand_batch( flearandctx *x) {
   ub4 a, b=x->b, c=x->c+(++x->z), d=x->d, i, *m=x->m, *r=x->r;
   for (i=0; i<FLEARAND_SIZE; ++i) {
     a = m[b % FLEARAND_SIZE];
@@ -118,7 +119,8 @@ void flearand_batch( flearandctx *x) {
   x->b=b; x->c=c; x->d=d;
 }
 
-ub4 flearand( flearandctx *x) {
+static ub4
+flearand( flearandctx *x) {
   if (!x->q--) {
     x->q = FLEARAND_SIZE-1;
     flearand_batch(x);
@@ -126,7 +128,8 @@ ub4 flearand( flearandctx *x) {
   return x->r[x->q];
 }
 
-void flearand_init( flearandctx *x, ub4 seed) {
+static void
+flearand_init( flearandctx *x, ub4 seed) {
   ub4    i;
 
   x->b = x->c = x->d = x->z = seed;
@@ -210,7 +213,8 @@ typedef  struct wchain {
 
 /* Return a count of how many withouts are disobeyed. */
 /* Also set a pointer to a randomly chosen violated without */
-int count_withouts(
+static int
+count_withouts(
 test     *t,                                                /* test to check */
 wchain   *wc)                                                /* restrictions */
 {
@@ -276,13 +280,15 @@ typedef  struct state {
 } state;
 
 
-void my_free( char *x)
+static void
+my_free( char *x)
 {
   free(x);
 }
 
 /* zero out a list of tuples */
-void truncate_tuple( tu_arr **tu, ub4 *count)
+static void
+truncate_tuple( tu_arr **tu, ub4 *count)
 {
   while (*tu) {
     tu_arr *tu2 = *tu;
@@ -293,7 +299,8 @@ void truncate_tuple( tu_arr **tu, ub4 *count)
 }
 
 /* delete the i-th test */
-void delete_test( state *s, ub4 i)
+static void
+delete_test( state *s, ub4 i)
 {
   test *t = s->t[i];
 
@@ -312,7 +319,8 @@ void delete_test( state *s, ub4 i)
   }
 }
 
-void cleanup(state *s)
+static void
+cleanup(state *s)
 {
   if (s->tu) {
     ub2 d,f;
@@ -416,7 +424,8 @@ void cleanup(state *s)
 }
 
 
-char *my_alloc( state *s, size_t len)
+static char*
+my_alloc( state *s, size_t len)
 {
   char *rsl;
   if (!(rsl = (char *)malloc(len+sizeof(size_t)))) {
@@ -429,7 +438,8 @@ char *my_alloc( state *s, size_t len)
 }
 
 /* insert a tuple into a tuple array */
-int insert_tuple( state *s, tu_iter *ctx, feature *tuple)
+static int
+insert_tuple( state *s, tu_iter *ctx, feature *tuple)
 {
   ub4      i;
   feature *fe;
@@ -457,7 +467,8 @@ int insert_tuple( state *s, tu_iter *ctx, feature *tuple)
 }
 
 /* print out a single tuple */
-void show_tuple( feature *fe, ub2 len)
+static void
+show_tuple( feature *fe, ub2 len)
 {
   ub4 i;
   for (i=0; i<len; ++i) {
@@ -467,7 +478,8 @@ void show_tuple( feature *fe, ub2 len)
 }
 
 /* delete a tuple from a tuple array */
-feature *delete_tuple( tu_iter *ctx)
+static feature*
+delete_tuple( tu_iter *ctx)
 {
   feature *fe;
   ub4      i;
@@ -501,7 +513,8 @@ feature *delete_tuple( tu_iter *ctx)
 }
 
 /* start a tuple iterator */
-feature *start_tuple( tu_iter *ctx, tu_arr **tu, ub4 n, ub4 *count)
+static feature*
+start_tuple( tu_iter *ctx, tu_arr **tu, ub4 n, ub4 *count)
 {
   ctx->tu = tu;
   ctx->offset = 0;
@@ -517,7 +530,8 @@ feature *start_tuple( tu_iter *ctx, tu_arr **tu, ub4 n, ub4 *count)
 }
 
 /* get the next tuple from a tuple iterator (0 if no more tuples) */
-static feature *next_tuple( tu_iter *ctx)
+static feature*
+next_tuple( tu_iter *ctx)
 {
   if (++ctx->offset < (*ctx->tu)->len) {
     ctx->fe += ctx->n;
@@ -535,7 +549,8 @@ static feature *next_tuple( tu_iter *ctx)
 
 
 /* test if this test covers this tuple */
-static int test_tuple( ub2 *test, feature *tuple, ub2 n)
+static int
+test_tuple( ub2 *test, feature *tuple, ub2 n)
 {
   sb4 i;
   for (i=0; i<n; ++i) {
@@ -547,7 +562,8 @@ static int test_tuple( ub2 *test, feature *tuple, ub2 n)
 }
 
 /* test if first tuple (t1, n1) is a subset of second tuple (t2, n2) */
-int subset_tuple( feature *t1, ub1 n1, feature *t2, ub1 n2)
+static int
+subset_tuple( feature *t1, ub1 n1, feature *t2, ub1 n2)
 {
   sb4 i, j;
   if (n2 < n1)
@@ -564,7 +580,8 @@ int subset_tuple( feature *t1, ub1 n1, feature *t2, ub1 n2)
   return TRUE;
 }
 
-void initialize( state *s)
+static void
+initialize( state *s)
 {
   /* make all freeable pointers start out zero */
   s->dim          = (ub2 *)0;
@@ -590,7 +607,8 @@ void initialize( state *s)
 
 
 /* add one test to the list of tests */
-int add_test( state *s, test *t)
+static int
+add_test( state *s, test *t)
 {
   ub4 i;
   if (s->ntests == MAX_TESTS) {
@@ -613,7 +631,8 @@ int add_test( state *s, test *t)
  * Place the token value in *rsl
  * Return the token type
  */
-token_type parse_token(char *inp, ub4 inl, ub4 *curr, ub4 *rsl)
+static token_type
+parse_token(char *inp, ub4 inl, ub4 *curr, ub4 *rsl)
 {
   char mychar;
   ub4  i;
@@ -664,7 +683,8 @@ token_type parse_token(char *inp, ub4 inl, ub4 *curr, ub4 *rsl)
 
 #define BUFSIZE (MAX_DIMENSIONS*7+2)
 /* load old tests before generating new ones */
-int load( state *s, char *testfile)
+static int
+load( state *s, char *testfile)
 {
   char  buf[BUFSIZE];            /* buffer holding a line read from the file */
   FILE *f;
@@ -703,7 +723,7 @@ int load( state *s, char *testfile)
 	goto failure;
       }
       if (value-1 != i) {
-	printf("jenny: -o, number %d found out-of-place\n", value);
+	printf("jenny: -o, number %lu found out-of-place\n", value);
 	goto failure;
       }
       if (parse_token(buf, UB4MAXVAL, &curr, &value) != TOKEN_FEATURE) {
@@ -711,7 +731,7 @@ int load( state *s, char *testfile)
 	goto failure;
       }
       if (value >= s->dim[i]) {
-	printf("jenny: -o, feature %c does not exist in dimension %d\n", 
+	printf("jenny: -o, feature %c does not exist in dimension %lu\n", 
 	       feature_name[value], i+1);
 	goto failure;
       }
@@ -773,7 +793,8 @@ static const sb1 *jenny_doc[] = {
 
 
 /* parse -n, the tuple size */
-int parse_n( state *s, char *myarg)
+static int
+parse_n( state *s, char *myarg)
 {
   ub4 curr = 0;
   ub4 temp = UB4MAXVAL;
@@ -805,7 +826,8 @@ int parse_n( state *s, char *myarg)
 
 
 /* parse -w, a without */
-int parse_w( state *s, sb1 *myarg)
+static int
+parse_w( state *s, sb1 *myarg)
 {
   without   *w;
   wchain    *wc;
@@ -835,7 +857,7 @@ int parse_w( state *s, sb1 *myarg)
     return FALSE;
   }
   if (used[dimension_number]) {
-    printf("jenny: -w, dimension %d was given twice in a single without\n",
+    printf("jenny: -w, dimension %lu was given twice in a single without\n",
 	   dimension_number+1);
     return FALSE;
   }
@@ -855,7 +877,7 @@ int parse_w( state *s, sb1 *myarg)
   
  feature:
   if (value >= s->dim[dimension_number]) {
-    printf("jenny: -w, there is no feature '%c' in dimension %d\n",
+    printf("jenny: -w, there is no feature '%c' in dimension %lu\n",
 	   feature_name[value], dimension_number+1);
     return FALSE;
   }
@@ -913,7 +935,8 @@ int parse_w( state *s, sb1 *myarg)
 }
 
 /* parse -s, a seed for the random number generator */
-int parse_s( state *s, sb1 *myarg)
+static int
+parse_s( state *s, sb1 *myarg)
 {
   ub4 seed = 0;
   ub4 dummy = 0;
@@ -930,7 +953,8 @@ int parse_s( state *s, sb1 *myarg)
   return TRUE;
 }
 
-void preliminary( state *s)
+static void
+preliminary( state *s)
 {
   wchain  *wc;
   ub4      d;
@@ -989,7 +1013,8 @@ void preliminary( state *s)
 }
 
 /* parse the inputs */
-int parse( int argc, char *argv[], state *s)
+static int
+parse( int argc, char *argv[], state *s)
 {
   int   i, j;
   ub4   temp;
@@ -997,7 +1022,7 @@ int parse( int argc, char *argv[], state *s)
 
   /* internal check: we have MAX_FEATURES names for features */
   if (strlen(feature_name) != MAX_FEATURES) {
-    printf("feature_name length is wrong, %d\n", strlen(feature_name));
+    printf("feature_name length is wrong, %lu\n", strlen(feature_name));
     return FALSE;
   }
 
@@ -1008,7 +1033,7 @@ int parse( int argc, char *argv[], state *s)
     }
   }
   if (temp > MAX_DIMENSIONS) {
-    printf("jenny: maximum number of dimensions is %ld.  %ld is too many.\n",
+    printf("jenny: maximum number of dimensions is %d.  %ld is too many.\n",
 	   MAX_DIMENSIONS, temp);
     return FALSE;
   }
@@ -1033,7 +1058,7 @@ int parse( int argc, char *argv[], state *s)
 	return FALSE;
       }
       if (temp < 2) {
-	printf("jenny: a dimension must have at least 2 features, not %d\n",
+	printf("jenny: a dimension must have at least 2 features, not %lu\n",
 	       temp);
 	return FALSE;
       }
@@ -1041,7 +1066,7 @@ int parse( int argc, char *argv[], state *s)
     } else if (argv[i][1] == 'h') {
       int i;
       for (i=0; i<(sizeof(jenny_doc)/sizeof(ub1 *)); ++i) {
-	printf(jenny_doc[i]);
+          printf("%s", jenny_doc[i]);
       }
       return FALSE;
     }
@@ -1073,7 +1098,7 @@ int parse( int argc, char *argv[], state *s)
   }                                            /* for (each argument) if '-' */
 
   if (s->n_final > s->ndim) {
-    printf("jenny: %ld-tuples are impossible with only %d dimensions\n",
+    printf("jenny: %hhu-tuples are impossible with only %hu dimensions\n",
 	   s->n_final, s->ndim);
     return FALSE;
   }
@@ -1091,17 +1116,19 @@ int parse( int argc, char *argv[], state *s)
 }
 
 /* print out a single test */
-void report( test *t, ub2 len)
+static void
+report( test *t, ub2 len)
 {
   ub4 i;
   for (i=0; i<len; ++i) {
-    printf(" %d%c", i+1, feature_name[t->f[i]]);
+    printf(" %lu%c", i+1, feature_name[t->f[i]]);
   }
   printf(" \n");
 }
 
 /* print out all the tests */
-void report_all( state *s)
+static void
+report_all( state *s)
 {
   ub4   i;
   for (i=0; i<s->ntests; ++i) {
@@ -1110,7 +1137,8 @@ void report_all( state *s)
 }
 
 
-void start_builder( state *s, feature *tuple, ub1 n)
+static void
+start_builder( state *s, feature *tuple, ub1 n)
 {
   ub1 i;
   for (i=0; i<n; ++i) {
@@ -1119,7 +1147,8 @@ void start_builder( state *s, feature *tuple, ub1 n)
   }
 }
 
-int next_builder( state *s, feature *tuple, ub1 n)
+static int
+next_builder( state *s, feature *tuple, ub1 n)
 {
   sb4 i = n;
 
@@ -1148,7 +1177,8 @@ int next_builder( state *s, feature *tuple, ub1 n)
 }
 
 
-void build_tuples( state *s, ub2 d, ub2 f)
+static void
+build_tuples( state *s, ub2 d, ub2 f)
 {
   feature  offset[MAX_N];                                      /* n-1-tuples */
   feature  tuple[MAX_N];                      /* n-tuples that include (d,f) */
@@ -1243,7 +1273,8 @@ void build_tuples( state *s, ub2 d, ub2 f)
  * in any disobeyed without.
  */
 #define MAX_NO_PROGRESS 2
-int obey_withouts(
+static int
+obey_withouts(
 state *s,                                                    /* global state */
 test  *t,                                                /* test being built */
 ub1   *mut)              /* mut[i] = 1 if I am allowed to adjust dimension i */
@@ -1321,7 +1352,8 @@ ub1   *mut)              /* mut[i] = 1 if I am allowed to adjust dimension i */
   return FALSE;               /* failure, could not satisfy all the withouts */
 }
 
-ub4 count_tuples( state *s, test *t, int d, int f)
+static ub4
+count_tuples( state *s, test *t, int d, int f)
 {
   ub4      count = 0;
   ub1      n = s->n[d][f];
@@ -1334,7 +1366,8 @@ ub4 count_tuples( state *s, test *t, int d, int f)
   return count;
 }
 
-ub4 maximize_coverage( 
+static ub4
+maximize_coverage( 
 state *s,                                                    /* global state */
 test  *t,            /* testcase being built, already obeys all restrictions */
 ub1   *mut,                        /* mut[i] = 1 if I can adjust dimension i */
@@ -1424,7 +1457,8 @@ ub1    n)                            /* size of smallest tuple left to cover */
  * if we couldn't satisfy the withouts while covering this tuple.
  */
 #define MAX_ITERS 10
-ub4 generate_test( state *s, test *t, feature *tuple, ub1 n)
+static ub4
+generate_test( state *s, test *t, feature *tuple, ub1 n)
 {
   int  iter, i;
   ub1  mut[MAX_DIMENSIONS];        /* mut[i] = 1 if I can adjust dimension i */
@@ -1448,7 +1482,7 @@ ub4 generate_test( state *s, test *t, feature *tuple, ub1 n)
     /* If we can get all the withouts obeyed, break, success */
     if (!s->wc2 || obey_withouts(s, t, mut)) {
       if (count_withouts(t, s->wc2)) {
-	printf("internal error without %d\n", s->wc2);
+	printf("internal error without %p\n", s->wc2);
       }
       break;
     }
@@ -1470,7 +1504,8 @@ ub4 generate_test( state *s, test *t, feature *tuple, ub1 n)
 }
 
 #define GROUP_SIZE 5
-void cover_tuples( state *s)
+static void
+cover_tuples( state *s)
 {
   test *curr_test;
   curr_test = (test *)my_alloc( s, sizeof(test));
@@ -1619,7 +1654,8 @@ void cover_tuples( state *s)
   my_free((char *)curr_test);
 }
 
-void prepare_reduce( state *s) 
+static void
+prepare_reduce( state *s) 
 {
   feature tuple[MAX_N];
   ub1     n = s->n_final;
@@ -1688,7 +1724,8 @@ void prepare_reduce( state *s)
 }
 
 /* find a test to try to eliminate */
-int which_test( state *s)
+static int
+which_test( state *s)
 {
   ub4 t;
   ub4 mincount = ~0;
@@ -1706,7 +1743,8 @@ int which_test( state *s)
   return mint;
 }
 
-void reduce_tests( state *s) 
+static void
+reduce_tests( state *s) 
 {
   ub4 t;
   prepare_reduce( s);
@@ -1714,7 +1752,8 @@ void reduce_tests( state *s)
 }
 
 /* Confirm that every tuple is covered by either a testcase or a without */
-int confirm( state *s)
+static int
+confirm( state *s)
 {
   feature  offset[MAX_N];
   sb4      i, j, n = s->n_final;
@@ -1781,7 +1820,8 @@ int confirm( state *s)
 }
 
 
-void driver( int argc, char *argv[])
+static void
+driver( int argc, char *argv[])
 {
   state s;                                                 /* internal state */
 
@@ -1798,9 +1838,9 @@ void driver( int argc, char *argv[])
   cleanup(&s);                                      /* deallocate everything */
 }
 
-int main( int argc, char *argv[])
+int
+main( int argc, char *argv[])
 {
   driver(argc, argv);
   return 0;
 }
-

commit 827c43d935b3bf88cfa7d52ea58a3d389299c05d
Author: John Ralls <jralls at ceridwen.us>
Date:   Mon Jul 23 12:47:25 2018 -0700

    Add jenny to the dist and compile it.

diff --git a/borrowed/CMakeLists.txt b/borrowed/CMakeLists.txt
index 421d1fe..b849ca5 100644
--- a/borrowed/CMakeLists.txt
+++ b/borrowed/CMakeLists.txt
@@ -5,5 +5,5 @@ if (WITH_GNUCASH)
   add_subdirectory(gwengui-gtk3)
 endif (WITH_GNUCASH)
 
-set_local_dist(borrowed_DIST_local CMakeLists.txt README)
+set_local_dist(borrowed_DIST_local jenny/jenny.c CMakeLists.txt README)
 set(borrowed_DIST ${borrowed_DIST_local} ${libc_DIST} ${guile-json_DIST} ${goffice_DIST} ${gwengui_gtk3_DIST} PARENT_SCOPE)
diff --git a/common/test-core/CMakeLists.txt b/common/test-core/CMakeLists.txt
index b57ab5c..9a757ad 100644
--- a/common/test-core/CMakeLists.txt
+++ b/common/test-core/CMakeLists.txt
@@ -90,3 +90,5 @@ if(NOT GMOCK_SHARED_LIB)
     ${GTEST_INCLUDE_DIR} ${GTEST_SRC_DIR}
     ${GMOCK_INCLUDE_DIR} ${GMOCK_SRC_DIR})
 endif()
+
+add_executable(jenny  ${CMAKE_SOURCE_DIR}/borrowed/jenny/jenny.c)
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 3e5dfbf..80cf8c0 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -33,6 +33,7 @@ borrowed/gwengui-gtk3/w_textedit.c
 borrowed/gwengui-gtk3/w_vlayout.c
 borrowed/gwengui-gtk3/w_vline.c
 borrowed/gwengui-gtk3/w_vspacer.c
+borrowed/jenny/jenny.c
 borrowed/libc/libc-missing-noop.c
 borrowed/libc/setenv.c
 borrowed/libc/strfmon.c

commit 6d605762ddcc99c93b58450634495d9c178498db
Author: John Ralls <jralls at ceridwen.us>
Date:   Mon Jul 23 12:00:54 2018 -0700

    Delete the last vestiges of timepair.

diff --git a/libgnucash/engine/engine-helpers-guile.h b/libgnucash/engine/engine-helpers-guile.h
index ad97e9c..41fda9a 100644
--- a/libgnucash/engine/engine-helpers-guile.h
+++ b/libgnucash/engine/engine-helpers-guile.h
@@ -32,10 +32,7 @@
 
 /* Helpers for various conversions to and from guile */
 
-SCM      gnc_timespec2timepair(Timespec t);
-Timespec gnc_timepair2timespec(SCM x);
 GDate    gnc_time64_to_GDate(SCM x);
-int      gnc_timepair_p(SCM x);
 
 SCM  gnc_guid2scm(GncGUID guid);
 GncGUID gnc_scm2guid(SCM guid_scm);
diff --git a/libgnucash/engine/engine-helpers.c b/libgnucash/engine/engine-helpers.c
index f646113..f589346 100644
--- a/libgnucash/engine/engine-helpers.c
+++ b/libgnucash/engine/engine-helpers.c
@@ -284,28 +284,6 @@ gnc_book_option_remove_cb (gchar *key, GncBOCb func, gpointer user_data)
     }
 }
 
-SCM
-gnc_timespec2timepair(Timespec t)
-{
-    SCM secs;
-    SCM nsecs;
-
-    secs = scm_from_int64(t.tv_sec);
-    nsecs = scm_from_long (t.tv_nsec);
-    return(scm_cons(secs, nsecs));
-}
-
-Timespec
-gnc_timepair2timespec(SCM x)
-{
-    Timespec result = {0, 0};
-    if (gnc_timepair_p (x))
-    {
-        result.tv_sec = scm_to_int64(SCM_CAR(x));
-        result.tv_nsec = scm_to_long(SCM_CDR(x));
-    }
-    return(result);
-}
 
 GDate gnc_time64_to_GDate(SCM x)
 {
@@ -313,14 +291,6 @@ GDate gnc_time64_to_GDate(SCM x)
     return time64_to_gdate(time);
 }
 
-int
-gnc_timepair_p(SCM x)
-{
-    return(scm_is_pair(x) &&
-           (scm_is_signed_integer(SCM_CAR(x), INT64_MIN, INT64_MAX) &&
-            scm_is_signed_integer(SCM_CDR(x), INT64_MIN, INT64_MAX)));
-}
-
 SCM
 gnc_guid2scm(GncGUID guid)
 {
@@ -390,8 +360,6 @@ gnc_guid_p(SCM guid_scm)
  *   Each OR term is a list of AND terms.
  *   Each AND term is a list of one of the following forms:
  *
- *   ('pd-date pr-type sense-bool use-start-bool start-timepair
- *             use-end-bool use-end-timepair)
  *   ('pd-amount pr-type sense-bool amt-match-how amt-match-sign amount)
  *   ('pd-account pr-type sense-bool acct-match-how list-of-account-guids)
  *   ('pd-string pr-type sense-bool case-sense-bool use-regexp-bool string)
diff --git a/libgnucash/engine/gnc-date.h b/libgnucash/engine/gnc-date.h
index f940817..2b34ae3 100644
--- a/libgnucash/engine/gnc-date.h
+++ b/libgnucash/engine/gnc-date.h
@@ -329,8 +329,8 @@ Timespec timespec_diff(const Timespec *ta, const Timespec *tb);
 /** absolute value, also normalized */
 Timespec timespec_abs(const Timespec *t);
 
-/** convert a timepair on a certain day (localtime) to
- * the timepair representing midday on that day. Watch out - this is *not* the
+/** convert a timespec on a certain day (localtime) to
+ * the timespec representing midday on that day. Watch out - this is *not* the
  * first second of the day, which is returned by various other functions
  * returning a Timespec. */
 Timespec timespecCanonicalDayTime(Timespec t);
diff --git a/libgnucash/engine/kvp-scm.cpp b/libgnucash/engine/kvp-scm.cpp
index 07a7859..ba7e785 100644
--- a/libgnucash/engine/kvp-scm.cpp
+++ b/libgnucash/engine/kvp-scm.cpp
@@ -56,11 +56,6 @@ gnc_scm_to_kvp_value_ptr(SCM val)
         auto tmpguid = guid_copy(&guid);
         return new KvpValue{tmpguid};
     }
-    else if (gnc_timepair_p(val))
-    {
-        Timespec ts = gnc_timepair2timespec(val);
-        return new KvpValue{ts};
-    }
     else if (scm_is_string(val))
     {
         return new KvpValue{gnc_scm_to_utf8_string(val)};
@@ -106,10 +101,6 @@ gnc_kvp_value_ptr_to_scm(KvpValue* val)
         return gnc_guid2scm(*tempguid);
     }
     break;
-    case KvpValue::Type::TIMESPEC:
-        return gnc_timespec2timepair(val->get<Timespec>());
-        break;
-
     case KvpValue::Type::FRAME:
     {
         auto frame = val->get<KvpFrame*>();
@@ -117,10 +108,6 @@ gnc_kvp_value_ptr_to_scm(KvpValue* val)
             return SWIG_NewPointerObj(frame, SWIG_TypeQuery("_p_KvpFrame"), 0);
     }
     break;
-    case KvpValue::Type::GDATE:
-        return gnc_timespec2timepair(gdate_to_timespec(val->get<GDate>()));
-
-        /* FIXME: handle types below */
     case KvpValue::Type::GLIST:
     default:
 	break;

commit 773b070345bf479afba3b907ed48c1fd47fb589e
Author: John Ralls <jralls at ceridwen.us>
Date:   Mon Jul 23 12:00:12 2018 -0700

    Don't set transaction properties via scheme in C code.

diff --git a/gnucash/register/ledger-core/split-register.c b/gnucash/register/ledger-core/split-register.c
index f534f28..9e3beac 100644
--- a/gnucash/register/ledger-core/split-register.c
+++ b/gnucash/register/ledger-core/split-register.c
@@ -1386,7 +1386,7 @@ gnc_split_register_save_to_scm (SplitRegister *reg,
         time64 time;
         cell = gnc_table_layout_get_cell (reg->table->layout, DATE_CELL);
         gnc_date_cell_get_date ((DateCell *) cell, &time);
-        gnc_trans_scm_set_date(trans_scm, time);
+        xaccTransSetDatePostedSecsNormalized(trans, time);
     }
 
     if (gnc_table_layout_get_cell_changed (reg->table->layout, NUM_CELL, TRUE))
@@ -1395,7 +1395,7 @@ gnc_split_register_save_to_scm (SplitRegister *reg,
 
         value = gnc_table_layout_get_cell_value (reg->table->layout, NUM_CELL);
         if (reg->use_tran_num_for_num_field)
-            gnc_trans_scm_set_num (trans_scm, value);
+            xaccTransSetNum (trans, value);
      /* else this contains the same as ACTN_CELL which is already handled below *
       * and the TNUM_CELL contains transaction number which is handled in next  *
       * if statement. */
@@ -1407,7 +1407,7 @@ gnc_split_register_save_to_scm (SplitRegister *reg,
 
         value = gnc_table_layout_get_cell_value (reg->table->layout, TNUM_CELL);
         if (!reg->use_tran_num_for_num_field)
-            gnc_trans_scm_set_num (trans_scm, value);
+            xaccTransSetNum (trans, value);
      /* else this cell is not used */
     }
 
@@ -1416,7 +1416,7 @@ gnc_split_register_save_to_scm (SplitRegister *reg,
         const char *value;
 
         value = gnc_table_layout_get_cell_value (reg->table->layout, DESC_CELL);
-        gnc_trans_scm_set_description (trans_scm, value);
+        xaccTransSetDescription (trans, value);
     }
 
     if (gnc_table_layout_get_cell_changed (reg->table->layout, NOTES_CELL, TRUE))
@@ -1424,7 +1424,7 @@ gnc_split_register_save_to_scm (SplitRegister *reg,
         const char *value;
 
         value = gnc_table_layout_get_cell_value (reg->table->layout, NOTES_CELL);
-        gnc_trans_scm_set_notes (trans_scm, value);
+        xaccTransSetNotes (trans, value);
     }
 
     if (gnc_table_layout_get_cell_changed (reg->table->layout, RECN_CELL, TRUE))
diff --git a/libgnucash/app-utils/guile-util.c b/libgnucash/app-utils/guile-util.c
index 1d2b00a..2628919 100644
--- a/libgnucash/app-utils/guile-util.c
+++ b/libgnucash/app-utils/guile-util.c
@@ -700,105 +700,6 @@ gnc_copy_trans_scm_onto_trans_swap_accounts(SCM trans_scm,
 }
 
 /********************************************************************\
- * gnc_trans_scm_set_date                                           *
- *   set the date of a scheme transaction.                          *
- *                                                                  *
- * Args: trans_scm - the scheme transaction                         *
- *       ts        - the time to set                                *
- * Returns: Nothing                                                 *
-\********************************************************************/
-void
-gnc_trans_scm_set_date(SCM trans_scm, time64 time)
-{
-    SCM arg;
-    Timespec ts = {time, 0};
-    initialize_scm_functions();
-    if (!gnc_is_trans_scm(trans_scm))
-        return;
-    arg = gnc_timespec2timepair(ts);
-    scm_call_2(setters.trans_scm_date, trans_scm, arg);
-}
-
-
-/********************************************************************\
- * gnc_trans_scm_set_num                                            *
- *   set the num of a scheme transaction.                           *
- *                                                                  *
- * Args: trans_scm - the scheme transaction                         *
- *       num       - the num to set                                 *
- * Returns: Nothing                                                 *
-\********************************************************************/
-void
-gnc_trans_scm_set_num(SCM trans_scm, const char *num)
-{
-    SCM arg;
-
-    initialize_scm_functions();
-
-    if (!gnc_is_trans_scm(trans_scm))
-        return;
-    if (num == NULL)
-        return;
-
-    arg = scm_from_utf8_string(num);
-
-    scm_call_2(setters.trans_scm_num, trans_scm, arg);
-}
-
-
-/********************************************************************\
- * gnc_trans_scm_set_description                                    *
- *   set the description of a scheme transaction.                   *
- *                                                                  *
- * Args: trans_scm   - the scheme transaction                       *
- *       description - the description to set                       *
- * Returns: Nothing                                                 *
-\********************************************************************/
-void
-gnc_trans_scm_set_description(SCM trans_scm, const char *description)
-{
-    SCM arg;
-
-    initialize_scm_functions();
-
-    if (!gnc_is_trans_scm(trans_scm))
-        return;
-    if (description == NULL)
-        return;
-
-    arg = scm_from_utf8_string(description);
-
-    scm_call_2(setters.trans_scm_description, trans_scm, arg);
-}
-
-
-/********************************************************************\
- * gnc_trans_scm_set_notes                                          *
- *   set the notes of a scheme transaction.                         *
- *                                                                  *
- * Args: trans_scm - the scheme transaction                         *
- *       notes     - the notes to set                               *
- * Returns: Nothing                                                 *
-\********************************************************************/
-void
-gnc_trans_scm_set_notes(SCM trans_scm, const char *notes)
-{
-    SCM arg;
-
-    initialize_scm_functions();
-
-    if (!gnc_is_trans_scm(trans_scm))
-        return;
-    if (notes == NULL)
-        return;
-
-    arg = scm_from_utf8_string(notes);
-
-    scm_call_2(setters.trans_scm_notes, trans_scm, arg);
-}
-
-
-/********************************************************************\
  * gnc_trans_scm_append_split_scm                                   *
  *   append the scheme split onto the scheme transaction            *
  *                                                                  *
diff --git a/libgnucash/app-utils/guile-util.h b/libgnucash/app-utils/guile-util.h
index 9623172..f95d38e 100644
--- a/libgnucash/app-utils/guile-util.h
+++ b/libgnucash/app-utils/guile-util.h
@@ -68,10 +68,6 @@ void   gnc_copy_trans_scm_onto_trans_swap_accounts(SCM trans_scm,
         gboolean do_commit,
         QofBook *book);
 
-void   gnc_trans_scm_set_date(SCM trans_scm, time64 time);
-void   gnc_trans_scm_set_num(SCM trans_scm, const char *num);
-void   gnc_trans_scm_set_description(SCM trans_scm, const char *description);
-void   gnc_trans_scm_set_notes(SCM trans_scm, const char *notes);
 void   gnc_trans_scm_append_split_scm(SCM trans_scm, SCM split_scm);
 
 SCM    gnc_trans_scm_get_split_scm(SCM trans_scm, int index);

commit 64778fcad50815ba86a56c780b23173d03ce6bfb
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Sun Jul 22 12:55:55 2018 +0100

    Fix error when options dialogue is open when app closed
    
    With the options dialogue open when Gnucash is closed this error is
    logged in the trace file, gnc_close_gui_component() component not found.
    
    This is fixed by reversing the components list found for session so the
    options dialogue is closed before the report window.

diff --git a/libgnucash/app-utils/gnc-component-manager.c b/libgnucash/app-utils/gnc-component-manager.c
index c32be01..2d909dc 100644
--- a/libgnucash/app-utils/gnc-component-manager.c
+++ b/libgnucash/app-utils/gnc-component-manager.c
@@ -827,6 +827,9 @@ gnc_close_gui_component_by_session (gpointer session)
 
     list = find_components_by_session (session);
 
+    // reverse the list so class like dialog-options close before window-report
+    list = g_list_reverse (list);
+
     for (node = list; node; node = node->next)
     {
         ComponentInfo *ci = node->data;

commit 5c90f677e556d08b82628a1b72c130a67b535fa1
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Sun Jul 22 12:39:44 2018 +0100

    Remove some white space and tabs from dialog-options.c

diff --git a/gnucash/gnome-utils/dialog-options.c b/gnucash/gnome-utils/dialog-options.c
index 6a78c40..e41b4bb 100644
--- a/gnucash/gnome-utils/dialog-options.c
+++ b/gnucash/gnome-utils/dialog-options.c
@@ -67,7 +67,7 @@
 /* This static indicates the debugging module that this .o belongs to.  */
 static QofLogModule log_module = GNC_MOD_GUI;
 
-#define DIALOG_OPTIONS_CM_CLASS "dialog-options"
+#define DIALOG_OPTIONS_CM_CLASS      "dialog-options"
 #define DIALOG_BOOK_OPTIONS_CM_CLASS "dialog-book-options"
 
 #define GNC_PREFS_GROUP              "dialogs.options"
@@ -105,7 +105,7 @@ struct gnc_option_win
     gpointer             close_cb_data;
 
     /* Hold onto this for a complete reset */
-    GNCOptionDB *		option_db;
+    GNCOptionDB *option_db;
 
     /* Hold on to this to unregister the right class */
     const char *component_class;
@@ -696,8 +696,7 @@ gnc_set_default_gain_loss_account_widget(gnc_commodity *commodity)
                 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(
                         book_currency_data->default_gain_loss_account_widget),
                         TRUE);
-                col = 
-                    gnc_tree_view_add_text_column(GNC_TREE_VIEW(
+                col = gnc_tree_view_add_text_column(GNC_TREE_VIEW(
                         book_currency_data->default_gain_loss_account_widget),
                          _("Currency"), /* title */
                         "commodity", /* pref name */
@@ -713,8 +712,7 @@ gnc_set_default_gain_loss_account_widget(gnc_commodity *commodity)
                 gnc_tree_view_account_column_add_color (GNC_TREE_VIEW_ACCOUNT(
                          book_currency_data->default_gain_loss_account_widget), col);
 
-                col =
-                    gnc_tree_view_add_toggle_column(GNC_TREE_VIEW(
+                col = gnc_tree_view_add_toggle_column(GNC_TREE_VIEW(
                         book_currency_data->default_gain_loss_account_widget),
                         _("Placeholder"),
                         /* Translators: This string has a context prefix; the
@@ -1918,7 +1916,7 @@ gnc_options_dialog_build_contents (GNCOptionWin *propertybox,
 }
 
 /********************************************************************\
- * gnc_options_dialog_build_contents_full                                *
+ * gnc_options_dialog_build_contents_full                           *
  *   builds an options dialog given a property box and an options   *
  *   database and make the dialog visible depending on the          *
  *   show_dialog flag                                               *
@@ -2121,10 +2119,10 @@ gnc_options_register_stocks (void)
 
     GtkStockItem items[] =
     {
-        { GTK_STOCK_APPLY		, "gnc_option_apply_button",	0, 0, NULL },
-        { GTK_STOCK_HELP		, "gnc_options_dialog_help",	0, 0, NULL },
-        { GTK_STOCK_OK			, "gnc_options_dialog_ok",	0, 0, NULL },
-        { GTK_STOCK_CANCEL		, "gnc_options_dialog_cancel",	0, 0, NULL },
+        { GTK_STOCK_APPLY       , "gnc_option_apply_button",    0, 0, NULL },
+        { GTK_STOCK_HELP        , "gnc_options_dialog_help",    0, 0, NULL },
+        { GTK_STOCK_OK          , "gnc_options_dialog_ok",      0, 0, NULL },
+        { GTK_STOCK_CANCEL      , "gnc_options_dialog_cancel",  0, 0, NULL },
     };
 
     if (done)
@@ -3585,7 +3583,7 @@ gnc_option_set_ui_value_radiobutton (GNCOption *option, gboolean use_default,
 
         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
         //    g_object_set_data(G_OBJECT(widget), "gnc_radiobutton_index",
-        //			GINT_TO_POINTER(index));
+        //          GINT_TO_POINTER(index));
         return FALSE;
     }
 }
@@ -4322,8 +4320,8 @@ void gnc_options_ui_initialize (void)
 
 struct scm_cb
 {
-    SCM	apply_cb;
-    SCM	close_cb;
+    SCM apply_cb;
+    SCM close_cb;
 };
 
 static void

commit 5ad584ca3b67236c563f5da25f935ee9f188592e
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Sun Jul 22 12:36:35 2018 +0100

    Change the Options dialogue to use GtkWindow
    
    Change the report / book options dialogue from a GtkDialog to GtkWindow.
    This removes the need for setting the transient parent which allows the
    dialogue to be placed behind the main application when changing values
    making it easier to see the result.

diff --git a/gnucash/gnome-utils/dialog-options.c b/gnucash/gnome-utils/dialog-options.c
index f981c5b..6a78c40 100644
--- a/gnucash/gnome-utils/dialog-options.c
+++ b/gnucash/gnome-utils/dialog-options.c
@@ -70,6 +70,8 @@ static QofLogModule log_module = GNC_MOD_GUI;
 #define DIALOG_OPTIONS_CM_CLASS "dialog-options"
 #define DIALOG_BOOK_OPTIONS_CM_CLASS "dialog-book-options"
 
+#define GNC_PREFS_GROUP              "dialogs.options"
+
 /*
  * Point where preferences switch control method from a set of
  * notebook tabs to a list.
@@ -86,7 +88,7 @@ static int gain_loss_accounts_in_filter = 0;
 
 struct gnc_option_win
 {
-    GtkWidget  * dialog;
+    GtkWidget  * window;
     GtkWidget  * notebook;
     GtkWidget  * page_list_view;
     GtkWidget  * page_list;
@@ -107,6 +109,9 @@ struct gnc_option_win
 
     /* Hold on to this to unregister the right class */
     const char *component_class;
+
+    /* widget being destroyed */
+    gboolean destroyed;
 };
 
 typedef enum
@@ -150,8 +155,6 @@ static currency_accounting_data *book_currency_data = NULL;
 static GNCOptionWinCallback global_help_cb = NULL;
 gpointer global_help_cb_data = NULL;
 
-void gnc_options_dialog_response_cb(GtkDialog *dialog, gint response,
-                                    GNCOptionWin *window);
 static void gnc_options_dialog_reset_cb(GtkWidget * w, gpointer data);
 void gnc_options_dialog_list_select_cb (GtkTreeSelection *selection,
                                         gpointer data);
@@ -172,16 +175,42 @@ gnc_option_get_gtk_widget (GNCOption *option)
 static void
 gnc_options_dialog_changed_internal (GtkWidget *widget, gboolean sensitive)
 {
-    GtkDialog *dialog;
-
-    while (widget && !GTK_IS_DIALOG(widget))
+    while (widget && !GTK_IS_WINDOW(widget))
         widget = gtk_widget_get_parent(widget);
     if (widget == NULL)
         return;
 
-    dialog = GTK_DIALOG(widget);
-    gtk_dialog_set_response_sensitive (dialog, GTK_RESPONSE_OK, sensitive);
-    gtk_dialog_set_response_sensitive (dialog, GTK_RESPONSE_APPLY, sensitive);
+    /* find the ok and cancel buttons, we know where they will be so do it
+       this way as opposed to using gtk_container_foreach, much less iteration */
+    if (GTK_IS_CONTAINER(widget))
+    {
+        GList *children = gtk_container_get_children(GTK_CONTAINER(widget));
+        for (GList *it = children; it; it = it->next)
+        {
+            if (GTK_IS_BOX (GTK_WIDGET(it->data)))
+            {
+                GList *children = gtk_container_get_children(GTK_CONTAINER(it->data));
+                for (GList *it = children; it; it = it->next)
+                {
+                    if (GTK_IS_BUTTON_BOX (GTK_WIDGET(it->data)))
+                    {
+                        GList *children = gtk_container_get_children(GTK_CONTAINER(it->data));
+                        for (GList *it = children; it; it = it->next)
+                        {
+                            if (g_strcmp0 (gtk_widget_get_name(GTK_WIDGET(it->data)), "ok_button") == 0)
+                                gtk_widget_set_sensitive (GTK_WIDGET(it->data), sensitive);
+
+                            if (g_strcmp0 (gtk_widget_get_name(GTK_WIDGET(it->data)), "apply_button") == 0)
+                                gtk_widget_set_sensitive (GTK_WIDGET(it->data), sensitive);
+                        }
+                        g_list_free (children);
+                    }
+                }
+                g_list_free (children);
+            }
+        }
+        g_list_free (children);
+    }
 }
 
 void
@@ -189,7 +218,7 @@ gnc_options_dialog_changed (GNCOptionWin *win)
 {
     if (!win) return;
 
-    gnc_options_dialog_changed_internal (win->dialog, TRUE);
+    gnc_options_dialog_changed_internal (win->window, TRUE);
 }
 
 void
@@ -1968,15 +1997,15 @@ gnc_options_dialog_build_contents_full (GNCOptionWin *propertybox,
         gtk_tree_selection_select_iter (selection, &iter);
         gtk_notebook_set_current_page(GTK_NOTEBOOK(propertybox->notebook), default_page);
     }
-    gnc_options_dialog_changed_internal(propertybox->dialog, FALSE);
+    gnc_options_dialog_changed_internal(propertybox->window, FALSE);
     if (show_dialog)
-        gtk_widget_show(propertybox->dialog);
+        gtk_widget_show(propertybox->window);
 }
 
 GtkWidget *
 gnc_options_dialog_widget(GNCOptionWin * win)
 {
-    return win->dialog;
+    return win->window;
 }
 
 GtkWidget *
@@ -1991,42 +2020,62 @@ gnc_options_dialog_notebook(GNCOptionWin * win)
     return win->notebook;
 }
 
-void
-gnc_options_dialog_response_cb(GtkDialog *dialog, gint response, GNCOptionWin *window)
+static void
+gnc_options_dialog_help_button_cb(GtkWidget * widget, GNCOptionWin *win)
 {
-    GNCOptionWinCallback close_cb;
+    if (win->help_cb)
+        (win->help_cb)(win, win->help_cb_data);
+}
 
-    switch (response)
-    {
-    case GTK_RESPONSE_HELP:
-        if (window->help_cb)
-            (window->help_cb)(window, window->help_cb_data);
-        break;
-
-    case GTK_RESPONSE_OK:
-    case GTK_RESPONSE_APPLY:
-        close_cb = window->close_cb;
-        window->close_cb = NULL;
-        if (window->apply_cb)
-            window->apply_cb (window, window->apply_cb_data);
-        window->close_cb = close_cb;
-        if (response == GTK_RESPONSE_APPLY)
-        {
-            gnc_options_dialog_changed_internal (window->dialog, FALSE);
-            break;
-        }
-        /* fall through */
+static void
+gnc_options_dialog_cancel_button_cb(GtkWidget * widget, GNCOptionWin *win)
+{
+    if (win->close_cb)
+        (win->close_cb)(win, win->close_cb_data);
+    else
+        gtk_widget_hide(win->window);
+}
 
-    default:
-        if (window->close_cb)
-        {
-            (window->close_cb)(window, window->close_cb_data);
-        }
-        else
-        {
-            gtk_widget_hide(window->dialog);
-        }
-        break;
+static void
+gnc_options_dialog_apply_button_cb(GtkWidget * widget, GNCOptionWin *win)
+{
+    GNCOptionWinCallback close_cb = win->close_cb;
+
+    win->close_cb = NULL;
+    if (win->apply_cb)
+        win->apply_cb (win, win->apply_cb_data);
+    win->close_cb = close_cb;
+    gnc_save_window_size (GNC_PREFS_GROUP, GTK_WINDOW(win->window));
+    gnc_options_dialog_changed_internal (win->window, FALSE);
+}
+
+static void
+gnc_options_dialog_ok_button_cb(GtkWidget * widget, GNCOptionWin *win)
+{
+    GNCOptionWinCallback close_cb = win->close_cb;
+
+    win->close_cb = NULL;
+    if (win->apply_cb)
+        win->apply_cb (win, win->apply_cb_data);
+    win->close_cb = close_cb;
+
+    gnc_save_window_size (GNC_PREFS_GROUP, GTK_WINDOW(win->window));
+
+    if (win->close_cb)
+        (win->close_cb)(win, win->close_cb_data);
+    else
+        gtk_widget_hide(win->window);
+}
+
+static void
+gnc_options_dialog_destroy_cb (GtkWidget *object, GNCOptionWin *win)
+{
+    if (!win) return;
+
+    if (win->destroyed == FALSE)
+    {
+        if (win->close_cb)
+            (win->close_cb)(win, win->close_cb_data);
     }
 }
 
@@ -2043,7 +2092,7 @@ gnc_options_dialog_reset_cb(GtkWidget * w, gpointer data)
 
     section = (GNCOptionSection*)val;
     gnc_option_db_section_reset_widgets (section);
-    gnc_options_dialog_changed_internal (win->dialog, TRUE);
+    gnc_options_dialog_changed_internal (win->window, TRUE);
 }
 
 void
@@ -2091,8 +2140,8 @@ gnc_options_register_stocks (void)
 static void
 component_close_handler (gpointer data)
 {
-    GNCOptionWin *window = data;
-    gtk_dialog_response(GTK_DIALOG(window->dialog), GTK_RESPONSE_CANCEL);
+    GNCOptionWin *win = data;
+    gnc_options_dialog_cancel_button_cb (NULL, win);
 }
 
 static void
@@ -2152,16 +2201,17 @@ gnc_options_dialog_new_modal(gboolean modal, gchar *title,
     GtkBuilder   *builder;
     GtkWidget    *hbox;
     gint component_id;
+    GtkWidget    *button;
 
     retval = g_new0(GNCOptionWin, 1);
     builder = gtk_builder_new();
-    gnc_builder_add_from_file (builder, "dialog-options.glade", "gnucash_options_dialog");
-    retval->dialog = GTK_WIDGET(gtk_builder_get_object (builder, "gnucash_options_dialog"));
+    gnc_builder_add_from_file (builder, "dialog-options.glade", "gnucash_options_window");
+    retval->window = GTK_WIDGET(gtk_builder_get_object (builder, "gnucash_options_window"));
     retval->page_list = GTK_WIDGET(gtk_builder_get_object (builder, "page_list_scroll"));
 
     // Set the style context for this dialog so it can be easily manipulated with css
-    gnc_widget_set_style_context (GTK_WIDGET(retval->dialog), "GncOptionsDialog");
-    gtk_window_set_transient_for (GTK_WINDOW (retval->dialog), parent);
+    gnc_widget_set_style_context (GTK_WIDGET(retval->window), "GncOptionsDialog");
+
     /* Page List */
     {
         GtkTreeView *view;
@@ -2189,13 +2239,23 @@ gnc_options_dialog_new_modal(gboolean modal, gchar *title,
         gtk_tree_selection_set_mode(selection, GTK_SELECTION_BROWSE);
         g_signal_connect (selection, "changed",
                           G_CALLBACK (gnc_options_dialog_list_select_cb), retval);
-
     }
 
+    button = GTK_WIDGET(gtk_builder_get_object (builder, "helpbutton"));
+        g_signal_connect(button, "clicked", G_CALLBACK(gnc_options_dialog_help_button_cb), retval);
+    button = GTK_WIDGET(gtk_builder_get_object (builder, "cancelbutton"));
+        g_signal_connect(button, "clicked", G_CALLBACK(gnc_options_dialog_cancel_button_cb), retval);
+    button = GTK_WIDGET(gtk_builder_get_object (builder, "applybutton"));
+        g_signal_connect(button, "clicked", G_CALLBACK(gnc_options_dialog_apply_button_cb), retval);
+    button = GTK_WIDGET(gtk_builder_get_object (builder, "okbutton"));
+        g_signal_connect(button, "clicked", G_CALLBACK(gnc_options_dialog_ok_button_cb), retval);
+
     gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, retval);
 
+    gnc_restore_window_size (GNC_PREFS_GROUP, GTK_WINDOW(retval->window));
+
     if (title)
-        gtk_window_set_title(GTK_WINDOW(retval->dialog), title);
+        gtk_window_set_title(GTK_WINDOW(retval->window), title);
 
     /* modal */
     if (modal == TRUE)
@@ -2229,20 +2289,25 @@ gnc_options_dialog_new_modal(gboolean modal, gchar *title,
                                          GNC_ID_ACCOUNT,
                                          QOF_EVENT_MODIFY | QOF_EVENT_DESTROY);
     }
+
+    g_signal_connect (retval->window, "destroy",
+                      G_CALLBACK(gnc_options_dialog_destroy_cb), retval);
+
     g_object_unref(G_OBJECT(builder));
 
+    retval->destroyed = FALSE;
     return retval;
 }
 
 /* Creates a new GNCOptionWin structure, but assumes you have your own
    dialog widget you want to plugin */
 GNCOptionWin *
-gnc_options_dialog_new_w_dialog(gchar *title, GtkWidget *dialog)
+gnc_options_dialog_new_w_dialog(gchar *title, GtkWidget *window)
 {
     GNCOptionWin * retval;
 
     retval = g_new0(GNCOptionWin, 1);
-    retval->dialog = dialog;
+    retval->window = window;
     return retval;
 }
 
@@ -2286,9 +2351,10 @@ gnc_options_dialog_destroy(GNCOptionWin * win)
 
     gnc_unregister_gui_component_by_data(win->component_class, win);
 
-    gtk_widget_destroy(win->dialog);
+    win->destroyed = TRUE;
+    gtk_widget_destroy(win->window);
 
-    win->dialog = NULL;
+    win->window = NULL;
     win->notebook = NULL;
     win->apply_cb = NULL;
     win->help_cb = NULL;
diff --git a/gnucash/gschemas/org.gnucash.dialogs.gschema.xml.in b/gnucash/gschemas/org.gnucash.dialogs.gschema.xml.in
index 3d96700..7736671 100644
--- a/gnucash/gschemas/org.gnucash.dialogs.gschema.xml.in
+++ b/gnucash/gschemas/org.gnucash.dialogs.gschema.xml.in
@@ -21,6 +21,7 @@
     <child name="search" schema="org.gnucash.dialogs.search"/>
     <child name="transfer" schema="org.gnucash.dialogs.transfer"/>
     <child name="trans-assoc" schema="org.gnucash.dialogs.trans-assoc"/>
+    <child name="options" schema="org.gnucash.dialogs.options"/>
   </schema>
 
   <schema id="org.gnucash.dialogs.account" path="/org/gnucash/dialogs/account/">
@@ -245,4 +246,14 @@
         followed by the width and height of the window.</description>
     </key>
   </schema>
+
+  <schema id="org.gnucash.dialogs.options" path="/org/gnucash/dialogs/options/">
+    <key name="last-geometry" type="(iiii)">
+      <default>(-1,-1,-1,-1)</default>
+      <summary>Last window position and size</summary>
+      <description>This setting describes the size and position of the window when it was last closed.
+        The numbers are the X and Y coordinates of the top left corner of the window
+        followed by the width and height of the window.</description>
+    </key>
+  </schema>
 </schemalist>
diff --git a/gnucash/gtkbuilder/dialog-options.glade b/gnucash/gtkbuilder/dialog-options.glade
index ae7435e..a30f3fc 100644
--- a/gnucash/gtkbuilder/dialog-options.glade
+++ b/gnucash/gtkbuilder/dialog-options.glade
@@ -1,27 +1,25 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.20.0 -->
+<!-- Generated with glade 3.20.4 -->
 <interface>
   <requires lib="gtk+" version="3.10"/>
-  <object class="GtkDialog" id="gnucash_options_dialog">
+  <object class="GtkWindow" id="gnucash_options_window">
     <property name="can_focus">False</property>
-    <property name="title" translatable="yes">GnuCash Options</property>
     <property name="default_width">640</property>
     <property name="default_height">480</property>
-    <property name="type_hint">dialog</property>
-    <signal name="response" handler="gnc_options_dialog_response_cb" swapped="no"/>
-    <child internal-child="vbox">
-      <object class="GtkBox" id="dialog-vbox1">
+    <child>
+      <object class="GtkBox" id="dialog-vbox">
         <property name="visible">True</property>
         <property name="can_focus">False</property>
         <property name="orientation">vertical</property>
-        <child internal-child="action_area">
-          <object class="GtkButtonBox" id="dialog-action_area1">
+        <child>
+          <object class="GtkButtonBox" id="buttonbox">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
             <property name="layout_style">end</property>
             <child>
-              <object class="GtkButton" id="helpbutton1">
+              <object class="GtkButton" id="helpbutton">
                 <property name="label" translatable="yes">_Help</property>
+                <property name="name">help_button</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="can_default">True</property>
@@ -32,11 +30,13 @@
                 <property name="expand">False</property>
                 <property name="fill">False</property>
                 <property name="position">0</property>
+                <property name="secondary">True</property>
               </packing>
             </child>
             <child>
-              <object class="GtkButton" id="cancelbutton1">
+              <object class="GtkButton" id="cancelbutton">
                 <property name="label" translatable="yes">_Cancel</property>
+                <property name="name">cancel_button</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="can_default">True</property>
@@ -53,6 +53,7 @@
             <child>
               <object class="GtkButton" id="applybutton">
                 <property name="label" translatable="yes">_Apply</property>
+                <property name="name">apply_button</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="can_default">True</property>
@@ -67,8 +68,9 @@
               </packing>
             </child>
             <child>
-              <object class="GtkButton" id="okbutton1">
+              <object class="GtkButton" id="okbutton">
                 <property name="label" translatable="yes">_OK</property>
+                <property name="name">ok_button</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="can_default">True</property>
@@ -91,7 +93,7 @@
           </packing>
         </child>
         <child>
-          <object class="GtkBox" id="hbox1">
+          <object class="GtkBox" id="hbox">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
             <child>
@@ -105,7 +107,7 @@
                     <property name="visible">True</property>
                     <property name="can_focus">True</property>
                     <child internal-child="selection">
-                      <object class="GtkTreeSelection" id="treeview-selection1"/>
+                      <object class="GtkTreeSelection" id="treeview-selection"/>
                     </child>
                   </object>
                 </child>
@@ -139,11 +141,8 @@
         </child>
       </object>
     </child>
-    <action-widgets>
-      <action-widget response="-11">helpbutton1</action-widget>
-      <action-widget response="-6">cancelbutton1</action-widget>
-      <action-widget response="-10">applybutton</action-widget>
-      <action-widget response="-5">okbutton1</action-widget>
-    </action-widgets>
+    <child type="titlebar">
+      <placeholder/>
+    </child>
   </object>
 </interface>

commit 8edf447808c2c4bc21ea63c44c3b92befaa10f95
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Thu Jul 19 16:44:00 2018 +0100

    Drop the tree model before updating transaction association tree view
    
    To avoid delays with large transaction associations trees, drop the
    model from the transaction association tree view while it is being
    updated and then reconnect it after the model has been updated.

diff --git a/gnucash/gnome/dialog-trans-assoc.c b/gnucash/gnome/dialog-trans-assoc.c
index ef2c50f..9429a32 100644
--- a/gnucash/gnome/dialog-trans-assoc.c
+++ b/gnucash/gnome/dialog-trans-assoc.c
@@ -165,7 +165,10 @@ assoc_dialog_update (AssocDialog *assoc_dialog)
     GtkTreeIter       iter;
     gboolean          valid;
 
+    /* disconnect the model from the treeview */
     model = gtk_tree_view_get_model (GTK_TREE_VIEW(assoc_dialog->view));
+    g_object_ref (G_OBJECT(model));
+    gtk_tree_view_set_model (GTK_TREE_VIEW(assoc_dialog->view), NULL);
 
     /* Get first row in list store */
     valid = gtk_tree_model_get_iter_first (model, &iter);
@@ -205,6 +208,9 @@ assoc_dialog_update (AssocDialog *assoc_dialog)
         g_free (filename);
         valid = gtk_tree_model_iter_next (model, &iter);
     }
+    /* reconnect the model to the treeview */
+    gtk_tree_view_set_model (GTK_TREE_VIEW(assoc_dialog->view), model);
+    g_object_unref(G_OBJECT(model));
 }
 
 static void
@@ -299,7 +305,10 @@ get_trans_info (AssocDialog *assoc_dialog)
     /* Get list of Accounts */
     accts = gnc_account_get_descendants_sorted (root);
 
+    /* disconnect the model from the treeview */
     model = gtk_tree_view_get_model (GTK_TREE_VIEW(assoc_dialog->view));
+    g_object_ref (G_OBJECT(model));
+    gtk_tree_view_set_model (GTK_TREE_VIEW(assoc_dialog->view), NULL);
 
     /* Go through list of accounts */
     for (ptr = accts; ptr; ptr = g_list_next (ptr))
@@ -352,6 +361,11 @@ get_trans_info (AssocDialog *assoc_dialog)
         qof_query_destroy (query);
         g_list_free (splits);
     }
+
+    /* reconnect the model to the treeview */
+    gtk_tree_view_set_model (GTK_TREE_VIEW(assoc_dialog->view), model);
+    g_object_unref(G_OBJECT(model));
+
     g_list_free (accts);
     g_list_free (trans_list);
 }

commit d34393410182e5e4c2b2f2a6f1e99dc32fc76227
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Thu Jul 19 15:53:09 2018 +0100

    Change the transaction association dialogue
    
    Change the transaction association dialogue from a GtkDialog to
    GtkWindow. This removes the need for setting the transient parent which
    allows the dialogue to be placed behind the main application when
    jumping to the transaction while the dialogue is still open.

diff --git a/gnucash/gnome/dialog-trans-assoc.c b/gnucash/gnome/dialog-trans-assoc.c
index e83f119..ef2c50f 100644
--- a/gnucash/gnome/dialog-trans-assoc.c
+++ b/gnucash/gnome/dialog-trans-assoc.c
@@ -48,7 +48,7 @@ enum GncAssocColumn {DATE_TRANS, DESC_TRANS, URI_U, AVAILABLE, URI_SPLIT, URI, U
 
 typedef struct
 {
-    GtkWidget    *dialog;
+    GtkWidget    *window;
     GtkWidget    *view;
     const gchar  *path_head;
     gboolean      valid_path_head;
@@ -57,38 +57,22 @@ typedef struct
 /* This static indicates the debugging module that this .o belongs to.  */
 static QofLogModule log_module = GNC_MOD_GUI;
 
-void gnc_assoc_dialog_window_destroy_cb (GtkWidget *object, gpointer user_data);
-void gnc_assoc_dialog_close_cb (GtkDialog *dialog, gpointer user_data);
-void gnc_assoc_dialog_response_cb (GtkDialog *dialog, gint response_id, gpointer user_data);
-
-
-void
+static void
 gnc_assoc_dialog_window_destroy_cb (GtkWidget *object, gpointer user_data)
 {
     AssocDialog *assoc_dialog = user_data;
 
     ENTER(" ");
     gnc_unregister_gui_component_by_data (DIALOG_ASSOC_CM_CLASS, assoc_dialog);
-
-    if (assoc_dialog->dialog)
+    if (assoc_dialog->window)
     {
-        gtk_widget_destroy (assoc_dialog->dialog);
-        assoc_dialog->dialog = NULL;
+        gtk_widget_destroy (assoc_dialog->window);
+        assoc_dialog->window = NULL;
     }
     g_free (assoc_dialog);
     LEAVE(" ");
 }
 
-void
-gnc_assoc_dialog_close_cb (GtkDialog *dialog, gpointer user_data)
-{
-    AssocDialog *assoc_dialog = user_data;
-
-    ENTER(" ");
-    gnc_close_gui_component_by_data (DIALOG_ASSOC_CM_CLASS, assoc_dialog);
-    LEAVE(" ");
-}
-
 static gint
 sort_iter_compare_func (GtkTreeModel *model,
                         GtkTreeIter  *a,
@@ -182,7 +166,7 @@ assoc_dialog_update (AssocDialog *assoc_dialog)
     gboolean          valid;
 
     model = gtk_tree_view_get_model (GTK_TREE_VIEW(assoc_dialog->view));
- 
+
     /* Get first row in list store */
     valid = gtk_tree_model_get_iter_first (model, &iter);
 
@@ -223,26 +207,25 @@ assoc_dialog_update (AssocDialog *assoc_dialog)
     }
 }
 
-void
-gnc_assoc_dialog_response_cb (GtkDialog *dialog, gint response_id, gpointer user_data)
+static void
+gnc_assoc_dialog_sort_button_cb (GtkWidget * widget, gpointer user_data)
 {
-    AssocDialog *assoc_dialog = user_data;
-
-    switch (response_id)
-    {
-    case GTK_RESPONSE_APPLY:
-        assoc_dialog_update (assoc_dialog);
-        return;
+    AssocDialog   *assoc_dialog = user_data;
+    assoc_dialog_sort (assoc_dialog);
+}
 
-    case -8:
-        assoc_dialog_sort (assoc_dialog);
-        return;
+static void
+gnc_assoc_dialog_check_button_cb (GtkWidget * widget, gpointer user_data)
+{
+    AssocDialog   *assoc_dialog = user_data;
+    assoc_dialog_update (assoc_dialog);
+}
 
-    case GTK_RESPONSE_CLOSE:
-    default:
-        gnc_close_gui_component_by_data (DIALOG_ASSOC_CM_CLASS, assoc_dialog);
-        return;
-    }
+static void
+gnc_assoc_dialog_close_button_cb (GtkWidget * widget, gpointer user_data)
+{
+    AssocDialog   *assoc_dialog = user_data;
+    gnc_close_gui_component_by_data (DIALOG_ASSOC_CM_CLASS, assoc_dialog);
 }
 
 static void
@@ -374,30 +357,35 @@ get_trans_info (AssocDialog *assoc_dialog)
 }
 
 static void
-gnc_assoc_dialog_create (GtkWindow *parent, AssocDialog *assoc_dialog)
+gnc_assoc_dialog_create (AssocDialog *assoc_dialog)
 {
-    GtkWidget         *dialog;
+    GtkWidget         *window;
     GtkBuilder        *builder;
     GtkTreeSelection  *selection;
     GtkWidget         *path_head;
     GtkTreeViewColumn *tree_column;
     GtkCellRenderer   *cr;
+    GtkWidget         *button;
 
     ENTER(" ");
     builder = gtk_builder_new();
     gnc_builder_add_from_file (builder, "dialog-trans-assoc.glade", "list-store");
+    gnc_builder_add_from_file (builder, "dialog-trans-assoc.glade", "transaction_association_window");
 
-    gnc_builder_add_from_file (builder, "dialog-trans-assoc.glade", "transaction_association_dialog");
+    window = GTK_WIDGET(gtk_builder_get_object (builder, "transaction_association_window"));
+    assoc_dialog->window = window;
 
-    dialog = GTK_WIDGET(gtk_builder_get_object (builder, "transaction_association_dialog"));
-    assoc_dialog->dialog = dialog;
+    button = GTK_WIDGET(gtk_builder_get_object (builder, "sort_button"));
+        g_signal_connect(button, "clicked", G_CALLBACK(gnc_assoc_dialog_sort_button_cb), assoc_dialog);
+    button = GTK_WIDGET(gtk_builder_get_object (builder, "check_button"));
+        g_signal_connect(button, "clicked", G_CALLBACK(gnc_assoc_dialog_check_button_cb), assoc_dialog);
+    button = GTK_WIDGET(gtk_builder_get_object (builder, "close_button"));
+        g_signal_connect(button, "clicked", G_CALLBACK(gnc_assoc_dialog_close_button_cb), assoc_dialog);
 
-    // Set the style context for this dialog so it can be easily manipulated with css
-    gnc_widget_set_style_context (GTK_WIDGET(dialog), "GncTransAssocDialog");
+    gtk_window_set_title (GTK_WINDOW(assoc_dialog->window), _("Transaction Associations"));
 
-    /* parent */
-    if (parent != NULL)
-        gtk_window_set_transient_for (GTK_WINDOW(dialog), GTK_WINDOW(parent));
+    // Set the style context for this dialog so it can be easily manipulated with css
+    gnc_widget_set_style_context (GTK_WIDGET(window), "GncTransAssocDialog");
 
     assoc_dialog->view = GTK_WIDGET(gtk_builder_get_object (builder, "treeview"));
     path_head = GTK_WIDGET(gtk_builder_get_object (builder, "path-head"));
@@ -444,18 +432,19 @@ gnc_assoc_dialog_create (GtkWindow *parent, AssocDialog *assoc_dialog)
     // Set grid lines option to preference
     gtk_tree_view_set_grid_lines (GTK_TREE_VIEW(assoc_dialog->view), gnc_tree_view_get_grid_lines_pref ());
 
-    /* default to 'close' button */
-    gtk_dialog_set_default_response (GTK_DIALOG(dialog), GTK_RESPONSE_CLOSE);
-
     selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(assoc_dialog->view));
     gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
 
+    g_signal_connect (assoc_dialog->window, "destroy",
+                      G_CALLBACK(gnc_assoc_dialog_window_destroy_cb), assoc_dialog);
+
     gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, assoc_dialog);
 
     g_object_unref (G_OBJECT(builder));
 
-    gnc_restore_window_size (GNC_PREFS_GROUP, GTK_WINDOW(assoc_dialog->dialog));
+    gnc_restore_window_size (GNC_PREFS_GROUP, GTK_WINDOW(assoc_dialog->window));
     get_trans_info (assoc_dialog);
+    gtk_widget_show_all (GTK_WIDGET(window));
 
     LEAVE(" ");
 }
@@ -466,8 +455,8 @@ close_handler (gpointer user_data)
     AssocDialog *assoc_dialog = user_data;
 
     ENTER(" ");
-    gnc_save_window_size (GNC_PREFS_GROUP, GTK_WINDOW(assoc_dialog->dialog));
-    gtk_widget_destroy (GTK_WIDGET(assoc_dialog->dialog));
+    gnc_save_window_size (GNC_PREFS_GROUP, GTK_WINDOW(assoc_dialog->window));
+    gtk_widget_destroy (GTK_WIDGET(assoc_dialog->window));
     LEAVE(" ");
 }
 
@@ -490,7 +479,7 @@ show_handler (const char *klass, gint component_id,
         LEAVE("No data strucure");
         return(FALSE);
     }
-    gtk_window_present (GTK_WINDOW(assoc_dialog->dialog));
+    gtk_window_present (GTK_WINDOW(assoc_dialog->window));
     LEAVE(" ");
     return(TRUE);
 }
@@ -503,7 +492,7 @@ show_handler (const char *klass, gint component_id,
  * Return: nothing                                                  *
 \********************************************************************/
 void
-gnc_trans_assoc_dialog (GtkWindow *parent)
+gnc_trans_assoc_dialog (void)
 {
     AssocDialog *assoc_dialog;
 
@@ -515,12 +504,12 @@ gnc_trans_assoc_dialog (GtkWindow *parent)
     }
     assoc_dialog = g_new0 (AssocDialog, 1);
 
-    gnc_assoc_dialog_create (parent, assoc_dialog);
+    gnc_assoc_dialog_create (assoc_dialog);
 
     gnc_register_gui_component (DIALOG_ASSOC_CM_CLASS,
                    refresh_handler, close_handler,
                    assoc_dialog);
 
-    gtk_widget_show (assoc_dialog->dialog);
+//    gtk_widget_show (assoc_dialog->window);
     LEAVE(" ");
 }
diff --git a/gnucash/gnome/dialog-trans-assoc.h b/gnucash/gnome/dialog-trans-assoc.h
index c95c5b7..fa82fcb 100644
--- a/gnucash/gnome/dialog-trans-assoc.h
+++ b/gnucash/gnome/dialog-trans-assoc.h
@@ -23,6 +23,6 @@
 #ifndef DIALOG_TRANS_ASSOC_H
 #define DIALOG_TRANS_ASSOC_H
 
-void gnc_trans_assoc_dialog (GtkWindow *parent);
+void gnc_trans_assoc_dialog (void);
 
 #endif
diff --git a/gnucash/gnome/gnc-plugin-basic-commands.c b/gnucash/gnome/gnc-plugin-basic-commands.c
index 5e50f6b..c019a72 100644
--- a/gnucash/gnome/gnc-plugin-basic-commands.c
+++ b/gnucash/gnome/gnc-plugin-basic-commands.c
@@ -624,7 +624,7 @@ static void
 gnc_main_window_cmd_tools_trans_assoc (GtkAction *action, GncMainWindowActionData *data)
 {
     gnc_set_busy_cursor (NULL, TRUE);
-    gnc_trans_assoc_dialog (GTK_WINDOW (data->window));
+    gnc_trans_assoc_dialog ();
     gnc_unset_busy_cursor (NULL);
 }
 
diff --git a/gnucash/gtkbuilder/dialog-trans-assoc.glade b/gnucash/gtkbuilder/dialog-trans-assoc.glade
index 57e92b7..f10e9b9 100644
--- a/gnucash/gtkbuilder/dialog-trans-assoc.glade
+++ b/gnucash/gtkbuilder/dialog-trans-assoc.glade
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.20.0 -->
+<!-- Generated with glade 3.20.4 -->
 <interface>
   <requires lib="gtk+" version="3.10"/>
   <object class="GtkListStore" id="list-store">
@@ -20,28 +20,31 @@
       <column type="gchararray"/>
     </columns>
   </object>
-  <object class="GtkDialog" id="transaction_association_dialog">
-    <property name="can_focus">True</property>
-    <property name="has_focus">True</property>
-    <property name="can_default">True</property>
-    <property name="border_width">6</property>
-    <property name="title" translatable="yes">Transaction Association Dialog</property>
-    <property name="default_width">600</property>
-    <property name="default_height">400</property>
-    <property name="destroy_with_parent">True</property>
-    <property name="type_hint">normal</property>
-    <signal name="destroy" handler="gnc_assoc_dialog_window_destroy_cb" swapped="no"/>
-    <signal name="response" handler="gnc_assoc_dialog_response_cb" swapped="no"/>
-    <child internal-child="vbox">
-      <object class="GtkBox" id="dialog-vbox2">
+  <object class="GtkWindow" id="transaction_association_window">
+    <property name="can_focus">False</property>
+    <child>
+      <object class="GtkBox" id="dialog-vbox">
         <property name="can_focus">False</property>
         <property name="orientation">vertical</property>
-        <child internal-child="action_area">
-          <object class="GtkButtonBox" id="dialog-action_area1">
+        <child>
+          <object class="GtkLabel" id="label3">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label" translatable="yes">All Transaction Associations</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="padding">2</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkButtonBox" id="buttonbox">
             <property name="can_focus">False</property>
             <property name="layout_style">end</property>
             <child>
-              <object class="GtkButton" id="sort">
+              <object class="GtkButton" id="sort_button">
                 <property name="label" translatable="yes">_Sort Association</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
@@ -55,7 +58,7 @@
               </packing>
             </child>
             <child>
-              <object class="GtkButton" id="Check">
+              <object class="GtkButton" id="check_button">
                 <property name="label" translatable="yes">_Locate Association</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
@@ -93,19 +96,6 @@
           </packing>
         </child>
         <child>
-          <object class="GtkLabel" id="label1">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="label" translatable="yes">All Transaction Associations</property>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">False</property>
-            <property name="padding">2</property>
-            <property name="position">0</property>
-          </packing>
-        </child>
-        <child>
           <object class="GtkLabel" id="path-head">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
@@ -118,7 +108,7 @@
           </packing>
         </child>
         <child>
-          <object class="GtkScrolledWindow" id="scrolledwindow2">
+          <object class="GtkScrolledWindow" id="scrolledwindow">
             <property name="visible">True</property>
             <property name="can_focus">True</property>
             <child>
@@ -126,8 +116,9 @@
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="model">list-store</property>
+                <property name="search_column">0</property>
                 <child internal-child="selection">
-                  <object class="GtkTreeSelection" id="treeview-selection1"/>
+                  <object class="GtkTreeSelection"/>
                 </child>
                 <child>
                   <object class="GtkTreeViewColumn" id="trans-date">
@@ -193,7 +184,7 @@
           </packing>
         </child>
         <child>
-          <object class="GtkLabel" id="label2">
+          <object class="GtkLabel" id="label4">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
             <property name="label" translatable="yes">     To jump to the Transaction, double click on the entry in the
@@ -208,10 +199,8 @@ Description column or Association column to open the Association</property>
         </child>
       </object>
     </child>
-    <action-widgets>
-      <action-widget response="-8">sort</action-widget>
-      <action-widget response="-10">Check</action-widget>
-      <action-widget response="-6">close_button</action-widget>
-    </action-widgets>
+    <child type="titlebar">
+      <placeholder/>
+    </child>
   </object>
 </interface>

commit 1ea4310f8cceae81070965f3f3ccb484ddadf183
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Thu Jul 19 15:22:40 2018 +0100

    Add a column for Tax related to find account dialogue

diff --git a/gnucash/gnome/dialog-find-account.c b/gnucash/gnome/dialog-find-account.c
index 9bde1e3..a25044b 100644
--- a/gnucash/gnome/dialog-find-account.c
+++ b/gnucash/gnome/dialog-find-account.c
@@ -40,7 +40,7 @@
 #define GNC_PREFS_GROUP                 "dialogs.find-account"
 
 /** Enumeration for the tree-store */
-enum GncFindAccountColumn {ACC_FULL_NAME, ACCOUNT, PLACE_HOLDER, HIDDEN, NOT_USED, BAL_ZERO};
+enum GncFindAccountColumn {ACC_FULL_NAME, ACCOUNT, PLACE_HOLDER, HIDDEN, NOT_USED, BAL_ZERO, TAX};
 
 typedef struct
 {
@@ -172,7 +172,8 @@ fill_model (GtkTreeModel *model, Account *account)
                         PLACE_HOLDER, (xaccAccountGetPlaceholder (account) == TRUE ? "emblem-default" : NULL),
                         HIDDEN, (xaccAccountGetHidden (account) == TRUE ? "emblem-default" : NULL),
                         NOT_USED, (splits == 0 ? "emblem-default" : NULL),
-                        BAL_ZERO, (gnc_numeric_zero_p (total) == TRUE ? "emblem-default" : NULL), -1);
+                        BAL_ZERO, (gnc_numeric_zero_p (total) == TRUE ? "emblem-default" : NULL),
+                        TAX, (xaccAccountGetTaxRelated (account) == TRUE ? "emblem-default" : NULL), -1);
     g_free (fullname);
 }
 
@@ -339,6 +340,16 @@ gnc_find_account_dialog_create (GtkWidget *parent, FindAccountDialog *facc_dialo
     gtk_tree_view_column_set_attributes (tree_column, cr, "icon-name", BAL_ZERO, NULL);
     gtk_cell_renderer_set_alignment (cr, 0.5, 0.5);
 
+    tree_column = gtk_tree_view_column_new();
+    gtk_tree_view_column_set_title (tree_column, _("Tax related"));
+    gtk_tree_view_append_column (GTK_TREE_VIEW(facc_dialog->view), tree_column);
+    gtk_tree_view_column_set_alignment (tree_column, 0.5);
+    gtk_tree_view_column_set_expand (tree_column, TRUE);
+    cr = gtk_cell_renderer_pixbuf_new();
+    gtk_tree_view_column_pack_start (tree_column, cr, TRUE);
+    // connect 'active' and set 'xalign' property of the cell renderer
+    gtk_tree_view_column_set_attributes (tree_column, cr, "icon-name", TAX, NULL);
+    gtk_cell_renderer_set_alignment (cr, 0.5, 0.5);
 
     g_signal_connect (facc_dialog->window, "destroy",
                       G_CALLBACK(gnc_find_account_dialog_window_destroy_cb), facc_dialog);
diff --git a/gnucash/gtkbuilder/dialog-find-account.glade b/gnucash/gtkbuilder/dialog-find-account.glade
index d630dd1..4ed0b75 100644
--- a/gnucash/gtkbuilder/dialog-find-account.glade
+++ b/gnucash/gtkbuilder/dialog-find-account.glade
@@ -16,6 +16,8 @@
       <column type="gchararray"/>
       <!-- column-name bal_zero -->
       <column type="gchararray"/>
+      <!-- column-name tax -->
+      <column type="gchararray"/>
     </columns>
   </object>
   <object class="GtkWindow" id="find_account_window">

commit 85bb778610bfc1d4a111432fae247d9918a65ee4
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Thu Jul 19 11:00:11 2018 +0100

    Drop the tree model before update find account tree view
    
    To avoid delays with large account trees, drop the model from the find
    account tree view while it is being updated and then reconnect it after
    the model has been updated.

diff --git a/gnucash/gnome/dialog-find-account.c b/gnucash/gnome/dialog-find-account.c
index 7138263..9bde1e3 100644
--- a/gnucash/gnome/dialog-find-account.c
+++ b/gnucash/gnome/dialog-find-account.c
@@ -156,9 +156,8 @@ gnc_find_account_dialog_close_button_cb (GtkWidget * widget, gpointer user_data)
 }
 
 static void
-fill_model (FindAccountDialog *facc_dialog, Account *account)
+fill_model (GtkTreeModel *model, Account *account)
 {
-    GtkTreeModel *model;
     GtkTreeIter   iter;
     gchar        *fullname = gnc_account_get_full_name (account);
     gint          splits = xaccAccountCountSplits (account, TRUE);
@@ -166,8 +165,6 @@ fill_model (FindAccountDialog *facc_dialog, Account *account)
 
     PINFO("Add to Store: Account '%s'", fullname);
 
-    model = gtk_tree_view_get_model (GTK_TREE_VIEW(facc_dialog->view));
-
     gtk_list_store_append (GTK_LIST_STORE(model), &iter);
 
     gtk_list_store_set (GTK_LIST_STORE(model), &iter,
@@ -187,6 +184,7 @@ get_account_info (FindAccountDialog *facc_dialog)
     GList        *ptr;
     gchar        *filter_text;
     gboolean      radio_root;
+    GtkTreeModel *model;
 
     /* Get the state of the root radio button */
     radio_root = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(facc_dialog->radio_root));
@@ -201,6 +199,14 @@ get_account_info (FindAccountDialog *facc_dialog)
 
     filter_text = g_ascii_strdown (gtk_entry_get_text (GTK_ENTRY(facc_dialog->filter_text_entry)), -1);
 
+    /* disconnect the model from the treeview */
+    model = gtk_tree_view_get_model (GTK_TREE_VIEW(facc_dialog->view));
+    g_object_ref (G_OBJECT(model));
+    gtk_tree_view_set_model (GTK_TREE_VIEW(facc_dialog->view), NULL);
+
+    // Clear the list store
+    gtk_list_store_clear (GTK_LIST_STORE(model));
+
     /* Go through list of accounts */
     for (ptr = accts; ptr; ptr = g_list_next (ptr))
     {
@@ -209,7 +215,7 @@ get_account_info (FindAccountDialog *facc_dialog)
         gchar   *match_string = g_ascii_strdown (full_name, -1);
 
         if ((g_strcmp0 (filter_text, "") == 0) || (g_strrstr (match_string, filter_text) != NULL))
-            fill_model (facc_dialog, acc);
+            fill_model (model, acc);
 
         g_free (match_string);
         g_free (full_name);
@@ -217,17 +223,16 @@ get_account_info (FindAccountDialog *facc_dialog)
     g_free (filter_text);
     g_list_free (accts);
 
+    /* reconnect the model to the treeview */
+    gtk_tree_view_set_model (GTK_TREE_VIEW(facc_dialog->view), model);
+    g_object_unref(G_OBJECT(model));
+
     gtk_tree_view_columns_autosize (GTK_TREE_VIEW(facc_dialog->view));
 }
 
 static void
 filter_button_cb (GtkButton *button, FindAccountDialog *facc_dialog)
 {
-    GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW(facc_dialog->view));
-
-    // Clear the list store
-    gtk_list_store_clear (GTK_LIST_STORE(model));
-
     get_account_info (facc_dialog);
 
     // Clear the filter

commit 193176cc251281b1287e67a05e8a2039c7a4f407
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Thu Jul 19 10:16:04 2018 +0100

    Change find-account from GtkDialog to GtkWindow
    
    Change the find account dialogue from a GtkDialog to GtkWindow. This
    removes the need for setting the transient parent which allows the
    dialogue to be placed behind the main application when jumping to the
    account if the the tick box to keep the dialogue open is used.

diff --git a/gnucash/gnome/dialog-find-account.c b/gnucash/gnome/dialog-find-account.c
index 98e7fe4..7138263 100644
--- a/gnucash/gnome/dialog-find-account.c
+++ b/gnucash/gnome/dialog-find-account.c
@@ -44,7 +44,7 @@ enum GncFindAccountColumn {ACC_FULL_NAME, ACCOUNT, PLACE_HOLDER, HIDDEN, NOT_USE
 
 typedef struct
 {
-    GtkWidget    *dialog;
+    GtkWidget    *window;
     GtkWidget    *parent;
     QofSession   *session;
     Account      *account;
@@ -65,11 +65,7 @@ typedef struct
 /* This static indicates the debugging module that this .o belongs to.  */
 static QofLogModule log_module = GNC_MOD_GUI;
 
-void gnc_find_account_dialog_window_destroy_cb (GtkWidget *object, gpointer user_data);
-void gnc_find_account_dialog_close_cb (GtkDialog *dialog, gpointer user_data);
-void gnc_find_account_dialog_response_cb (GtkDialog *dialog, gint response_id, gpointer user_data);
-
-void
+static void
 gnc_find_account_dialog_window_destroy_cb (GtkWidget *object, gpointer user_data)
 {
     FindAccountDialog *facc_dialog = user_data;
@@ -77,25 +73,15 @@ gnc_find_account_dialog_window_destroy_cb (GtkWidget *object, gpointer user_data
     ENTER(" ");
     gnc_unregister_gui_component_by_data (DIALOG_FIND_ACCOUNT_CM_CLASS, facc_dialog);
 
-    if (facc_dialog->dialog)
+    if (facc_dialog->window)
     {
-        gtk_widget_destroy (facc_dialog->dialog);
-        facc_dialog->dialog = NULL;
+        gtk_widget_destroy (facc_dialog->window);
+        facc_dialog->window = NULL;
     }
     g_free (facc_dialog);
     LEAVE(" ");
 }
 
-void
-gnc_find_account_dialog_close_cb (GtkDialog *dialog, gpointer user_data)
-{
-    FindAccountDialog *facc_dialog = user_data;
-
-    ENTER(" ");
-    gnc_close_gui_component_by_data (DIALOG_FIND_ACCOUNT_CM_CLASS, facc_dialog);
-    LEAVE(" ");
-}
-
 static void
 jump_to_account (FindAccountDialog *facc_dialog, Account *jump_account)
 {
@@ -103,7 +89,7 @@ jump_to_account (FindAccountDialog *facc_dialog, Account *jump_account)
         gnc_plugin_page_account_tree_open (jump_account, GTK_WINDOW(facc_dialog->parent));
 
     if (facc_dialog->jump_close == TRUE)
-        gnc_find_account_dialog_close_cb (GTK_DIALOG(facc_dialog->dialog), facc_dialog);
+        gnc_close_gui_component_by_data (DIALOG_FIND_ACCOUNT_CM_CLASS, facc_dialog);
 }
 
 static void
@@ -148,26 +134,25 @@ row_double_clicked (GtkTreeView *treeview, GtkTreePath *path,
     jump_to_account (facc_dialog, jump_account);
 }
 
-void
-gnc_find_account_dialog_response_cb (GtkDialog *dialog, gint response_id, gpointer user_data)
+static void
+gnc_find_account_dialog_jump_button_cb (GtkWidget * widget, gpointer user_data)
 {
     FindAccountDialog *facc_dialog = user_data;
+    gnc_find_account_dialog_jump_to (facc_dialog);
+}
 
-    switch (response_id)
-    {
-    case GTK_RESPONSE_APPLY:
-        gnc_find_account_dialog_jump_to (facc_dialog);
-        return;
-
-    case GTK_RESPONSE_YES:
-        gnc_find_account_dialog_jump_set (facc_dialog);
-        return;
+static void
+gnc_find_account_dialog_check_button_cb (GtkWidget * widget, gpointer user_data)
+{
+    FindAccountDialog *facc_dialog = user_data;
+    gnc_find_account_dialog_jump_set (facc_dialog);
+}
 
-    case GTK_RESPONSE_CLOSE:
-    default:
-        gnc_close_gui_component_by_data (DIALOG_FIND_ACCOUNT_CM_CLASS, facc_dialog);
-        return;
-    }
+static void
+gnc_find_account_dialog_close_button_cb (GtkWidget * widget, gpointer user_data)
+{
+    FindAccountDialog *facc_dialog = user_data;
+    gnc_close_gui_component_by_data (DIALOG_FIND_ACCOUNT_CM_CLASS, facc_dialog);
 }
 
 static void
@@ -252,34 +237,29 @@ filter_button_cb (GtkButton *button, FindAccountDialog *facc_dialog)
 static void
 gnc_find_account_dialog_create (GtkWidget *parent, FindAccountDialog *facc_dialog)
 {
-    GtkWidget         *dialog;
+    GtkWidget         *window;
     GtkBuilder        *builder;
     GtkTreeSelection  *selection;
 
     GtkTreeViewColumn *tree_column;
     GtkCellRenderer   *cr;
+    GtkWidget         *button;
 
     ENTER(" ");
     builder = gtk_builder_new();
     gnc_builder_add_from_file (builder, "dialog-find-account.glade", "list-store");
-    gnc_builder_add_from_file (builder, "dialog-find-account.glade", "find_account_dialog");
+    gnc_builder_add_from_file (builder, "dialog-find-account.glade", "find_account_window");
 
-    dialog = GTK_WIDGET(gtk_builder_get_object (builder, "find_account_dialog"));
-    facc_dialog->dialog = dialog;
+    window = GTK_WIDGET(gtk_builder_get_object (builder, "find_account_window"));
+    facc_dialog->window = window;
 
     // Set the style context for this dialog so it can be easily manipulated with css
-    gnc_widget_set_style_context (GTK_WIDGET(dialog), "GncFindAccountDialog");
+    gnc_widget_set_style_context (GTK_WIDGET(window), "GncFindAccountDialog");
 
     facc_dialog->session = gnc_get_current_session();
+    facc_dialog->parent = parent;
 
-    /* parent */
-    if (parent != NULL)
-    {
-        facc_dialog->parent = parent;
-        gtk_window_set_transient_for (GTK_WINDOW(dialog), GTK_WINDOW(parent));
-    }
-    else
-        facc_dialog->parent = NULL;
+    gtk_window_set_title (GTK_WINDOW(facc_dialog->window), _("Find Account"));
 
     /* Connect the radio buttons...*/
     facc_dialog->radio_root = GTK_WIDGET(gtk_builder_get_object (builder, "radio-root"));
@@ -292,6 +272,13 @@ gnc_find_account_dialog_create (GtkWidget *parent, FindAccountDialog *facc_dialo
     g_signal_connect (facc_dialog->filter_button, "clicked",
                       G_CALLBACK(filter_button_cb), (gpointer)facc_dialog);
 
+    button = GTK_WIDGET(gtk_builder_get_object (builder, "jumpto_button"));
+        g_signal_connect(button, "clicked", G_CALLBACK(gnc_find_account_dialog_jump_button_cb), facc_dialog);
+    button = GTK_WIDGET(gtk_builder_get_object (builder, "check_button"));
+        g_signal_connect(button, "clicked", G_CALLBACK(gnc_find_account_dialog_check_button_cb), facc_dialog);
+    button = GTK_WIDGET(gtk_builder_get_object (builder, "close_button"));
+        g_signal_connect(button, "clicked", G_CALLBACK(gnc_find_account_dialog_close_button_cb), facc_dialog);
+
     facc_dialog->view = GTK_WIDGET(gtk_builder_get_object (builder, "treeview"));
     g_signal_connect (facc_dialog->view, "row-activated",
                      G_CALLBACK(row_double_clicked), (gpointer)facc_dialog);
@@ -299,9 +286,6 @@ gnc_find_account_dialog_create (GtkWidget *parent, FindAccountDialog *facc_dialo
     // Set grid lines option to preference
     gtk_tree_view_set_grid_lines (GTK_TREE_VIEW(facc_dialog->view), gnc_tree_view_get_grid_lines_pref ());
 
-    /* default to 'close' button */
-    gtk_dialog_set_default_response (GTK_DIALOG(dialog), GTK_RESPONSE_CLOSE);
-
     selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(facc_dialog->view));
     gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
 
@@ -350,11 +334,17 @@ gnc_find_account_dialog_create (GtkWidget *parent, FindAccountDialog *facc_dialo
     gtk_tree_view_column_set_attributes (tree_column, cr, "icon-name", BAL_ZERO, NULL);
     gtk_cell_renderer_set_alignment (cr, 0.5, 0.5);
 
+
+    g_signal_connect (facc_dialog->window, "destroy",
+                      G_CALLBACK(gnc_find_account_dialog_window_destroy_cb), facc_dialog);
+
     gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, facc_dialog);
 
     g_object_unref (G_OBJECT(builder));
 
-    gnc_restore_window_size (GNC_PREFS_GROUP, GTK_WINDOW(facc_dialog->dialog));
+    gnc_restore_window_size (GNC_PREFS_GROUP, GTK_WINDOW(facc_dialog->window));
+
+    gtk_widget_show_all (GTK_WIDGET(facc_dialog->window));
 
     if (facc_dialog->account != NULL)
     {
@@ -368,7 +358,6 @@ gnc_find_account_dialog_create (GtkWidget *parent, FindAccountDialog *facc_dialo
         g_free (sub_label);
 
         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(facc_dialog->radio_subroot), TRUE);
-        gtk_widget_show_all (facc_dialog->radio_hbox);
     }
     else
         gtk_widget_hide (facc_dialog->radio_hbox);
@@ -377,7 +366,6 @@ gnc_find_account_dialog_create (GtkWidget *parent, FindAccountDialog *facc_dialo
     gtk_entry_set_text (GTK_ENTRY(facc_dialog->filter_text_entry), "");
 
     get_account_info (facc_dialog);
-
     LEAVE(" ");
 }
 
@@ -387,8 +375,8 @@ close_handler (gpointer user_data)
     FindAccountDialog *facc_dialog = user_data;
 
     ENTER(" ");
-    gnc_save_window_size (GNC_PREFS_GROUP, GTK_WINDOW(facc_dialog->dialog));
-    gtk_widget_destroy (GTK_WIDGET(facc_dialog->dialog));
+    gnc_save_window_size (GNC_PREFS_GROUP, GTK_WINDOW(facc_dialog->window));
+    gtk_widget_destroy (GTK_WIDGET(facc_dialog->window));
     LEAVE(" ");
 }
 
@@ -411,7 +399,7 @@ show_handler (const char *klass, gint component_id,
         LEAVE("No data strucure");
         return(FALSE);
     }
-    gtk_window_present (GTK_WINDOW(facc_dialog->dialog));
+    gtk_window_present (GTK_WINDOW(facc_dialog->window));
     LEAVE(" ");
     return(TRUE);
 }
@@ -447,7 +435,5 @@ gnc_find_account_dialog (GtkWidget *parent, Account *account)
                    facc_dialog);
 
     gnc_gui_component_set_session (component_id, facc_dialog->session);
-
-    gtk_widget_show (facc_dialog->dialog);
     LEAVE(" ");
 }
diff --git a/gnucash/gtkbuilder/dialog-find-account.glade b/gnucash/gtkbuilder/dialog-find-account.glade
index 27e0de3..d630dd1 100644
--- a/gnucash/gtkbuilder/dialog-find-account.glade
+++ b/gnucash/gtkbuilder/dialog-find-account.glade
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.20.0 -->
+<!-- Generated with glade 3.20.4 -->
 <interface>
   <requires lib="gtk+" version="3.10"/>
   <object class="GtkListStore" id="list-store">
@@ -18,21 +18,30 @@
       <column type="gchararray"/>
     </columns>
   </object>
-  <object class="GtkDialog" id="find_account_dialog">
+  <object class="GtkWindow" id="find_account_window">
     <property name="can_focus">False</property>
-    <property name="border_width">6</property>
-    <property name="title" translatable="yes">Find Account Dialog</property>
     <property name="default_width">600</property>
     <property name="default_height">400</property>
-    <property name="type_hint">dialog</property>
-    <signal name="destroy" handler="gnc_find_account_dialog_window_destroy_cb" swapped="no"/>
-    <signal name="response" handler="gnc_find_account_dialog_response_cb" swapped="no"/>
-    <child internal-child="vbox">
-      <object class="GtkBox" id="dialog-vbox2">
+    <child>
+      <object class="GtkBox" id="dialog-vbox">
         <property name="can_focus">False</property>
         <property name="orientation">vertical</property>
-        <child internal-child="action_area">
-          <object class="GtkButtonBox" id="dialog-action_area1">
+        <child>
+          <object class="GtkLabel" id="label5">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="margin_bottom">6</property>
+            <property name="label" translatable="yes"><b>Search the Account List</b></property>
+            <property name="use_markup">True</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkButtonBox" id="buttonbox">
             <property name="can_focus">False</property>
             <property name="layout_style">end</property>
             <child>
@@ -90,20 +99,6 @@
           </packing>
         </child>
         <child>
-          <object class="GtkLabel" id="label1">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="margin_bottom">6</property>
-            <property name="label" translatable="yes"><b>Search the Account List</b></property>
-            <property name="use_markup">True</property>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">False</property>
-            <property name="position">0</property>
-          </packing>
-        </child>
-        <child>
           <object class="GtkBox" id="hbox-radio">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
@@ -130,7 +125,6 @@
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="receives_default">False</property>
-                <property name="active">True</property>
                 <property name="draw_indicator">True</property>
                 <property name="group">radio-root</property>
               </object>
@@ -148,7 +142,7 @@
           </packing>
         </child>
         <child>
-          <object class="GtkScrolledWindow" id="scrolledwindow2">
+          <object class="GtkScrolledWindow" id="scrollwindow">
             <property name="visible">True</property>
             <property name="can_focus">True</property>
             <child>
@@ -156,15 +150,16 @@
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="model">list-store</property>
+                <property name="search_column">0</property>
                 <child internal-child="selection">
-                  <object class="GtkTreeSelection" id="treeview-selection1"/>
+                  <object class="GtkTreeSelection"/>
                 </child>
                 <child>
                   <object class="GtkTreeViewColumn" id="account_full_name">
                     <property name="resizable">True</property>
                     <property name="title" translatable="yes">Account Full Name</property>
                     <child>
-                      <object class="GtkCellRendererText" id="cellrenderertext1"/>
+                      <object class="GtkCellRendererText" id="cellrenderertext"/>
                       <attributes>
                         <attribute name="text">0</attribute>
                       </attributes>
@@ -194,11 +189,11 @@
           </packing>
         </child>
         <child>
-          <object class="GtkBox" id="hbox2">
+          <object class="GtkBox" id="hbox1">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
             <child>
-              <object class="GtkLabel" id="label3">
+              <object class="GtkLabel" id="label6">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
               </object>
@@ -237,7 +232,7 @@
               </packing>
             </child>
             <child>
-              <object class="GtkLabel" id="label4">
+              <object class="GtkLabel" id="label7">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
               </object>
@@ -255,7 +250,7 @@
           </packing>
         </child>
         <child>
-          <object class="GtkLabel" id="label2">
+          <object class="GtkLabel" id="label8">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
             <property name="label" translatable="yes">Select a row and then press 'jump to' to jump to account in the Account Tree,
@@ -273,10 +268,8 @@ if account should not be shown, this will be temporarily overridden.</property>
         </child>
       </object>
     </child>
-    <action-widgets>
-      <action-widget response="-8">check_button</action-widget>
-      <action-widget response="-10">jumpto_button</action-widget>
-      <action-widget response="-6">close_button</action-widget>
-    </action-widgets>
+    <child type="titlebar">
+      <placeholder/>
+    </child>
   </object>
 </interface>

commit 93030c61f110e5fee8a4b1bf792c7a0107fb28f5
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Thu Jul 19 10:10:02 2018 +0100

    Bug 796762 - Scrollbar partially hides the delete button in
     the Saved Report Configurations window
    
    The vertical scrollbar obscures the delete button in the tree view so
    add a dummy blank column to the end and set it to the width of the
    vertical scrollbar.

diff --git a/gnucash/gtkbuilder/dialog-custom-report.glade b/gnucash/gtkbuilder/dialog-custom-report.glade
index c7b0411..c5877f1 100644
--- a/gnucash/gtkbuilder/dialog-custom-report.glade
+++ b/gnucash/gtkbuilder/dialog-custom-report.glade
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.20.0 -->
+<!-- Generated with glade 3.20.4 -->
 <interface>
   <requires lib="gtk+" version="3.10"/>
   <object class="GtkDialog" id="custom_report_dialog">
@@ -66,7 +66,7 @@
           </packing>
         </child>
         <child>
-          <object class="GtkScrolledWindow" id="scrolledwindow1">
+          <object class="GtkScrolledWindow" id="custom_report_sw">
             <property name="width_request">300</property>
             <property name="height_request">150</property>
             <property name="visible">True</property>
@@ -124,5 +124,8 @@ the Reports menu or tool bar.</property>
     <action-widgets>
       <action-widget response="0">close_report_button</action-widget>
     </action-widgets>
+    <child>
+      <placeholder/>
+    </child>
   </object>
 </interface>
diff --git a/gnucash/report/report-gnome/dialog-custom-report.c b/gnucash/report/report-gnome/dialog-custom-report.c
index d201982..be18149 100644
--- a/gnucash/report/report-gnome/dialog-custom-report.c
+++ b/gnucash/report/report-gnome/dialog-custom-report.c
@@ -73,6 +73,7 @@ typedef struct _CustomReportDialog
     GtkTreeViewColumn *runcol;
     GtkTreeViewColumn *editcol;
     GtkTreeViewColumn *delcol;
+    GtkTreeViewColumn *dummycol;
 
     /* data */
     SCM reportlist;
@@ -195,6 +196,7 @@ set_reports_view_and_model(CustomReportDialog *crd)
 {
     GtkCellRenderer *renderer;
     GtkTreeModel *model;
+    gint number_of_columns;
 
     crd->namerenderer = gtk_cell_renderer_text_new();
     g_signal_connect (G_OBJECT (crd->namerenderer), "edited",
@@ -227,6 +229,14 @@ set_reports_view_and_model(CustomReportDialog *crd)
              NULL);
     crd->delcol = gtk_tree_view_get_column (GTK_TREE_VIEW (crd->reportview), VIEW_COL_DELETE);
 
+    // this is a dummy column which will be set the same width of the vertical scrollbar
+    renderer = gtk_cell_renderer_text_new();
+    number_of_columns = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (crd->reportview), -1,
+             "", renderer,
+             NULL);
+
+    crd->dummycol = gtk_tree_view_get_column (GTK_TREE_VIEW (crd->reportview), number_of_columns -1);
+
     model = create_and_fill_report_list(crd);
 
     gtk_tree_view_set_model (GTK_TREE_VIEW (crd->reportview), model);
@@ -495,6 +505,9 @@ gnc_ui_custom_report_internal(GncMainWindow * window)
     GtkTreeIter iter;
     GtkTreeModel *model;
     GtkWidget *no_report_notification;
+    GtkWidget *scroll_window;
+    GtkWidget *vscroll;
+    GtkRequisition nat_sb;
 
     crd = g_new0(CustomReportDialog, 1);
 
@@ -503,10 +516,18 @@ gnc_ui_custom_report_internal(GncMainWindow * window)
 
     crd->dialog = GTK_WIDGET(gtk_builder_get_object (builder, "custom_report_dialog"));
     crd->reportview = GTK_WIDGET(gtk_builder_get_object (builder, "custom_report_list_view"));
+    scroll_window = GTK_WIDGET(gtk_builder_get_object (builder, "custom_report_sw"));
     no_report_notification = GTK_WIDGET(gtk_builder_get_object (builder, "label2"));
     set_reports_view_and_model(crd);
     crd->window = window;
 
+    // get the vertical scroll bar width
+    vscroll = gtk_scrolled_window_get_vscrollbar (GTK_SCROLLED_WINDOW (scroll_window));
+    gtk_widget_get_preferred_size (vscroll, NULL, &nat_sb);
+
+    // set the width of the dummy column to that of the scrollbar
+    gtk_tree_view_column_set_fixed_width (crd->dummycol, nat_sb.width);
+
     gtk_window_set_transient_for (GTK_WINDOW (crd->dialog), GTK_WINDOW(window));
 
     // Set the style context for this dialog so it can be easily manipulated with css

commit 697d2a166fb83823dd723d5565940e5cf08ed269
Author: Di Mang <DiMan at users.noreply.github.com>
Date:   Wed Jul 18 22:08:11 2018 +0200

    unify appearance in preferences dialog
    
    The reports and other windows based on GtkNotebooks have currently max. 6 tabs in preferences dialog.
    Changing the value MAX_TAB_COUNT to 6 will unify appearance in all such dialogs. But to consider future changes, it would be useful to add a few extra places for new tabs: MAX_TAB_COUNT = 8.

diff --git a/gnucash/gnome-utils/dialog-options.c b/gnucash/gnome-utils/dialog-options.c
index 88c3a6f..d224a52 100644
--- a/gnucash/gnome-utils/dialog-options.c
+++ b/gnucash/gnome-utils/dialog-options.c
@@ -74,7 +74,7 @@ static QofLogModule log_module = GNC_MOD_GUI;
  * Point where preferences switch control method from a set of
  * notebook tabs to a list.
  */
-#define MAX_TAB_COUNT 5
+#define MAX_TAB_COUNT 8
 
 /* A pointer to the last selected filename */
 #define LAST_SELECTION "last-selection"

commit 4c8f822c12ee57208d735da4a366251b86793309
Author: Di Mang <dimang.freenet at gmail.com>
Date:   Sat Jul 14 21:45:28 2018 +0200

    Increase of MAX_TAB_COUNT to change appearance of dialog "Book Options" in german language.
    
    The dialog "Book Options" looks in german different, because it has 5 tabs: four standard tabs and additionaly one tab for tax settings, which appears only for german language. The 1 to 4 tabs appearance on top (horizontal mode). The appearance switchs to vertical mode (with tabs on the left side) for 5 and more tabs. Here the setting MAX_TAB_COUNT is increased to 5. This change should make the dialog similar in german and other languages.

diff --git a/gnucash/gnome-utils/dialog-options.c b/gnucash/gnome-utils/dialog-options.c
index f981c5b..88c3a6f 100644
--- a/gnucash/gnome-utils/dialog-options.c
+++ b/gnucash/gnome-utils/dialog-options.c
@@ -74,7 +74,7 @@ static QofLogModule log_module = GNC_MOD_GUI;
  * Point where preferences switch control method from a set of
  * notebook tabs to a list.
  */
-#define MAX_TAB_COUNT 4
+#define MAX_TAB_COUNT 5
 
 /* A pointer to the last selected filename */
 #define LAST_SELECTION "last-selection"



Summary of changes:
 borrowed/CMakeLists.txt                            |   2 +-
 borrowed/jenny/jenny.c                             | 562 +++++++++++----------
 common/test-core/CMakeLists.txt                    |   2 +
 gnucash/gnome-utils/dialog-options.c               | 212 +++++---
 gnucash/gnome/dialog-find-account.c                | 146 +++---
 gnucash/gnome/dialog-trans-assoc.c                 | 121 ++---
 gnucash/gnome/dialog-trans-assoc.h                 |   2 +-
 gnucash/gnome/gnc-plugin-basic-commands.c          |   2 +-
 .../gschemas/org.gnucash.dialogs.gschema.xml.in    |  11 +
 gnucash/gtkbuilder/dialog-custom-report.glade      |   7 +-
 gnucash/gtkbuilder/dialog-find-account.glade       |  71 ++-
 gnucash/gtkbuilder/dialog-options.glade            |  39 +-
 gnucash/gtkbuilder/dialog-trans-assoc.glade        |  69 ++-
 gnucash/import-export/aqb/dialog-ab-daterange.c    |  14 +-
 gnucash/import-export/aqb/dialog-ab-daterange.h    |   4 +-
 gnucash/import-export/aqb/gnc-ab-gettrans.c        |  29 +-
 gnucash/import-export/aqb/gnc-ab-kvp.c             |   9 +-
 gnucash/import-export/aqb/gnc-ab-kvp.h             |   4 +-
 gnucash/import-export/aqb/test/test-kvp.c          |  32 +-
 .../csv-exp/csv-transactions-export.c              |   8 +-
 .../import-export/csv-imp/gnc-imp-props-price.cpp  |  21 +-
 gnucash/import-export/csv-imp/gnc-imp-props-tx.cpp |   7 +-
 gnucash/import-export/import-parse.c               |   4 +-
 gnucash/import-export/import-parse.h               |   2 +-
 gnucash/import-export/log-replay/gnc-log-replay.c  |  34 +-
 gnucash/import-export/ofx/gnc-ofx-import.c         |   5 +-
 .../import-export/qif-imp/assistant-qif-import.c   |   9 +-
 gnucash/import-export/test/test-import-parse.c     |   8 +-
 gnucash/register/ledger-core/split-register.c      |  10 +-
 gnucash/report/report-gnome/dialog-custom-report.c |  21 +
 libgnucash/app-utils/gnc-component-manager.c       |   3 +
 libgnucash/app-utils/guile-util.c                  |  99 ----
 libgnucash/app-utils/guile-util.h                  |   4 -
 libgnucash/engine/engine-helpers-guile.h           |   3 -
 libgnucash/engine/engine-helpers.c                 |  32 --
 libgnucash/engine/gnc-date.h                       |   4 +-
 libgnucash/engine/kvp-scm.cpp                      |  13 -
 po/POTFILES.in                                     |   1 +
 38 files changed, 808 insertions(+), 818 deletions(-)



More information about the gnucash-changes mailing list