Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git
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() {