### Description

This patch adds a dmenu interface to [setrule][setrule], which allows to add or
change client rules at runtime. It must be applied on top of [setrule][setrule]
and [menu][menu] patches.

You can invoke the menu by pressing `Alt+R`. The menu lists all the rules, plus
a shortcut to define a new one that would apply to the currently focused client
(marked with `(NEW)`). Rules that already apply to the focused client are marked
with `<`.

![menurule in action](menurule.png)

To edit a rule, you need to select it, press `Tab`, change what you need  and
finally press `Enter`. You can remove a rule by prepending it with `-`. To add a
new rule, just put new values into `[appid|title]`.

To add support for new rules, you need to edit `fprintf` and `sscanf` calls in
`menurulefeed` and `menuruleaction` functions respectively.

For example, this is what I did to add support for [swallow][swallow] patch
rules.

```diff
diff --git a/dwl.c b/dwl.c
index 34397fc..f1b31ea 100644
--- a/dwl.c
+++ b/dwl.c
@@ -2441,10 +2441,14 @@ menurulefeed(FILE *f)
 		fprintf(f, "%-*s "
 			" tags:%-4"PRIi32
 			" isfloating:%-2d"
+			" isterm:%-2d"
+			" noswallow:%-2d"
 			" monitor:%-2d"
 			"%s\n", wid, buf,
 			r->tags,
 			r->isfloating,
+			r->isterm,
+			r->noswallow,
 			r->monitor,
 			(r == &t) ? "  (NEW)" : match ? "  <" : "");
 	}
@@ -2465,10 +2469,14 @@ menuruleaction(char *line)
 	sscanf(line, "[%255[^|]|%255[^]]]"
 		" tags:%"SCNu32
 		" isfloating:%d"
+		" isterm:%d"
+		" noswallow:%d"
 		" monitor:%d"
 		"%n", appid, title,
 		&r.tags,
 		&r.isfloating,
+		&r.isterm,
+		&r.noswallow,
 		&r.monitor,
 		&end);
```

[setrule]: /dwl/dwl-patches/src/branch/main/patches/setrule
[menu]:    /dwl/dwl-patches/src/branch/main/patches/menu
[swallow]: /dwl/dwl-patches/src/branch/main/patches/swallow

### Download

- [v0.7](/dwl/dwl-patches/raw/branch/main/patches/menurule/menurule.patch)

### Authors

- [Nikita Ivanov](https://codeberg.org/nikitaivanov) ([GitHub](https://github.com/NikitaIvanovV))
