gnucash maint: Multiple changes pushed

Robert Fewell bobit at code.gnucash.org
Fri Nov 6 08:56:19 EST 2020


Updated	 via  https://github.com/Gnucash/gnucash/commit/b6c0a62b (commit)
	 via  https://github.com/Gnucash/gnucash/commit/39ad1e9e (commit)
	 via  https://github.com/Gnucash/gnucash/commit/c0e13411 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/5c48244e (commit)
	 via  https://github.com/Gnucash/gnucash/commit/b51a7067 (commit)
	from  https://github.com/Gnucash/gnucash/commit/bf9b2672 (commit)



commit b6c0a62bbd33f63462e10bd8fcbaacd85ca8e7ec
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Wed Oct 28 13:56:07 2020 +0000

    Add confirmation of Main Window close when more than one
    
    If you have more than one Gnucash window open is is very easy to close
    the wrong window with the 'x' and in doing so change your saved pages.
    The way to save the configuration of all windows and pages is to use
    'File->Quit'.

diff --git a/gnucash/gnome-utils/gnc-main-window.c b/gnucash/gnome-utils/gnc-main-window.c
index 354ce3c80..d416a3e36 100644
--- a/gnucash/gnome-utils/gnc-main-window.c
+++ b/gnucash/gnome-utils/gnc-main-window.c
@@ -67,6 +67,7 @@
 #include "gnc-ui-util.h"
 #include "gnc-uri-utils.h"
 #include "gnc-version.h"
+#include "gnc-warnings.h"
 #include "gnc-window.h"
 #include "gnc-prefs.h"
 #include "option-util.h"
@@ -1423,6 +1424,32 @@ gnc_main_window_delete_event (GtkWidget *window,
     if (already_dead)
         return TRUE;
 
+    if (g_list_length (active_windows) > 1)
+    {
+        gint response;
+        GtkWidget *dialog;
+        gchar *message = _("This window is closing and will not be restored.");
+
+        dialog = gtk_message_dialog_new (GTK_WINDOW (window),
+                                         GTK_DIALOG_DESTROY_WITH_PARENT,
+                                         GTK_MESSAGE_QUESTION,
+                                         GTK_BUTTONS_NONE,
+                                         "%s", _("Close Window?"));
+        gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG(dialog),
+                                                  "%s", message);
+
+        gtk_dialog_add_buttons (GTK_DIALOG(dialog),
+                              _("_Cancel"), GTK_RESPONSE_CANCEL,
+                              _("_OK"), GTK_RESPONSE_YES,
+                               (gchar *)NULL);
+        gtk_dialog_set_default_response (GTK_DIALOG(dialog), GTK_RESPONSE_YES);
+        response = gnc_dialog_run (GTK_DIALOG(dialog), GNC_PREF_WARN_CLOSING_WINDOW_QUESTION);
+        gtk_widget_destroy (dialog);
+
+        if (response == GTK_RESPONSE_CANCEL)
+            return TRUE;
+    }
+
     if (!gnc_main_window_finish_pending(GNC_MAIN_WINDOW(window)))
     {
         /* Don't close the window. */
diff --git a/gnucash/gschemas/org.gnucash.warnings.gschema.xml.in b/gnucash/gschemas/org.gnucash.warnings.gschema.xml.in
index fd404c18f..cc85417a4 100644
--- a/gnucash/gschemas/org.gnucash.warnings.gschema.xml.in
+++ b/gnucash/gschemas/org.gnucash.warnings.gschema.xml.in
@@ -9,6 +9,11 @@
       <summary>Print checks from multiple accounts</summary>
       <description>This dialog is presented if you try to print checks from multiple accounts at the same time.</description>
     </key>
+    <key name="closing-window-question" type="i">
+      <default>0</default>
+      <summary>Confirm Window Close</summary>
+      <description>This dialog is presented when there is more than one window.</description>
+    </key>
     <key name="inv-entry-mod" type="i">
       <default>0</default>
       <summary>Commit changes to a invoice entry</summary>
@@ -107,6 +112,11 @@
       <summary>Print checks from multiple accounts</summary>
       <description>This dialog is presented if you try to print checks from multiple accounts at the same time.</description>
     </key>
+    <key name="closing-window-question" type="i">
+      <default>0</default>
+      <summary>Confirm Window Close</summary>
+      <description>This dialog is presented when there is more than one window.</description>
+    </key>
     <key name="inv-entry-mod" type="i">
       <default>0</default>
       <summary>Commit changes to a invoice entry</summary>

commit 39ad1e9ebb0ab2b35da278f058394130dd9e2329
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Tue Oct 27 14:47:58 2020 +0000

    Add two key combinations to the main notebook
    
    Add ability to do key combination Ctrl+Alt+Menu to bring up the main
    notebook menu so pages can be selected.
    Also add Ctrl+Alt+a to jump to the Accounts page with the 'a' being
    translatable.

diff --git a/gnucash/gnome-utils/gnc-main-window.c b/gnucash/gnome-utils/gnc-main-window.c
index 46e281cbd..354ce3c80 100644
--- a/gnucash/gnome-utils/gnc-main-window.c
+++ b/gnucash/gnome-utils/gnc-main-window.c
@@ -2743,6 +2743,58 @@ gnc_main_window_destroy (GtkWidget *widget)
 }
 
 
+static gboolean
+gnc_main_window_key_press_event (GtkWidget *widget, GdkEventKey *event, gpointer user_data)
+{
+    GncMainWindowPrivate *priv;
+    GdkModifierType modifiers;
+
+    g_return_val_if_fail (GNC_IS_MAIN_WINDOW(widget), FALSE);
+
+    priv = GNC_MAIN_WINDOW_GET_PRIVATE(widget);
+
+    modifiers = gtk_accelerator_get_default_mod_mask ();
+
+    if ((event->state & modifiers) == (GDK_CONTROL_MASK | GDK_MOD1_MASK)) // Ctrl+Alt+
+    {
+        const gchar *account_key = C_ ("lower case key for short cut to 'Accounts'", "a");
+        guint account_keyval = gdk_keyval_from_name (account_key);
+
+        if ((account_keyval == event->keyval) || (account_keyval == gdk_keyval_to_lower (event->keyval)))
+        {
+            gint page = 0;
+
+            for (GList *item = priv->installed_pages; item; item = g_list_next (item))
+            {
+                 const gchar *pname = gnc_plugin_page_get_plugin_name (GNC_PLUGIN_PAGE(item->data));
+
+                 if (g_strcmp0 (pname, "GncPluginPageAccountTree") == 0)
+                 {
+                     gtk_notebook_set_current_page (GTK_NOTEBOOK(priv->notebook), page);
+                     return TRUE;
+                 }
+                 page++;
+            }
+        }
+        else if ((GDK_KEY_Menu == event->keyval) || (GDK_KEY_space == event->keyval))
+        {
+            GList *menu = gtk_menu_get_for_attach_widget (GTK_WIDGET(priv->notebook));
+
+            if (menu)
+            {
+                gtk_menu_popup_at_widget (GTK_MENU(menu->data),
+                                          GTK_WIDGET(priv->notebook),
+                                          GDK_GRAVITY_SOUTH,
+                                          GDK_GRAVITY_SOUTH,
+                                          NULL);
+                return TRUE;
+            }
+        }
+    }
+    return FALSE;
+}
+
+
 /*  Create a new gnc main window plugin.
  */
 GncMainWindow *
@@ -2777,6 +2829,11 @@ gnc_main_window_new (void)
 #endif
     gnc_engine_add_commit_error_callback( gnc_main_window_engine_commit_error_callback, window );
 
+    // set up a callback for noteboook navigation
+    g_signal_connect (G_OBJECT(window), "key-press-event",
+                      G_CALLBACK(gnc_main_window_key_press_event),
+                      NULL);
+
     return window;
 }
 

commit c0e1341139d93d8b4756ec08c19dc77030fcefeb
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Mon Oct 26 11:22:12 2020 +0000

    Intercept the Ctrl+Alt+PgUp/Down for a report page
    
    With the focus on the webkit webview, this key sequence can be used to
    scroll the view. For the key sequence to work for tab page switching a
    callback is connected to the 'key-press-event' for the webkit view and
    checked for the sequence and passed to the notebook if required.

diff --git a/gnucash/gnome/gnc-plugin-page-report.c b/gnucash/gnome/gnc-plugin-page-report.c
index ece19892c..e7f260e57 100644
--- a/gnucash/gnome/gnc-plugin-page-report.c
+++ b/gnucash/gnome/gnc-plugin-page-report.c
@@ -390,6 +390,45 @@ gnc_plugin_page_report_load_uri (GncPluginPage *page)
     gnc_window_set_progressbar_window( NULL );
 }
 
+/* used to capture Ctrl+Alt+PgUp/Down for tab selection */
+static gboolean
+webkit_key_press_event_cb (GtkWidget *widget, GdkEventKey *event, gpointer user_data)
+{
+    GncPluginPageReport *report = GNC_PLUGIN_PAGE_REPORT(user_data);
+    GncPluginPageReportPrivate *priv = GNC_PLUGIN_PAGE_REPORT_GET_PRIVATE(report);
+    GdkModifierType modifiers = gtk_accelerator_get_default_mod_mask ();
+    GtkWidget *window = gnc_plugin_page_get_window (GNC_PLUGIN_PAGE(report));
+
+    if (GNC_PLUGIN_PAGE(report) != gnc_main_window_get_current_page (GNC_MAIN_WINDOW(window)))
+        return FALSE;
+
+    if ((event->keyval == GDK_KEY_Page_Up || event->keyval == GDK_KEY_Page_Down ||
+         event->keyval == GDK_KEY_KP_Page_Up || event->keyval == GDK_KEY_KP_Page_Down)
+          && (event->state & modifiers) == (GDK_CONTROL_MASK | GDK_MOD1_MASK))
+    {
+        GtkNotebook *notebook = GTK_NOTEBOOK(gtk_widget_get_parent (GTK_WIDGET(priv->container)));
+        gint pages = gtk_notebook_get_n_pages (notebook);
+        gint current_page = gtk_notebook_get_current_page (notebook);
+
+        if (event->keyval == GDK_KEY_Page_Up || event->keyval == GDK_KEY_KP_Page_Up)
+        {
+            if (current_page == 0)
+                gtk_notebook_set_current_page (notebook, pages - 1);
+            else
+                gtk_notebook_prev_page (notebook);
+        }
+        else
+        {
+            if (pages == current_page + 1)
+                gtk_notebook_set_current_page (notebook, 0);
+            else
+                gtk_notebook_next_page (notebook);
+        }
+        return TRUE;
+    }
+    return FALSE;
+}
+
 static
 GtkWidget*
 gnc_plugin_page_report_create_widget( GncPluginPage *page )
@@ -398,6 +437,7 @@ gnc_plugin_page_report_create_widget( GncPluginPage *page )
     GncPluginPageReportPrivate *priv;
     GtkWindow *topLvl;
     GtkAction *action;
+    GtkWidget *webview;
     URLType type;
     char * id_name;
     char * child_name;
@@ -460,6 +500,18 @@ gnc_plugin_page_report_create_widget( GncPluginPage *page )
                       G_CALLBACK(gnc_plugin_page_inserted_cb),
                       NULL);
 
+    // used to capture Ctrl+Alt+PgUp/Down for tab selection
+    webview = gnc_html_get_webview (priv->html);
+    if (webview)
+    {
+        gtk_widget_add_events (webview, gtk_widget_get_events (webview) |
+                               GDK_KEY_PRESS_MASK);
+
+        g_signal_connect (webview, "key-press-event",
+                          G_CALLBACK(webkit_key_press_event_cb),
+                          page);
+    }
+
     gtk_widget_show_all( GTK_WIDGET(priv->container) );
     LEAVE("container %p", priv->container);
     return GTK_WIDGET( priv->container );

commit 5c48244e8d8dfb781aceecfdb52157af55d42225
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Mon Oct 26 11:05:02 2020 +0000

    Fix report page focus
    
    Currently the setting of keyboard focus is to the scroll window but
    should be to the Webkit webview so correct this.

diff --git a/gnucash/gnome/gnc-plugin-page-report.c b/gnucash/gnome/gnc-plugin-page-report.c
index d77aa5e9d..ece19892c 100644
--- a/gnucash/gnome/gnc-plugin-page-report.c
+++ b/gnucash/gnome/gnc-plugin-page-report.c
@@ -253,7 +253,7 @@ gnc_plugin_page_report_focus_widget (GncPluginPage *report_plugin_page)
 
         if (window && !gnc_main_window_is_restoring_pages (GNC_MAIN_WINDOW(window)))
         {
-            GtkWidget * widget = gnc_html_get_widget (priv->html);
+            GtkWidget *widget = gnc_html_get_webview (priv->html);
 
             gnc_plugin_page_report_load_uri (report_plugin_page);
 
@@ -752,15 +752,12 @@ static void
 gnc_plugin_page_report_destroy_widget(GncPluginPage *plugin_page)
 {
     GncPluginPageReportPrivate *priv;
-    GtkWidget *widget;
 
     // FIXME: cleanup other resources.
 
     PINFO("destroy widget");
     priv = GNC_PLUGIN_PAGE_REPORT_GET_PRIVATE(plugin_page);
 
-    widget = gnc_html_get_widget(priv->html);
-
     // Remove the page_changed signal callback
     gnc_plugin_page_disconnect_page_changed (GNC_PLUGIN_PAGE(plugin_page));
 
diff --git a/gnucash/html/gnc-html.c b/gnucash/html/gnc-html.c
index 3b97ec22d..4565bdaad 100644
--- a/gnucash/html/gnc-html.c
+++ b/gnucash/html/gnc-html.c
@@ -574,6 +574,39 @@ gnc_html_get_widget( GncHtml* self )
     return GNC_HTML_GET_PRIVATE(self)->container;
 }
 
+
+GtkWidget *
+gnc_html_get_webview( GncHtml* self )
+{
+    GncHtmlPrivate* priv;
+    GList *sw_list = NULL;
+    GtkWidget *webview = NULL;
+
+    g_return_val_if_fail (self != NULL, NULL);
+    g_return_val_if_fail (GNC_IS_HTML(self), NULL);
+
+    priv = GNC_HTML_GET_PRIVATE(self);
+    sw_list = gtk_container_get_children (GTK_CONTAINER(priv->container));
+
+    if (sw_list) // the scroll window has only one child
+    {
+#ifdef WEBKIT1
+        webview = sw_list->data;
+#else
+        GList *vp_list = gtk_container_get_children (GTK_CONTAINER(sw_list->data));
+ 
+        if (vp_list) // the viewport has only one child
+        {
+            webview = vp_list->data;
+            g_list_free (vp_list);
+        }
+#endif
+    }
+    g_list_free (sw_list);
+    return webview;
+}
+
+
 void
 gnc_html_set_parent( GncHtml* self, GtkWindow* parent )
 {
diff --git a/gnucash/html/gnc-html.h b/gnucash/html/gnc-html.h
index 67eaf7373..70b4352c9 100644
--- a/gnucash/html/gnc-html.h
+++ b/gnucash/html/gnc-html.h
@@ -256,6 +256,15 @@ gnc_html_history* gnc_html_get_history( GncHtml* html );
  */
 GtkWidget* gnc_html_get_widget( GncHtml* html );
 
+/**
+ * Returns the webview widget for this html engine
+ *
+ * @param html GncHtml object
+ * @return webview widget
+ */
+GtkWidget* gnc_html_get_webview( GncHtml* html );
+
+
 /**
  * Sets the parent window for this html engine.  The engine will be embedded in this parent.
  *

commit b51a70675f75470185e44d245853be185c4d5c20
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Mon Oct 26 10:17:07 2020 +0000

    Bug 797944 - Crash when opening new file from existing one
    
    If you have report pages that are left open when the current book is
    'Saved' and then use the 'File->Open' to open a new book Gnucash may
    crash. This was traced to the use of a g_idle_add to delay loading the
    reports in the pages that was not being cleared when the first book was
    closed.
    
    To fix this the g_idle_add has been removed and the loading of the
    report has been moved to the page focus function. By using a flag to
    indicate when pages are being restored, the report loading is delayed
    until the page is focused which has also decreased book loading time
    especially if no report pages were the current page when the book was
    closed.

diff --git a/gnucash/gnome-utils/gnc-main-window.c b/gnucash/gnome-utils/gnc-main-window.c
index 8735eecfc..46e281cbd 100644
--- a/gnucash/gnome-utils/gnc-main-window.c
+++ b/gnucash/gnome-utils/gnc-main-window.c
@@ -231,6 +231,8 @@ typedef struct GncMainWindowPrivate
      *  group, the values are structures of type
      *  MergedActionEntry. */
     GHashTable *merged_actions_table;
+    /** Set when restoring plugin pages */
+    gboolean restoring_pages;
 } GncMainWindowPrivate;
 
 GNC_DEFINE_TYPE_WITH_CODE(GncMainWindow, gnc_main_window, GTK_TYPE_WINDOW,
@@ -529,6 +531,14 @@ typedef struct
 } GncMainWindowSaveData;
 
 
+gboolean
+gnc_main_window_is_restoring_pages (GncMainWindow *window)
+{
+    GncMainWindowPrivate *priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
+    return priv->restoring_pages;
+}
+
+
 /*  Iterator function to walk all pages in all windows, calling the
  *  specified function for each page. */
 void
@@ -853,7 +863,7 @@ gnc_main_window_restore_window (GncMainWindow *window, GncMainWindowSaveData *da
     {
         gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), desired_visibility);
     }
-
+    priv->restoring_pages = TRUE;
     /* Now populate the window with pages. */
     for (i = 0; i < page_count; i++)
     {
@@ -865,7 +875,7 @@ gnc_main_window_restore_window (GncMainWindow *window, GncMainWindowSaveData *da
         while (gtk_events_pending ())
             gtk_main_iteration ();
     }
-
+    priv->restoring_pages = FALSE;
     /* Restore page ordering within the notebook. Use +1 notation so the
      * numbers in the page order match the page sections, at least for
      * the one window case. */
@@ -899,6 +909,9 @@ gnc_main_window_restore_window (GncMainWindow *window, GncMainWindowSaveData *da
         }
         gtk_notebook_set_current_page (GTK_NOTEBOOK(priv->notebook),
                                        order[0] - 1);
+
+        g_signal_emit_by_name (window, "page_changed",
+                               g_list_nth_data (priv->usage_order, 0));
     }
     if (order)
     {
@@ -2581,6 +2594,8 @@ gnc_main_window_init (GncMainWindow *window, void *data)
     priv->event_handler_id =
         qof_event_register_handler(gnc_main_window_event_handler, window);
 
+    priv->restoring_pages = FALSE;
+
     /* Get the show_color_tabs value preference */
     priv->show_color_tabs = gnc_prefs_get_bool(GNC_PREFS_GROUP_GENERAL, GNC_PREF_TAB_COLOR);
 
diff --git a/gnucash/gnome-utils/gnc-main-window.h b/gnucash/gnome-utils/gnc-main-window.h
index 568607951..ad0903b59 100644
--- a/gnucash/gnome-utils/gnc-main-window.h
+++ b/gnucash/gnome-utils/gnc-main-window.h
@@ -348,6 +348,16 @@ gboolean gnc_main_window_popup_menu_cb (GtkWidget *widget,
  */
 void gnc_main_window_restore_all_windows(const GKeyFile *keyfile);
 
+/** Check if the main window is restoring the plugin pages. This is
+ *  used on report pages to delay the creation of the report till the
+ *  page is focused.
+ *
+ *  @param window When window whose pages should be checked.
+ *
+ *  @return TRUE if pages are being restored
+ */
+gboolean gnc_main_window_is_restoring_pages (GncMainWindow *window);
+
 /** Save the persistent state of all windows.
  *
  *  @param keyfile The GKeyFile to contain persistent window state.
diff --git a/gnucash/gnome/gnc-plugin-page-report.c b/gnucash/gnome/gnc-plugin-page-report.c
index 960d63e61..d77aa5e9d 100644
--- a/gnucash/gnome/gnc-plugin-page-report.c
+++ b/gnucash/gnome/gnc-plugin-page-report.c
@@ -153,6 +153,7 @@ static GncPluginPage *gnc_plugin_page_report_recreate_page (GtkWidget *window, G
 static void gnc_plugin_page_report_name_changed (GncPluginPage *page, const gchar *name);
 static void gnc_plugin_page_report_update_edit_menu (GncPluginPage *page, gboolean hide);
 static gboolean gnc_plugin_page_report_finish_pending (GncPluginPage *page);
+static void gnc_plugin_page_report_load_uri (GncPluginPage *page);
 
 static int gnc_plugin_page_report_check_urltype(URLType t);
 //static void gnc_plugin_page_report_load_cb(gnc_html * html, URLType type,
@@ -243,12 +244,24 @@ gnc_plugin_page_report_focus_widget (GncPluginPage *report_plugin_page)
     if (GNC_IS_PLUGIN_PAGE_REPORT(report_plugin_page))
     {
         GncPluginPageReportPrivate *priv = GNC_PLUGIN_PAGE_REPORT_GET_PRIVATE(report_plugin_page);
-        GtkWidget *widget = gnc_html_get_widget (priv->html);
+        GtkWidget *window;
 
-        if (GTK_IS_WIDGET(widget))
+        if (!priv)
+            return FALSE;
+
+        window = gnc_plugin_page_get_window (report_plugin_page);
+
+        if (window && !gnc_main_window_is_restoring_pages (GNC_MAIN_WINDOW(window)))
         {
-            if (!gtk_widget_is_focus (GTK_WIDGET(widget)))
-                gtk_widget_grab_focus (GTK_WIDGET(widget));
+            GtkWidget * widget = gnc_html_get_widget (priv->html);
+
+            gnc_plugin_page_report_load_uri (report_plugin_page);
+
+            if (GTK_IS_WIDGET(widget))
+            {
+                if (!gtk_widget_is_focus (GTK_WIDGET(widget)))
+                    gtk_widget_grab_focus (GTK_WIDGET(widget));
+            }
         }
     }
     return FALSE;
@@ -332,7 +345,7 @@ gnc_plugin_page_report_set_progressbar (GncPluginPage *page, gboolean set)
         gtk_widget_set_size_request (GTK_WIDGET(progressbar), -1, -1); //reset
 }
 
-static gboolean
+static void
 gnc_plugin_page_report_load_uri (GncPluginPage *page)
 {
     GncPluginPageReport *report;
@@ -346,7 +359,7 @@ gnc_plugin_page_report_load_uri (GncPluginPage *page)
     report = GNC_PLUGIN_PAGE_REPORT(page);
     priv = GNC_PLUGIN_PAGE_REPORT_GET_PRIVATE(report);
     if (!priv)
-        return FALSE; // No priv means the page doesn't exist anymore.
+        return; // No priv means the page doesn't exist anymore.
 
     DEBUG( "Load uri id=%d", priv->reportId );
     id_name = g_strdup_printf("id=%d", priv->reportId );
@@ -375,20 +388,6 @@ gnc_plugin_page_report_load_uri (GncPluginPage *page)
 
     // this resets the window for the progressbar to NULL
     gnc_window_set_progressbar_window( NULL );
-
-    return FALSE;
-}
-
-static void
-gnc_plugin_page_report_realize_uri (GtkWidget *widget, GncPluginPage *page)
-{
-    GtkAllocation allocation;
-
-    gtk_widget_get_allocation (widget, &allocation);
-    PINFO("Realized Container size is %dw x %dh", allocation.width, allocation.height);
-
-    /* load uri when view idle */
-    g_idle_add ((GSourceFunc)gnc_plugin_page_report_load_uri, page);
 }
 
 static
@@ -457,10 +456,6 @@ gnc_plugin_page_report_create_widget( GncPluginPage *page )
     // FIXME.  This is f^-1(f(x)), isn't it?
     DEBUG( "id=%d", priv->reportId );
 
-    /* load uri when view is realized */
-    g_signal_connect (G_OBJECT(GTK_WIDGET(priv->container)), "realize",
-                      G_CALLBACK(gnc_plugin_page_report_realize_uri), page);
-
     g_signal_connect (G_OBJECT(page), "inserted",
                       G_CALLBACK(gnc_plugin_page_inserted_cb),
                       NULL);



Summary of changes:
 gnucash/gnome-utils/gnc-main-window.c              | 103 ++++++++++++++++++++-
 gnucash/gnome-utils/gnc-main-window.h              |  10 ++
 gnucash/gnome/gnc-plugin-page-report.c             |  88 +++++++++++++-----
 .../gschemas/org.gnucash.warnings.gschema.xml.in   |  10 ++
 gnucash/html/gnc-html.c                            |  33 +++++++
 gnucash/html/gnc-html.h                            |   9 ++
 6 files changed, 229 insertions(+), 24 deletions(-)



More information about the gnucash-changes mailing list