oxwm

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

fixed issue where clicking unfocused window without modkey would silently crash due to x11s passive button grab -> oxwm event.child = NONE for windows without subwindows, by ensuring call allow_events to unfreeze pointer

Commit
1f89cc1d10620fee3f32a30e22b30b4269dc9c55
Parent
11d2346
Author
tonybanters <tonybanters@gmail.com>
Date
2025-12-04 21:48:49

Diff

diff --git a/src/window_manager.rs b/src/window_manager.rs
index 56aac96..b3a0518 100644
--- a/src/window_manager.rs
+++ b/src/window_manager.rs
@@ -2565,6 +2565,10 @@ impl WindowManager {
         let snap = 32;
         let is_normie = self.layout.name() == "normie";
 
+        if !was_floating && !is_normie {
+            self.toggle_floating()?;
+        }
+
         self.connection.warp_pointer(
             x11rb::NONE,
             window,
@@ -2603,20 +2607,6 @@ impl WindowManager {
                     let new_width = ((e.root_x as i32 - orig_x as i32 - 2 * border_width as i32 + 1).max(1)) as u32;
                     let new_height = ((e.root_y as i32 - orig_y as i32 - 2 * border_width as i32 + 1).max(1)) as u32;
 
-                    let in_monitor_bounds =
-                        monitor.window_area_x + new_width as i32 >= monitor.window_area_x &&
-                        monitor.window_area_x + new_width as i32 <= monitor.window_area_x + monitor.window_area_width &&
-                        monitor.window_area_y + new_height as i32 >= monitor.window_area_y &&
-                        monitor.window_area_y + new_height as i32 <= monitor.window_area_y + monitor.window_area_height;
-
-                    if in_monitor_bounds {
-                        if !was_floating && !is_normie &&
-                           ((new_width as i32 - orig_width as i32).abs() > snap ||
-                            (new_height as i32 - orig_height as i32).abs() > snap) {
-                            self.toggle_floating()?;
-                        }
-                    }
-
                     let should_resize = is_normie || self.clients
                         .get(&window)
                         .map(|c| c.is_floating)
@@ -2974,18 +2964,31 @@ impl WindowManager {
                     } else if event.child != x11rb::NONE {
                         self.focus(Some(event.child))?;
                         self.update_tab_bars()?;
-                        self.connection.allow_events(Allow::REPLAY_POINTER, event.time)?;
 
-                        if event.detail == ButtonIndex::M1.into() {
+                        let state_clean = u16::from(event.state) & !(u16::from(ModMask::LOCK) | u16::from(ModMask::M2));
+                        let modkey_held = state_clean & u16::from(self.config.modkey) != 0;
+
+                        if modkey_held && event.detail == ButtonIndex::M1.into() {
                             self.drag_window(event.child)?;
-                        } else if event.detail == ButtonIndex::M3.into() {
+                        } else if modkey_held && event.detail == ButtonIndex::M3.into() {
                             self.resize_window_with_mouse(event.child)?;
+                        } else {
+                            self.connection.allow_events(Allow::REPLAY_POINTER, event.time)?;
                         }
                     } else if self.windows.contains(&event.event) {
-                        // child is NONE but event.event is a managed window (click on border/frame)
                         self.focus(Some(event.event))?;
                         self.update_tab_bars()?;
-                        self.connection.allow_events(Allow::REPLAY_POINTER, event.time)?;
+
+                        let state_clean = u16::from(event.state) & !(u16::from(ModMask::LOCK) | u16::from(ModMask::M2));
+                        let modkey_held = state_clean & u16::from(self.config.modkey) != 0;
+
+                        if modkey_held && event.detail == ButtonIndex::M1.into() {
+                            self.drag_window(event.event)?;
+                        } else if modkey_held && event.detail == ButtonIndex::M3.into() {
+                            self.resize_window_with_mouse(event.event)?;
+                        } else {
+                            self.connection.allow_events(Allow::REPLAY_POINTER, event.time)?;
+                        }
                     } else {
                         self.connection.allow_events(Allow::REPLAY_POINTER, event.time)?;
                     }