Merge pull request #735 from Djeeberjr/master
multiple scripts for notification
This commit is contained in:
commit
9db8b76473
@ -88,16 +88,20 @@ void notification_print(const struct notification *n)
|
||||
printf("\t\t\"%s\": \"%s\"\n", (char*)p_key, (char*)p_value);
|
||||
printf("\t}\n");
|
||||
}
|
||||
printf("\tscript: %s\n", n->script);
|
||||
printf("\tscript_count: %d\n", n->script_count);
|
||||
if (n->script_count > 0) {
|
||||
printf("\tscripts: ");
|
||||
for (int i = 0; i < n->script_count; i++) {
|
||||
printf("'%s' ",n->scripts[i]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
printf("}\n");
|
||||
}
|
||||
|
||||
/* see notification.h */
|
||||
void notification_run_script(struct notification *n)
|
||||
{
|
||||
if (STR_EMPTY(n->script))
|
||||
return;
|
||||
|
||||
if (n->script_run && !settings.always_run_script)
|
||||
return;
|
||||
|
||||
@ -110,27 +114,35 @@ void notification_run_script(struct notification *n)
|
||||
|
||||
const char *urgency = notification_urgency_to_string(n->urgency);
|
||||
|
||||
int pid1 = fork();
|
||||
for(int i = 0; i < n->script_count; i++) {
|
||||
|
||||
if (pid1) {
|
||||
int status;
|
||||
waitpid(pid1, &status, 0);
|
||||
} else {
|
||||
int pid2 = fork();
|
||||
if (pid2) {
|
||||
exit(0);
|
||||
const char *script = n->scripts[i];
|
||||
|
||||
if (STR_EMPTY(script))
|
||||
continue;
|
||||
|
||||
int pid1 = fork();
|
||||
|
||||
if (pid1) {
|
||||
int status;
|
||||
waitpid(pid1, &status, 0);
|
||||
} else {
|
||||
int ret = execlp(n->script,
|
||||
n->script,
|
||||
appname,
|
||||
summary,
|
||||
body,
|
||||
icon,
|
||||
urgency,
|
||||
(char *)NULL);
|
||||
if (ret != 0) {
|
||||
LOG_W("Unable to run script: %s", strerror(errno));
|
||||
exit(EXIT_FAILURE);
|
||||
int pid2 = fork();
|
||||
if (pid2) {
|
||||
exit(0);
|
||||
} else {
|
||||
int ret = execlp(script,
|
||||
script,
|
||||
appname,
|
||||
summary,
|
||||
body,
|
||||
icon,
|
||||
urgency,
|
||||
(char *)NULL);
|
||||
if (ret != 0) {
|
||||
LOG_W("Unable to run script: %s", strerror(errno));
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -236,6 +248,10 @@ void notification_unref(struct notification *n)
|
||||
|
||||
notification_private_free(n->priv);
|
||||
|
||||
if (n->script_count > 0){
|
||||
g_free(n->scripts);
|
||||
}
|
||||
|
||||
g_free(n);
|
||||
}
|
||||
|
||||
@ -324,6 +340,7 @@ struct notification *notification_create(void)
|
||||
|
||||
n->actions = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
|
||||
|
||||
n->script_count = 0;
|
||||
return n;
|
||||
}
|
||||
|
||||
|
@ -62,7 +62,8 @@ struct notification {
|
||||
|
||||
enum markup_mode markup;
|
||||
const char *format;
|
||||
const char *script;
|
||||
const char **scripts;
|
||||
int script_count;
|
||||
struct notification_colors colors;
|
||||
|
||||
char *stack_tag; /**< stack notifications by tag */
|
||||
|
@ -44,8 +44,12 @@ void rule_apply(struct rule *r, struct notification *n)
|
||||
}
|
||||
if (r->format)
|
||||
n->format = r->format;
|
||||
if (r->script)
|
||||
n->script = r->script;
|
||||
if (r->script){
|
||||
n->scripts = g_renew(const char*,n->scripts,n->script_count + 1);
|
||||
n->scripts[n->script_count] = r->script;
|
||||
|
||||
n->script_count++;
|
||||
}
|
||||
if (r->set_stack_tag) {
|
||||
g_free(n->stack_tag);
|
||||
n->stack_tag = g_strdup(r->set_stack_tag);
|
||||
|
Loading…
x
Reference in New Issue
Block a user