oxwm

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

Added urgent tags, very similar to DWM logic.

Commit
9d4c28ff0076e483e4efeed542e5b81d71c9d167
Parent
0efc6aa
Author
tonybtw <tonybtw@tonybtw.com>
Date
2025-12-17 05:33:43

Diff

diff --git a/resources/test-config.lua b/resources/test-config.lua
index 7f6ab4a..124af25 100644
--- a/resources/test-config.lua
+++ b/resources/test-config.lua
@@ -56,6 +56,7 @@ oxwm.bar.set_font("JetBrainsMono Nerd Font:style=Bold:size=12")
 oxwm.bar.set_scheme_normal(colors.fg, colors.bg, 0x444444)
 oxwm.bar.set_scheme_occupied(colors.cyan, colors.bg, colors.cyan)
 oxwm.bar.set_scheme_selected(colors.cyan, colors.bg, colors.purple)
+oxwm.bar.set_scheme_urgent(colors.red, colors.bg, colors.red)
 
 oxwm.key.chord({
     { { modkey }, "Space" },
diff --git a/src/bar/bar.rs b/src/bar/bar.rs
index 3e1955f..4b6e1c8 100644
--- a/src/bar/bar.rs
+++ b/src/bar/bar.rs
@@ -30,6 +30,7 @@ pub struct Bar {
     scheme_normal: crate::ColorScheme,
     scheme_occupied: crate::ColorScheme,
     scheme_selected: crate::ColorScheme,
+    scheme_urgent: crate::ColorScheme,
 }
 
 impl Bar {
@@ -136,6 +137,7 @@ impl Bar {
             scheme_normal: config.scheme_normal,
             scheme_occupied: config.scheme_occupied,
             scheme_selected: config.scheme_selected,
+            scheme_urgent: config.scheme_urgent,
         })
     }
 
@@ -183,6 +185,7 @@ impl Bar {
         display: *mut x11::xlib::Display,
         current_tags: u32,
         occupied_tags: u32,
+        urgent_tags: u32,
         draw_blocks: bool,
         layout_symbol: &str,
         keychord_indicator: Option<&str>,
@@ -218,11 +221,14 @@ impl Bar {
             let tag_mask = 1 << tag_index;
             let is_selected = (current_tags & tag_mask) != 0;
             let is_occupied = (occupied_tags & tag_mask) != 0;
+            let is_urgent = (urgent_tags & tag_mask) != 0;
 
             let tag_width = self.tag_widths[tag_index];
 
             let scheme = if is_selected {
                 &self.scheme_selected
+            } else if is_urgent {
+                &self.scheme_urgent
             } else if is_occupied {
                 &self.scheme_occupied
             } else {
@@ -238,7 +244,7 @@ impl Bar {
             self.font_draw
                 .draw_text(font, scheme.foreground, text_x, text_y, tag);
 
-            if is_selected {
+            if is_selected || is_urgent {
                 let font_height = font.height();
                 let underline_height = font_height / 8;
                 let bottom_gap = 3;
@@ -406,6 +412,7 @@ impl Bar {
         self.scheme_normal = config.scheme_normal;
         self.scheme_occupied = config.scheme_occupied;
         self.scheme_selected = config.scheme_selected;
+        self.scheme_urgent = config.scheme_urgent;
 
         self.status_text.clear();
         self.needs_redraw = true;
diff --git a/src/config/lua.rs b/src/config/lua.rs
index 52a8e8c..952c49e 100644
--- a/src/config/lua.rs
+++ b/src/config/lua.rs
@@ -48,6 +48,7 @@ pub fn parse_lua_config(
         scheme_normal: builder_data.scheme_normal,
         scheme_occupied: builder_data.scheme_occupied,
         scheme_selected: builder_data.scheme_selected,
+        scheme_urgent: builder_data.scheme_urgent,
         autostart: builder_data.autostart,
         auto_tile: builder_data.auto_tile,
         path: None,
diff --git a/src/config/lua_api.rs b/src/config/lua_api.rs
index c816820..52d815f 100644
--- a/src/config/lua_api.rs
+++ b/src/config/lua_api.rs
@@ -32,6 +32,7 @@ pub struct ConfigBuilder {
     pub scheme_normal: ColorScheme,
     pub scheme_occupied: ColorScheme,
     pub scheme_selected: ColorScheme,
+    pub scheme_urgent: ColorScheme,
     pub autostart: Vec<String>,
     pub auto_tile: bool,
 }
@@ -72,6 +73,11 @@ impl Default for ConfigBuilder {
                 background: 0x000000,
                 underline: 0x444444,
             },
+            scheme_urgent: ColorScheme {
+                foreground: 0xff5555,
+                background: 0x000000,
+                underline: 0xff5555,
+            },
             autostart: Vec::new(),
             auto_tile: false,
         }
@@ -705,6 +711,21 @@ fn register_bar_module(
             Ok(())
         })?;
 
+    let builder_clone = builder.clone();
+    let set_scheme_urgent =
+        lua.create_function(move |_, (fg, bg, ul): (Value, Value, Value)| {
+            let foreground = parse_color_value(fg)?;
+            let background = parse_color_value(bg)?;
+            let underline = parse_color_value(ul)?;
+
+            builder_clone.borrow_mut().scheme_urgent = ColorScheme {
+                foreground,
+                background,
+                underline,
+            };
+            Ok(())
+        })?;
+
     bar_table.set("set_font", set_font)?;
     bar_table.set("block", block_table)?;
     bar_table.set("add_block", add_block)?; // Deprecated, for backwards compatibility
@@ -712,6 +733,7 @@ fn register_bar_module(
     bar_table.set("set_scheme_normal", set_scheme_normal)?;
     bar_table.set("set_scheme_occupied", set_scheme_occupied)?;
     bar_table.set("set_scheme_selected", set_scheme_selected)?;
+    bar_table.set("set_scheme_urgent", set_scheme_urgent)?;
     parent.set("bar", bar_table)?;
     Ok(())
 }
diff --git a/src/lib.rs b/src/lib.rs
index ddbed3b..b52b23c 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -99,6 +99,7 @@ pub struct Config {
     pub scheme_normal: ColorScheme,
     pub scheme_occupied: ColorScheme,
     pub scheme_selected: ColorScheme,
+    pub scheme_urgent: ColorScheme,
 
     pub autostart: Vec<String>,
     pub auto_tile: bool,
@@ -345,6 +346,11 @@ impl Default for Config {
                 background: 0x1a1b26,
                 underline: 0xad8ee6,
             },
+            scheme_urgent: ColorScheme {
+                foreground: 0xff5555,
+                background: 0x1a1b26,
+                underline: 0xff5555,
+            },
             autostart: vec![],
             auto_tile: false,
         }
diff --git a/src/window_manager.rs b/src/window_manager.rs
index 6d77f5d..1543c94 100644
--- a/src/window_manager.rs
+++ b/src/window_manager.rs
@@ -670,9 +670,13 @@ impl WindowManager {
         for (monitor_index, monitor) in self.monitors.iter().enumerate() {
             if let Some(bar) = self.bars.get_mut(monitor_index) {
                 let mut occupied_tags: TagMask = 0;
+                let mut urgent_tags: TagMask = 0;
                 for client in self.clients.values() {
                     if client.monitor_index == monitor_index {
                         occupied_tags |= client.tags;
+                        if client.is_urgent {
+                            urgent_tags |= client.tags;
+                        }
                     }
                 }
 
@@ -684,6 +688,7 @@ impl WindowManager {
                     self.display,
                     monitor.tagset[monitor.selected_tags_index],
                     occupied_tags,
+                    urgent_tags,
                     draw_blocks,
                     &layout_symbol,
                     keychord_indicator.as_deref(),
@@ -2067,6 +2072,10 @@ impl WindowManager {
                 return Ok(());
             }
 
+            if self.clients.get(&win).is_some_and(|c| c.is_urgent) {
+                self.set_urgent(win, false)?;
+            }
+
             let monitor_idx = self
                 .clients
                 .get(&win)
diff --git a/templates/config.lua b/templates/config.lua
index 50bb4cb..160e30a 100644
--- a/templates/config.lua
+++ b/templates/config.lua
@@ -169,6 +169,8 @@ oxwm.bar.set_scheme_normal(colors.fg, colors.bg, "#444444")
 oxwm.bar.set_scheme_occupied(colors.cyan, colors.bg, colors.cyan)
 -- Currently selected tag
 oxwm.bar.set_scheme_selected(colors.cyan, colors.bg, colors.purple)
+-- Urgent tags (windows requesting attention)
+oxwm.bar.set_scheme_urgent(colors.red, colors.bg, colors.red)
 
 -------------------------------------------------------------------------------
 -- Keybindings
diff --git a/templates/oxwm.lua b/templates/oxwm.lua
index 3ec047c..3dc0d81 100644
--- a/templates/oxwm.lua
+++ b/templates/oxwm.lua
@@ -309,6 +309,12 @@ function oxwm.bar.set_scheme_occupied(foreground, background, underline) end
 ---@param underline string|integer Underline color
 function oxwm.bar.set_scheme_selected(foreground, background, underline) end
 
+---Set urgent tag color scheme (tags with urgent windows)
+---@param foreground string|integer Foreground color
+---@param background string|integer Background color
+---@param underline string|integer Underline color
+function oxwm.bar.set_scheme_urgent(foreground, background, underline) end
+
 ---Add an autostart command
 ---@param cmd string Command to run at startup
 function oxwm.autostart(cmd) end