oxwm

https://git.tonybtw.com/oxwm.git git://git.tonybtw.com/oxwm.git

Added focus follows rule back into window rules on zig lua.

Commit
9de572d2f3992f8b8f5e25c068791181e2e3c191
Parent
f64308d
Author
tonybanters <tonybanters@gmail.com>
Date
2026-02-19 21:50:47

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 {