From 8d5ac9a2b71fac4e2587a2beafcff05cf5be60bd Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Tue, 16 Dec 2025 20:39:21 +0100 Subject: [PATCH] tree: make FindTreeUsecase handling more explicit --- src/ifs/wl_surface/x_surface/xwindow.rs | 6 +++-- src/ifs/wl_surface/xdg_surface/xdg_popup.rs | 6 +++-- .../wl_surface/xdg_surface/xdg_toplevel.rs | 6 +++-- src/tree.rs | 2 +- src/tree/output.rs | 22 ++++++++++++++----- 5 files changed, 29 insertions(+), 13 deletions(-) diff --git a/src/ifs/wl_surface/x_surface/xwindow.rs b/src/ifs/wl_surface/x_surface/xwindow.rs index d4d44c0d..f156323e 100644 --- a/src/ifs/wl_surface/x_surface/xwindow.rs +++ b/src/ifs/wl_surface/x_surface/xwindow.rs @@ -396,8 +396,10 @@ impl Node for Xwindow { tree: &mut Vec, usecase: FindTreeUsecase, ) -> FindTreeResult { - if usecase == FindTreeUsecase::SelectToplevel { - return FindTreeResult::AcceptsInput; + match usecase { + FindTreeUsecase::None => {} + FindTreeUsecase::SelectToplevel => return FindTreeResult::AcceptsInput, + FindTreeUsecase::SelectWorkspace => return FindTreeResult::Other, } let rect = self.x.surface.buffer_abs_pos.get(); if x < rect.width() && y < rect.height() { diff --git a/src/ifs/wl_surface/xdg_surface/xdg_popup.rs b/src/ifs/wl_surface/xdg_surface/xdg_popup.rs index 7758c138..c874122b 100644 --- a/src/ifs/wl_surface/xdg_surface/xdg_popup.rs +++ b/src/ifs/wl_surface/xdg_surface/xdg_popup.rs @@ -340,8 +340,10 @@ impl Node for XdgPopup { tree: &mut Vec, usecase: FindTreeUsecase, ) -> FindTreeResult { - if usecase == FindTreeUsecase::SelectToplevel { - return FindTreeResult::Other; + match usecase { + FindTreeUsecase::None => {} + FindTreeUsecase::SelectToplevel => return FindTreeResult::Other, + FindTreeUsecase::SelectWorkspace => return FindTreeResult::Other, } self.xdg.find_tree_at(x, y, tree) } diff --git a/src/ifs/wl_surface/xdg_surface/xdg_toplevel.rs b/src/ifs/wl_surface/xdg_surface/xdg_toplevel.rs index 0f01ab95..e6e3e45d 100644 --- a/src/ifs/wl_surface/xdg_surface/xdg_toplevel.rs +++ b/src/ifs/wl_surface/xdg_surface/xdg_toplevel.rs @@ -598,8 +598,10 @@ impl Node for XdgToplevel { tree: &mut Vec, usecase: FindTreeUsecase, ) -> FindTreeResult { - if usecase == FindTreeUsecase::SelectToplevel { - return FindTreeResult::AcceptsInput; + match usecase { + FindTreeUsecase::None => {} + FindTreeUsecase::SelectToplevel => return FindTreeResult::AcceptsInput, + FindTreeUsecase::SelectWorkspace => return FindTreeResult::Other, } self.xdg.find_tree_at(x, y, tree) } diff --git a/src/tree.rs b/src/tree.rs index b2461344..40c0ae2d 100644 --- a/src/tree.rs +++ b/src/tree.rs @@ -109,7 +109,7 @@ impl FindTreeResult { } } -#[derive(Copy, Clone, Eq, PartialEq)] +#[derive(Copy, Clone)] pub enum FindTreeUsecase { None, SelectToplevel, diff --git a/src/tree/output.rs b/src/tree/output.rs index 6cdcc2e7..fa468976 100644 --- a/src/tree/output.rs +++ b/src/tree/output.rs @@ -1073,8 +1073,10 @@ impl OutputNode { tree: &mut Vec, usecase: FindTreeUsecase, ) -> FindTreeResult { - if usecase == FindTreeUsecase::SelectToplevel { - return FindTreeResult::Other; + match usecase { + FindTreeUsecase::None => {} + FindTreeUsecase::SelectToplevel => return FindTreeResult::Other, + FindTreeUsecase::SelectWorkspace => return FindTreeResult::Other, } let len = tree.len(); for layer in layers.iter().copied() { @@ -1634,9 +1636,12 @@ impl Node for OutputNode { usecase: FindTreeUsecase, ) -> FindTreeResult { if self.state.lock.locked.get() { - if usecase != FindTreeUsecase::SelectToplevel - && let Some(ls) = self.lock_surface.get() - { + let allow_surface = match usecase { + FindTreeUsecase::None => true, + FindTreeUsecase::SelectToplevel => false, + FindTreeUsecase::SelectWorkspace => false, + }; + if allow_surface && let Some(ls) = self.lock_surface.get() { tree.push(FoundNode { node: ls.clone(), x, @@ -1647,7 +1652,12 @@ impl Node for OutputNode { return FindTreeResult::AcceptsInput; } let ws_rect_rel = self.workspace_rect_rel.get(); - if usecase == FindTreeUsecase::SelectWorkspace && ws_rect_rel.contains(x, y) { + let select_workspace = match usecase { + FindTreeUsecase::None => false, + FindTreeUsecase::SelectToplevel => false, + FindTreeUsecase::SelectWorkspace => true, + }; + if select_workspace && ws_rect_rel.contains(x, y) { let (x, y) = ws_rect_rel.translate(x, y); if let Some(ws) = self.workspace.get() { tree.push(FoundNode {