From b0d0bfb034150bed134d3c4f29d49a6a22f4454c Mon Sep 17 00:00:00 2001 From: Victoria Brekenfeld Date: Wed, 26 Mar 2025 18:25:22 +0100 Subject: [PATCH] xdg-activation/toplevel-management: Unmaximize when activating a tiled window --- src/wayland/handlers/toplevel_management.rs | 16 ++++++++++++++ src/wayland/handlers/xdg_activation.rs | 23 +++++++++++++++++++-- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/wayland/handlers/toplevel_management.rs b/src/wayland/handlers/toplevel_management.rs index 25936219..fb1656e6 100644 --- a/src/wayland/handlers/toplevel_management.rs +++ b/src/wayland/handlers/toplevel_management.rs @@ -53,12 +53,28 @@ impl ToplevelManagementHandler for State { .unwrap() .clone(); + let handle = workspace.handle; let res = shell.activate( &output, idx, WorkspaceDelta::new_shortcut(), &mut self.common.workspace_state.update(), ); + + let workspace = shell.workspaces.space_for_handle_mut(&handle).unwrap(); + if seat.get_keyboard().unwrap().current_focus() != Some(mapped.clone().into()) + && workspace.is_tiled(&mapped) + { + for mapped in workspace + .mapped() + .filter(|m| m.maximized_state.lock().unwrap().is_some()) + .cloned() + .collect::>() + .into_iter() + { + workspace.unmaximize_request(&mapped); + } + } std::mem::drop(shell); if seat.active_output() != *output { diff --git a/src/wayland/handlers/xdg_activation.rs b/src/wayland/handlers/xdg_activation.rs index 10bc14ca..9494bcc6 100644 --- a/src/wayland/handlers/xdg_activation.rs +++ b/src/wayland/handlers/xdg_activation.rs @@ -154,10 +154,29 @@ impl XdgActivationHandler for State { } if in_current_workspace { - let target = element.into(); + if seat.get_keyboard().unwrap().current_focus() + != Some(element.clone().into()) + && current_workspace.is_tiled(&element) + { + for mapped in current_workspace + .mapped() + .filter(|m| m.maximized_state.lock().unwrap().is_some()) + .cloned() + .collect::>() + .into_iter() + { + current_workspace.unmaximize_request(&mapped); + } + } std::mem::drop(shell); - Shell::set_focus(self, Some(&target), &seat, None, false); + Shell::set_focus( + self, + Some(&element.clone().into()), + &seat, + None, + false, + ); } else if let Some(w) = element_workspace { shell.append_focus_stack(&element, &seat); let mut workspace_guard = self.common.workspace_state.update();