diff --git a/src/shell/mod.rs b/src/shell/mod.rs index a102ccb4..b5518cc7 100644 --- a/src/shell/mod.rs +++ b/src/shell/mod.rs @@ -230,6 +230,7 @@ pub struct WorkspaceSet { output: Output, theme: cosmic::Theme, pub sticky_layer: FloatingLayout, + pub minimized_windows: Vec, pub workspaces: Vec, } @@ -351,6 +352,7 @@ impl WorkspaceSet { tiling_enabled, theme, sticky_layer, + minimized_windows: Vec::new(), workspaces, output: output.clone(), } @@ -978,6 +980,7 @@ impl Shell { [ WmCapabilities::Fullscreen, WmCapabilities::Maximize, + WmCapabilities::Minimize, WmCapabilities::WindowMenu, ], ); @@ -2618,6 +2621,10 @@ impl Shell { } } + pub fn minimize_request(&mut self, mapped: &CosmicMapped) {} + + pub fn unminimize_request(&mut self, mapped: &CosmicMapped) {} + pub fn maximize_request(&mut self, mapped: &CosmicMapped) { let (original_layer, floating_layer, original_geometry) = if let Some(set) = self .workspaces diff --git a/src/shell/workspace.rs b/src/shell/workspace.rs index 7a9536de..71e22b3e 100644 --- a/src/shell/workspace.rs +++ b/src/shell/workspace.rs @@ -77,6 +77,7 @@ pub struct Workspace { pub output: Output, pub tiling_layer: TilingLayout, pub floating_layer: FloatingLayout, + pub minimized_windows: Vec, pub tiling_enabled: bool, pub fullscreen: Option, @@ -90,6 +91,15 @@ pub struct Workspace { pub dirty: AtomicBool, } +#[derive(Debug)] +pub struct MinimizedWindow { + pub window: CosmicMapped, + pub previous_layer: ManagedLayer, + pub was_fullscreen: Option, + pub was_maximized: bool, + pub tiling_state: Option<(id_tree::NodeId, Rectangle)>, +} + #[derive(Debug, Clone)] pub struct FullscreenSurface { pub surface: CosmicSurface, @@ -222,6 +232,7 @@ impl Workspace { tiling_layer, floating_layer, tiling_enabled, + minimized_windows: Vec::new(), fullscreen: None, handle, focus_stack: FocusStacks::default(), diff --git a/src/wayland/handlers/xdg_shell/mod.rs b/src/wayland/handlers/xdg_shell/mod.rs index 915c0c63..4efdf055 100644 --- a/src/wayland/handlers/xdg_shell/mod.rs +++ b/src/wayland/handlers/xdg_shell/mod.rs @@ -162,6 +162,17 @@ impl XdgShellHandler for State { Shell::resize_request(self, surface.wl_surface(), &seat, serial, edges.into()) } + fn minimize_request(&mut self, surface: ToplevelSurface) { + if let Some(mapped) = self + .common + .shell + .element_for_wl_surface(surface.wl_surface()) + .cloned() + { + self.common.shell.minimize_request(&mapped) + } + } + fn maximize_request(&mut self, surface: ToplevelSurface) { if let Some(mapped) = self .common diff --git a/src/xwayland.rs b/src/xwayland.rs index 8b925bf2..08c8918b 100644 --- a/src/xwayland.rs +++ b/src/xwayland.rs @@ -426,6 +426,20 @@ impl XwmHandler for State { } } + fn minimize_request(&mut self, _xwm: XwmId, window: X11Surface) { + let surface = CosmicSurface::X11(window); + if let Some(mapped) = self.common.shell.element_for_surface(&surface).cloned() { + self.common.shell.minimize_request(&mapped); + } + } + + fn unminimize_request(&mut self, _xwm: XwmId, window: X11Surface) { + let surface = CosmicSurface::X11(window); + if let Some(mapped) = self.common.shell.element_for_surface(&surface).cloned() { + self.common.shell.unminimize_request(&mapped); + } + } + fn fullscreen_request(&mut self, _xwm: XwmId, window: X11Surface) { if let Some(mapped) = self.common.shell.element_for_x11_surface(&window).cloned() { if let Some(workspace) = self.common.shell.space_for_mut(&mapped) {