git.lucas.co / cce-compositor
Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git

commitf450c6d0cb186c46c950473404065030206c6065
parentf3e610afec
authorLucas Galante <[email protected]>
date2026-06-26 12:40
feat: unfocus the current window when left-clicking on the desktop background

 src/server/cursor.rs | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/src/server/cursor.rs b/src/server/cursor.rs
index 59c2416..b67b439 100644
--- a/src/server/cursor.rs
+++ b/src/server/cursor.rs
@@ -806,9 +806,11 @@ unsafe extern "C" fn handle_button(listener: *mut ffi::wl_listener, data: *mut s
         let lx = cursor.x();
         let ly = cursor.y();
         let server = seat.server;
+        let mut clicked_something = false;
         if let Some(result) = (*server).scene.at(lx, ly) {
             match result.data {
                 SceneNodeDataVal::Window(window) => {
+                    clicked_something = true;
                     if !(*window).is_status_bar() {
                         if !seat.object.is_null() {
                             if !(*window).object.is_null() {
@@ -821,11 +823,19 @@ unsafe extern "C" fn handle_button(listener: *mut ffi::wl_listener, data: *mut s
                     }
                 }
                 SceneNodeDataVal::LayerSurface(_) => {
+                    clicked_something = true;
                     seat.focus(Focus::LayerSurface(result.surface));
                 }
-                _ => {}
+                SceneNodeDataVal::ShellSurface(_) | SceneNodeDataVal::LockSurface(_) | SceneNodeDataVal::OverrideRedirect(_) => {
+                    clicked_something = true;
+                }
             }
         }
+
+        if !clicked_something && (*event).button == 0x110 {
+            seat.focus(Focus::None);
+            (*(*seat).server).wm.dirty_windowing();
+        }
     } else {
         assert_eq!((*event).state, ffi::wl_pointer_button_state_WL_POINTER_BUTTON_STATE_RELEASED);
         if seat.op.is_some() {