aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/riverctl.1.scd10
-rw-r--r--river/command/rule.zig51
-rw-r--r--river/rule_list.zig5
3 files changed, 33 insertions, 33 deletions
diff --git a/doc/riverctl.1.scd b/doc/riverctl.1.scd
index 7218a6c..7f1fcc3 100644
--- a/doc/riverctl.1.scd
+++ b/doc/riverctl.1.scd
@@ -281,11 +281,11 @@ matches everything while _\*\*_ and the empty string are invalid.
If multiple rules in a list match a given view the most specific
rule will be applied. For example with the following rules
```
- action app-id title
- ssd foo bar
- csd foo *
- csd * bar
- ssd * baz
+ app-id title action
+ foo bar ssd
+ foo * csd
+ * bar csd
+ * baz ssd
```
a view with app-id 'foo' and title 'bar' would get ssd despite matching
two csd rules as the first rule is most specific. Furthermore a view
diff --git a/river/command/rule.zig b/river/command/rule.zig
index 807b55e..965014b 100644
--- a/river/command/rule.zig
+++ b/river/command/rule.zig
@@ -121,40 +121,35 @@ pub fn listRules(_: *Seat, args: []const [:0]const u8, out: *?[]const u8) Error!
if (args.len > 2) return error.TooManyArguments;
const list = std.meta.stringToEnum(enum { float, ssd }, args[1]) orelse return Error.UnknownOption;
-
- const rules = switch (list) {
- .float => server.config.float_rules.rules.items,
- .ssd => server.config.ssd_rules.rules.items,
+ const max_glob_len = switch (list) {
+ .float => server.config.float_rules.getMaxGlobLen(),
+ .ssd => server.config.ssd_rules.getMaxGlobLen(),
};
-
- var action_column_max = "action".len;
- var app_id_column_max = "app-id".len;
- for (rules) |rule| {
- const action = switch (list) {
- .float => if (rule.value) "float" else "no-float",
- .ssd => if (rule.value) "ssd" else "csd",
- };
- action_column_max = @max(action_column_max, action.len);
- app_id_column_max = @max(app_id_column_max, rule.app_id_glob.len);
- }
- action_column_max += 2;
- app_id_column_max += 2;
+ const app_id_column_max = 2 + @max("app-id".len, max_glob_len.app_id);
+ const title_column_max = 2 + @max("title".len, max_glob_len.title);
var buffer = std.ArrayList(u8).init(util.gpa);
const writer = buffer.writer();
- try fmt.formatBuf("action", .{ .width = action_column_max, .alignment = .Left }, writer);
+ try fmt.formatBuf("title", .{ .width = title_column_max, .alignment = .Left }, writer);
try fmt.formatBuf("app-id", .{ .width = app_id_column_max, .alignment = .Left }, writer);
- try writer.writeAll("title\n");
-
- for (rules) |rule| {
- const action = switch (list) {
- .float => if (rule.value) "float" else "no-float",
- .ssd => if (rule.value) "ssd" else "csd",
- };
- try fmt.formatBuf(action, .{ .width = action_column_max, .alignment = .Left }, writer);
- try fmt.formatBuf(rule.app_id_glob, .{ .width = app_id_column_max, .alignment = .Left }, writer);
- try writer.print("{s}\n", .{rule.title_glob});
+ try writer.writeAll("action\n");
+
+ switch (list) {
+ .float, .ssd => {
+ const rules = switch (list) {
+ .float => server.config.float_rules.rules.items,
+ .ssd => server.config.ssd_rules.rules.items,
+ };
+ for (rules) |rule| {
+ try fmt.formatBuf(rule.title_glob, .{ .width = title_column_max, .alignment = .Left }, writer);
+ try fmt.formatBuf(rule.app_id_glob, .{ .width = app_id_column_max, .alignment = .Left }, writer);
+ try writer.print("{s}\n", .{switch (list) {
+ .float => if (rule.value) "float" else "no-float",
+ .ssd => if (rule.value) "ssd" else "csd",
+ }});
+ }
+ },
}
out.* = buffer.toOwnedSlice();
diff --git a/river/rule_list.zig b/river/rule_list.zig
index 325dcc3..de1fa41 100644
--- a/river/rule_list.zig
+++ b/river/rule_list.zig
@@ -22,6 +22,11 @@ const util = @import("util.zig");
const View = @import("View.zig");
+pub const MaxGlobLen = struct {
+ app_id: usize,
+ title: usize,
+};
+
pub fn RuleList(comptime T: type) type {
return struct {
const Self = @This();