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,
prefers_ssd: bool,
is_active: bool,
is_fullscreen: bool,
bounds: Bounds,
restricted_edges: Edges<bool>,
}
@ -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<bool>) {
@ -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(())

View file

@ -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::<u8>() };