diff --git a/config.c b/config.c
index 817f7e97..1116a8c7 100644
--- a/config.c
+++ b/config.c
@@ -111,6 +111,8 @@ void init_default_style(struct mako_style *style) {
style->default_timeout = 0;
style->ignore_timeout = false;
+ style->max_urgency = MAKO_NOTIFICATION_URGENCY_CRITICAL;
+
style->colors.background = 0x285577FF;
style->colors.text = 0xFFFFFFFF;
style->colors.border = 0x4C7899FF;
@@ -311,6 +313,11 @@ bool apply_style(struct mako_style *target, const struct mako_style *style) {
target->spec.ignore_timeout = true;
}
+ if (style->spec.max_urgency) {
+ target->max_urgency = style->max_urgency;
+ target->spec.max_urgency = true;
+ }
+
if (style->spec.colors.background) {
target->colors.background = style->colors.background;
target->spec.colors.background = true;
@@ -642,6 +649,9 @@ static bool apply_style_option(struct mako_style *style, const char *name,
} else if (strcmp(name, "ignore-timeout") == 0) {
return spec->ignore_timeout =
parse_boolean(value, &style->ignore_timeout);
+ } else if (strcmp(name, "max-urgency") == 0) {
+ return spec->max_urgency =
+ parse_urgency(value, &style->max_urgency);
} else if (strcmp(name, "group-by") == 0) {
return spec->group_criteria_spec =
parse_criteria_spec(value, &style->group_criteria_spec);
@@ -921,6 +931,7 @@ int parse_config_arguments(struct mako_config *config, int argc, char **argv) {
{"history", required_argument, 0, 0},
{"default-timeout", required_argument, 0, 0},
{"ignore-timeout", required_argument, 0, 0},
+ {"max-urgency", required_argument, 0, 0},
{"output", required_argument, 0, 0},
{"layer", required_argument, 0, 0},
{"anchor", required_argument, 0, 0},
diff --git a/contrib/completions/bash/mako b/contrib/completions/bash/mako
index bdb5bbb6..4757c034 100644
--- a/contrib/completions/bash/mako
+++ b/contrib/completions/bash/mako
@@ -34,6 +34,7 @@ _mako()
'--sort'
'--default-timeout'
'--ignore-timeout'
+ '--max-urgency'
'--output'
'--layer'
'--anchor'
@@ -45,6 +46,10 @@ _mako()
return
;;
--icons|--markup|--actions|--history|--ignore-timeout)
+ COMPREPLY=($(compgen -W "low normal critical" -- "$cur"))
+ return
+ ;;
+ --max-urgency)
COMPREPLY=($(compgen -W "0 1" -- "$cur"))
return
;;
diff --git a/contrib/completions/fish/mako.fish b/contrib/completions/fish/mako.fish
index c64d203d..ddf7943c 100644
--- a/contrib/completions/fish/mako.fish
+++ b/contrib/completions/fish/mako.fish
@@ -33,6 +33,7 @@ complete -c mako -l history -d 'Add expired notifications to history' -xa "1 0"
complete -c mako -l sort -d 'Set notification sorting method' -x
complete -c mako -l default-timeout -d 'Notification timeout in ms' -x
complete -c mako -l ignore-timeout -d 'Enable notification timeout or not' -xa "1 0"
+complete -c mako -l max-urgency -d 'Max allowed notification urgency' -xa "low normal critical"
complete -c mako -l output -d 'Show notifications on this output' -xa '(complete_outputs)'
complete -c mako -l layer -d 'Show notifications on this layer' -x
complete -c mako -l anchor -d 'Position on output to put notifications' -x
diff --git a/contrib/completions/zsh/_mako b/contrib/completions/zsh/_mako
index 4a1f01c2..a554f54f 100644
--- a/contrib/completions/zsh/_mako
+++ b/contrib/completions/zsh/_mako
@@ -27,6 +27,7 @@ _arguments \
'--history[Add expired notification to history.]:history:' \
'--default-timeout[Default timeout in milliseconds.]:timeout (ms):' \
'--ignore-timeout[If set, mako will ignore the expire timeout sent by notifications and use the one provided by default-timeout instead.]:Use default timeout:(0 1)' \
+ '--max-urgency[Maximum allowed notification urgency.]:urgency:(low normal critical)' \
'--output[Show notifications on this output.]:name:' \
'--layer[Arrange notifications at this layer.]:layer:(background bottom top overlay)' \
'--anchor[Position on output to put notifications.]:position:(top-right bottom-right bottom-center bottom-left top-left top-center center-right center-left center)' \
diff --git a/dbus/xdg.c b/dbus/xdg.c
index 1f914314..a4ee06d9 100644
--- a/dbus/xdg.c
+++ b/dbus/xdg.c
@@ -408,6 +408,10 @@ static int handle_notify(sd_bus_message *msg, void *data,
handle_notification_timer, notif);
}
+ if (notif->style.spec.max_urgency && notif->urgency > notif->style.max_urgency) {
+ notif->urgency = notif->style.max_urgency;
+ }
+
if (notif->style.icons) {
notif->icon = create_icon(notif);
}
diff --git a/doc/mako.5.scd b/doc/mako.5.scd
index 6c1683a2..f57ef814 100644
--- a/doc/mako.5.scd
+++ b/doc/mako.5.scd
@@ -274,6 +274,12 @@ Default when grouped: (%g) %s\\n%b
Default: 0
+*max-urgency*=low|normal|critical
+ Set the maximum allowed urgency to the given value. Intended to be used
+ as part of a criteria for applications abusing urgency.
+
+ Default: critical (meaning no practical limit)
+
*group-by*=_field[,field,...]_
A comma-separated list of criteria fields that will be compared to other
visible notifications to determine if this one should form a group with
diff --git a/include/config.h b/include/config.h
index 48769898..d8e1da6f 100644
--- a/include/config.h
+++ b/include/config.h
@@ -40,7 +40,7 @@ enum mako_icon_location {
// structs are also mirrored.
struct mako_style_spec {
bool width, height, outer_margin, margin, padding, border_size, border_radius, font,
- markup, format, text_alignment, actions, default_timeout, ignore_timeout,
+ markup, format, text_alignment, actions, default_timeout, ignore_timeout, max_urgency,
icons, max_icon_size, icon_path, icon_border_radius, group_criteria_spec, invisible, history,
icon_location, max_visible, layer, output, anchor;
struct {
@@ -78,6 +78,8 @@ struct mako_style {
int default_timeout; // in ms
bool ignore_timeout;
+ enum mako_notification_urgency max_urgency;
+
struct {
uint32_t background;
uint32_t text;
diff --git a/main.c b/main.c
index c273a4b8..1d5e0a27 100644
--- a/main.c
+++ b/main.c
@@ -53,6 +53,7 @@ static const char usage[] =
" descending(-) order.\n"
" --default-timeout Default timeout in milliseconds.\n"
" --ignore-timeout <0|1> Enable/disable notification timeout.\n"
+ " --max-urgency Max allowed notification urgency.\n"
" --output Show notifications on this output.\n"
" --layer Arrange notifications at this layer.\n"
" --anchor Position on output to put notifications.\n"