diff --git a/src/shell/mod.rs b/src/shell/mod.rs index 7aaeb84a..9c2d7ae4 100644 --- a/src/shell/mod.rs +++ b/src/shell/mod.rs @@ -1961,6 +1961,33 @@ impl Shell { }) } + pub fn is_surface_mapped(&self, surface: &S) -> bool + where + CosmicSurface: PartialEq, + { + self.workspaces.sets.values().any(|set| { + set.minimized_windows + .iter() + .any(|w| w.windows().any(|s| &s == surface)) + || set + .sticky_layer + .mapped() + .any(|m| m.windows().any(|(s, _)| &s == surface)) + || set.workspaces.iter().any(|w| { + w.get_fullscreen().is_some_and(|s| s == surface) + || w.minimized_windows + .iter() + .any(|m| m.windows().any(|s| &s == surface)) + || w.floating_layer + .mapped() + .any(|m| m.windows().any(|(s, _)| &s == surface)) + || w.tiling_layer + .mapped() + .any(|(m, _)| m.windows().any(|(s, _)| &s == surface)) + }) + }) + } + pub fn space_for(&self, mapped: &CosmicMapped) -> Option<&Workspace> { self.workspaces.spaces().find(|workspace| { workspace.mapped().any(|m| m == mapped) diff --git a/src/xwayland.rs b/src/xwayland.rs index 337342ba..f802fff1 100644 --- a/src/xwayland.rs +++ b/src/xwayland.rs @@ -734,8 +734,11 @@ impl XwmHandler for State { let mut shell = self.common.shell.write(); let startup_id = window.startup_id(); - // TODO: Not correct for fullscreen (and minimized?) - if shell.element_for_surface(&window).is_some() { + if shell.is_surface_mapped(&window) { + warn!( + ?window, + "Got map_request for already mapped window? Ignoring" + ); return; }