2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4 ;; MODULE : tm-preferences.scm
5 ;; DESCRIPTION : management of the user preferences
6 ;; COPYRIGHT : (C) 1999 Joris van der Hoeven
8 ;; This software falls under the GNU general public license version 3 or later.
9 ;; It comes WITHOUT ANY WARRANTY WHATSOEVER. For details, see the file LICENSE
10 ;; in the root directory or <http://www.gnu.org/licenses/gpl-3.0.html>.
12 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
14 (texmacs-module (kernel texmacs tm-preferences)
15 (:use (kernel texmacs tm-define)))
17 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
18 ;; Defining preference call back routines
19 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
21 (define-public preferences-table (make-ahash-table))
22 (define-public preferences-default (make-ahash-table))
23 (define-public preferences-call-back (make-ahash-table))
25 (define (define-preference x)
26 (with (which value call-back) x
27 `(if (not (ahash-ref preferences-default ,which))
28 (ahash-set! preferences-default ,which ,value))))
30 (define (define-preference-call-back x)
31 (with (which value call-back) x
33 (ahash-set! preferences-call-back ,which ,call-back)
34 (notify-preference ,which))))
36 (define-public-macro (define-preferences . l)
38 (map-in-order define-preference l)
39 (map-in-order define-preference-call-back l)))
41 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
42 ;; Setting and getting preferences
43 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
45 (define (test-preference? which what)
46 (== what (get-preference which)))
48 (tm-define (set-preference which what)
49 (:synopsis "Set preference @which to @what")
50 (:check-mark "*" test-preference?)
51 (ahash-set! preferences-table which what)
52 ;;(display* "set-preference " which " := " what "\n")
53 ((get-call-back which) which (get-preference which))
56 (tm-define (reset-preference which)
57 (:synopsis "Revert preference @which to default setting")
58 (ahash-remove! preferences-table which)
59 ((get-call-back which) which (get-preference which))
62 (tm-define (get-preference which)
63 (:synopsis "Get preference @which")
64 (if (ahash-ref preferences-table which)
65 (ahash-ref preferences-table which)
66 (ahash-ref preferences-default which)))
68 (define (preference-on? which)
69 (test-preference? which "on"))
71 (tm-define (toggle-preference which)
72 (:synopsis "Toggle the preference @which")
73 (:check-mark "v" preference-on?)
74 (let ((what (get-preference which)))
75 (set-preference which (cond ((== what "on") "off")
76 ((== what "off") "on")
79 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
80 ;; Applying preferences
81 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
83 (define (get-call-back what)
84 (let ((r (ahash-ref preferences-call-back what)))
85 (if r r (lambda args (noop)))))
87 (define-public (notify-preference var)
88 "Notify a change in preference @var"
89 ;;(display* "notify-preference " var ", " (get-preference var) "\n")
90 ((get-call-back var) var (get-preference var)))
92 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
93 ;; Initialize preferences and consulting preferences
94 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
96 (define user-preferences '())
97 (define saved-preferences '())
99 (define (preferences->list table)
100 (let* ((folder (lambda (key im tail) (cons (list key im) tail)))
101 (unsorted (ahash-fold folder '() table))
102 (comp? (lambda (l1 l2) (string<=? (car l1) (car l2)))))
103 (list-sort unsorted comp?)))
105 (define (save-preferences)
106 (set! user-preferences (preferences->list preferences-table))
107 (if (!= user-preferences saved-preferences)
109 (save-object "$TEXMACS_HOME_PATH/system/preferences.scm"
111 (set! saved-preferences user-preferences))))
113 (define (retrieve-preferences)
114 "Retrieve preferences from disk"
115 (if (url-exists? "$TEXMACS_HOME_PATH/system/preferences.scm")
116 (set! saved-preferences
117 (load-object "$TEXMACS_HOME_PATH/system/preferences.scm")))
118 (fill-dictionary preferences-table saved-preferences))
120 (retrieve-preferences)