aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2023-08-10 10:18:48 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2023-08-10 14:50:51 +0400
commit24d954f9fee9322fd138ee125c277c1cdcad592d (patch)
tree21cde39acdb76afc2e106c828e83a775d3fd26af /src
parent9b073b2350d00dfdb32a4983a102c4bde843c92c (diff)
downloadniri-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.rs46
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