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 namespace: String,
pub tracker: Tracker<Self>,
output_pos: Cell<Rect>,
output_extents: Cell<Rect>,
pos: Cell<Rect>,
mapped: Cell<bool>,
layer: Cell<u32>,
@ -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<FoundNode>,
_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>) {

View file

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

View file

@ -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)