oxwm

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

Fixed issue where floating -> fullscreen -> floating would not show bar again..

Commit
ccf09251cf1771f7a79d2de5f0da4deeeb5be669
Parent
39092d5
Author
tonybtw <tonybtw@tonybtw.com>
Date
2025-11-18 05:52:03

Diff

diff --git a/resources/test-config.lua b/resources/test-config.lua
index 3ac8c57..3416810 100644
--- a/resources/test-config.lua
+++ b/resources/test-config.lua
@@ -107,14 +107,23 @@ oxwm.key.bind({ modkey, "Shift" }, "9", oxwm.tag.move_to(8))
 
 oxwm.bar.set_blocks({
     oxwm.bar.block.battery({
-        charging = "󰂄 Bat: {}%",
-        discharging = "󰁹 Bat: {}%",
-        full = "󰁹 Bat: {}%",
-        format = "",
+        format = "Bat: {}%",
+        charging = "⚡ Bat: {}%",
+        discharging = "🔋 Bat: {}%",
+        full = "✓ Bat: {}%",
         interval = 30,
         color = colors.green,
-        underline = true
+        underline = true,
     }),
+    -- oxwm.bar.block.battery({
+    --     charging = "󰂄 Bat: {}%",
+    --     discharging = "󰁹 Bat: {}%",
+    --     full = "󰁹 Bat: {}%",
+    --     format = "",
+    --     interval = 30,
+    --     color = colors.green,
+    --     underline = true
+    -- }),
     oxwm.bar.block.static({
         text = " │  ",
         format = "",
diff --git a/src/window_manager.rs b/src/window_manager.rs
index 1dc4c7b..cfe5114 100644
--- a/src/window_manager.rs
+++ b/src/window_manager.rs
@@ -1470,6 +1470,20 @@ impl WindowManager {
 
     fn fullscreen(&mut self) -> WmResult<()> {
         if self.show_bar {
+            let windows: Vec<Window> = self.windows.iter()
+                .filter(|&&w| self.is_window_visible(w))
+                .copied()
+                .collect();
+
+            for window in &windows {
+                if let Ok(geom) = self.connection.get_geometry(*window)?.reply() {
+                        self.floating_geometry_before_fullscreen.insert(
+                            *window,
+                            (geom.x, geom.y, geom.width, geom.height, geom.border_width as u16),
+                        );
+                    }
+            }
+
             self.last_layout = Some(self.layout.name());
             if let Ok(layout) = layout_from_str("monocle") {
                 self.layout = layout;
@@ -1478,19 +1492,12 @@ impl WindowManager {
             self.apply_layout()?;
 
             let border_width = self.config.border_width;
-            let windows: Vec<Window> = self.windows.iter()
-                .filter(|&&w| self.floating_windows.contains(&w) && self.is_window_visible(w))
+            let floating_windows: Vec<Window> = windows.iter()
+                .filter(|&&w| self.floating_windows.contains(&w))
                 .copied()
                 .collect();
 
-            for window in windows {
-                if let Ok(geom) = self.connection.get_geometry(window)?.reply() {
-                        self.floating_geometry_before_fullscreen.insert(
-                            window,
-                            (geom.x, geom.y, geom.width, geom.height, geom.border_width as u16),
-                        );
-                    }
-
+            for window in floating_windows {
                 let monitor_idx = *self.window_monitor.get(&window).unwrap_or(&self.selected_monitor);
                 let monitor = &self.monitors[monitor_idx];
 
@@ -1524,15 +1531,13 @@ impl WindowManager {
                     self.layout = layout;
                 }
             }
-            self.toggle_bar()?;
-            self.apply_layout()?;
 
-            let windows: Vec<Window> = self.windows.iter()
-                .filter(|&&w| self.floating_windows.contains(&w) && self.is_window_visible(w))
+            let windows_to_restore: Vec<Window> = self.floating_geometry_before_fullscreen
+                .keys()
                 .copied()
                 .collect();
 
-            for window in windows {
+            for window in windows_to_restore {
                 if let Some(&(x, y, width, height, border_width)) = self.floating_geometry_before_fullscreen.get(&window) {
                     self.connection.configure_window(
                         window,
@@ -1543,10 +1548,34 @@ impl WindowManager {
                             .height(height as u32)
                             .border_width(border_width as u32),
                     )?;
+
+                    self.update_geometry_cache(window, CachedGeometry {
+                        x_position: x,
+                        y_position: y,
+                        width,
+                        height,
+                        border_width,
+                    });
+
                     self.floating_geometry_before_fullscreen.remove(&window);
                 }
             }
             self.connection.flush()?;
+
+            self.toggle_bar()?;
+
+            if self.layout.name() != "normie" {
+                self.apply_layout()?;
+            } else {
+                if let Some(bar) = self.bars.get(self.selected_monitor) {
+                    self.connection.configure_window(
+                        bar.window(),
+                        &x11rb::protocol::xproto::ConfigureWindowAux::new()
+                            .stack_mode(x11rb::protocol::xproto::StackMode::ABOVE),
+                    )?;
+                    self.connection.flush()?;
+                }
+            }
         }
         Ok(())
     }