diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2023-08-10 10:18:48 +0400 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2023-08-10 14:50:51 +0400 |
| commit | 24d954f9fee9322fd138ee125c277c1cdcad592d (patch) | |
| tree | 21cde39acdb76afc2e106c828e83a775d3fd26af /src | |
| parent | 9b073b2350d00dfdb32a4983a102c4bde843c92c (diff) | |
| download | niri-24d954f9fee9322fd138ee125c277c1cdcad592d.tar.gz niri-24d954f9fee9322fd138ee125c277c1cdcad592d.tar.bz2 niri-24d954f9fee9322fd138ee125c277c1cdcad592d.zip | |
xdg_shell: Support un/maximize
Diffstat (limited to 'src')
| -rw-r--r-- | src/handlers/xdg_shell.rs | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/src/handlers/xdg_shell.rs b/src/handlers/xdg_shell.rs index e681d0ef..5f1c582e 100644 --- a/src/handlers/xdg_shell.rs +++ b/src/handlers/xdg_shell.rs @@ -99,6 +99,52 @@ impl XdgShellHandler for Niri { fn grab(&mut self, _surface: PopupSurface, _seat: wl_seat::WlSeat, _serial: Serial) { // TODO popup grabs } + + fn maximize_request(&mut self, surface: ToplevelSurface) { + if surface + .current_state() + .capabilities + .contains(xdg_toplevel::WmCapabilities::Maximize) + { + let wl_surface = surface.wl_surface(); + let window = self + .space + .elements() + .find(|w| w.toplevel().wl_surface() == wl_surface) + .unwrap() + .clone(); + let geometry = self + .space + .output_geometry(self.output.as_ref().unwrap()) + .unwrap(); + + surface.with_pending_state(|state| { + state.states.set(xdg_toplevel::State::Maximized); + state.size = Some(geometry.size); + }); + self.space.map_element(window, geometry.loc, true); + } + + // The protocol demands us to always reply with a configure, + // regardless of we fulfilled the request or not + surface.send_configure(); + } + + fn unmaximize_request(&mut self, surface: ToplevelSurface) { + if !surface + .current_state() + .states + .contains(xdg_toplevel::State::Maximized) + { + return; + } + + surface.with_pending_state(|state| { + state.states.unset(xdg_toplevel::State::Maximized); + state.size = None; + }); + surface.send_pending_configure(); + } } // Xdg Shell |
