Diff
diff --git a/src/config/config.zig b/src/config/config.zig
index c671d61..3c5f573 100644
--- a/src/config/config.zig
+++ b/src/config/config.zig
@@ -56,6 +56,7 @@ pub const Rule = struct {
tags: u32,
is_floating: bool,
monitor: i32,
+ focus: bool,
};
pub const Block_Type = enum {
diff --git a/src/config/lua.zig b/src/config/lua.zig
index 6b8f389..d935a35 100644
--- a/src/config/lua.zig
+++ b/src/config/lua.zig
@@ -695,6 +695,7 @@ fn lua_rule_add(state: ?*c.lua_State) callconv(.c) c_int {
.tags = 0,
.is_floating = false,
.monitor = -1,
+ .focus = false,
};
_ = c.lua_getfield(s, 1, "class");
@@ -736,6 +737,12 @@ fn lua_rule_add(state: ?*c.lua_State) callconv(.c) c_int {
}
c.lua_settop(s, -2);
+ _ = c.lua_getfield(s, 1, "focus");
+ if (c.lua_type(s, -1) == c.LUA_TBOOLEAN) {
+ rule.focus = c.lua_toboolean(s, -1) != 0;
+ }
+ c.lua_settop(s, -2);
+
cfg.add_rule(rule) catch return 0;
return 0;
}
diff --git a/src/main.zig b/src/main.zig
index bad41a0..78859d7 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -2472,6 +2472,7 @@ fn apply_rules(display: *Display, client: *Client) void {
client.is_floating = false;
client.tags = 0;
+ var rule_focus = false;
for (config.rules.items) |rule| {
const class_matches = if (rule.class) |rc| std.mem.indexOf(u8, class_str, rc) != null else true;
@@ -2493,6 +2494,9 @@ fn apply_rules(display: *Display, client: *Client) void {
target = mon.next;
}
}
+ if (rule.focus) {
+ rule_focus = true;
+ }
}
}
@@ -2507,6 +2511,14 @@ fn apply_rules(display: *Display, client: *Client) void {
if (client.tags == 0) {
client.tags = monitor.tagset[monitor.sel_tags];
}
+
+ if (rule_focus and client.tags != 0) {
+ const monitor_tagset = monitor.tagset[monitor.sel_tags];
+ const is_tag_focused = (monitor_tagset & client.tags) == client.tags;
+ if (!is_tag_focused) {
+ view(display, client.tags);
+ }
+ }
}
fn update_client_list(display: *Display) void {