Handle hiding the titlebar for full screen mode

This commit is contained in:
Val Packett 2026-03-20 02:07:15 -03:00
parent d2ddc70aa7
commit 207529a185
2 changed files with 24 additions and 9 deletions

View file

@ -28,6 +28,7 @@ struct DecoParams {
has_geometry: bool, has_geometry: bool,
prefers_ssd: bool, prefers_ssd: bool,
is_active: bool, is_active: bool,
is_fullscreen: bool,
bounds: Bounds, bounds: Bounds,
restricted_edges: Edges<bool>, restricted_edges: Edges<bool>,
} }
@ -133,9 +134,9 @@ impl DecoSurface {
} }
impl Deco { impl Deco {
fn top_size(&self) -> i32 { fn last_top_size(&self) -> i32 {
let params = self.last_params.borrow(); let params = self.last_params.borrow();
if params.prefers_ssd { if params.prefers_ssd && !params.is_fullscreen {
self.border_size + 24 self.border_size + 24
} else { } else {
self.border_size self.border_size
@ -208,8 +209,14 @@ impl Deco {
height, height,
}; };
let width = width + self.border_size * 2; let width = width + self.border_size * 2;
let height = height + self.top_size() + self.border_size; let height = height + self.last_top_size() + self.border_size;
(x - self.border_size, y - self.top_size(), width, height) // 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<bool>) { pub fn set_restricted_edges(&self, edges: Edges<bool>) {
@ -222,6 +229,11 @@ impl Deco {
params.is_active = is_active; 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) { pub fn set_prefers_ssd(&self, prefers_ssd: bool) {
let mut params = self.next_params.borrow_mut(); let mut params = self.next_params.borrow_mut();
params.prefers_ssd = prefers_ssd; params.prefers_ssd = prefers_ssd;
@ -234,19 +246,19 @@ impl Deco {
pub fn transform_configure(&self, width: i32, height: i32) -> (i32, i32) { pub fn transform_configure(&self, width: i32, height: i32) -> (i32, i32) {
( (
width - self.border_size * 2, 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) { pub fn transform_size(&self, width: i32, height: i32) -> (i32, i32) {
( (
width + self.border_size * 2, 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) { 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<()> { fn draw(&self) -> eyre::Result<()> {
@ -286,13 +298,13 @@ impl Deco {
self.wl_surface.send_damage_buffer(0, 0, width, height); self.wl_surface.send_damage_buffer(0, 0, width, height);
let input_region = self.globals.wl_compositor.new_send_create_region(); let input_region = self.globals.wl_compositor.new_send_create_region();
input_region.set_forward_to_client(false); 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(0, 0, self.border_size, height);
input_region.send_add(width - self.border_size, 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); input_region.send_add(0, height - self.border_size, width, self.border_size);
self.wl_surface.send_set_input_region(Some(&input_region)); self.wl_surface.send_set_input_region(Some(&input_region));
self.subsurface 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(); self.wl_surface.send_commit();
// let _ = self.globals.wl_display.new_send_sync(); // let _ = self.globals.wl_display.new_send_sync();
Ok(()) Ok(())

View file

@ -250,6 +250,7 @@ impl ClientXdgToplevel {
} }
} }
#[derive(PartialEq)]
enum ToplevelState { enum ToplevelState {
Normal, Normal,
Maximixed, Maximixed,
@ -355,6 +356,8 @@ impl XdgToplevelHandler for ClientXdgToplevel {
}; };
self.deco.set_active(activated); self.deco.set_active(activated);
self.deco
.set_fullscreen(top_state == ToplevelState::Fullscreen);
self.deco.set_restricted_edges(restricted_edges); self.deco.set_restricted_edges(restricted_edges);
let (width, height) = self.deco.transform_configure(width, height); let (width, height) = self.deco.transform_configure(width, height);
let (_prefix, states, _suffix) = unsafe { outer_state.align_to::<u8>() }; let (_prefix, states, _suffix) = unsafe { outer_state.align_to::<u8>() };