[Gnucash-changes] r12956 - gnucash/trunk/src - Major step in extraction of application startup from guile.

Chris Shoemaker chris at cvs.gnucash.org
Mon Jan 23 12:38:14 EST 2006


Author: chris
Date: 2006-01-23 12:38:13 -0500 (Mon, 23 Jan 2006)
New Revision: 12956
Trac: http://svn.gnucash.org/trac/changeset/12956

Modified:
   gnucash/trunk/src/bin/gnucash-bin.c
   gnucash/trunk/src/gnome/Makefile.am
   gnucash/trunk/src/gnome/gw-gnc-spec.scm
   gnucash/trunk/src/gnome/top-level.c
   gnucash/trunk/src/gnome/top-level.h
   gnucash/trunk/src/scm/Makefile.am
   gnucash/trunk/src/scm/build-config.scm.in
   gnucash/trunk/src/scm/main-window.scm
   gnucash/trunk/src/scm/main.scm
Log:
  Major step in extraction of application startup from guile.

  Details:
    Remove the last bits of libguile from top-level.[ch].
    Change the gui initialization funtions so they can be called from C.
    Drop some gwrappers for gui initialization functions.
    Process the --nofile and filename command-line options from C.
    Drastic simpilification of main.scm.
    Initialize the gui and enter the gtk event-loop from C.

  Even though there's some more clean-up to do, this patch does mark
  a certain milestone:  A developer seeking to understand and/or modify 
  GnuCash's startup process can now essentially ignore the guile portion.
  Most parts of our startup now look pretty typical for a gnome-2 app.
  The parts that remain firmly in guile are initialization of the report
  menus and the installation of price-quote sources.

  Caveat: We have multiple mechanisms for handling the filename
  argument string -- some in guile and some in C.  The C-side mechanisms
  (in engine/gnc-filepath-utils.c) seem a little nicer than the guile
  ones (in main.scm).  They have slightly different behavior (e.g. which
  paths they'll search for data files.)  They both handle URIs and
  making absolute paths out of relative ones.  This patch switches from
  using the guile functions to the C function.  I've tested that the common
  cases are handled the same way, but it wouldn't surprise me if some 
  corner-cases are not.



Modified: gnucash/trunk/src/bin/gnucash-bin.c
===================================================================
--- gnucash/trunk/src/bin/gnucash-bin.c	2006-01-23 14:30:37 UTC (rev 12955)
+++ gnucash/trunk/src/bin/gnucash-bin.c	2006-01-23 17:38:13 UTC (rev 12956)
@@ -43,16 +43,23 @@
 #include "gnc-main.h"
 #include "gnc-splash.h"
 #include "gnc-gnome-utils.h"
+#include "gnc-plugin-file-history.h"
+#include "gnc-gconf-utils.h"
+#include "dialog-new-user.h"
 
-static int gnucash_show_version;
 /* GNUCASH_SVN is defined whenever we're building from an SVN tree */
 #ifdef GNUCASH_SVN
 static int is_development_version = TRUE;
 #else
 static int is_development_version = FALSE;
 #endif
-static char *add_quotes_file;
 
+/* Command-line option variables */
+static int gnucash_show_version;
+static const char *add_quotes_file;
+static int nofile;
+static const char *file_to_load;
+
 static void
 gnc_print_unstable_message(void)
 {
@@ -209,7 +216,7 @@
         {"loglevel", '\0', POPT_ARG_INT, NULL, 0,
          _("Set the logging level from 0 (least) to 6 (most)"), 
          _("LOGLEVEL")},
-        {"nofile", '\0', POPT_ARG_NONE, NULL, 0,
+        {"nofile", '\0', POPT_ARG_NONE, &nofile, 0,
          _("Do not load the last file opened"), NULL},
         {"config-path", '\0', POPT_ARG_STRING, &config_path, 0,
          _("Set configuration path"), _("CONFIGPATH")},
@@ -232,6 +239,7 @@
     poptSetOtherOptionHelp(pc, "[OPTIONS...] [datafile]");
     
     while ((rc = poptGetNextOpt(pc)) > 0);
+    file_to_load = poptGetArg(pc);
     poptFreeContext(pc);
 
     if (gnucash_show_version) {
@@ -330,22 +338,56 @@
     return;
 }
 
+static char *
+get_file_to_load()
+{
+    if (file_to_load)
+        return g_strdup(file_to_load);
+    else
+        return gnc_history_get_last();
+}
+
 static void
 inner_main (void *closure, int argc, char **argv)
 {
     SCM main_mod;
+    char* fn;
+    GError *error = NULL;
  
     main_mod = scm_c_resolve_module("gnucash main");
     scm_set_current_module(main_mod);
 
-    /* Can't show splash screen here unless we init gnome first */
-    //gnc_show_splash_screen();
+    /* TODO: After some more guile-extraction, this should happen
+       even before booting guile. */
+    gnc_gui_init();
 
     load_gnucash_modules();
     load_system_config();
     load_user_config();
+    gnc_hook_add_dangler(HOOK_UI_SHUTDOWN, (GFunc)gnc_file_quit, NULL);
 
     scm_c_eval_string("(gnc:main)");
+
+    
+    if (!nofile && (fn = get_file_to_load())) {
+        gnc_update_splash_screen(_("Loading data..."));
+        gnc_destroy_splash_screen();
+        if (gnc_file_open_file(fn))
+            gnc_hook_run(HOOK_BOOK_OPENED, NULL);
+        g_free(fn);
+    } 
+    else if (gnc_gconf_get_bool("dialogs/new_user", "first_startup", &error) &&
+             !error) {
+        gnc_destroy_splash_screen();
+        gnc_ui_new_user_dialog();
+    }
+
+    gnc_destroy_splash_screen();
+
+    gnc_hook_run(HOOK_UI_POST_STARTUP, NULL);
+    gnc_ui_start_event_loop();
+    gnc_hook_remove_dangler(HOOK_UI_SHUTDOWN, (GFunc)gnc_file_quit);
+
     shutdown(0);
     return;
 }

Modified: gnucash/trunk/src/gnome/Makefile.am
===================================================================
--- gnucash/trunk/src/gnome/Makefile.am	2006-01-23 14:30:37 UTC (rev 12955)
+++ gnucash/trunk/src/gnome/Makefile.am	2006-01-23 17:38:13 UTC (rev 12956)
@@ -12,6 +12,7 @@
   ${top_builddir}/src/report/report-gnome/libgncmod-report-gnome.la \
   ${top_builddir}/src/register/ledger-core/libgncmod-ledger-core.la \
   ${top_builddir}/src/gnome-search/libgncmod-gnome-search.la \
+  ${top_builddir}/src/gnome-utils/libgncmod-gnome-utils.la \
   ${top_builddir}/lib/glib26/libgncglib.la \
   ${GUILE_LIBS} ${GNOME_LIBS} ${GLIB_LIBS} ${QOF_LIBS}
 

Modified: gnucash/trunk/src/gnome/gw-gnc-spec.scm
===================================================================
--- gnucash/trunk/src/gnome/gw-gnc-spec.scm	2006-01-23 14:30:37 UTC (rev 12955)
+++ gnucash/trunk/src/gnome/gw-gnc-spec.scm	2006-01-23 17:38:13 UTC (rev 12956)
@@ -74,30 +74,6 @@
 
   (gw:wrap-function
    ws
-   'gnc:start-ui-event-loop
-   '<gw:int>
-   "gnc_ui_start_event_loop"
-   '()
-   "Start the UI event loop.")
-
-  (gw:wrap-function
-   ws
-   'gnc:gui-init
-   '<gw:scm>
-   "gnc_gui_init"
-   '((<gw:scm> command-line))
-   "Initialize the remaining parts of the lower level ui. Returns main-window and remaining command line.")
-
-  (gw:wrap-function
-   ws
-   'gnc:gui-init-splash
-   '<gw:scm>
-   "gnc_gui_init_splash"
-   '((<gw:scm> command-line))
-   "Initialize the lower level ui parts and put up the splash screen. Returns remaining command line.")
-
-  (gw:wrap-function
-   ws
    'gnc:update-splash-screen
    '<gw:void>
    "gnc_update_splash_screen"

Modified: gnucash/trunk/src/gnome/top-level.c
===================================================================
--- gnucash/trunk/src/gnome/top-level.c	2006-01-23 14:30:37 UTC (rev 12955)
+++ gnucash/trunk/src/gnome/top-level.c	2006-01-23 17:38:13 UTC (rev 12956)
@@ -26,7 +26,6 @@
 
 #include <gtk/gtk.h>
 #include <glib/gi18n.h>
-#include <libguile.h>
 #include <popt.h>
 #include <stdlib.h>
 #include <g-wrap-wct.h>
@@ -72,6 +71,7 @@
 #include "guile-util.h"
 #include "top-level.h"
 #include "window-report.h"
+#include "gnc-window.h"
 
 
 #define ACCEL_MAP_NAME "accelerator-map"
@@ -238,11 +238,9 @@
 
 /* ============================================================== */
 
-SCM
-gnc_gui_init_splash (SCM command_line)
+void
+gnc_gui_init_splash (void)
 {
-  SCM ret = command_line;
-
   ENTER (" ");
 
   if (!splash_is_initialized)
@@ -254,32 +252,33 @@
   }
 
   LEAVE (" ");
-
-  return ret;
 }
 
-SCM
-gnc_gui_init (SCM command_line)
+void
+gnc_gui_init (void)
 {
-  SCM ret = command_line;
-  GncMainWindow *main_window;
-  gchar *map;
+    GncMainWindow *main_window;
+    gchar *map;
 
-  ENTER (" ");
-
-  if (!gnome_is_initialized)
-  {
+    ENTER (" ");
+    
+    if (gnome_is_initialized) {
+        LEAVE("already initialized");
+        return;
+    }
+        
     /* Make sure the splash (and hense gnome) was initialized */
     if (!splash_is_initialized)
-      ret = gnc_gui_init_splash (ret);
+        gnc_gui_init_splash();
 
     gnome_is_initialized = TRUE;
 
     gnc_ui_util_init();
     gnc_configure_date_format();
-    gnc_gconf_general_register_cb(KEY_DATE_FORMAT,
-				  (GncGconfGeneralCb)gnc_configure_date_format, NULL);
-    gnc_gconf_general_register_any_cb((GncGconfGeneralAnyCb)gnc_gui_refresh_all, NULL);
+    gnc_gconf_general_register_cb(
+        KEY_DATE_FORMAT, (GncGconfGeneralCb)gnc_configure_date_format, NULL);
+    gnc_gconf_general_register_any_cb(
+        (GncGconfGeneralAnyCb)gnc_gui_refresh_all, NULL);
 
     if (!gnucash_style_init())
       gnc_shutdown(1);
@@ -309,11 +308,16 @@
     g_free(map);
 
     /* FIXME Remove this test code */
-    gnc_plugin_manager_add_plugin (gnc_plugin_manager_get (), gnc_plugin_account_tree_new ());
-    gnc_plugin_manager_add_plugin (gnc_plugin_manager_get (), gnc_plugin_basic_commands_new ());
-    gnc_plugin_manager_add_plugin (gnc_plugin_manager_get (), gnc_plugin_file_history_new ());
-    gnc_plugin_manager_add_plugin (gnc_plugin_manager_get (), gnc_plugin_menu_additions_new ());
-    gnc_plugin_manager_add_plugin (gnc_plugin_manager_get (), gnc_plugin_register_new ());
+    gnc_plugin_manager_add_plugin (
+        gnc_plugin_manager_get (), gnc_plugin_account_tree_new ());
+    gnc_plugin_manager_add_plugin (
+        gnc_plugin_manager_get (), gnc_plugin_basic_commands_new ());
+    gnc_plugin_manager_add_plugin (
+        gnc_plugin_manager_get (), gnc_plugin_file_history_new ());
+    gnc_plugin_manager_add_plugin (
+        gnc_plugin_manager_get (), gnc_plugin_menu_additions_new ());
+    gnc_plugin_manager_add_plugin (
+        gnc_plugin_manager_get (), gnc_plugin_register_new ());
     /* I'm not sure why the FIXME note says to remove this.  Maybe
        each module should be adding its own plugin to the manager?
        Anyway... Oh, maybe... nah */
@@ -325,17 +329,11 @@
     /* Run the ui startup hooks. */
     gnc_hook_run(HOOK_UI_STARTUP, NULL);
 
-    // return ( main_window . command_line )
-    {
-      SCM gncMainWindowType;
-      gncMainWindowType = scm_c_eval_string("<gnc:MainWindow*>");
-      ret = scm_cons( gw_wcp_assimilate_ptr(main_window, gncMainWindowType), ret );
-    }
-  }
+    gnc_window_set_progressbar_window (GNC_WINDOW(main_window));
 
-  LEAVE (" ");
+    LEAVE (" ");
 
-  return ret;
+    return;
 }
 
 /* ============================================================== */

Modified: gnucash/trunk/src/gnome/top-level.h
===================================================================
--- gnucash/trunk/src/gnome/top-level.h	2006-01-23 14:30:37 UTC (rev 12955)
+++ gnucash/trunk/src/gnome/top-level.h	2006-01-23 17:38:13 UTC (rev 12956)
@@ -24,14 +24,13 @@
 #define TOP_LEVEL_H
 
 #include <glib.h>
-#include <libguile.h>
 
-gboolean      gnucash_ui_is_running (void);
-gboolean      gnucash_ui_is_terminating (void);
-SCM           gnc_gui_init_splash (SCM command_line);
-SCM           gnc_gui_init (SCM command_line);
-void          gnc_gui_shutdown (void);
-void          gnc_gui_destroy (void);
-int           gnc_ui_start_event_loop (void);
+gboolean gnucash_ui_is_running (void);
+gboolean gnucash_ui_is_terminating (void);
+void gnc_gui_init_splash (void);
+void gnc_gui_init (void);
+void gnc_gui_shutdown (void);
+void gnc_gui_destroy (void);
+int gnc_ui_start_event_loop (void);
 
 #endif

Modified: gnucash/trunk/src/scm/Makefile.am
===================================================================
--- gnucash/trunk/src/scm/Makefile.am	2006-01-23 14:30:37 UTC (rev 12955)
+++ gnucash/trunk/src/scm/Makefile.am	2006-01-23 17:38:13 UTC (rev 12956)
@@ -44,8 +44,6 @@
 	rm -f $@.tmp
 	sed < $< > $@.tmp \
             -e 's:@-VERSION-@:${VERSION}:' \
-            -e 's:@-GNC_CONFIGDIR-@:${GNC_CONFIGDIR}:' \
-            -e 's:@-GNC_SHAREDIR-@:${GNC_SHAREDIR}:' \
             -e 's:@-GNC_HELPDIR-@:${GNC_HELPDIR}:'
 	mv $@.tmp $@
 

Modified: gnucash/trunk/src/scm/build-config.scm.in
===================================================================
--- gnucash/trunk/src/scm/build-config.scm.in	2006-01-23 14:30:37 UTC (rev 12955)
+++ gnucash/trunk/src/scm/build-config.scm.in	2006-01-23 17:38:13 UTC (rev 12956)
@@ -3,6 +3,4 @@
 
 ;; Automatically generated defaults (don't use these directly --
 ;; they're used during actual initialization elsewhere)
-(define gnc:_install-config-path_ '("@-GNC_CONFIGDIR-@"))
-(define gnc:_install-share-path_ '("@-GNC_SHAREDIR-@"))
 (define gnc:_install-doc-path_ '("@-GNC_HELPDIR-@"))

Modified: gnucash/trunk/src/scm/main-window.scm
===================================================================
--- gnucash/trunk/src/scm/main-window.scm	2006-01-23 14:30:37 UTC (rev 12955)
+++ gnucash/trunk/src/scm/main-window.scm	2006-01-23 17:38:13 UTC (rev 12956)
@@ -50,7 +50,8 @@
     ;; get a list of the reports we'll be needing to nuke     
     (hash-fold 
      (lambda (k v p)
-       (set! dead-reports (cons k dead-reports)) #t) #t *gnc:_reports_*)
+       (set! dead-reports (cons k dead-reports)) #t) 
+     #t *gnc:_reports_*)
 
     ;; actually remove them (if they're being displayed, the
     ;; window's reference will keep the report alive until the
@@ -95,7 +96,3 @@
 			   slots (_ "Book Options")
 			   changed_cb)))
 
-(gnc:hook-remove-dangler gnc:*book-closed-hook* 
-                         gnc:main-window-book-close-handler)
-(gnc:hook-add-dangler gnc:*book-closed-hook* 
-                      gnc:main-window-book-close-handler)

Modified: gnucash/trunk/src/scm/main.scm
===================================================================
--- gnucash/trunk/src/scm/main.scm	2006-01-23 14:30:37 UTC (rev 12955)
+++ gnucash/trunk/src/scm/main.scm	2006-01-23 17:38:13 UTC (rev 12956)
@@ -37,6 +37,8 @@
 ;; files we can load from the top-level because they're "well behaved"
 ;; (these should probably be in modules eventually)
 (load-from-path "doc.scm")
+(load-from-path "main-window.scm")  ;; depends on app-utils (N_, etc.)...
+(load-from-path "fin.scm")
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Exports
@@ -318,56 +320,6 @@
             (gnc:find-file file (list (car dirs)))
             (loop prefixes (cdr dirs))))))
 
-(define (gnc:startup-pass-2)
-  (gnc:debug "starting up (2).")
-
-  ;; SUPER UGLY HACK -- this should go away when I come back for the
-  ;; second cleanup pass...
-  (let ((original-module (current-module))
-        (bootstrap (resolve-module '(gnucash main))))
-    
-    (define (load-module name vers optional?)
-      (let ((str (string-append (_ "Loading modules... ") name)))
-	(gnc:update-splash-screen str)
-	(if optional?
-	    (gnc:module-load-optional name vers)
-	    (gnc:module-load name vers))))
-
-    (set-current-module bootstrap)
-
-    ;; files we should be able to load from the top-level because
-    ;; they're "well behaved" (these should probably be in modules
-    ;; eventually)
-    (load-from-path "main-window.scm")  ;; depends on app-utils (N_, etc.)...
-    (load-from-path "printing/print-check.scm") ;; depends on simple-obj...
-    ;; +jsled - 2002.07.08
-    (load-from-path "fin.scm")
-
-    (gnc:update-splash-screen (_ "Checking Finance::Quote..."))
-    (gnc:price-quotes-install-sources)
-
-    (set-current-module original-module))
-
-  ;; Load the system configs
-  (gnc:update-splash-screen (_ "Loading configs..."))
-
-  (gnc:report-menu-setup)
-
-  ;; the Welcome to GnuCash "extravaganza" report
-  (gnc:add-extension 
-   (gnc:make-menu-item 
-    (N_ "Welcome Sample Report")
-    (N_ "Welcome-to-GnuCash report screen")
-    (list gnc:menuname-reports gnc:menuname-utility "")
-    (lambda (window)
-      (gnc:main-window-open-report (gnc:make-welcome-report) window))))
-
-  (gnc:hook-run-danglers gnc:*startup-hook*)
-
-  (if (gnc:config-var-value-get gnc:*loglevel*)
-      (gnc:set-log-level-global (gnc:config-var-value-get gnc:*loglevel*))))
-
-
 (define (gnc:shutdown exit-status)
   (gnc:debug "Shutdown -- exit-status: " exit-status)
 
@@ -458,37 +410,31 @@
   (if (not (gnc:handle-command-line-args))
       (gnc:shutdown 1))
 
-  (gnc:hook-add-dangler gnc:*ui-shutdown-hook* gnc:gui-finish)
-  ;; We init splash before gui-init, but gui-init will do the
-  ;; splash itself.
-  (set! gnc:*command-line-remaining*
-        (gnc:gui-init-splash gnc:*command-line-remaining*))
+  (gnc:hook-remove-dangler gnc:*book-closed-hook* 
+                           gnc:main-window-book-close-handler)
+  (gnc:hook-add-dangler gnc:*book-closed-hook* 
+                        gnc:main-window-book-close-handler)
   
-  (gnc:startup-pass-2)
-
-  ;; Why are we doing this again?
-  (gnc:hook-add-dangler gnc:*ui-shutdown-hook* gnc:gui-finish)
-  (let* ((init-window-cons-rest
-          (gnc:gui-init gnc:*command-line-remaining*))
-         (main-window (car init-window-cons-rest)))
-    (set! gnc:*command-line-remaining* (cdr init-window-cons-rest))
-    (if (and
-         (not (gnc:account-file-to-load))
-         (not (string? (gnc:history-get-last)))
-         (gnc:gconf-get-bool "dialogs/new_user" "first_startup"))
-        (begin
-          (gnc:destroy-splash-screen)
-          (gnc:new-user-dialog))
-        (begin
-          (gnc:destroy-splash-screen)
-          (gnc:main-window-set-progressbar-window main-window)
-          (gnc:load-account-file)
-          ))
-    ;; no matter how or what we loaded, ensure the main-window
-    ;; title is valid...
-    (gnc:hook-run-danglers gnc:*ui-post-startup-hook*)
-    (gnc:start-ui-event-loop) ;; this won't return until we're exiting
-    (gnc:hook-remove-dangler gnc:*ui-shutdown-hook* gnc:gui-finish))
+  (load-from-path "printing/print-check.scm") ;; depends on simple-obj...
   
+  (gnc:update-splash-screen (_ "Checking Finance::Quote..."))
+  (gnc:price-quotes-install-sources)  
+  
+  (gnc:report-menu-setup)
+  
+  ;; the Welcome to GnuCash "extravaganza" report
+  (gnc:add-extension 
+   (gnc:make-menu-item 
+    (N_ "Welcome Sample Report")
+    (N_ "Welcome-to-GnuCash report screen")
+    (list gnc:menuname-reports gnc:menuname-utility "")
+    (lambda (window)
+      (gnc:main-window-open-report (gnc:make-welcome-report) window))))
+  
+  (gnc:hook-run-danglers gnc:*startup-hook*)
+  
+  (if (gnc:config-var-value-get gnc:*loglevel*)
+      (gnc:set-log-level-global (gnc:config-var-value-get gnc:*loglevel*)))
+    
   ;;return to C
   )



More information about the gnucash-changes mailing list