diff --git a/src/gnome/top-level.c b/src/gnome/top-level.c index 96c7deb00c..06ea2c7e6e 100644 --- a/src/gnome/top-level.c +++ b/src/gnome/top-level.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include "AccWindow.h" @@ -38,6 +39,7 @@ #include "Refresh.h" #include "SplitLedger.h" #include "TransLog.h" +#include "argv-list-converters.h" #include "combocell.h" #include "date.h" #include "dialog-account.h" @@ -134,6 +136,23 @@ gnc_get_ui_data(void) return app; } +static const char* gnc_scheme_remaining_var = "gnc:*command-line-remaining*"; + +static char** +gnc_get_remaining_argv(int prelen, const char **prependargv) +{ + SCM rem = gh_lookup(gnc_scheme_remaining_var); + return gnc_scheme_list_to_nulltermcharpp(prelen, prependargv, rem); +} + +static void +gnc_set_remaining_argv(int len, const char **rest) +{ + SCM toput = gnc_argvarr_to_scheme_list(len, rest); + gh_define(gnc_scheme_remaining_var, toput); +} + + /* ============================================================== */ /* These gnucash_ui_init and gnucash_ui functions are just hacks to get @@ -141,11 +160,19 @@ gnc_get_ui_data(void) what they should do soon, and expect that the open/select functions will be merged with the code in FMB_OPEN in MainWindow.c */ +static const char *default_argv[] = {"gnucash", 0}; + +static const struct poptOption nullPoptTable[] = { + { NULL, 0, 0, NULL, 0 } +}; + int gnucash_ui_init(void) { - int fake_argc = 1; - char *fake_argv[] = {"gnucash"}; + int restargc; + char **restargv; + char **restargv2; + poptContext returnedPoptContext; ENTER ("\n"); @@ -153,9 +180,27 @@ gnucash_ui_init(void) specific args... */ if (!gnome_is_initialized) { - gnome_init("GnuCash", NULL, fake_argc, fake_argv); + restargv = gnc_get_remaining_argv(1, default_argv); + if(restargv == NULL) + { + restargv = g_new(char*, 2); + restargv[0] = g_strdup(default_argv[0]); + restargv[1] = NULL; + } + + restargc = argv_length(restargv); + + gnome_init_with_popt_table("GnuCash", NULL, restargc, restargv, + nullPoptTable, 0, &returnedPoptContext); gnome_is_initialized = TRUE; + restargv2 = (char**)poptGetArgs(returnedPoptContext); + gnc_set_remaining_argv(argv_length(restargv2), (const char**)restargv2); + gh_eval_str("(gnc:load-account-file)"); + + /* this must come after using the poptGetArgs return value */ + gnc_free_argv(restargv); + gnc_component_manager_init (); /* initialization required for gtkhtml */ @@ -208,13 +253,13 @@ gnucash_ui_init(void) auto_decimal_callback_id = gnc_register_option_change_callback(gnc_configure_auto_decimal_cb, NULL, "General", - "Automatic Decimal Point"); + "Automatic Decimal Point"); gnc_configure_auto_decimal_places(); auto_decimal_places_callback_id = - gnc_register_option_change_callback(gnc_configure_auto_decimal_places_cb, - NULL, "General", - "Auto Decimal Places"); + gnc_register_option_change_callback(gnc_configure_auto_decimal_places_cb, + NULL, "General", + "Auto Decimal Places"); gnc_configure_register_font(); register_font_callback_id = diff --git a/src/scm/command-line.scm b/src/scm/command-line.scm index 62af95fd6e..f872c6c079 100644 --- a/src/scm/command-line.scm +++ b/src/scm/command-line.scm @@ -17,8 +17,71 @@ ;; also "-c" -(define gnc:*command-line-files* #f) +(define gnc:*command-line-remaining* #f) +;;(use-modules (ice-9 getopt-long)) + +;;(define (gnc:is-boolean-arg? arg) +;; (if (or (string=? arg "true") (string=? arg "false")) #t #f)) + +;;(define (gnc:is-integer-arg? arg) +;; (if (string->number arg) #t #f)) + +;;(define (gnc:convert-arg-to-boolean arg) +;; (if (string=? arg "true") +;; #t +;; (if (string=? arg "false") +;; #f +;; 'abort))) + +;;(define (gnc:convert-arg-to-integer arg) +;; (let ((value (string->number arg))) +;; (if (and (not value) (not (exact? value))) +;; 'abort +;; value))) + +;;(define (gnc:convert-arg-defs-to-opt-args arg-defs) +;; (letrec ((return '()) +;; (decide-single-char +;; (let ((single-char-cache '())) +;; (lambda (name) +;; (let ((possible (string-ref name 0))) +;; (if (eq? (assv possible single-char-cache) #f) +;; (begin +;; (set! single-char-cache (acons possible #t +;; single-char-cache)) +;; possible) +;; #f))))) +;; (create-arg-list +;; (lambda (name-sym value pred sc) +;; (let ((ret `(,name-sym (value ,value)))) +;; (if (not (eq? pred #f)) +;; (set! ret (append ret (cons 'predicate pred)))) +;; (if (not (eq? sc #f)) +;; (set! ret (append ret (cons 'single-char sc)))) +;; ret))) +;; (helper +;; (lambda (arg-defs ret) +;; (if (not (pair? arg-defs)) +;; ret +;; (helper +;; (cdr arg-defs) +;; (cons +;; (let* ((one-arg (car arg-defs)) +;; (arg-name (car one-arg)) +;; (arg-sym (string->symbol arg-name)) +;; (arg-oc (decide-single-char arg-name))) +;; (case (cadr one-arg) +;; ((boolean) (create-arg-list arg-sym 'optional +;; gnc:is-boolean-arg? +;; arg-oc)) +;; ((integer) (create-arg-list arg-sym #t +;; gnc:is-integer-arg? +;; arg-oc)) +;; ((string) (create-arg-list arg-sym #t #f arg-oc)))) +;; ret)))))) +;; (helper arg-defs return))) + (define gnc:*arg-defs* (list @@ -150,11 +213,41 @@ (define (gnc:prefs-show-usage) (display "usage: gnucash [ option ... ] [ datafile ]") (newline)) +;;(define (gnc:handle-command-line-args) +;; (letrec ((internal +;; (lambda () +;; (getopt-long (program-arguments) +;; (gnc:convert-arg-defs-to-opt-args gnc:*arg-defs*)))) +;; (arg-handler +;; (lambda (args) +;; (if (pair? args) +;; (begin +;; (let ((one-arg (car args))) +;; (if (eq? (car one-arg) '()) +;; (set! gnc:*command-line-remaining* (cdr one-arg)) +;; (let* ((arg-name (symbol->string (car one-arg))) +;; (arg-stuff (assoc-ref gnc:*arg-defs* arg-name))) +;; (case (car arg-stuff) +;; ((string) +;; ((cdr arg-stuff) (cdr one-arg))) +;; ((integer) +;; ((cdr arg-stuff) (gnc:convert-arg-to-integer +;; (cdr one-arg)))) +;; ((boolean) +;; ((cdr arg-stuff) (gnc:convert-arg-to-boolean +;; (cdr one-arg)))))))) +;; (arg-handler (cdr args))))))) +;; (display "Converted") (newline) +;; (display (gnc:convert-arg-defs-to-opt-args gnc:*arg-defs*)) (newline) +;; (flush-all-ports) +;; (arg-handler (internal))) +;; #t) + (define (gnc:handle-command-line-args) (gnc:debug "handling command line arguments" (program-arguments)) - (let ((files-to-open '()) + (let ((remaining-arguments '()) (result #t)) (do ((rest (cdr (program-arguments))) ; initial cdr skips argv[0] @@ -172,7 +265,7 @@ (begin (gnc:debug "non-option " item ", assuming file") (set! rest (cdr rest)) - (set! files-to-open (cons item files-to-open))) + (set! remaining-arguments (cons item remaining-arguments))) (if (string=? "--" item) ;; ignore -- @@ -188,6 +281,8 @@ ;;(set! quit? #t)) (display "Ignoring unused option ")(display arg-string) (newline) + (set! remaining-arguments + (cons item remaining-arguments)) (set! rest (cdr rest))) (let* ((arg-type (car arg-def)) @@ -210,8 +305,8 @@ ((cdr arg-def) parsed-value) (set! rest remaining-args))))))))) (if result - (gnc:debug "files to open: " files-to-open)) + (gnc:debug "files to open: " remaining-arguments)) - (set! gnc:*command-line-files* files-to-open) + (set! gnc:*command-line-remaining* remaining-arguments) result)) diff --git a/src/scm/main.scm b/src/scm/main.scm index 4754d3c207..d1e5b6aee1 100644 --- a/src/scm/main.scm +++ b/src/scm/main.scm @@ -99,6 +99,14 @@ (gnc:debug "UI Shutdown hook.") (gnc:file-quit)) +(define (gnc:load-account-file) + (let ((ok (not (gnc:config-var-value-get gnc:*arg-no-file*))) + (file (if (pair? gnc:*command-line-remaining*) + (car gnc:*command-line-remaining*) + (gnc:history-get-last)))) + (if (and ok (string? file)) + (gnc:ui-open-file file)))) + (define (gnc:main) ;; Now the fun begins. @@ -118,12 +126,8 @@ (if (null? gnc:*batch-mode-things-to-do*) ;; We're not in batch mode; we can go ahead and do the normal thing. - (let ((ok (not (gnc:config-var-value-get gnc:*arg-no-file*))) - (file (if (pair? gnc:*command-line-files*) - (car gnc:*command-line-files*) - (gnc:history-get-last)))) - (if (and ok (string? file)) - (gnc:ui-open-file file)) + (begin + ;; (gnc:load-account-file) (gnc:hook-add-dangler gnc:*ui-shutdown-hook* gnc:ui-finish) (gnc:ui-main) (gnc:hook-remove-dangler gnc:*ui-shutdown-hook* gnc:ui-finish))