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;