summaryrefslogtreecommitdiffstats
path: root/prefs.c
diff options
context:
space:
mode:
authorGravatar Linus Torvalds <torvalds@linux-foundation.org>2013-01-11 10:14:10 -0800
committerGravatar Dirk Hohndel <dirk@hohndel.org>2013-01-11 12:19:34 -0800
commite8a896b64d0abb7d85d7aefb6ba551a22f720ffd (patch)
tree19213a00a86d7c88a887d4a5a28c9218b0498e8f /prefs.c
parentc4ae58d589bdf315223c41716ca4b0ae747a8498 (diff)
downloadsubsurface-e8a896b64d0abb7d85d7aefb6ba551a22f720ffd.tar.gz
Update preference saving for numeric values
This does the "don't save defaults" for numeric values too. Also, move the preferences loading/saving to a new "prefs.c" file. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'prefs.c')
-rw-r--r--prefs.c160
1 files changed, 160 insertions, 0 deletions
diff --git a/prefs.c b/prefs.c
new file mode 100644
index 000000000..9dbb9ed4a
--- /dev/null
+++ b/prefs.c
@@ -0,0 +1,160 @@
+#include "dive.h"
+
+static void set_bool_conf(char *name, gboolean value, gboolean def)
+{
+ if (value == def) {
+ subsurface_unset_conf(name);
+ return;
+ }
+ subsurface_set_conf_bool(name, value);
+}
+#define __SAVE_BOOLEAN(name, field, value) \
+ set_bool_conf(name, prefs.field == value, default_prefs.field == value)
+#define SAVE_UNIT(name, field, value) __SAVE_BOOLEAN(name, units.field, value)
+#define SAVE_BOOL(name, field) __SAVE_BOOLEAN(name, field, TRUE)
+
+/* We don't really save doubles */
+static void save_double_conf(char *name, double _val, double _def)
+{
+ int val = rint(_val * 100), neg, len;
+ int def = rint(_def * 100);
+ char string[16];
+
+ if (val == def) {
+ subsurface_unset_conf(name);
+ return;
+ }
+ neg = 0;
+ if (val < 0) {
+ neg = 1;
+ val = -val;
+ }
+ len = snprintf(string, sizeof(string), "%s%d.%02d",
+ neg ? "-" : "", val / 100, val % 100);
+
+ /* Save with 0-2 decimals */
+ if (string[len-1] == '0') {
+ len--;
+ if (string[len-1] == '0')
+ len -= 2; /* Remove decimal point too */
+ string[len] = 0;
+ }
+
+ subsurface_set_conf(name, string);
+}
+
+#define SAVE_DOUBLE(name, field) save_double_conf(name, prefs.field, default_prefs.field)
+#define SAVE_PERCENT(name, field) save_double_conf(name, prefs.field*100, default_prefs.field*100)
+
+void save_preferences(void)
+{
+ SAVE_UNIT("feet", length, FEET);
+ SAVE_UNIT("psi", pressure, PSI);
+ SAVE_UNIT("cuft", volume, CUFT);
+ SAVE_UNIT("fahrenheit", temperature, FAHRENHEIT);
+ SAVE_UNIT("lbs", weight, LBS);
+
+ SAVE_BOOL("TEMPERATURE", visible_cols.temperature);
+ SAVE_BOOL("TOTALWEIGHT", visible_cols.totalweight);
+ SAVE_BOOL("SUIT", visible_cols.suit);
+ SAVE_BOOL("CYLINDER", visible_cols.cylinder);
+ SAVE_BOOL("NITROX", visible_cols.nitrox);
+ SAVE_BOOL("SAC", visible_cols.sac);
+ SAVE_BOOL("OTU", visible_cols.otu);
+ SAVE_BOOL("MAXCNS", visible_cols.maxcns);
+
+ subsurface_set_conf("divelist_font", divelist_font);
+
+ SAVE_BOOL("po2graph", pp_graphs.po2);
+ SAVE_BOOL("pn2graph", pp_graphs.pn2);
+ SAVE_BOOL("phegraph", pp_graphs.phe);
+
+ SAVE_DOUBLE("po2threshold", pp_graphs.po2_threshold);
+ SAVE_DOUBLE("pn2threshold", pp_graphs.pn2_threshold);
+ SAVE_DOUBLE("phethreshold", pp_graphs.phe_threshold);
+
+ SAVE_BOOL("redceiling", profile_red_ceiling);
+ SAVE_BOOL("calcceiling", profile_calc_ceiling);
+ SAVE_BOOL("calcceiling3m", calc_ceiling_3m_incr);
+
+ SAVE_PERCENT("gflow", gflow);
+ SAVE_PERCENT("gfhigh", gfhigh);
+
+ subsurface_set_conf("default_filename", default_filename);
+
+ /* Flush the changes out to the system */
+ subsurface_flush_conf();
+}
+
+static gboolean get_bool(char *name, gboolean def)
+{
+ int val = subsurface_get_conf_bool(name);
+ if (val < 0)
+ return def;
+ return val;
+}
+#define GET_UNIT(name, field, f, t) \
+ prefs.units.field = get_bool(name, default_prefs.units.field) ? (t) : (f)
+#define GET_BOOL(name, field) \
+ prefs.field = get_bool(name, default_prefs.field)
+
+
+void load_preferences(void)
+{
+ const char *conf_value;
+
+ GET_UNIT("feet", length, METERS, FEET);
+ GET_UNIT("psi", pressure, BAR, PSI);
+ GET_UNIT("cuft", volume, LITER, CUFT);
+ GET_UNIT("fahrenheit", temperature, CELSIUS, FAHRENHEIT);
+ GET_UNIT("lbs", weight, KG, LBS);
+
+ /* an unset key is 'default' */
+ GET_BOOL("CYLINDER", visible_cols.cylinder);
+ GET_BOOL("TEMPERATURE", visible_cols.temperature);
+ GET_BOOL("TOTALWEIGHT", visible_cols.totalweight);
+ GET_BOOL("SUIT", visible_cols.suit);
+ GET_BOOL("NITROX", visible_cols.nitrox);
+ GET_BOOL("OTU", visible_cols.otu);
+ GET_BOOL("MAXCNS", visible_cols.maxcns);
+ GET_BOOL("SAC", visible_cols.sac);
+ GET_BOOL("po2graph", pp_graphs.po2);
+ GET_BOOL("pn2graph", pp_graphs.pn2);
+ GET_BOOL("phegraph", pp_graphs.phe);
+
+ conf_value = subsurface_get_conf("po2threshold");
+ if (conf_value) {
+ sscanf(conf_value, "%lf", &prefs.pp_graphs.po2_threshold);
+ free((void *)conf_value);
+ }
+ conf_value = subsurface_get_conf("pn2threshold");
+ if (conf_value) {
+ sscanf(conf_value, "%lf", &prefs.pp_graphs.pn2_threshold);
+ free((void *)conf_value);
+ }
+ conf_value = subsurface_get_conf("phethreshold");
+ if (conf_value) {
+ sscanf(conf_value, "%lf", &prefs.pp_graphs.phe_threshold);
+ free((void *)conf_value);
+ }
+ GET_BOOL("redceiling", profile_red_ceiling);
+ GET_BOOL("calcceiling", profile_calc_ceiling);
+ GET_BOOL("calcceiling3m", calc_ceiling_3m_incr);
+ conf_value = subsurface_get_conf("gflow");
+ if (conf_value) {
+ sscanf(conf_value, "%lf", &prefs.gflow);
+ prefs.gflow /= 100.0;
+ set_gf(prefs.gflow, -1.0);
+ free((void *)conf_value);
+ }
+ conf_value = subsurface_get_conf("gfhigh");
+ if (conf_value) {
+ sscanf(conf_value, "%lf", &prefs.gfhigh);
+ prefs.gfhigh /= 100.0;
+ set_gf(-1.0, prefs.gfhigh);
+ free((void *)conf_value);
+ }
+ divelist_font = subsurface_get_conf("divelist_font");
+
+ default_filename = subsurface_get_conf("default_filename");
+}