From 5f97691ce5cf2e37e46bc8e1f21a8dbb0dbee228 Mon Sep 17 00:00:00 2001 From: Victoria Brekenfeld Date: Tue, 1 Jul 2025 14:22:25 +0200 Subject: [PATCH] xwayland: Don't allow spurious map_requests to map windows twice --- src/shell/mod.rs | 27 +++++++++++++++++++++++++++ src/xwayland.rs | 7 +++++-- 2 files changed, 32 insertions(+), 2 deletions(-) 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; }