AUDIT: r20693 - gnucash/trunk/src/gnome-utils - Fix up the Mac shutdown process to give Gnucash a chance to clean up without spewing critical errors about the main loop already running (because of calling gnc_shutdown in an event handler).
jralls at code.gnucash.org
Thu May 26 19:14:14 EDT 2011
Date: 2011-05-26 19:14:13 -0400 (Thu, 26 May 2011)
New Revision: 20693
Fix up the Mac shutdown process to give Gnucash a chance to clean up without spewing critical errors about the main loop already running (because of calling gnc_shutdown in an event handler).
--- gnucash/trunk/src/gnome-utils/gnc-main-window.c 2011-05-26 23:14:05 UTC (rev 20692)
+++ gnucash/trunk/src/gnome-utils/gnc-main-window.c 2011-05-26 23:14:13 UTC (rev 20693)
@@ -3401,12 +3401,25 @@
+/* Event handlers for the shutdown process. Gnc_quartz_shutdown is
+ * connected to NSApplicationWillTerminate, the last chance to do
+ * anything before quitting. The problem is that it's launched from a
+ * CFRunLoop, not a g_main_loop, and if we call anything that would
+ * affect the main_loop we get an assert that we're in a subidiary
+ * loop.
gtk_quartz_shutdown (GtkOSXApplication *theApp, gpointer data)
+/* Do Nothing. It's too late. */
+/* Should quit responds to NSApplicationBlockTermination; returning
+ * TRUE means "don't terminate", FALSE means "do terminate". If we
+ * decide that it's OK to terminate, then we queue a gnc_shutdown for
+ * the next idle time (because we're not running in the main loop) and
+ * then tell the OS not to terminate. That gives the gnc_shutdown an
+ * opportunity to shut down.
gtk_quartz_should_quit (GtkOSXApplication *theApp, GncMainWindow *window)
@@ -3421,8 +3434,9 @@
if (needs_save && gnc_main_window_prompt_for_save(GTK_WIDGET(window)))
- return FALSE;
+ g_idle_add((GSourceFunc)gnc_shutdown, 0);
+ return TRUE;
More information about the gnucash-changes