dunst/settings.c
Sascha Kruse 0d8be7dccf markup
2013-02-22 18:36:25 +00:00

309 lines
14 KiB
C

/* copyright 2013 Sascha Kruse and contributors (see LICENSE for licensing information) */
#include <glib.h>
#include <basedir.h>
#include <basedir_fs.h>
#include "dunst.h"
#include "rules.h"
#include "option_parser.h"
#include "settings.h"
#include "config.h"
settings_t settings;
static void parse_follow_mode(const char *mode)
{
if (strcmp(mode, "mouse") == 0)
settings.f_mode = FOLLOW_MOUSE;
else if (strcmp(mode, "keyboard") == 0)
settings.f_mode = FOLLOW_KEYBOARD;
else if (strcmp(mode, "none") == 0)
settings.f_mode = FOLLOW_NONE;
else {
fprintf(stderr, "Warning: unknown follow mode: \"%s\"\n", mode);
settings.f_mode = FOLLOW_NONE;
}
}
void load_settings(char *cmdline_config_path)
{
#ifndef STATIC_CONFIG
xdgHandle xdg;
FILE *config_file = NULL;
xdgInitHandle(&xdg);
if (cmdline_config_path != NULL) {
config_file = fopen(cmdline_config_path, "r");
}
if (config_file == NULL) {
config_file = xdgConfigOpen("dunst/dunstrc", "r", &xdg);
}
if (config_file == NULL) {
/* Fall back to just "dunstrc", which was used before 2013-06-23
* (before v0.2). */
config_file = xdgConfigOpen("dunstrc", "r", &xdg);
if (config_file == NULL) {
puts("no dunstrc found -> skipping\n");
xdgWipeHandle(&xdg);
return;
}
}
load_ini_file(config_file);
#endif
settings.font =
option_get_string("global", "font", "-fn", font,
"The font dunst should use.");
settings.allow_markup =
option_get_bool("global", "allow_markup", "-markup", allow_markup,
"Allow markups.");
settings.format =
option_get_string("global", "format", "-format", format,
"The format template for the notifictions");
settings.sort =
option_get_bool("global", "sort", "-sort", sort,
"Sort notifications by urgency and date?");
settings.indicate_hidden =
option_get_bool("global", "indicate_hidden", "-indicate_hidden",
indicate_hidden,
"Show how many notificaitons are hidden?");
settings.word_wrap =
option_get_bool("global", "word_wrap", "-word_wrap", word_wrap,
"Truncating long lines or do word wrap");
settings.ignore_newline =
option_get_bool("global", "ignore_newline", "-ignore_newline",
ignore_newline,
"Ignore newline characters in notifications");
settings.idle_threshold =
option_get_int("global", "idle_threshold", "-idle_threshold",
idle_threshold,
"Don't timeout notifications if user is longer idle than threshold");
settings.monitor =
option_get_int("global", "monitor", "-mon", monitor,
"On which monitor should the notifications be displayed");
{
char *c = option_get_string("global", "follow", "-follow", "",
"Follow mouse, keyboard or none?");
if (strlen(c) > 0) {
parse_follow_mode(c);
free(c);
}
}
settings.geom =
option_get_string("global", "geometry", "-geom/-geometry", geom,
"Geometry for the window");
settings.line_height =
option_get_int("global", "line_height", "-lh/-line_height",
line_height,
"Add additional padding above and beneath text");
settings.bounce_freq =
option_get_double("global", "bounce_freq", "-bounce_freq",
bounce_freq,
"Make long text bounce from side to side");
{
char *c = option_get_string("global", "alignment",
"-align/-alignment", "",
"Align notifications left/center/right");
if (strlen(c) > 0) {
if (strcmp(c, "left") == 0)
settings.align = left;
else if (strcmp(c, "center") == 0)
settings.align = center;
else if (strcmp(c, "right") == 0)
settings.align = right;
else
fprintf(stderr,
"Warning: unknown allignment\n");
free(c);
}
}
settings.show_age_threshold =
option_get_int("global", "show_age_threshold",
"-show_age_threshold", show_age_threshold,
"When should the age of the notification be displayed?");
settings.sticky_history =
option_get_bool("global", "sticky_history", "-sticky_history",
sticky_history,
"Don't timeout notifications popped up from history");
settings.separator_height =
option_get_int("global", "separator_height",
"-sep_height/-separator_height", separator_height,
"height of the separator line");
settings.padding =
option_get_int("global", "padding", "-padding", padding,
"Padding between text and separator");
settings.h_padding =
option_get_int("global", "horizontal_padding",
"-horizontal_padding", h_padding,
"horizontal padding");
settings.transparency =
option_get_int("global", "transparency", "-transparency",
transparency, "Transparency. range 0-100");
{
char *c = option_get_string("global", "separator_color",
"-sep_color/-separator_color", "",
"Color of the separator line (or 'auto')");
if (strlen(c) > 0) {
if (strcmp(c, "auto") == 0)
settings.sep_color = AUTO;
else if (strcmp(c, "foreground") == 0)
settings.sep_color = FOREGROUND;
else if (strcmp(c, "frame") == 0)
settings.sep_color = FRAME;
else {
settings.sep_color = CUSTOM;
settings.sep_custom_color_str = g_strdup(c);
}
free(c);
}
}
settings.startup_notification =
option_get_bool("global", "startup_notification",
"-startup_notification", false,
"print notification on startup");
settings.dmenu =
option_get_string("global", "dmenu", "-dmenu", dmenu,
"path to dmenu");
settings.dmenu_cmd = g_strsplit(dmenu, " ", 0);
settings.browser =
option_get_string("global", "browser", "-browser", browser,
"path to browser");
settings.frame_width =
option_get_int("frame", "width", "-frame_width", frame_width,
"Width of frame around window");
settings.frame_color =
option_get_string("frame", "color", "-frame_color", frame_color,
"Color of the frame around window");
settings.lowbgcolor =
option_get_string("urgency_low", "background", "-lb", lowbgcolor,
"Background color for notifcations with low urgency");
settings.lowfgcolor =
option_get_string("urgency_low", "foreground", "-lf", lowfgcolor,
"Foreground color for notifications with low urgency");
settings.timeouts[LOW] =
option_get_int("urgency_low", "timeout", "-lto", timeouts[LOW],
"Timeout for notifications with low urgency");
settings.normbgcolor =
option_get_string("urgency_normal", "background", "-nb",
normbgcolor,
"Background color for notifications with normal urgency");
settings.normfgcolor =
option_get_string("urgency_normal", "foreground", "-nf",
normfgcolor,
"Foreground color for notifications with normal urgency");
settings.timeouts[NORM] =
option_get_int("urgency_normal", "timeout", "-nto", timeouts[NORM],
"Timeout for notifications with normal urgency");
settings.critbgcolor =
option_get_string("urgency_critical", "background", "-cb",
critbgcolor,
"Background color for notifications with critical urgency");
settings.critfgcolor =
option_get_string("urgency_critical", "foreground", "-cf",
critfgcolor,
"Foreground color for notifications with ciritical urgency");
settings.timeouts[CRIT] =
option_get_int("urgency_critical", "timeout", "-cto",
timeouts[CRIT],
"Timeout for notifications with critical urgency");
settings.close_ks.str =
option_get_string("shortcuts", "close", "-key", close_ks.str,
"Shortcut for closing one notification");
settings.close_all_ks.str =
option_get_string("shortcuts", "close_all", "-all_key",
close_all_ks.str,
"Shortcut for closing all notifications");
settings.history_ks.str =
option_get_string("shortcuts", "history", "-history_key",
history_ks.str,
"Shortcut to pop the last notification from history");
settings.context_ks.str =
option_get_string("shortcuts", "context", "-context_key",
context_ks.str, "Shortcut for context menu");
settings.print_notifications =
cmdline_get_bool("-print", false,
"Print notifications to cmdline (DEBUG)");
/* push hardcoded default rules into rules list */
for (int i = 0; i < LENGTH(default_rules); i++) {
rules = g_slist_insert(rules, &(default_rules[i]), 0);
}
char *cur_section = NULL;
for (;;) {
cur_section = next_section(cur_section);
if (!cur_section)
break;
if (strcmp(cur_section, "global") == 0
|| strcmp(cur_section, "shortcuts") == 0
|| strcmp(cur_section, "urgency_low") == 0
|| strcmp(cur_section, "urgency_normal") == 0
|| strcmp(cur_section, "urgency_critical") == 0)
continue;
/* check for existing rule with same name */
rule_t *r = NULL;
for (GSList * iter = rules; iter; iter = iter->next) {
rule_t *match = iter->data;
if (match->name &&
strcmp(match->name, cur_section) == 0)
r = match;
}
if (r == NULL) {
r = g_malloc(sizeof(rule_t));
rule_init(r);
rules = g_slist_insert(rules, r, 0);
}
r->name = g_strdup(cur_section);
r->appname = ini_get_string(cur_section, "appname", r->appname);
r->summary = ini_get_string(cur_section, "summary", r->summary);
r->body = ini_get_string(cur_section, "body", r->body);
r->icon = ini_get_string(cur_section, "icon", r->icon);
r->timeout = ini_get_int(cur_section, "timeout", r->timeout);
{
char *urg = ini_get_string(cur_section, "urgency", "");
if (strlen(urg) > 0) {
if (strcmp(urg, "low") == 0)
r->urgency = LOW;
else if (strcmp(urg, "normal") == 0)
r->urgency = NORM;
else if (strcmp(urg, "critical") == 0)
r->urgency = CRIT;
else
fprintf(stderr,
"unknown urgency: %s, ignoring\n",
urg);
free(urg);
}
}
r->fg = ini_get_string(cur_section, "foreground", r->fg);
r->bg = ini_get_string(cur_section, "background", r->bg);
r->format = ini_get_string(cur_section, "format", r->format);
r->script = ini_get_string(cur_section, "script", NULL);
}
#ifndef STATIC_CONFIG
fclose(config_file);
free_ini();
xdgWipeHandle(&xdg);
#endif
}
/* vim: set ts=8 sw=8 tw=0: */