river: add tags rule
This commit is contained in:
@ -75,6 +75,7 @@ modes: std.ArrayListUnmanaged(Mode),
|
||||
|
||||
float_rules: RuleList(bool) = .{},
|
||||
ssd_rules: RuleList(bool) = .{},
|
||||
tag_rules: RuleList(u32) = .{},
|
||||
|
||||
/// The selected focus_follows_cursor mode
|
||||
focus_follows_cursor: FocusFollowsCursorMode = .disabled,
|
||||
@ -150,6 +151,7 @@ pub fn deinit(self: *Self) void {
|
||||
|
||||
self.float_rules.deinit();
|
||||
self.ssd_rules.deinit();
|
||||
self.tag_rules.deinit();
|
||||
|
||||
util.gpa.free(self.default_layout_namespace);
|
||||
|
||||
|
@ -508,6 +508,7 @@ pub fn map(view: *Self) !void {
|
||||
view.pending.box.y = @divTrunc(math.max(0, output.usable_box.height - view.pending.box.height), 2);
|
||||
|
||||
view.pending.tags = blk: {
|
||||
if (server.config.tag_rules.match(view)) |tags| break :blk tags;
|
||||
const tags = output.pending.tags & server.config.spawn_tagmask;
|
||||
break :blk if (tags != 0) tags else output.pending.tags;
|
||||
};
|
||||
|
@ -32,6 +32,7 @@ const Action = enum {
|
||||
@"no-float",
|
||||
ssd,
|
||||
csd,
|
||||
tag,
|
||||
};
|
||||
|
||||
pub fn ruleAdd(_: *Seat, args: []const [:0]const u8, _: *?[]const u8) Error!void {
|
||||
@ -44,9 +45,14 @@ pub fn ruleAdd(_: *Seat, args: []const [:0]const u8, _: *?[]const u8) Error!void
|
||||
return error.InvalidValue;
|
||||
};
|
||||
|
||||
if (result.args.len > 0) return Error.TooManyArguments;
|
||||
|
||||
const action = std.meta.stringToEnum(Action, args[1]) orelse return Error.UnknownOption;
|
||||
|
||||
const positional_arguments_count: u8 = switch (action) {
|
||||
.float, .@"no-float", .ssd, .csd => 0,
|
||||
.tag => 1,
|
||||
};
|
||||
if (result.args.len > positional_arguments_count) return Error.TooManyArguments;
|
||||
|
||||
const app_id_glob = result.flags.@"app-id" orelse "*";
|
||||
const title_glob = result.flags.title orelse "*";
|
||||
|
||||
@ -70,6 +76,14 @@ 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[0], 10);
|
||||
try server.config.tag_rules.add(.{
|
||||
.app_id_glob = app_id_glob,
|
||||
.title_glob = title_glob,
|
||||
.value = tag,
|
||||
});
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
@ -104,6 +118,12 @@ pub fn ruleDel(_: *Seat, args: []const [:0]const u8, _: *?[]const u8) Error!void
|
||||
apply_ssd_rules();
|
||||
server.root.applyPending();
|
||||
},
|
||||
.tag => {
|
||||
server.config.tag_rules.del(.{
|
||||
.app_id_glob = app_id_glob,
|
||||
.title_glob = title_glob,
|
||||
});
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
@ -120,10 +140,15 @@ 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 { float, ssd }, args[1]) orelse return Error.UnknownOption;
|
||||
const list = std.meta.stringToEnum(enum {
|
||||
float,
|
||||
ssd,
|
||||
tag,
|
||||
}, 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(),
|
||||
};
|
||||
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);
|
||||
@ -140,6 +165,7 @@ pub fn listRules(_: *Seat, args: []const [:0]const u8, out: *?[]const u8) Error!
|
||||
const rules = switch (list) {
|
||||
.float => server.config.float_rules.rules.items,
|
||||
.ssd => server.config.ssd_rules.rules.items,
|
||||
else => unreachable,
|
||||
};
|
||||
for (rules) |rule| {
|
||||
try fmt.formatBuf(rule.title_glob, .{ .width = title_column_max, .alignment = .Left }, writer);
|
||||
@ -147,9 +173,18 @@ 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",
|
||||
else => unreachable,
|
||||
}});
|
||||
}
|
||||
},
|
||||
.tag => {
|
||||
const rules = server.config.tag_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("{b}\n", .{rule.value});
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
out.* = buffer.toOwnedSlice();
|
||||
|
Reference in New Issue
Block a user