better window handling
[guerillascript.git] / main / prefsengine.js
blob1e157ee27959903472da0e05b358f44ccf3ea901
1 /* coded by Ketmar // Invisible Vector (psyc://ketmar.no-ip.org/~Ketmar)
2 * Understanding is not required. Only obedience.
4 * This program is free software. It comes without any warranty, to
5 * the extent permitted by applicable law. You can redistribute it
6 * and/or modify it under the terms of the Do What The Fuck You Want
7 * To Public License, Version 2, as published by Sam Hocevar. See
8 * http://www.wtfpl.net/txt/copying/ for more details.
9 */
10 ////////////////////////////////////////////////////////////////////////////////
11 // user code should define `PREFS_BRANCH`, `PREFS` and `PREFS_DIR_NAMES`
14 ////////////////////////////////////////////////////////////////////////////////
15 function setDefaultPrefs () {
16 let branch = Services.prefs.getDefaultBranch(PREFS_BRANCH);
17 for (let [key, val] in Iterator(PREFS)) {
18 switch (typeof(val)) {
19 case "boolean": branch.setBoolPref(key, val); break;
20 case "number": branch.setIntPref(key, val); break;
21 case "string": branch.setCharPref(key, val); break;
27 ////////////////////////////////////////////////////////////////////////////////
28 let knownDirs = {};
30 function getUserXXDir (name, createit) {
31 let res = knownDirs[name];
32 if (res) {
33 // cached
34 res = res.clone();
35 } else {
36 if (!(name in PREFS_DIR_NAMES)) throw new Error("unknown 'known' dir: '"+name+"'");
37 //logError("getting dir '"+name+"'");
38 // new, cache it
39 let dn = "";
40 try { dn = Services.prefs.getCharPref(PREFS_BRANCH+name); } catch (e) {}
41 if (dn.length && dn[0] == '/') {
42 res = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
43 res.initWithPath(dn);
44 } else {
45 res = getProfileDir();
46 if (dn.length) {
47 for (let d of dn.split("/")) if (d.length) res.append(d);
50 //logError("dir ["+name+"] = ["+res.path+"]");
51 knownDirs[name] = res.clone();
53 if (createit && !res.exists()) res.create(res.DIRECTORY_TYPE, 0700);
54 return res;
57 exportsGlobal.resetUserDirCache = function () { knownDirs = {}; };
59 // build dir getters
60 if ("PREFS_DIR_NAMES" in this) {
61 for (let [iname, oname] in Iterator(PREFS_DIR_NAMES)) {
62 exportsGlobal["getUser"+oname] = tieto(this, getUserXXDir, iname, true);
67 ////////////////////////////////////////////////////////////////////////////////
68 function getAddonPref (name) {
69 if (typeof(name) == "string" && (name in PREFS)) {
70 try {
71 switch (typeof(PREFS[name])) {
72 case "boolean": return Services.prefs.getBoolPref(PREFS_BRANCH+name);
73 case "number": return Services.prefs.getIntPref(PREFS_BRANCH+name);
74 case "string": return Services.prefs.getCharPref(PREFS_BRANCH+name);
76 } catch (e) {}
77 return PREFS[name];
79 logError("k8extcarcass: invalid preference request for '"+name+"'");
80 return null;
84 ////////////////////////////////////////////////////////////////////////////////
85 function setAddonPref (name, val) {
86 if (typeof(name) == "string" && (name in PREFS)) {
87 try {
88 switch (typeof(PREFS[name])) {
89 case "boolean": val = !!val; Services.prefs.setBoolPref(PREFS_BRANCH+name, val); break;
90 case "number": val = parseInt(val); Services.prefs.setIntPref(PREFS_BRANCH+name, val); break;
91 case "string": val = ""+val; Services.prefs.setCharPref(PREFS_BRANCH+name, val); break;
93 return val;
94 } catch (e) {}
96 logError("k8extcarcass: invalid preference set request for '"+name+"'");
97 return null;
101 ////////////////////////////////////////////////////////////////////////////////
102 let addonOptions = {
103 _cache: {},
104 _resetCache: function () { addonOptions._cache = {}; },
105 _getOpt: function (name) {
106 if (!(name in addonOptions._cache)) addonOptions._cache[name] = getAddonPref(name);
107 return addonOptions._cache[name];
109 _setOpt: function (name, val) {
110 addonOptions._cache[name] = val;
111 return setAddonPref(name, val);
113 //TODO: make this generic instead of pasta!
114 get debugMode () addonOptions._getOpt("debugMode"),
115 set debugMode (val) addonOptions._setOpt("debugMode", !!val),
116 get debugCache () addonOptions._getOpt("debugCache"),
117 set debugCache (val) addonOptions._setOpt("debugCache", !!val),
118 get logEnabled () addonOptions._getOpt("logEnabled"),
119 set logEnabled (val) addonOptions._setOpt("logEnabled", !!val),
120 get openConsole () addonOptions._getOpt("openErrorConsoleOnStartup"),
121 set openConsole (val) addonOptions._setOpt("openErrorConsoleOnStartup", !!val),
122 get active () addonOptions._getOpt("active"),
123 set active (val) addonOptions._setOpt("active", !!val),
125 exportsGlobal.addonOptions = addonOptions;
128 ////////////////////////////////////////////////////////////////////////////////
129 let prefObserver = {
130 observe: function (aSubject, aTopic, aData) {
131 //conlog("data: ["+aData+"]; subj="+aSubject+"; topic="+aTopic);
132 //let name = aData.substr(PREFS_BRANCH.length);
133 //conlog("name: ["+name+"]");
134 //let prf = Services.prefs;
135 //if (name == "openErrorConsoleOnStartup") addonOptions.openConsole = prf.getBoolPref(aData);
136 if (aData.indexOf("dir") > 0) {
137 resetUserDirCache();
138 } else {
139 addonOptions._resetCache();
145 ////////////////////////////////////////////////////////////////////////////////
146 registerStartupHook("preferences", function () {
147 setDefaultPrefs(); // always set the default prefs as they disappear on restart
148 Services.prefs.addObserver(PREFS_BRANCH, prefObserver, false);
152 registerShutdownHook("preferences", function () {
153 Services.prefs.removeObserver(PREFS_BRANCH, prefObserver);