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