oxwm

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

Added size hints for old terminals, and added smartgaps flag to lua config for single window gaps

Commit
23d144c8b1d6ce0d4b778c35729daf19dc232d4c
Parent
16b90b9
Author
tonybtw <tonybtw@tonybtw.com>
Date
2025-12-01 05:23:05

Diff

diff --git a/resources/test-config.lua b/resources/test-config.lua
index 1f8094f..099a6cd 100644
--- a/resources/test-config.lua
+++ b/resources/test-config.lua
@@ -42,6 +42,7 @@ oxwm.border.set_focused_color(colors.blue)
 oxwm.border.set_unfocused_color(colors.grey)
 
 oxwm.gaps.set_enabled(true)
+oxwm.gaps.set_smart(true)  -- Disable outer gaps when only 1 window (dwm smartgaps)
 oxwm.gaps.set_inner(5, 5)
 oxwm.gaps.set_outer(5, 5)
 
diff --git a/src/config/lua.rs b/src/config/lua.rs
index a2341b4..5033149 100644
--- a/src/config/lua.rs
+++ b/src/config/lua.rs
@@ -32,6 +32,7 @@ pub fn parse_lua_config(
         border_unfocused: builder_data.border_unfocused,
         font: builder_data.font,
         gaps_enabled: builder_data.gaps_enabled,
+        smartgaps_enabled: builder_data.smartgaps_enabled,
         gap_inner_horizontal: builder_data.gap_inner_horizontal,
         gap_inner_vertical: builder_data.gap_inner_vertical,
         gap_outer_horizontal: builder_data.gap_outer_horizontal,
diff --git a/src/config/lua_api.rs b/src/config/lua_api.rs
index 4dc33b9..5ed03fd 100644
--- a/src/config/lua_api.rs
+++ b/src/config/lua_api.rs
@@ -16,6 +16,7 @@ pub struct ConfigBuilder {
     pub border_unfocused: u32,
     pub font: String,
     pub gaps_enabled: bool,
+    pub smartgaps_enabled: bool,
     pub gap_inner_horizontal: u32,
     pub gap_inner_vertical: u32,
     pub gap_outer_horizontal: u32,
@@ -40,6 +41,7 @@ impl Default for ConfigBuilder {
             border_unfocused: 0xbbbbbb,
             font: "monospace:style=Bold:size=10".to_string(),
             gaps_enabled: true,
+            smartgaps_enabled: true,
             gap_inner_horizontal: 5,
             gap_inner_vertical: 5,
             gap_outer_horizontal: 5,
@@ -184,11 +186,18 @@ fn register_gaps_module(lua: &Lua, parent: &Table, builder: SharedBuilder) -> Re
         Ok(())
     })?;
 
+    let builder_clone = builder.clone();
+    let set_smart = lua.create_function(move |_, enabled: bool| {
+        builder_clone.borrow_mut().smartgaps_enabled = enabled;
+        Ok(())
+    })?;
+
     gaps_table.set("set_enabled", set_enabled)?;
     gaps_table.set("enable", enable)?;
     gaps_table.set("disable", disable)?;
     gaps_table.set("set_inner", set_inner)?;
     gaps_table.set("set_outer", set_outer)?;
+    gaps_table.set("set_smart", set_smart)?;
     parent.set("gaps", gaps_table)?;
     Ok(())
 }
diff --git a/src/layout/grid.rs b/src/layout/grid.rs
index 7ad68e3..12aa836 100644
--- a/src/layout/grid.rs
+++ b/src/layout/grid.rs
@@ -20,6 +20,7 @@ impl Layout for GridLayout {
         gaps: &GapConfig,
         _master_factor: f32,
         _num_master: i32,
+        _smartgaps_enabled: bool,
     ) -> Vec<WindowGeometry> {
         let window_count = windows.len();
         if window_count == 0 {
diff --git a/src/layout/mod.rs b/src/layout/mod.rs
index 61db85e..bee6b0a 100644
--- a/src/layout/mod.rs
+++ b/src/layout/mod.rs
@@ -88,6 +88,7 @@ pub trait Layout {
         gaps: &GapConfig,
         master_factor: f32,
         num_master: i32,
+        smartgaps_enabled: bool,
     ) -> Vec<WindowGeometry>;
     fn name(&self) -> &'static str;
     fn symbol(&self) -> &'static str;
diff --git a/src/layout/monocle.rs b/src/layout/monocle.rs
index e97b221..5f511d9 100644
--- a/src/layout/monocle.rs
+++ b/src/layout/monocle.rs
@@ -20,6 +20,7 @@ impl Layout for MonocleLayout {
         gaps: &GapConfig,
         _master_factor: f32,
         _num_master: i32,
+        _smartgaps_enabled: bool,
     ) -> Vec<WindowGeometry> {
         let window_count = windows.len();
         if window_count == 0 {
diff --git a/src/layout/normie.rs b/src/layout/normie.rs
index 2e1d4a3..6bd87cb 100644
--- a/src/layout/normie.rs
+++ b/src/layout/normie.rs
@@ -21,6 +21,7 @@ impl Layout for NormieLayout {
         _gaps: &GapConfig,
         _master_factor: f32,
         _num_master: i32,
+        _smartgaps_enabled: bool,
     ) -> Vec<WindowGeometry> {
         const DEFAULT_WIDTH_RATIO: f32 = 0.6;
         const DEFAULT_HEIGHT_RATIO: f32 = 0.6;
diff --git a/src/layout/tabbed.rs b/src/layout/tabbed.rs
index ee9f75e..ab8f26f 100644
--- a/src/layout/tabbed.rs
+++ b/src/layout/tabbed.rs
@@ -22,6 +22,7 @@ impl Layout for TabbedLayout {
         gaps: &GapConfig,
         _master_factor: f32,
         _num_master: i32,
+        _smartgaps_enabled: bool,
     ) -> Vec<WindowGeometry> {
         let window_count = windows.len();
         if window_count == 0 {
diff --git a/src/layout/tiling.rs b/src/layout/tiling.rs
index a67defb..3468fcd 100644
--- a/src/layout/tiling.rs
+++ b/src/layout/tiling.rs
@@ -87,13 +87,13 @@ impl Layout for TilingLayout {
         gaps: &GapConfig,
         master_factor: f32,
         num_master: i32,
+        smartgaps_enabled: bool,
     ) -> Vec<WindowGeometry> {
         let window_count = windows.len();
         if window_count == 0 {
             return Vec::new();
         }
 
-        let smartgaps_enabled = true;
         let gap_values = Self::getgaps(gaps, window_count, smartgaps_enabled);
 
         let outer_gap_horizontal = gap_values.outer_horizontal;
diff --git a/src/lib.rs b/src/lib.rs
index 3a8ce7d..d91b97b 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -33,6 +33,7 @@ pub struct Config {
 
     // Gaps
     pub gaps_enabled: bool,
+    pub smartgaps_enabled: bool,
     pub gap_inner_horizontal: u32,
     pub gap_inner_vertical: u32,
     pub gap_outer_horizontal: u32,
@@ -87,6 +88,7 @@ impl Default for Config {
             border_unfocused: 0xbbbbbb,
             font: "monospace:size=10".to_string(),
             gaps_enabled: false,
+            smartgaps_enabled: true,
             gap_inner_horizontal: 0,
             gap_inner_vertical: 0,
             gap_outer_horizontal: 0,
diff --git a/src/window_manager.rs b/src/window_manager.rs
index 97bc9e5..e1ca9b4 100644
--- a/src/window_manager.rs
+++ b/src/window_manager.rs
@@ -2698,6 +2698,7 @@ impl WindowManager {
             let usable_height = monitor_height.saturating_sub(bar_height as i32);
             let master_factor = monitor.master_factor;
             let num_master = monitor.num_master;
+            let smartgaps_enabled = self.config.smartgaps_enabled;
 
             let geometries = self.layout.arrange(
                 &visible,
@@ -2706,11 +2707,24 @@ impl WindowManager {
                 &gaps,
                 master_factor,
                 num_master,
+                smartgaps_enabled,
             );
 
             for (window, geometry) in visible.iter().zip(geometries.iter()) {
-                let adjusted_width = geometry.width.saturating_sub(2 * border_width);
-                let adjusted_height = geometry.height.saturating_sub(2 * border_width);
+                let mut adjusted_width = geometry.width.saturating_sub(2 * border_width);
+                let mut adjusted_height = geometry.height.saturating_sub(2 * border_width);
+
+                if let Some(client) = self.clients.get(window) {
+                    if !client.is_floating {
+                        let (hint_width, hint_height) = self.apply_size_hints(
+                            client,
+                            adjusted_width as i32,
+                            adjusted_height as i32,
+                        );
+                        adjusted_width = hint_width as u32;
+                        adjusted_height = hint_height as u32;
+                    }
+                }
 
                 let adjusted_x = geometry.x_coordinate + monitor_x;
                 let adjusted_y = geometry.y_coordinate + monitor_y + bar_height as i32;