mirror of
https://github.com/niri-wm/niri.git
synced 2026-06-22 02:01:55 +07:00
Add update_render_elements() to MappedLayer
This commit is contained in:
+16
-16
@@ -1,12 +1,10 @@
|
|||||||
use std::cell::RefCell;
|
|
||||||
|
|
||||||
use niri_config::layer_rule::LayerRule;
|
use niri_config::layer_rule::LayerRule;
|
||||||
use smithay::backend::renderer::element::surface::{
|
use smithay::backend::renderer::element::surface::{
|
||||||
render_elements_from_surface_tree, WaylandSurfaceRenderElement,
|
render_elements_from_surface_tree, WaylandSurfaceRenderElement,
|
||||||
};
|
};
|
||||||
use smithay::backend::renderer::element::Kind;
|
use smithay::backend::renderer::element::Kind;
|
||||||
use smithay::desktop::{LayerSurface, PopupManager};
|
use smithay::desktop::{LayerSurface, PopupManager};
|
||||||
use smithay::utils::{Logical, Rectangle, Scale};
|
use smithay::utils::{Logical, Point, Scale, Size};
|
||||||
|
|
||||||
use super::ResolvedLayerRules;
|
use super::ResolvedLayerRules;
|
||||||
use crate::niri_render_elements;
|
use crate::niri_render_elements;
|
||||||
@@ -23,7 +21,7 @@ pub struct MappedLayer {
|
|||||||
rules: ResolvedLayerRules,
|
rules: ResolvedLayerRules,
|
||||||
|
|
||||||
/// Buffer to draw instead of the surface when it should be blocked out.
|
/// Buffer to draw instead of the surface when it should be blocked out.
|
||||||
block_out_buffer: RefCell<SolidColorBuffer>,
|
block_out_buffer: SolidColorBuffer,
|
||||||
}
|
}
|
||||||
|
|
||||||
niri_render_elements! {
|
niri_render_elements! {
|
||||||
@@ -38,10 +36,17 @@ impl MappedLayer {
|
|||||||
Self {
|
Self {
|
||||||
surface,
|
surface,
|
||||||
rules,
|
rules,
|
||||||
block_out_buffer: RefCell::new(SolidColorBuffer::new((0., 0.), [0., 0., 0., 1.])),
|
block_out_buffer: SolidColorBuffer::new((0., 0.), [0., 0., 0., 1.]),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn update_render_elements(&mut self, size: Size<f64, Logical>, scale: Scale<f64>) {
|
||||||
|
// Round to physical pixels.
|
||||||
|
let size = size.to_physical_precise_round(scale).to_logical(scale);
|
||||||
|
|
||||||
|
self.block_out_buffer.resize(size);
|
||||||
|
}
|
||||||
|
|
||||||
pub fn surface(&self) -> &LayerSurface {
|
pub fn surface(&self) -> &LayerSurface {
|
||||||
&self.surface
|
&self.surface
|
||||||
}
|
}
|
||||||
@@ -64,7 +69,7 @@ impl MappedLayer {
|
|||||||
pub fn render<R: NiriRenderer>(
|
pub fn render<R: NiriRenderer>(
|
||||||
&self,
|
&self,
|
||||||
renderer: &mut R,
|
renderer: &mut R,
|
||||||
geometry: Rectangle<i32, Logical>,
|
location: Point<f64, Logical>,
|
||||||
scale: Scale<f64>,
|
scale: Scale<f64>,
|
||||||
target: RenderTarget,
|
target: RenderTarget,
|
||||||
) -> SplitElements<LayerSurfaceRenderElement<R>> {
|
) -> SplitElements<LayerSurfaceRenderElement<R>> {
|
||||||
@@ -74,23 +79,18 @@ impl MappedLayer {
|
|||||||
|
|
||||||
if target.should_block_out(self.rules.block_out_from) {
|
if target.should_block_out(self.rules.block_out_from) {
|
||||||
// Round to physical pixels.
|
// Round to physical pixels.
|
||||||
let geometry = geometry
|
let location = location.to_physical_precise_round(scale).to_logical(scale);
|
||||||
.to_f64()
|
|
||||||
.to_physical_precise_round(scale)
|
|
||||||
.to_logical(scale);
|
|
||||||
|
|
||||||
let mut buffer = self.block_out_buffer.borrow_mut();
|
|
||||||
buffer.resize(geometry.size.to_f64());
|
|
||||||
let elem = SolidColorRenderElement::from_buffer(
|
let elem = SolidColorRenderElement::from_buffer(
|
||||||
&buffer,
|
&self.block_out_buffer,
|
||||||
geometry.loc,
|
location,
|
||||||
alpha,
|
alpha,
|
||||||
Kind::Unspecified,
|
Kind::Unspecified,
|
||||||
);
|
);
|
||||||
rv.normal.push(elem.into());
|
rv.normal.push(elem.into());
|
||||||
} else {
|
} else {
|
||||||
// Layer surfaces don't have extra geometry like windows.
|
// Layer surfaces don't have extra geometry like windows.
|
||||||
let buf_pos = geometry.loc;
|
let buf_pos = location;
|
||||||
|
|
||||||
let surface = self.surface.wl_surface();
|
let surface = self.surface.wl_surface();
|
||||||
for (popup, popup_offset) in PopupManager::popups_for_surface(surface) {
|
for (popup, popup_offset) in PopupManager::popups_for_surface(surface) {
|
||||||
@@ -100,7 +100,7 @@ impl MappedLayer {
|
|||||||
rv.popups.extend(render_elements_from_surface_tree(
|
rv.popups.extend(render_elements_from_surface_tree(
|
||||||
renderer,
|
renderer,
|
||||||
popup.wl_surface(),
|
popup.wl_surface(),
|
||||||
(buf_pos + offset).to_physical_precise_round(scale),
|
(buf_pos + offset.to_f64()).to_physical_precise_round(scale),
|
||||||
scale,
|
scale,
|
||||||
alpha,
|
alpha,
|
||||||
Kind::Unspecified,
|
Kind::Unspecified,
|
||||||
|
|||||||
+13
-1
@@ -3248,6 +3248,18 @@ impl Niri {
|
|||||||
if let Some(transition) = &mut state.screen_transition {
|
if let Some(transition) = &mut state.screen_transition {
|
||||||
transition.update_render_elements(scale, transform);
|
transition.update_render_elements(scale, transform);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let layer_map = layer_map_for_output(out);
|
||||||
|
for surface in layer_map.layers() {
|
||||||
|
let Some(mapped) = self.mapped_layer_surfaces.get_mut(surface) else {
|
||||||
|
continue;
|
||||||
|
};
|
||||||
|
let Some(geo) = layer_map.layer_geometry(surface) else {
|
||||||
|
continue;
|
||||||
|
};
|
||||||
|
|
||||||
|
mapped.update_render_elements(geo.size.to_f64(), scale);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3440,7 +3452,7 @@ impl Niri {
|
|||||||
Some((mapped, geo))
|
Some((mapped, geo))
|
||||||
});
|
});
|
||||||
for (mapped, geo) in iter {
|
for (mapped, geo) in iter {
|
||||||
elements.extend(mapped.render(renderer, geo, scale, target));
|
elements.extend(mapped.render(renderer, geo.loc.to_f64(), scale, target));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user