[Gnucash-changes] Convert hooks to C API in all things.

Derek Atkins warlord at cvs.gnucash.org
Sun Jun 12 19:33:27 EDT 2005


Log Message:
-----------
Convert hooks to C API in all things.

	* src/app-utils/hooks.scm:
	  remove most of the hooks code; use the C impl.
	* src/app-utils/prefs.scm: don't define the save-options-hook here
	* src/engine/gnc-hooks.[ch]:
	  Fix the actual implementation of the scheme callback
	  Make sure we call back with appropriate number of args
	* src/engine/gw-engine-spec.scm:
	  wrap the gnc-hooks APIs
	  define the old hooks as strings.
	* src/gnome-utils/gnc-menu-extensions.scm:
	  remove definition of add-extension-hook
	* various others:
	  remove call to run-c-hook, just use the run-dangers API

Tags:
----
gnucash-gnome2-dev

Modified Files:
--------------
    gnucash:
        ChangeLog
    gnucash/src/app-utils:
        hooks.scm
        prefs.scm
    gnucash/src/engine:
        gnc-hooks.c
        gw-engine-spec.scm
    gnucash/src/gnome-utils:
        gnc-menu-extensions.scm
    gnucash/src/report/report-gnome:
        report-gnome.scm
    gnucash/src/scm:
        main.scm

Revision Data
-------------
Index: ChangeLog
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/ChangeLog,v
retrieving revision 1.1487.2.228
retrieving revision 1.1487.2.229
diff -LChangeLog -LChangeLog -u -r1.1487.2.228 -r1.1487.2.229
--- ChangeLog
+++ ChangeLog
@@ -13,6 +13,20 @@
 	* src/engine/gnc-hooks.[ch]:
 	  Fix APIs..  Even though we return 'const' don't say we do.
 
+	* src/app-utils/hooks.scm:
+	  remove most of the hooks code; use the C impl.
+	* src/app-utils/prefs.scm: don't define the save-options-hook here
+	* src/engine/gnc-hooks.[ch]:
+	  Fix the actual implementation of the scheme callback
+	  Make sure we call back with appropriate number of args
+	* src/engine/gw-engine-spec.scm:
+	  wrap the gnc-hooks APIs
+	  define the old hooks as strings.
+	* src/gnome-utils/gnc-menu-extensions.scm:
+	  remove definition of add-extension-hook
+	* various others:
+	  remove call to run-c-hook, just use the run-dangers API
+
 2005-06-11  David Hampton  <hampton at employees.org>
 
 	* src/gnome-utils/gnc-plugin-manager.[ch]: Take ownership of
Index: gw-engine-spec.scm
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/gw-engine-spec.scm,v
retrieving revision 1.53.4.10
retrieving revision 1.53.4.11
diff -Lsrc/engine/gw-engine-spec.scm -Lsrc/engine/gw-engine-spec.scm -u -r1.53.4.10 -r1.53.4.11
--- src/engine/gw-engine-spec.scm
+++ src/engine/gw-engine-spec.scm
@@ -2497,8 +2497,64 @@
 ;;
 (gw:wrap-function
  ws
- 'gnc:run-c-hook
+ 'gnc:hook-define
+ '(<gw:mchars> caller-owned)
+ "gnc_hook_create"
+ '(((<gw:mchars> caller-owned) name) ((<gw:mchars> caller-owned) desc))
+ "Define (create) a new hook")
+
+(gw:wrap-function
+ ws
+ 'gnc:hook-get-description
+ '(<gw:mchars> callee-owned)
+ "gnc_hook_get_description"
+ '(((<gw:mchars> caller-owned) hook))
+ "Get the description of a hook")
+
+(gw:wrap-function
+ ws
+ 'gnc:hook-add-dangler
+ '<gw:void>
+ "gnc_hook_add_scm_dangler"
+ '(((<gw:mchars> caller-owned) hook) (<gw:scm> procedure))
+ "Add a hook dangler to an existing hook")
+
+(gw:wrap-function
+ ws
+ 'gnc:hook-remove-dangler
+ '<gw:void>
+ "gnc_hook_del_scm_dangler"
+ '(((<gw:mchars> caller-owned) hook) (<gw:scm> procedure))
+ "Remove a hook dangler from an existing hook")
+
+(gw:wrap-function
+ ws
+ 'gnc:hook-run-danglers-real
  '<gw:void>
  "gnc_hook_run"
- '(((<gw:mchars> caller-owned) name) (<gw:void*> data))
- "Run a callback hook in the C domain.")
+ '(((<gw:mchars> caller-owned) name) (<gnc:Session*> arg))
+ "Run the danglers on a hook.")
+
+; Now wrap all the 'known' hooks
+(gw:wrap-value ws 'gnc:*startup-hook*
+	       '(<gw:mchars> callee-owned) "HOOK_STARTUP")
+(gw:wrap-value ws 'gnc:*shutdown-hook*
+	       '(<gw:mchars> callee-owned) "HOOK_SHUTDOWN")
+(gw:wrap-value ws 'gnc:*ui-startup-hook*
+	       '(<gw:mchars> callee-owned) "HOOK_UI_STARTUP")
+(gw:wrap-value ws 'gnc:*ui-post-startup-hook*
+	       '(<gw:mchars> callee-owned) "HOOK_UI_POST_STARTUP")
+(gw:wrap-value ws 'gnc:*ui-shutdown-hook* 
+	       '(<gw:mchars> callee-owned) "HOOK_UI_SHUTDOWN")
+(gw:wrap-value ws 'gnc:*new-book-hook*
+	       '(<gw:mchars> callee-owned) "HOOK_NEW_BOOK")
+(gw:wrap-value ws 'gnc:*report-hook*
+	       '(<gw:mchars> callee-owned) "HOOK_REPORT")
+(gw:wrap-value ws 'gnc:*save-options-hook*
+	       '(<gw:mchars> callee-owned) "HOOK_SAVE_OPTIONS")
+(gw:wrap-value ws 'gnc:*add-extension-hook*
+	       '(<gw:mchars> callee-owned) "HOOK_ADD_EXTENSION")
+(gw:wrap-value ws 'gnc:*book-opened-hook*
+	       '(<gw:mchars> callee-owned) "HOOK_BOOK_OPENED")
+(gw:wrap-value ws 'gnc:*book-closed-hook*
+	       '(<gw:mchars> callee-owned) "HOOK_BOOK_CLOSED")
Index: gnc-hooks.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/Attic/gnc-hooks.c,v
retrieving revision 1.1.2.6
retrieving revision 1.1.2.7
diff -Lsrc/engine/gnc-hooks.c -Lsrc/engine/gnc-hooks.c -u -r1.1.2.6 -r1.1.2.7
--- src/engine/gnc-hooks.c
+++ src/engine/gnc-hooks.c
@@ -172,11 +172,13 @@
   ENTER("hook %p, data %p, cbarg %p", hook, data, hook->data);
 
   // XXX: FIXME: We really should make sure this is a session!!! */
-  scm_call_1 (scm->proc,
-	      (data ? 
-	       gw_wcp_assimilate_ptr (data,
-				      scm_c_eval_string("<gnc:Session*>")) :
-               SCM_BOOL_F));
+  if (data) {
+    scm_call_1 (scm->proc,
+		gw_wcp_assimilate_ptr (data,
+				       scm_c_eval_string("<gnc:Session*>")));
+  } else {
+    scm_call_0 (scm->proc);
+  }
 
   LEAVE("");
 }
@@ -292,6 +294,11 @@
   gnc_hook_create(HOOK_REPORT,
 		  "Run just before the reports are pushed into the menus."
 		  "  Hook args: ()");
+  gnc_hook_create(HOOK_SAVE_OPTIONS,
+		  "Functions to run when saving options.  Hook args: ()");
+  gnc_hook_create(HOOK_ADD_EXTENSION,
+		  "Functions to run when the extensions menu is created."
+		  "  Hook args: ()");
 
   gnc_hook_create(HOOK_BOOK_OPENED,
 		  "Run after book open.  Hook args: <gnc:Session*>.");
Index: gnc-menu-extensions.scm
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/gnome-utils/gnc-menu-extensions.scm,v
retrieving revision 1.4.4.4
retrieving revision 1.4.4.5
diff -Lsrc/gnome-utils/gnc-menu-extensions.scm -Lsrc/gnome-utils/gnc-menu-extensions.scm -u -r1.4.4.4 -r1.4.4.5
--- src/gnome-utils/gnc-menu-extensions.scm
+++ src/gnome-utils/gnc-menu-extensions.scm
@@ -54,16 +54,11 @@
 (define (gnc:make-separator path)
   (gnc:make-extension 'separator "" "" path #f))
 
-(define gnc:*add-extension-hook*
-  (gnc:hook-define 
-   'add-extension-hook
-   "Functions to run when the extensions menu is created. Hook args: ()"))
-
 (define (gnc:extensions-menu-setup)
   (define menu (gnc:make-menu (N_ "Extensions") (list "_Tools")))
   (gnc:add-extension menu)
   (gnc:hook-run-danglers gnc:*add-extension-hook*)
-  (gnc:run-c-hook "hook_add_extension") #f)
+  #f)
 
 (if (gnc:debugging?)
     (gnc:hook-add-dangler gnc:*ui-startup-hook*
Index: report-gnome.scm
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/report/report-gnome/report-gnome.scm,v
retrieving revision 1.9.4.7
retrieving revision 1.9.4.8
diff -Lsrc/report/report-gnome/report-gnome.scm -Lsrc/report/report-gnome/report-gnome.scm -u -r1.9.4.7 -r1.9.4.8
--- src/report/report-gnome/report-gnome.scm
+++ src/report/report-gnome/report-gnome.scm
@@ -114,7 +114,6 @@
 
   ;; run report-hook danglers
   (gnc:hook-run-danglers gnc:*report-hook*)
-  (gnc:run-c-hook "hook_report" #f)
 
   ;; push reports (new items added on top of menu)
   (gnc:add-report-template-menu-items))
Index: prefs.scm
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/app-utils/prefs.scm,v
retrieving revision 1.28.4.6
retrieving revision 1.28.4.7
diff -Lsrc/app-utils/prefs.scm -Lsrc/app-utils/prefs.scm -u -r1.28.4.6 -r1.28.4.7
--- src/app-utils/prefs.scm
+++ src/app-utils/prefs.scm
@@ -70,19 +70,13 @@
 (define (gnc:global-options-clear-changes)
   (gnc:options-clear-changes gnc:*options-entries*))
 
-(define gnc:*save-options-hook*
-  (gnc:hook-define 
-   'save-options-hook
-   "Functions to run when saving options.  Hook args: ()"))
-
 ;; save-all-options: this is the actual hook that gets called at
 ;; shutdown.  right now, we put all the options in the same file so
 ;; it's important to make sure it happens in this order.  later the
 ;; hook should probably revert back to just save-global-options.
 (define (gnc:save-all-options)
   (gnc:save-global-options)
-  (gnc:hook-run-danglers gnc:*save-options-hook*)
-  (gnc:run-c-hook "hook_save_options" #f))
+  (gnc:hook-run-danglers gnc:*save-options-hook*))
 
 (define (gnc:save-global-options)
   (gnc:make-home-dir)
Index: hooks.scm
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/app-utils/hooks.scm,v
retrieving revision 1.5
retrieving revision 1.5.4.1
diff -Lsrc/app-utils/hooks.scm -Lsrc/app-utils/hooks.scm -u -r1.5 -r1.5.4.1
--- src/app-utils/hooks.scm
+++ src/app-utils/hooks.scm
@@ -15,115 +15,8 @@
 ;; 59 Temple Place - Suite 330        Fax:    +1-617-542-2652
 ;; Boston, MA  02111-1307,  USA       gnu at gnu.org
 
-;;; 
-;;; Code to support emacs-inspired hooks.
-;;;
-
-;;;; This is not functional yet, but it should be close...
-
-;;; Private
-
-;; Central repository for all hooks -- so we can look them up later by name.
-(define gnc:*hooks* '())
-
-;;; Developers
-
-(define (gnc:hook-define name description)
-  (let ((hook-data (vector name description '())))
-    (set! gnc:*hooks* (assoc-set! gnc:*hooks* name hook-data))
-    hook-data))
-
-(define (gnc:hook-danglers-get hook)
-  (vector-ref hook 2))
-
-(define (gnc:hook-danglers-set! hook danglers)
-  (vector-set! hook 2 danglers))
-
-(define (gnc:hook-danglers->list hook)
-  (gnc:hook-danglers-get hook))
-
-(define (gnc:hook-replace-danglers hook function-list)
-  (gnc:hook-danglers-set! hook function-list))
-
 (define (gnc:hook-run-danglers hook . args)
-  (gnc:debug "Running functions on hook " (gnc:hook-name-get hook))
-  (for-each (lambda (dangler)
-              (if (gnc:debugging?)
-                  (begin
-                    (display "  ") (display dangler) (newline)))
-              (apply dangler args))
-            (gnc:hook-danglers-get hook)))
-
-;;; Public
-
-(define (gnc:hook-lookup name)
-  (assoc-ref gnc:*hooks* name))
-
-(define (gnc:hook-add-dangler hook function)
-  (let ((danglers (gnc:hook-danglers-get hook)))
-    (gnc:hook-danglers-set! hook (append danglers (list function)))))
-
-(define (gnc:hook-remove-dangler hook function)
-  (let ((danglers (gnc:hook-danglers-get hook)))
-    (gnc:hook-danglers-set! hook (delq! function danglers))))
-
-(define (gnc:hook-description-get hook)
-  (vector-ref hook 1))
-
-(define (gnc:hook-name-get hook)
-  (vector-ref hook 0))
-
-(define gnc:*startup-hook*
-  (gnc:hook-define
-   'startup-hook
-   "Functions to run at startup.  Hook args: ()"))
-
-(define gnc:*shutdown-hook*
-  (gnc:hook-define 
-   'shutdown-hook
-   "Functions to run at guile shutdown.  Hook args: ()"))
-
-(define gnc:*ui-startup-hook*
-  (gnc:hook-define
-   'ui-startup-hook
-   "Functions to run when the ui comes up.  Hook args: ()"))
-
-(define gnc:*ui-post-startup-hook*
-  (gnc:hook-define
-   'ui-post-startup-hook
-   "Functions to run after the ui comes up.  Hook args: ()"))
-
-(define gnc:*ui-shutdown-hook*
-  (gnc:hook-define 
-   'ui-shutdown-hook
-   "Functions to run at ui shutdown.  Hook args: ()"))
-
-(define gnc:*book-opened-hook*
-  (gnc:hook-define 
-   'book-opened-hook
-   "Run after book open.  Hook args: <gnc:Session*>."))
-
-(define gnc:*new-book-hook*
-  (gnc:hook-define 
-   'new-book-hook
-   "Run after a new (empty) book is opened, before the book-opened-hook. Hook args: ()"))
-
-(define gnc:*book-closed-hook*
-  (gnc:hook-define 
-   'book-closed-hook
-   "Run before file close.  Hook args: <gnc:Session*>"))
-
-(define gnc:*report-hook*
-  (gnc:hook-define
-   'report-hook
-   "Run just before the reports are pushed into the menus.  Hook args: ()"))
-
-;;(let ((hook (gnc:hook-lookup 'startup-hook)))
-;;  (display (gnc:hook-name-get hook))
-;;  (newline)
-;;  (display (gnc:hook-description-get hook))
-;;  (newline)
-;;  (gnc:hook-add-dangler hook (lambda ()
-;;                                   (display "Running a simple startup hook")
-;;                                   (newline)))
-;;  (gnc:hook-run-danglers hook))
+  (if (null? args)
+      (set! args #f)
+      (set! args (car args)))
+  (gnc:hook-run-danglers-real hook args))
Index: main.scm
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/scm/main.scm,v
retrieving revision 1.109.2.19
retrieving revision 1.109.2.20
diff -Lsrc/scm/main.scm -Lsrc/scm/main.scm -u -r1.109.2.19 -r1.109.2.20
--- src/scm/main.scm
+++ src/scm/main.scm
@@ -503,7 +503,6 @@
       (gnc:main-window-open-report (gnc:make-welcome-report) window))))
 
   (gnc:hook-run-danglers gnc:*startup-hook*)
-  (gnc:run-c-hook "hook_startup" #f)
 
   (if (gnc:config-var-value-get gnc:*loglevel*)
       (gnc:set-log-level-global (gnc:config-var-value-get gnc:*loglevel*))))
@@ -517,12 +516,10 @@
              (if (gnc:file-query-save)
                  (begin
                    (gnc:hook-run-danglers gnc:*ui-shutdown-hook*)
-		   (gnc:run-c-hook "hook_ui_shutdown" #f)
                    (gnc:gui-shutdown)))))
         (else
 	 (gnc:gui-destroy)
 	 (gnc:hook-run-danglers gnc:*shutdown-hook*)
-	 (gnc:run-c-hook "hook_shutdown" #f)
          (gnc:engine-shutdown)
 	 (exit exit-status))))
 
@@ -581,10 +578,8 @@
 	(begin
 	  (gnc:update-splash-screen (_ "Loading data..."))
 	  (and (not (gnc:file-open-file file))
-	       (gnc:hook-run-danglers gnc:*book-opened-hook* #f)
-	       (gnc:run-c-hook "hook_book_opened" #f)))
-        (and (gnc:hook-run-danglers gnc:*book-opened-hook* #f)
-	     (gnc:run-c-hook "hook_book_opened" #f)))))
+	       (gnc:hook-run-danglers gnc:*book-opened-hook* #f)))
+        (and (gnc:hook-run-danglers gnc:*book-opened-hook* #f)))))
 
 (define (gnc:main)
 
@@ -646,7 +641,6 @@
           ;; no matter how or what we loaded, ensure the main-window title is valid...
           (gnc:main-window-update-title main-window)
           (gnc:hook-run-danglers gnc:*ui-post-startup-hook*)
-	  (gnc:run-c-hook "hook_ui_post_startup" #f)
           (gnc:start-ui-event-loop)
           (gnc:hook-remove-dangler gnc:*ui-shutdown-hook* gnc:gui-finish)))
         


More information about the gnucash-changes mailing list