run script via rule
This commit is contained in:
parent
aa0b63b270
commit
131016878b
14
config.def.h
14
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 }, */
|
||||
};
|
||||
|
54
dunst.c
54
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
|
||||
|
4
dunst.h
4
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 {
|
||||
|
11
dunstrc
11
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"
|
||||
|
Loading…
x
Reference in New Issue
Block a user