rules: rename "tag" action to "tags"
This rule action accepts and assigns a set of 32 tags represented as a 32 bit integer just like all of river's other commands handling tags. Using the singular here is potentially misleading and is also inconsistent with set-view-tags, etc. which all use the plural. Sorry about the breaking change for those who use master branch, ideally I would have caught this before merging but at least I noticed before a release. This commit also does a bit of internal refactoring/cleanup of the rules system.
This commit is contained in:
@ -32,7 +32,7 @@ const Action = enum {
|
||||
@"no-float",
|
||||
ssd,
|
||||
csd,
|
||||
tag,
|
||||
tags,
|
||||
output,
|
||||
position,
|
||||
dimensions,
|
||||
@ -54,7 +54,7 @@ pub fn ruleAdd(_: *Seat, args: []const [:0]const u8, _: *?[]const u8) Error!void
|
||||
|
||||
const positional_arguments_count: u8 = switch (action) {
|
||||
.float, .@"no-float", .ssd, .csd, .fullscreen, .@"no-fullscreen" => 1,
|
||||
.tag, .output => 2,
|
||||
.tags, .output => 2,
|
||||
.position, .dimensions => 3,
|
||||
};
|
||||
if (result.args.len > positional_arguments_count) return Error.TooManyArguments;
|
||||
@ -68,14 +68,14 @@ pub fn ruleAdd(_: *Seat, args: []const [:0]const u8, _: *?[]const u8) Error!void
|
||||
|
||||
switch (action) {
|
||||
.float, .@"no-float" => {
|
||||
try server.config.float_rules.add(.{
|
||||
try server.config.rules.float.add(.{
|
||||
.app_id_glob = app_id_glob,
|
||||
.title_glob = title_glob,
|
||||
.value = (action == .float),
|
||||
});
|
||||
},
|
||||
.ssd, .csd => {
|
||||
try server.config.ssd_rules.add(.{
|
||||
try server.config.rules.ssd.add(.{
|
||||
.app_id_glob = app_id_glob,
|
||||
.title_glob = title_glob,
|
||||
.value = (action == .ssd),
|
||||
@ -83,18 +83,18 @@ pub fn ruleAdd(_: *Seat, args: []const [:0]const u8, _: *?[]const u8) Error!void
|
||||
apply_ssd_rules();
|
||||
server.root.applyPending();
|
||||
},
|
||||
.tag => {
|
||||
const tag = try fmt.parseInt(u32, result.args[1], 10);
|
||||
try server.config.tag_rules.add(.{
|
||||
.tags => {
|
||||
const tags = try fmt.parseInt(u32, result.args[1], 10);
|
||||
try server.config.rules.tags.add(.{
|
||||
.app_id_glob = app_id_glob,
|
||||
.title_glob = title_glob,
|
||||
.value = tag,
|
||||
.value = tags,
|
||||
});
|
||||
},
|
||||
.output => {
|
||||
const output_name = try util.gpa.dupe(u8, result.args[1]);
|
||||
errdefer util.gpa.free(output_name);
|
||||
try server.config.output_rules.add(.{
|
||||
try server.config.rules.output.add(.{
|
||||
.app_id_glob = app_id_glob,
|
||||
.title_glob = title_glob,
|
||||
.value = output_name,
|
||||
@ -103,7 +103,7 @@ pub fn ruleAdd(_: *Seat, args: []const [:0]const u8, _: *?[]const u8) Error!void
|
||||
.position => {
|
||||
const x = try fmt.parseInt(u31, result.args[1], 10);
|
||||
const y = try fmt.parseInt(u31, result.args[2], 10);
|
||||
try server.config.position_rules.add(.{
|
||||
try server.config.rules.position.add(.{
|
||||
.app_id_glob = app_id_glob,
|
||||
.title_glob = title_glob,
|
||||
.value = .{
|
||||
@ -115,7 +115,7 @@ pub fn ruleAdd(_: *Seat, args: []const [:0]const u8, _: *?[]const u8) Error!void
|
||||
.dimensions => {
|
||||
const width = try fmt.parseInt(u31, result.args[1], 10);
|
||||
const height = try fmt.parseInt(u31, result.args[2], 10);
|
||||
try server.config.dimensions_rules.add(.{
|
||||
try server.config.rules.dimensions.add(.{
|
||||
.app_id_glob = app_id_glob,
|
||||
.title_glob = title_glob,
|
||||
.value = .{
|
||||
@ -125,7 +125,7 @@ pub fn ruleAdd(_: *Seat, args: []const [:0]const u8, _: *?[]const u8) Error!void
|
||||
});
|
||||
},
|
||||
.fullscreen, .@"no-fullscreen" => {
|
||||
try server.config.fullscreen_rules.add(.{
|
||||
try server.config.rules.fullscreen.add(.{
|
||||
.app_id_glob = app_id_glob,
|
||||
.title_glob = title_glob,
|
||||
.value = (action == .fullscreen),
|
||||
@ -153,29 +153,29 @@ pub fn ruleDel(_: *Seat, args: []const [:0]const u8, _: *?[]const u8) Error!void
|
||||
};
|
||||
switch (action) {
|
||||
.float, .@"no-float" => {
|
||||
_ = server.config.float_rules.del(rule);
|
||||
_ = server.config.rules.float.del(rule);
|
||||
},
|
||||
.ssd, .csd => {
|
||||
_ = server.config.ssd_rules.del(rule);
|
||||
_ = server.config.rules.ssd.del(rule);
|
||||
apply_ssd_rules();
|
||||
server.root.applyPending();
|
||||
},
|
||||
.tag => {
|
||||
_ = server.config.tag_rules.del(rule);
|
||||
.tags => {
|
||||
_ = server.config.rules.tags.del(rule);
|
||||
},
|
||||
.output => {
|
||||
if (server.config.output_rules.del(rule)) |output_rule| {
|
||||
if (server.config.rules.output.del(rule)) |output_rule| {
|
||||
util.gpa.free(output_rule);
|
||||
}
|
||||
},
|
||||
.position => {
|
||||
_ = server.config.position_rules.del(rule);
|
||||
_ = server.config.rules.position.del(rule);
|
||||
},
|
||||
.dimensions => {
|
||||
_ = server.config.dimensions_rules.del(rule);
|
||||
_ = server.config.rules.dimensions.del(rule);
|
||||
},
|
||||
.fullscreen, .@"no-fullscreen" => {
|
||||
_ = server.config.fullscreen_rules.del(rule);
|
||||
_ = server.config.rules.fullscreen.del(rule);
|
||||
},
|
||||
}
|
||||
}
|
||||
@ -183,7 +183,7 @@ pub fn ruleDel(_: *Seat, args: []const [:0]const u8, _: *?[]const u8) Error!void
|
||||
fn apply_ssd_rules() void {
|
||||
var it = server.root.views.iterator(.forward);
|
||||
while (it.next()) |view| {
|
||||
if (server.config.ssd_rules.match(view)) |ssd| {
|
||||
if (server.config.rules.ssd.match(view)) |ssd| {
|
||||
view.pending.ssd = ssd;
|
||||
}
|
||||
}
|
||||
@ -193,23 +193,17 @@ pub fn listRules(_: *Seat, args: []const [:0]const u8, out: *?[]const u8) Error!
|
||||
if (args.len < 2) return error.NotEnoughArguments;
|
||||
if (args.len > 2) return error.TooManyArguments;
|
||||
|
||||
const list = std.meta.stringToEnum(enum {
|
||||
const rule_list = std.meta.stringToEnum(enum {
|
||||
float,
|
||||
ssd,
|
||||
tag,
|
||||
tags,
|
||||
output,
|
||||
position,
|
||||
dimensions,
|
||||
fullscreen,
|
||||
}, args[1]) orelse return Error.UnknownOption;
|
||||
const max_glob_len = switch (list) {
|
||||
.float => server.config.float_rules.getMaxGlobLen(),
|
||||
.ssd => server.config.ssd_rules.getMaxGlobLen(),
|
||||
.tag => server.config.tag_rules.getMaxGlobLen(),
|
||||
.output => server.config.output_rules.getMaxGlobLen(),
|
||||
.position => server.config.position_rules.getMaxGlobLen(),
|
||||
.dimensions => server.config.dimensions_rules.getMaxGlobLen(),
|
||||
.fullscreen => server.config.fullscreen_rules.getMaxGlobLen(),
|
||||
const max_glob_len = switch (rule_list) {
|
||||
inline else => |list| @field(server.config.rules, @tagName(list)).getMaxGlobLen(),
|
||||
};
|
||||
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);
|
||||
@ -221,11 +215,13 @@ pub fn listRules(_: *Seat, args: []const [:0]const u8, out: *?[]const u8) Error!
|
||||
try fmt.formatBuf("app-id", .{ .width = app_id_column_max, .alignment = .left }, writer);
|
||||
try writer.writeAll("action\n");
|
||||
|
||||
switch (list) {
|
||||
.float, .ssd => {
|
||||
switch (rule_list) {
|
||||
inline .float, .ssd, .output, .fullscreen => |list| {
|
||||
const rules = switch (list) {
|
||||
.float => server.config.float_rules.rules.items,
|
||||
.ssd => server.config.ssd_rules.rules.items,
|
||||
.float => server.config.rules.float.rules.items,
|
||||
.ssd => server.config.rules.ssd.rules.items,
|
||||
.output => server.config.rules.output.rules.items,
|
||||
.fullscreen => server.config.rules.fullscreen.rules.items,
|
||||
else => unreachable,
|
||||
};
|
||||
for (rules) |rule| {
|
||||
@ -234,50 +230,33 @@ pub fn listRules(_: *Seat, args: []const [:0]const u8, out: *?[]const u8) Error!
|
||||
try writer.print("{s}\n", .{switch (list) {
|
||||
.float => if (rule.value) "float" else "no-float",
|
||||
.ssd => if (rule.value) "ssd" else "csd",
|
||||
.output => rule.value,
|
||||
.fullscreen => if (rule.value) "fullscreen" else "no-fullscreen",
|
||||
else => unreachable,
|
||||
}});
|
||||
}
|
||||
},
|
||||
.tag => {
|
||||
const rules = server.config.tag_rules.rules.items;
|
||||
for (rules) |rule| {
|
||||
.tags => {
|
||||
for (server.config.rules.tags.rules.items) |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("{b}\n", .{rule.value});
|
||||
}
|
||||
},
|
||||
.output => {
|
||||
const rules = server.config.output_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", .{rule.value});
|
||||
}
|
||||
},
|
||||
.position => {
|
||||
const rules = server.config.position_rules.rules.items;
|
||||
for (rules) |rule| {
|
||||
for (server.config.rules.position.rules.items) |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("{d},{d}\n", .{ rule.value.x, rule.value.y });
|
||||
}
|
||||
},
|
||||
.dimensions => {
|
||||
const rules = server.config.dimensions_rules.rules.items;
|
||||
for (rules) |rule| {
|
||||
for (server.config.rules.dimensions.rules.items) |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("{d}x{d}\n", .{ rule.value.width, rule.value.height });
|
||||
}
|
||||
},
|
||||
.fullscreen => {
|
||||
const rules = server.config.fullscreen_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", .{if (rule.value) "fullscreen" else "no-fullscreen"});
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
out.* = try buffer.toOwnedSlice();
|
||||
|
Reference in New Issue
Block a user