From a5d6b0f2659f32e011659ef7d8de933a88974271 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Wed, 8 May 2024 13:04:19 +0200 Subject: [PATCH] layer-shell: consider sub-surface extents during positioning --- src/ifs/wl_surface/zwlr_layer_surface_v1.rs | 28 ++++++++++----------- src/renderer.rs | 13 +++------- src/tree/output.rs | 2 +- 3 files changed, 18 insertions(+), 25 deletions(-) diff --git a/src/ifs/wl_surface/zwlr_layer_surface_v1.rs b/src/ifs/wl_surface/zwlr_layer_surface_v1.rs index e2e274f3..6f974fff 100644 --- a/src/ifs/wl_surface/zwlr_layer_surface_v1.rs +++ b/src/ifs/wl_surface/zwlr_layer_surface_v1.rs @@ -45,7 +45,7 @@ pub struct ZwlrLayerSurfaceV1 { pub output: Rc, pub namespace: String, pub tracker: Tracker, - output_pos: Cell, + output_extents: Cell, pos: Cell, mapped: Cell, layer: Cell, @@ -106,7 +106,7 @@ impl ZwlrLayerSurfaceV1 { output: output.clone(), namespace: namespace.to_string(), tracker: Default::default(), - output_pos: Default::default(), + output_extents: Default::default(), pos: Default::default(), mapped: Cell::new(false), layer: Cell::new(layer), @@ -284,19 +284,16 @@ impl ZwlrLayerSurfaceV1 { } } - pub fn output_position(&self) -> Rect { - self.output_pos.get() - } - - pub fn position(&self) -> Rect { - self.pos.get() + pub fn output_extents(&self) -> Rect { + self.output_extents.get() } fn compute_position(&self) { let Some(global) = self.output.get() else { return; }; - let (width, height) = self.size.get(); + let extents = self.surface.extents.get(); + let (width, height) = extents.size(); let mut anchor = self.anchor.get(); if anchor == 0 { anchor = LEFT | RIGHT | TOP | BOTTOM; @@ -320,9 +317,11 @@ impl ZwlrLayerSurfaceV1 { } let o_rect = Rect::new_sized(x1, y1, width, height).unwrap(); let a_rect = o_rect.move_(opos.x1(), opos.y1()); - self.output_pos.set(o_rect); + self.output_extents.set(o_rect); self.pos.set(a_rect); - self.surface.set_absolute_position(a_rect.x1(), a_rect.y1()); + let abs_x = a_rect.x1() - extents.x1(); + let abs_y = a_rect.y1() - extents.y1(); + self.surface.set_absolute_position(abs_x, abs_y); self.client.state.tree_changed(); } @@ -360,9 +359,7 @@ impl SurfaceExt for ZwlrLayerSurfaceV1 { if !buffer_is_some { self.destroy_node(); } else { - let pos = self.pos.get(); - let (width, height) = self.size.get(); - if width != pos.width() || height != pos.height() { + if self.surface.extents.get().size() != self.pos.get().size() { self.compute_position(); } } @@ -437,7 +434,8 @@ impl Node for ZwlrLayerSurfaceV1 { tree: &mut Vec, _usecase: FindTreeUsecase, ) -> FindTreeResult { - self.surface.find_tree_at_(x, y, tree) + let (dx, dy) = self.surface.extents.get().position(); + self.surface.find_tree_at_(x + dx, y + dy, tree) } fn node_render(&self, renderer: &mut Renderer, x: i32, y: i32, _bounds: Option<&Rect>) { diff --git a/src/renderer.rs b/src/renderer.rs index 6821c49b..85244e24 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -103,12 +103,8 @@ impl Renderer<'_> { macro_rules! render_layer { ($layer:expr) => { for ls in $layer.iter() { - let pos = ls.position(); - self.render_layer_surface( - ls.deref(), - x + pos.x1() - opos.x1(), - y + pos.y1() - opos.y1(), - ); + let pos = ls.output_extents(); + self.render_layer_surface(ls.deref(), x + pos.x1(), y + pos.y1()); self.base.ops.push(GfxApiOpt::Sync); } }; @@ -539,8 +535,7 @@ impl Renderer<'_> { } pub fn render_layer_surface(&mut self, surface: &ZwlrLayerSurfaceV1, x: i32, y: i32) { - let body = surface.position().at_point(x, y); - let body = self.base.scale_rect(body); - self.render_surface(&surface.surface, x, y, Some(&body)); + let (dx, dy) = surface.surface.extents.get().position(); + self.render_surface(&surface.surface, x - dx, y - dy, None); } } diff --git a/src/tree/output.rs b/src/tree/output.rs index 0aabc9f4..459046ea 100644 --- a/src/tree/output.rs +++ b/src/tree/output.rs @@ -582,7 +582,7 @@ impl OutputNode { let len = tree.len(); for layer in layers.iter().copied() { for surface in self.layers[layer as usize].rev_iter() { - let pos = surface.output_position(); + let pos = surface.output_extents(); if pos.contains(x, y) { let (x, y) = pos.translate(x, y); if surface.node_find_tree_at(x, y, tree, usecase)