1
0
Fork 0
forked from wry/wry

layer-shell: consider sub-surface extents during positioning

This commit is contained in:
Julian Orth 2024-05-08 13:04:19 +02:00
parent 06ac1189d0
commit a5d6b0f265
3 changed files with 18 additions and 25 deletions

View file

@ -45,7 +45,7 @@ pub struct ZwlrLayerSurfaceV1 {
pub output: Rc<OutputGlobalOpt>, pub output: Rc<OutputGlobalOpt>,
pub namespace: String, pub namespace: String,
pub tracker: Tracker<Self>, pub tracker: Tracker<Self>,
output_pos: Cell<Rect>, output_extents: Cell<Rect>,
pos: Cell<Rect>, pos: Cell<Rect>,
mapped: Cell<bool>, mapped: Cell<bool>,
layer: Cell<u32>, layer: Cell<u32>,
@ -106,7 +106,7 @@ impl ZwlrLayerSurfaceV1 {
output: output.clone(), output: output.clone(),
namespace: namespace.to_string(), namespace: namespace.to_string(),
tracker: Default::default(), tracker: Default::default(),
output_pos: Default::default(), output_extents: Default::default(),
pos: Default::default(), pos: Default::default(),
mapped: Cell::new(false), mapped: Cell::new(false),
layer: Cell::new(layer), layer: Cell::new(layer),
@ -284,19 +284,16 @@ impl ZwlrLayerSurfaceV1 {
} }
} }
pub fn output_position(&self) -> Rect { pub fn output_extents(&self) -> Rect {
self.output_pos.get() self.output_extents.get()
}
pub fn position(&self) -> Rect {
self.pos.get()
} }
fn compute_position(&self) { fn compute_position(&self) {
let Some(global) = self.output.get() else { let Some(global) = self.output.get() else {
return; return;
}; };
let (width, height) = self.size.get(); let extents = self.surface.extents.get();
let (width, height) = extents.size();
let mut anchor = self.anchor.get(); let mut anchor = self.anchor.get();
if anchor == 0 { if anchor == 0 {
anchor = LEFT | RIGHT | TOP | BOTTOM; anchor = LEFT | RIGHT | TOP | BOTTOM;
@ -320,9 +317,11 @@ impl ZwlrLayerSurfaceV1 {
} }
let o_rect = Rect::new_sized(x1, y1, width, height).unwrap(); let o_rect = Rect::new_sized(x1, y1, width, height).unwrap();
let a_rect = o_rect.move_(opos.x1(), opos.y1()); 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.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(); self.client.state.tree_changed();
} }
@ -360,9 +359,7 @@ impl SurfaceExt for ZwlrLayerSurfaceV1 {
if !buffer_is_some { if !buffer_is_some {
self.destroy_node(); self.destroy_node();
} else { } else {
let pos = self.pos.get(); if self.surface.extents.get().size() != self.pos.get().size() {
let (width, height) = self.size.get();
if width != pos.width() || height != pos.height() {
self.compute_position(); self.compute_position();
} }
} }
@ -437,7 +434,8 @@ impl Node for ZwlrLayerSurfaceV1 {
tree: &mut Vec<FoundNode>, tree: &mut Vec<FoundNode>,
_usecase: FindTreeUsecase, _usecase: FindTreeUsecase,
) -> FindTreeResult { ) -> 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>) { fn node_render(&self, renderer: &mut Renderer, x: i32, y: i32, _bounds: Option<&Rect>) {

View file

@ -103,12 +103,8 @@ impl Renderer<'_> {
macro_rules! render_layer { macro_rules! render_layer {
($layer:expr) => { ($layer:expr) => {
for ls in $layer.iter() { for ls in $layer.iter() {
let pos = ls.position(); let pos = ls.output_extents();
self.render_layer_surface( self.render_layer_surface(ls.deref(), x + pos.x1(), y + pos.y1());
ls.deref(),
x + pos.x1() - opos.x1(),
y + pos.y1() - opos.y1(),
);
self.base.ops.push(GfxApiOpt::Sync); 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) { pub fn render_layer_surface(&mut self, surface: &ZwlrLayerSurfaceV1, x: i32, y: i32) {
let body = surface.position().at_point(x, y); let (dx, dy) = surface.surface.extents.get().position();
let body = self.base.scale_rect(body); self.render_surface(&surface.surface, x - dx, y - dy, None);
self.render_surface(&surface.surface, x, y, Some(&body));
} }
} }

View file

@ -582,7 +582,7 @@ impl OutputNode {
let len = tree.len(); let len = tree.len();
for layer in layers.iter().copied() { for layer in layers.iter().copied() {
for surface in self.layers[layer as usize].rev_iter() { 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) { if pos.contains(x, y) {
let (x, y) = pos.translate(x, y); let (x, y) = pos.translate(x, y);
if surface.node_find_tree_at(x, y, tree, usecase) if surface.node_find_tree_at(x, y, tree, usecase)