From 131016878b16db3cc4e2b995364b1a271f839c95 Mon Sep 17 00:00:00 2001 From: Sascha Kruse Date: Fri, 21 Dec 2012 12:21:08 +0100 Subject: [PATCH] run script via rule --- config.def.h | 14 +++++++------- dunst.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++ dunst.h | 4 +++- dunstrc | 11 +++++++++++ 4 files changed, 75 insertions(+), 8 deletions(-) diff --git a/config.def.h b/config.def.h index 45c0a87..78f3250 100644 --- a/config.def.h +++ b/config.def.h @@ -71,11 +71,11 @@ keyboard_shortcut context_ks = {.str = "none", rule_t default_rules[] = { /* name can be any unique string. It is used to identify the rule in dunstrc to override it there */ - /* name, appname, summary, body, icon, timeout, urgency, fg, bg, format */ - { "empty", NULL, NULL, NULL, NULL, -1, -1, NULL, NULL, NULL, }, - /* { "rule1", "notify-send", NULL, NULL, NULL, -1, -1, NULL, NULL, "%s %b" }, */ - /* { "rule2", "Pidgin", "*says*, NULL, NULL, -1, CRITICAL, NULL, NULL, NULL }, */ - /* { "rule3", "Pidgin", "*signed on*", NULL, NULL, -1, LOW, NULL, NULL, NULL }, */ - /* { "rule4", "Pidgin", "*signed off*", NULL, NULL, -1, LOW, NULL, NULL, NULL }, */ - /* { "rule5", NULL, "*foobar*", NULL, NULL, -1, -1, NULL, "#00FF00", NULL, }, */ + /* name, appname, summary, body, icon, timeout, urgency, fg, bg, format, script */ + { "empty", NULL, NULL, NULL, NULL, -1, -1, NULL, NULL, NULL, NULL}, + /* { "rule1", "notify-send", NULL, NULL, NULL, -1, -1, NULL, NULL, "%s %b", NULL }, */ + /* { "rule2", "Pidgin", "*says*, NULL, NULL, -1, CRITICAL, NULL, NULL, NULL, NULL }, */ + /* { "rule3", "Pidgin", "*signed on*", NULL, NULL, -1, LOW, NULL, NULL, NULL, NULL }, */ + /* { "rule4", "Pidgin", "*signed off*", NULL, NULL, -1, LOW, NULL, NULL, NULL, NULL }, */ + /* { "rule5", NULL, "*foobar*", NULL, NULL, -1, -1, NULL, "#00FF00", NULL, NULL }, */ }; diff --git a/dunst.c b/dunst.c index e23826d..3671bd7 100644 --- a/dunst.c +++ b/dunst.c @@ -107,6 +107,7 @@ void move_all_to_history(void); void print_version(void); str_array *extract_urls(const char *str); void context_menu(void); +void run_script(notification *n); void r_line_cache_init(r_line_cache *c); void r_line_cache_append(r_line_cache *c, const char *s, ColorSet *col, bool continues); @@ -230,6 +231,50 @@ void context_menu(void) { } } +void run_script(notification *n) +{ + if (!n->script || strlen(n->script) < 1) + return; + + char *appname = n->appname ? n->appname : ""; + char *summary = n->summary ? n->summary : ""; + char *body = n->body ? n->body : ""; + char *icon = n->icon ? n->icon : ""; + + char *urgency; + switch (n->urgency) { + case LOW: + urgency = "LOW"; + break; + case NORM: + urgency = "NORMAL"; + break; + case CRIT: + urgency = "CRITICAL"; + break; + default: + urgency = "NORMAL"; + break; + } + + int pid = fork(); + + if (pid == 0) { + execlp(n->script, n->script, + appname, + summary, + body, + icon, + urgency, + (char *) NULL + ); + } else if (pid < 0) { + PERR("Unable to fork", errno); + } else { + return; + } +} + void pause_signal_handler(int sig) { if (sig == SIGUSR1) { @@ -258,6 +303,7 @@ static void print_notification(notification * n) printf("\t\t%s\n", (n->urls->strs)[i]); } printf("\t}\n"); + printf("\tscript: %s\n", n->script); printf("}\n"); } @@ -337,6 +383,7 @@ void apply_rules(notification * n) n->color_strings[ColBG] = r->bg ? r->bg : n->color_strings[ColBG]; n->format = r->format ? r->format : n->format; + n->script = r->script ? r->script : n->script; } } } @@ -409,6 +456,9 @@ void update_lists() if (!n) return; n->start = now; + if (!n->redisplayed && n->script) { + run_script(n); + } n_queue_enqueue(&displayed, n); } @@ -959,6 +1009,8 @@ int init_notification(notification * n, int id) return 0; } + n->script = NULL; + n->format = format; apply_rules(n); @@ -1051,6 +1103,7 @@ int init_notification(notification * n, int id) free(tmp); + if (print_notifications) print_notification(n); @@ -1698,6 +1751,7 @@ void load_options(char *cmdline_config_path) 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 diff --git a/dunst.h b/dunst.h index bc289e5..9c3ce33 100644 --- a/dunst.h +++ b/dunst.h @@ -52,8 +52,10 @@ typedef struct _notification { int dup_count; ColorSet *colors; char *color_strings[2]; + int progress; /* percentage + 1, 0 to hide */ int line_count; + const char *script; struct { int count; char **strs; } *urls; } notification; @@ -76,7 +78,7 @@ typedef struct _rule_t { char *fg; char *bg; const char *format; - + const char *script; } rule_t; typedef struct _keyboard_shortcut { diff --git a/dunstrc b/dunstrc index e1c5c72..7399f62 100644 --- a/dunstrc +++ b/dunstrc @@ -145,10 +145,21 @@ # and 'format'. # Shell-like globbing will get expanded. # +# SCRIPTING +# you can specify a script that gets run when the rule matches by setting +# the 'script' option. +# The script will be called as follows: +# script appname summary body icon urgency +# where urgency can be "LOW", "NORMAL" or "CRITICAL". +# # NOTE: if you don't want a notification to be displayed, set the format to "" # NOTE: It might be helpful to run dunst -print in a terminal in order to find # fitting options for rules. +#[script-test] +# summary = "*script*" +# script = dunst_test.sh + #[ignore] ## This notification will not be displayed # summary = "foobar"