X-Git-Url: https://git.wpitchoune.net/gitweb/?a=blobdiff_plain;f=src%2Fcfg.c;h=e5273fbd25d7b15bdd428f49df5eac9623ee0dc4;hb=ee99ebd7dd966b5741068fd0053420787c019e60;hp=4c646f65adfe2d99b56e2e4ef8f317d374439fe2;hpb=14a24e505a6afba7da3a65eec878ada824b1936c;p=psensor.git diff --git a/src/cfg.c b/src/cfg.c index 4c646f6..e5273fb 100644 --- a/src/cfg.c +++ b/src/cfg.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010-2012 jeanfi@gmail.com + * Copyright (C) 2010-2014 jeanfi@gmail.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -16,23 +16,34 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ + +#include #include #include #include #include +#include +#include -#include - -#include "cfg.h" +#include +#include +#define _(str) gettext(str) -static const char *KEY_SENSORS = "/apps/psensor/sensors"; +#include +#include +#include -static const char *ATT_SENSOR_ALARM_ENABLED = "alarm/enabled"; -static const char *ATT_SENSOR_ALARM_HIGH_THRESOLD = "alarm/high_thresold"; -static const char *ATT_SENSOR_ALARM_LOW_THRESOLD = "alarm/low_thresold"; +static const char *ATT_SENSOR_ALARM_ENABLED = "alarm_enabled"; +static const char *ATT_SENSOR_ALARM_HIGH_THRESHOLD = "alarm_high_threshold"; +static const char *ATT_SENSOR_ALARM_LOW_THRESHOLD = "alarm_low_threshold"; static const char *ATT_SENSOR_COLOR = "color"; -static const char *ATT_SENSOR_ENABLED = "enabled"; +static const char *ATT_SENSOR_GRAPH_ENABLED = "graph_enabled"; static const char *ATT_SENSOR_NAME = "name"; +static const char *ATT_SENSOR_APPINDICATOR_MENU_DISABLED += "appindicator_menu_disabled"; +static const char *ATT_SENSOR_APPINDICATOR_LABEL_ENABLED += "appindicator_label_enabled"; +static const char *ATT_SENSOR_POSITION = "position"; static const char *KEY_SENSOR_UPDATE_INTERVAL = "/apps/psensor/sensor/update_interval"; @@ -90,8 +101,19 @@ static const char *KEY_INTERFACE_WINDOW_DIVIDER_POS static const char *KEY_INTERFACE_TEMPERATURE_UNIT = "/apps/psensor/interface/temperature_unit"; +static const char *KEY_SLOG_ENABLED = "/apps/psensor/slog/enabled"; +static const char *KEY_SLOG_INTERVAL = "/apps/psensor/slog/interval"; + +static const char *KEY_NOTIFICATION_SCRIPT = "/apps/psensor/notif_script"; + static GConfClient *client; +static char *user_dir; + +static GKeyFile *key_file; + +static char *sensor_config_path; + static char *get_string(const char *key, const char *default_value) { char *value; @@ -106,6 +128,29 @@ static char *get_string(const char *key, const char *default_value) return value; } +char *config_get_notif_script() +{ + char *str; + + str = gconf_client_get_string(client, KEY_NOTIFICATION_SCRIPT, NULL); + if (str && !strlen(str)) { + free(str); + str = NULL; + } + + return str; +} + +void config_set_notif_script(const char *str) +{ + if (str && strlen(str) > 0) + gconf_client_set_string(client, + KEY_NOTIFICATION_SCRIPT, str, NULL); + else + gconf_client_set_string(client, + KEY_NOTIFICATION_SCRIPT, "", NULL); +} + static struct color *get_background_color() { char *scolor; @@ -140,13 +185,9 @@ static struct color *get_foreground_color() return c; } -static unsigned int is_alpha_channel_enabled() +static bool is_alpha_channel_enabled() { - gboolean b; - - b = gconf_client_get_bool(client, KEY_ALPHA_CHANNEL_ENABLED, NULL); - - return b == TRUE; + return gconf_client_get_bool(client, KEY_ALPHA_CHANNEL_ENABLED, NULL); } static enum sensorlist_position get_sensorlist_position() @@ -204,213 +245,77 @@ static void set_foreground_color(const struct color *color) free(str); } -static char *get_sensor_att_key(const char *sid, const char *att) -{ - char *esc_sid, *key; - - esc_sid = gconf_escape_key(sid, -1); - /* [KEY_SENSORS]/[esc_sid]/[att] */ - key = malloc(strlen(KEY_SENSORS) - + 1 + 2 * strlen(esc_sid) - + 1 + strlen(att) + 1); - - sprintf(key, "%s/%s/%s", KEY_SENSORS, esc_sid, att); - - free(esc_sid); - - return key; -} - -struct color * -config_get_sensor_color(const char *sid, const struct color *dft) -{ - char *key, *scolor; - struct color *color; - - key = get_sensor_att_key(sid, ATT_SENSOR_COLOR); - - scolor = gconf_client_get_string(client, key, NULL); - - color = NULL; - - if (scolor) - color = str_to_color(scolor); - - if (!scolor || !color) { - color = color_new(dft->red, dft->green, dft->blue); - scolor = color_to_str(color); - gconf_client_set_string(client, key, scolor, NULL); - } - - free(scolor); - free(key); - - return color; -} - -void config_set_sensor_color(const char *sid, const struct color *color) +bool is_slog_enabled() { - char *key, *scolor; - - key = get_sensor_att_key(sid, ATT_SENSOR_COLOR); - scolor = color_to_str(color); - - gconf_client_set_string(client, key, scolor, NULL); - - free(scolor); - free(key); + return gconf_client_get_bool(client, KEY_SLOG_ENABLED, NULL); } -int config_get_sensor_alarm_high_thresold(const char *sid) +static void set_slog_enabled(bool enabled) { - int res; - char *key; - - key = get_sensor_att_key(sid, ATT_SENSOR_ALARM_HIGH_THRESOLD); - res = gconf_client_get_int(client, key, NULL); - free(key); - - return res; + gconf_client_set_bool(client, KEY_SLOG_ENABLED, enabled, NULL); } -void -config_set_sensor_alarm_high_thresold(const char *sid, int thresold) +void config_slog_enabled_notify_add(GConfClientNotifyFunc cbk, void *data) { - char *key; - - key = get_sensor_att_key(sid, ATT_SENSOR_ALARM_HIGH_THRESOLD); - gconf_client_set_int(client, key, thresold, NULL); - free(key); + log_debug("config_slog_enabled_notify_add"); + gconf_client_add_dir(client, + KEY_SLOG_ENABLED, + GCONF_CLIENT_PRELOAD_NONE, + NULL); + gconf_client_notify_add(client, + KEY_SLOG_ENABLED, + cbk, + data, + NULL, + NULL); } -int config_get_sensor_alarm_low_thresold(const char *sid) +int config_get_slog_interval() { int res; - char *key; - key = get_sensor_att_key(sid, ATT_SENSOR_ALARM_LOW_THRESOLD); - res = gconf_client_get_int(client, key, NULL); - free(key); - - return res; -} + res = gconf_client_get_int(client, KEY_SLOG_INTERVAL, NULL); -void -config_set_sensor_alarm_low_thresold(const char *sid, int thresold) -{ - char *key; - - key = get_sensor_att_key(sid, ATT_SENSOR_ALARM_LOW_THRESOLD); - gconf_client_set_int(client, key, thresold, NULL); - free(key); -} - -int config_get_sensor_alarm_enabled(const char *sid) -{ - gboolean b; - char *key; - - key = get_sensor_att_key(sid, ATT_SENSOR_ALARM_ENABLED); - b = gconf_client_get_bool(client, key, NULL); - free(key); - - return b == TRUE; -} - -void config_set_sensor_alarm_enabled(const char *sid, int enabled) -{ - char *key; - - key = get_sensor_att_key(sid, ATT_SENSOR_ALARM_ENABLED); - gconf_client_set_bool(client, key, enabled, NULL); - free(key); -} - -int config_is_sensor_enabled(const char *sid) -{ - gboolean b; - char *key; - - key = get_sensor_att_key(sid, ATT_SENSOR_ENABLED); - b = gconf_client_get_bool(client, key, NULL); - free(key); - - return b == TRUE; -} - -void config_set_sensor_enabled(const char *sid, int enabled) -{ - char *key; - - key = get_sensor_att_key(sid, ATT_SENSOR_ENABLED); - gconf_client_set_bool(client, key, enabled, NULL); - free(key); + if (res <= 0) + return 300; + else + return res; } -char *config_get_sensor_name(const char *sid) +static void set_slog_interval(int interval) { - char *name, *key; - - key = get_sensor_att_key(sid, ATT_SENSOR_NAME); - name = gconf_client_get_string(client, key, NULL); - free(key); + if (interval <= 0) + interval = 300; - return name; + gconf_client_set_int(client, KEY_SLOG_INTERVAL, interval, NULL); } -void config_set_sensor_name(const char *sid, const char *name) +static bool is_window_decoration_enabled() { - char *key; - - key = get_sensor_att_key(sid, ATT_SENSOR_NAME); - gconf_client_set_string(client, key, name, NULL); - free(key); + return !gconf_client_get_bool(client, + KEY_INTERFACE_WINDOW_DECORATION_DISABLED, + NULL); } -static int is_window_decoration_enabled() +static bool is_window_keep_below_enabled() { - gboolean b; - - b = gconf_client_get_bool(client, - KEY_INTERFACE_WINDOW_DECORATION_DISABLED, - NULL); - - return b == FALSE; + return gconf_client_get_bool(client, + KEY_INTERFACE_WINDOW_KEEP_BELOW_ENABLED, + NULL); } -static int is_window_keep_below_enabled() +static void set_window_decoration_enabled(bool enabled) { - gboolean b; - - b = gconf_client_get_bool(client, - KEY_INTERFACE_WINDOW_KEEP_BELOW_ENABLED, - NULL); - - return b == TRUE; -} - -static void set_window_decoration_enabled(int enabled) -{ - if (enabled) - gconf_client_set_bool - (client, - KEY_INTERFACE_WINDOW_DECORATION_DISABLED, FALSE, NULL); - else - gconf_client_set_bool - (client, - KEY_INTERFACE_WINDOW_DECORATION_DISABLED, TRUE, NULL); + gconf_client_set_bool + (client, + KEY_INTERFACE_WINDOW_DECORATION_DISABLED, !enabled, NULL); } -static void set_window_keep_below_enabled(int enabled) +static void set_window_keep_below_enabled(bool enabled) { - if (enabled) - gconf_client_set_bool(client, - KEY_INTERFACE_WINDOW_KEEP_BELOW_ENABLED, - TRUE, NULL); - else - gconf_client_set_bool(client, - KEY_INTERFACE_WINDOW_KEEP_BELOW_ENABLED, - FALSE, NULL); + gconf_client_set_bool(client, + KEY_INTERFACE_WINDOW_KEEP_BELOW_ENABLED, + enabled, NULL); } /* @@ -428,6 +333,23 @@ void config_cleanup() g_object_unref(client); client = NULL; } + + config_sync(); + + if (user_dir) { + free(user_dir); + user_dir = NULL; + } + + if (key_file) { + g_key_file_free(key_file); + key_file = NULL; + } + + if (sensor_config_path) { + free(sensor_config_path); + sensor_config_path = NULL; + } } struct config *config_load() @@ -445,6 +367,8 @@ struct config *config_load() c->sensorlist_position = get_sensorlist_position(); c->window_decoration_enabled = is_window_decoration_enabled(); c->window_keep_below_enabled = is_window_keep_below_enabled(); + c->slog_enabled = is_slog_enabled(); + c->slog_interval = config_get_slog_interval(); c->sensor_update_interval = gconf_client_get_int(client, KEY_SENSOR_UPDATE_INTERVAL, NULL); @@ -525,6 +449,8 @@ void config_save(const struct config *c) set_sensorlist_position(c->sensorlist_position); set_window_decoration_enabled(c->window_decoration_enabled); set_window_keep_below_enabled(c->window_keep_below_enabled); + set_slog_enabled(c->slog_enabled); + set_slog_interval(c->slog_interval); gconf_client_set_int(client, KEY_GRAPH_UPDATE_INTERVAL, @@ -570,3 +496,283 @@ void config_save(const struct config *c) c->temperature_unit, NULL); } + +const char *get_psensor_user_dir() +{ + const char *home; + + log_fct_enter(); + + if (!user_dir) { + home = getenv("HOME"); + + if (!home) + return NULL; + + user_dir = path_append(home, ".psensor"); + + if (mkdir(user_dir, 0700) == -1 && errno != EEXIST) { + log_err(_("Failed to create the directory %s: %s"), + user_dir, + strerror(errno)); + + free(user_dir); + user_dir = NULL; + } + } + + log_fct_exit(); + + return user_dir; +} + +static const char *get_sensor_config_path() +{ + const char *dir; + + if (!sensor_config_path) { + dir = get_psensor_user_dir(); + + if (dir) + sensor_config_path = path_append(dir, "psensor.cfg"); + } + + return sensor_config_path; +} + +static GKeyFile *get_sensor_key_file() +{ + int ret; + GError *err; + const char *path; + + if (!key_file) { + path = get_sensor_config_path(); + + key_file = g_key_file_new(); + + err = NULL; + ret = g_key_file_load_from_file(key_file, + path, + G_KEY_FILE_KEEP_COMMENTS + | G_KEY_FILE_KEEP_TRANSLATIONS, + &err); + + if (!ret) { + if (err->code == G_KEY_FILE_ERROR_NOT_FOUND) { + log_fct(_("The configuration file " + "does not exist.")); + } else { + log_err(_("Failed to parse configuration " + "file: %s"), + path); + } + } + } + + return key_file; +} + +static void save_sensor_key_file() +{ + GKeyFile *kfile; + const char *path; + char *data; + + log_fct_enter(); + + kfile = get_sensor_key_file(); + + data = g_key_file_to_data(kfile, NULL, NULL); + + path = get_sensor_config_path(); + + if (!g_file_set_contents(path, data, -1, NULL)) + log_err(_("Failed to save configuration file %s."), path); + + free(data); + + log_fct_exit(); +} + +void config_sync() +{ + log_fct_enter(); + save_sensor_key_file(); + log_fct_exit(); +} + +static void +config_sensor_set_string(const char *sid, const char *att, const char *str) +{ + GKeyFile *kfile; + + kfile = get_sensor_key_file(); + g_key_file_set_string(kfile, sid, att, str); +} + +static char *config_sensor_get_string(const char *sid, const char *att) +{ + GKeyFile *kfile; + + kfile = get_sensor_key_file(); + return g_key_file_get_string(kfile, sid, att, NULL); +} + +static bool config_sensor_get_bool(const char *sid, const char *att) +{ + + GKeyFile *kfile; + + kfile = get_sensor_key_file(); + return g_key_file_get_boolean(kfile, sid, att, NULL); +} + +static void +config_sensor_set_bool(const char *sid, const char *att, bool enabled) +{ + GKeyFile *kfile; + + kfile = get_sensor_key_file(); + + g_key_file_set_boolean(kfile, sid, att, enabled); +} + +static int config_sensor_get_int(const char *sid, const char *att) +{ + + GKeyFile *kfile; + + kfile = get_sensor_key_file(); + return g_key_file_get_integer(kfile, sid, att, NULL); +} + +static void +config_sensor_set_int(const char *sid, const char *att, int i) +{ + GKeyFile *kfile; + + kfile = get_sensor_key_file(); + + g_key_file_set_integer(kfile, sid, att, i); +} + +char *config_get_sensor_name(const char *sid) +{ + return config_sensor_get_string(sid, ATT_SENSOR_NAME); +} + +void config_set_sensor_name(const char *sid, const char *name) +{ + config_sensor_set_string(sid, ATT_SENSOR_NAME, name); +} + +void config_set_sensor_color(const char *sid, const struct color *color) +{ + char *scolor; + + scolor = color_to_str(color); + + config_sensor_set_string(sid, ATT_SENSOR_COLOR, scolor); + + free(scolor); +} + +struct color * +config_get_sensor_color(const char *sid, const struct color *dft) +{ + char *scolor; + struct color *color; + + scolor = config_sensor_get_string(sid, ATT_SENSOR_COLOR); + + if (scolor) + color = str_to_color(scolor); + else + color = NULL; + + if (!color) { + color = color_new(dft->red, dft->green, dft->blue); + config_set_sensor_color(sid, color); + } + + free(scolor); + + return color; +} + +bool config_is_sensor_enabled(const char *sid) +{ + return config_sensor_get_bool(sid, ATT_SENSOR_GRAPH_ENABLED); +} + +void config_set_sensor_enabled(const char *sid, bool enabled) +{ + config_sensor_set_bool(sid, ATT_SENSOR_GRAPH_ENABLED, enabled); +} + +int config_get_sensor_alarm_high_threshold(const char *sid) +{ + return config_sensor_get_int(sid, ATT_SENSOR_ALARM_HIGH_THRESHOLD); +} + +void config_set_sensor_alarm_high_threshold(const char *sid, int threshold) +{ + config_sensor_set_int(sid, ATT_SENSOR_ALARM_HIGH_THRESHOLD, threshold); +} + +int config_get_sensor_alarm_low_threshold(const char *sid) +{ + return config_sensor_get_int(sid, ATT_SENSOR_ALARM_LOW_THRESHOLD); +} + +void config_set_sensor_alarm_low_threshold(const char *sid, int threshold) +{ + config_sensor_set_int(sid, ATT_SENSOR_ALARM_LOW_THRESHOLD, threshold); +} + +bool config_is_appindicator_enabled(const char *sid) +{ + return !config_sensor_get_bool(sid, + ATT_SENSOR_APPINDICATOR_MENU_DISABLED); +} + +void config_set_appindicator_enabled(const char *sid, bool enabled) +{ + return config_sensor_set_bool(sid, + ATT_SENSOR_APPINDICATOR_MENU_DISABLED, + !enabled); +} + +int config_get_sensor_position(const char *sid) +{ + return config_sensor_get_int(sid, ATT_SENSOR_POSITION); +} + +void config_set_sensor_position(const char *sid, int pos) +{ + return config_sensor_set_int(sid, ATT_SENSOR_POSITION, pos); +} + +bool config_get_sensor_alarm_enabled(const char *sid) +{ + return config_sensor_get_bool(sid, ATT_SENSOR_ALARM_ENABLED); +} + +void config_set_sensor_alarm_enabled(const char *sid, bool enabled) +{ + config_sensor_set_bool(sid, ATT_SENSOR_ALARM_ENABLED, enabled); +} + +bool config_is_appindicator_label_enabled(const char *sid) +{ + return config_sensor_get_bool(sid, + ATT_SENSOR_APPINDICATOR_LABEL_ENABLED); +} + +void config_set_appindicator_label_enabled(const char *sid, bool enabled) +{ + config_sensor_set_bool(sid, + ATT_SENSOR_APPINDICATOR_LABEL_ENABLED, + enabled); +}