diff --git a/src/shell/focus/target.rs b/src/shell/focus/target.rs index b1124fcf..b177f00f 100644 --- a/src/shell/focus/target.rs +++ b/src/shell/focus/target.rs @@ -197,7 +197,7 @@ impl PointerFocusTarget { PointerFocusTarget::WlSurface { toplevel: Some(PointerFocusToplevel::Popup(PopupKind::Xdg(popup))), .. - } => get_popup_toplevel(popup) + } => get_popup_toplevel(&PopupKind::Xdg(popup.clone())) .and_then(|s| shell.element_for_surface(&s).map(|mapped| (mapped, s))) .and_then(|(m, s)| { m.windows() @@ -243,7 +243,7 @@ impl KeyboardFocusTarget { match self { KeyboardFocusTarget::Element(mapped) => mapped.wl_surface(), KeyboardFocusTarget::Popup(PopupKind::Xdg(xdg)) => { - get_popup_toplevel(xdg).map(Cow::Owned) + get_popup_toplevel(&PopupKind::Xdg(xdg.clone())).map(Cow::Owned) } _ => None, } diff --git a/src/shell/layout/floating/mod.rs b/src/shell/layout/floating/mod.rs index 0ba0fee5..3eee770b 100644 --- a/src/shell/layout/floating/mod.rs +++ b/src/shell/layout/floating/mod.rs @@ -1278,7 +1278,7 @@ impl FloatingLayout { let Some(focused) = (match target { KeyboardFocusTarget::Popup(popup) => { let Some(toplevel_surface) = (match popup { - PopupKind::Xdg(xdg) => get_popup_toplevel(&xdg), + PopupKind::Xdg(_) => get_popup_toplevel(&popup), PopupKind::InputMethod(_) => unreachable!(), }) else { return MoveResult::None; diff --git a/src/shell/layout/tiling/mod.rs b/src/shell/layout/tiling/mod.rs index 6db8aef2..22d592bf 100644 --- a/src/shell/layout/tiling/mod.rs +++ b/src/shell/layout/tiling/mod.rs @@ -2848,7 +2848,7 @@ impl TilingLayout { // if the focus is currently on a popup, treat it's toplevel as the target if let KeyboardFocusTarget::Popup(popup) = target { let toplevel_surface = match popup { - PopupKind::Xdg(xdg) => get_popup_toplevel(&xdg), + PopupKind::Xdg(_) => get_popup_toplevel(&popup), PopupKind::InputMethod(_) => unreachable!(), }?; let root_id = tree.root_node_id()?; diff --git a/src/shell/mod.rs b/src/shell/mod.rs index 4dde0f82..daac0456 100644 --- a/src/shell/mod.rs +++ b/src/shell/mod.rs @@ -3883,7 +3883,7 @@ impl Shell { let Some(focused) = (match target { KeyboardFocusTarget::Popup(popup) => { let Some(toplevel_surface) = (match popup { - PopupKind::Xdg(xdg) => get_popup_toplevel(&xdg), + PopupKind::Xdg(_) => get_popup_toplevel(&popup), PopupKind::InputMethod(_) => unreachable!(), }) else { return FocusResult::None; diff --git a/src/wayland/handlers/xdg_shell/popup.rs b/src/wayland/handlers/xdg_shell/popup.rs index 23713934..59e8b6e5 100644 --- a/src/wayland/handlers/xdg_shell/popup.rs +++ b/src/wayland/handlers/xdg_shell/popup.rs @@ -24,7 +24,7 @@ use tracing::warn; impl Shell { pub fn unconstrain_popup(&self, surface: &PopupSurface) { - if let Some(parent) = get_popup_toplevel(surface) { + if let Some(parent) = get_popup_toplevel(&PopupKind::from(surface.clone())) { if let Some(elem) = self.element_for_surface(&parent) { let (mut element_geo, output, is_tiled) = if let Some(workspace) = self.space_for(elem) { @@ -173,8 +173,11 @@ fn unconstrain_layer_popup(surface: &PopupSurface, output: &Output, layer_surfac }); } -pub fn get_popup_toplevel(popup: &PopupSurface) -> Option { - let mut parent = popup.get_parent_surface()?; +pub fn get_popup_toplevel(popup: &PopupKind) -> Option { + let mut parent = match popup { + PopupKind::Xdg(popup) => popup.get_parent_surface()?, + PopupKind::InputMethod(popup) => popup.get_parent()?.surface.clone(), + }; while get_role(&parent) == Some(XDG_POPUP_ROLE) { parent = with_states(&parent, |states| { states