dunst/src/rules.c
2019-01-30 23:50:33 -08:00

106 lines
3.3 KiB
C

/* copyright 2013 Sascha Kruse and contributors (see LICENSE for licensing information) */
#include "rules.h"
#include <fnmatch.h>
#include <glib.h>
#include "dunst.h"
GSList *rules = NULL;
/*
* Apply rule to notification.
*/
void rule_apply(struct rule *r, struct notification *n)
{
if (r->timeout != -1)
n->timeout = r->timeout;
if (r->urgency != URG_NONE)
n->urgency = r->urgency;
if (r->fullscreen != FS_NULL)
n->fullscreen = r->fullscreen;
if (r->history_ignore != -1)
n->history_ignore = r->history_ignore;
if (r->set_transient != -1)
n->transient = r->set_transient;
if (r->skip_display != -1)
n->skip_display = r->skip_display;
if (r->markup != MARKUP_NULL)
n->markup = r->markup;
if (r->new_icon)
notification_icon_replace_path(n, r->new_icon);
if (r->fg) {
g_free(n->colors.fg);
n->colors.fg = g_strdup(r->fg);
}
if (r->bg) {
g_free(n->colors.bg);
n->colors.bg = g_strdup(r->bg);
}
if (r->fc) {
g_free(n->colors.frame);
n->colors.frame = g_strdup(r->fc);
}
if (r->format)
n->format = r->format;
if (r->script)
n->script = r->script;
if (r->set_stack_tag) {
g_free(n->stack_tag);
n->stack_tag = g_strdup(r->set_stack_tag);
}
}
/*
* Check all rules if they match n and apply.
*/
void rule_apply_all(struct notification *n)
{
for (GSList *iter = rules; iter; iter = iter->next) {
struct rule *r = iter->data;
if (rule_matches_notification(r, n)) {
rule_apply(r, n);
}
}
}
struct rule *rule_new(void)
{
struct rule *r = g_malloc0(sizeof(struct rule));
r->msg_urgency = URG_NONE;
r->timeout = -1;
r->urgency = URG_NONE;
r->fullscreen = FS_NULL;
r->markup = MARKUP_NULL;
r->history_ignore = false;
r->match_transient = -1;
r->set_transient = -1;
r->skip_display = -1;
return r;
}
static inline bool rule_field_matches_string(const char *value, const char *pattern)
{
return !pattern || (value && !fnmatch(pattern, value, 0));
}
/*
* Check whether rule should be applied to n.
*/
bool rule_matches_notification(struct rule *r, struct notification *n)
{
return (r->msg_urgency == URG_NONE || r->msg_urgency == n->urgency)
&& (r->match_transient == -1 || (r->match_transient == n->transient))
&& rule_field_matches_string(n->appname, r->appname)
&& rule_field_matches_string(n->desktop_entry, r->desktop_entry)
&& rule_field_matches_string(n->summary, r->summary)
&& rule_field_matches_string(n->body, r->body)
&& rule_field_matches_string(n->iconname, r->icon)
&& rule_field_matches_string(n->category, r->category)
&& rule_field_matches_string(n->stack_tag, r->stack_tag);
}
/* vim: set tabstop=8 shiftwidth=8 expandtab textwidth=0: */