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