From 207529a185bddf4a1037e66d895adf82a2b04c09 Mon Sep 17 00:00:00 2001 From: Val Packett Date: Fri, 20 Mar 2026 02:07:15 -0300 Subject: [PATCH] Handle hiding the titlebar for full screen mode --- src/deco.rs | 30 +++++++++++++++++++++--------- src/xdg.rs | 3 +++ 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/deco.rs b/src/deco.rs index c1539e9..4ec2c79 100644 --- a/src/deco.rs +++ b/src/deco.rs @@ -28,6 +28,7 @@ struct DecoParams { has_geometry: bool, prefers_ssd: bool, is_active: bool, + is_fullscreen: bool, bounds: Bounds, restricted_edges: Edges, } @@ -133,9 +134,9 @@ impl DecoSurface { } impl Deco { - fn top_size(&self) -> i32 { + fn last_top_size(&self) -> i32 { let params = self.last_params.borrow(); - if params.prefers_ssd { + if params.prefers_ssd && !params.is_fullscreen { self.border_size + 24 } else { self.border_size @@ -208,8 +209,14 @@ impl Deco { height, }; let width = width + self.border_size * 2; - let height = height + self.top_size() + self.border_size; - (x - self.border_size, y - self.top_size(), width, height) + let height = height + self.last_top_size() + self.border_size; + // XXX: it's not good that we use the last state here!! Gotta buffer the geometry until commit and send on pre-commit? + ( + x - self.border_size, + y - self.last_top_size(), + width, + height, + ) } pub fn set_restricted_edges(&self, edges: Edges) { @@ -222,6 +229,11 @@ impl Deco { params.is_active = is_active; } + pub fn set_fullscreen(&self, is_fullscreen: bool) { + let mut params = self.next_params.borrow_mut(); + params.is_fullscreen = is_fullscreen; + } + pub fn set_prefers_ssd(&self, prefers_ssd: bool) { let mut params = self.next_params.borrow_mut(); params.prefers_ssd = prefers_ssd; @@ -234,19 +246,19 @@ impl Deco { pub fn transform_configure(&self, width: i32, height: i32) -> (i32, i32) { ( width - self.border_size * 2, - height - self.top_size() - self.border_size, + height - self.last_top_size() - self.border_size, ) } pub fn transform_size(&self, width: i32, height: i32) -> (i32, i32) { ( width + self.border_size * 2, - height + self.top_size() + self.border_size, + height + self.last_top_size() + self.border_size, ) } pub fn transform_anchor(&self, x: i32, y: i32) -> (i32, i32) { - (x + self.border_size, y + self.top_size()) + (x + self.border_size, y + self.last_top_size()) } fn draw(&self) -> eyre::Result<()> { @@ -286,13 +298,13 @@ impl Deco { self.wl_surface.send_damage_buffer(0, 0, width, height); let input_region = self.globals.wl_compositor.new_send_create_region(); input_region.set_forward_to_client(false); - input_region.send_add(0, 0, width, self.top_size()); + input_region.send_add(0, 0, width, self.last_top_size()); input_region.send_add(0, 0, self.border_size, height); input_region.send_add(width - self.border_size, 0, self.border_size, height); input_region.send_add(0, height - self.border_size, width, self.border_size); self.wl_surface.send_set_input_region(Some(&input_region)); self.subsurface - .send_set_position(bounds.x - self.border_size, bounds.y - self.top_size()); + .send_set_position(bounds.x - self.border_size, bounds.y - self.last_top_size()); self.wl_surface.send_commit(); // let _ = self.globals.wl_display.new_send_sync(); Ok(()) diff --git a/src/xdg.rs b/src/xdg.rs index 6635acc..20b519d 100644 --- a/src/xdg.rs +++ b/src/xdg.rs @@ -250,6 +250,7 @@ impl ClientXdgToplevel { } } +#[derive(PartialEq)] enum ToplevelState { Normal, Maximixed, @@ -355,6 +356,8 @@ impl XdgToplevelHandler for ClientXdgToplevel { }; self.deco.set_active(activated); + self.deco + .set_fullscreen(top_state == ToplevelState::Fullscreen); self.deco.set_restricted_edges(restricted_edges); let (width, height) = self.deco.transform_configure(width, height); let (_prefix, states, _suffix) = unsafe { outer_state.align_to::() };