layer-shell: consider sub-surface extents during positioning
This commit is contained in:
parent
06ac1189d0
commit
a5d6b0f265
3 changed files with 18 additions and 25 deletions
|
|
@ -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>) {
|
||||||
|
|
|
||||||
|
|
@ -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));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue