1 
2 /******************************************************************************
3 * MODULE     : preferences.cpp
4 * DESCRIPTION: User preferences for TeXmacs
5 * COPYRIGHT  : (C) 2012  Joris van der Hoeven
6 *******************************************************************************
7 * This software falls under the GNU general public license version 3 or later.
8 * It comes WITHOUT ANY WARRANTY WHATSOEVER. For details, see the file LICENSE
9 * in the root directory or <http://www.gnu.org/licenses/gpl-3.0.html>.
10 ******************************************************************************/
11 
12 #include "boot.hpp"
13 #include "file.hpp"
14 #include "sys_utils.hpp"
15 #include "analyze.hpp"
16 #include "convert.hpp"
17 #include "merge_sort.hpp"
18 #include "iterator.hpp"
19 
20 /******************************************************************************
21 * Changing the user preferences
22 ******************************************************************************/
23 
24 bool user_prefs_modified= false;
25 hashmap<string,string> user_prefs ("");
26 void notify_preference (string var);
27 
28 bool
has_user_preference(string var)29 has_user_preference (string var) {
30   return user_prefs->contains (var);
31 }
32 
33 void
set_user_preference(string var,string val)34 set_user_preference (string var, string val) {
35   if (val == "default") user_prefs->reset (var);
36   else user_prefs (var)= val;
37   user_prefs_modified= true;
38   notify_preference (var);
39 }
40 
41 void
reset_user_preference(string var)42 reset_user_preference (string var) {
43   user_prefs->reset (var);
44   user_prefs_modified= true;
45   notify_preference (var);
46 }
47 
48 string
get_user_preference(string var,string val)49 get_user_preference (string var, string val) {
50   if (user_prefs->contains (var)) return user_prefs[var];
51   else return val;
52 }
53 
54 /******************************************************************************
55 * Loading and saving user preferences
56 ******************************************************************************/
57 
58 void
load_user_preferences()59 load_user_preferences () {
60   url prefs_file= "$TEXMACS_HOME_PATH/system/preferences.scm";
61   string s;
62   tree p (TUPLE);
63   if (!load_string (prefs_file, s, false))
64     p= block_to_scheme_tree (s);
65   while (is_func (p, TUPLE, 1)) p= p[0];
66   for (int i=0; i<N(p); i++)
67     if (is_func (p[i], TUPLE, 2) &&
68         is_atomic (p[i][0]) && is_atomic (p[i][1]) &&
69         is_quoted (p[i][0]->label) && is_quoted (p[i][1]->label)) {
70       string var= scm_unquote (p[i][0]->label);
71       string val= scm_unquote (p[i][1]->label);
72       user_prefs (var)= val;
73     }
74   user_prefs_modified= false;
75 }
76 
77 void
save_user_preferences()78 save_user_preferences () {
79   if (!user_prefs_modified) return;
80   url prefs_file= "$TEXMACS_HOME_PATH/system/preferences.scm";
81   iterator<string> it= iterate (user_prefs);
82   array<string> a;
83   while (it->busy ())
84     a << it->next ();
85   merge_sort (a);
86   string s;
87   for (int i=0; i<N(a); i++)
88     s << "(" << scm_quote (a[i])
89       << " " << scm_quote (user_prefs[a[i]]) << ")\n";
90   if (save_string (prefs_file, s))
91     std_warning << "The user preferences could not be saved\n";
92   user_prefs_modified= false;
93 }
94