aboutsummaryrefslogtreecommitdiff
path: root/src/layout
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2025-09-21 20:26:49 +0300
committerIvan Molodetskikh <yalterz@gmail.com>2025-10-02 09:33:08 +0300
commita5e285865b97c008549b60aac29c6a14b7f4f8c0 (patch)
tree718fecf648c0fdf43439a4a01a58b3b58c1703a8 /src/layout
parentd5f4e79e4c35d4f5a7a4a64e85e72fb1545ef2db (diff)
downloadniri-a5e285865b97c008549b60aac29c6a14b7f4f8c0.tar.gz
niri-a5e285865b97c008549b60aac29c6a14b7f4f8c0.tar.bz2
niri-a5e285865b97c008549b60aac29c6a14b7f4f8c0.zip
Move background rendering to Workspace
Per-output background-color doesn't work yet.
Diffstat (limited to 'src/layout')
-rw-r--r--src/layout/monitor.rs14
-rw-r--r--src/layout/workspace.rs31
2 files changed, 42 insertions, 3 deletions
diff --git a/src/layout/monitor.rs b/src/layout/monitor.rs
index ec513857..54bcf9af 100644
--- a/src/layout/monitor.rs
+++ b/src/layout/monitor.rs
@@ -23,6 +23,7 @@ use crate::input::swipe_tracker::SwipeTracker;
use crate::niri_render_elements;
use crate::render_helpers::renderer::NiriRenderer;
use crate::render_helpers::shadow::ShadowRenderElement;
+use crate::render_helpers::solid_color::SolidColorRenderElement;
use crate::render_helpers::RenderTarget;
use crate::rubber_band::RubberBand;
use crate::utils::transaction::Transaction;
@@ -175,6 +176,7 @@ niri_render_elements! {
InsertHint = CropRenderElement<InsertHintRenderElement>,
UncroppedInsertHint = InsertHintRenderElement,
Shadow = ShadowRenderElement,
+ SolidColor = SolidColorRenderElement,
}
}
@@ -1619,6 +1621,7 @@ impl<W: LayoutElement> Monitor<W> {
) -> impl Iterator<
Item = (
Rectangle<f64, Logical>,
+ MonitorRenderElement<R>,
impl Iterator<Item = MonitorRenderElement<R>> + 'a,
),
> {
@@ -1692,7 +1695,7 @@ impl<W: LayoutElement> Monitor<W> {
let iter = floating.chain(hint).chain(scrolling);
- let iter = iter.map(move |elem| {
+ let scale_relocate = move |elem| {
let elem = RescaleRenderElement::from_element(elem, Point::from((0, 0)), zoom);
RelocateRenderElement::from_element(
elem,
@@ -1702,9 +1705,14 @@ impl<W: LayoutElement> Monitor<W> {
geo.loc.to_physical_precise_round(scale),
Relocate::Relative,
)
- });
+ };
+
+ let iter = iter.map(scale_relocate);
+
+ let background = ws.render_background();
+ let background = scale_relocate(MonitorInnerRenderElement::SolidColor(background));
- (geo, iter)
+ (geo, background, iter)
})
}
diff --git a/src/layout/workspace.rs b/src/layout/workspace.rs
index 06d3009d..3831ffe3 100644
--- a/src/layout/workspace.rs
+++ b/src/layout/workspace.rs
@@ -6,6 +6,7 @@ use niri_config::{
CenterFocusedColumn, CornerRadius, OutputName, PresetSize, Workspace as WorkspaceConfig,
};
use niri_ipc::{ColumnDisplay, PositionChange, SizeChange, WindowLayout};
+use smithay::backend::renderer::element::Kind;
use smithay::backend::renderer::gles::GlesRenderer;
use smithay::desktop::{layer_map_for_output, Window};
use smithay::output::Output;
@@ -29,6 +30,7 @@ use crate::animation::Clock;
use crate::niri_render_elements;
use crate::render_helpers::renderer::NiriRenderer;
use crate::render_helpers::shadow::ShadowRenderElement;
+use crate::render_helpers::solid_color::{SolidColorBuffer, SolidColorRenderElement};
use crate::render_helpers::RenderTarget;
use crate::utils::id::IdCounter;
use crate::utils::transaction::{Transaction, TransactionBlocker};
@@ -87,6 +89,9 @@ pub struct Workspace<W: LayoutElement> {
/// This workspace's shadow in the overview.
shadow: Shadow,
+ /// This workspace's background.
+ background_buffer: SolidColorBuffer,
+
/// Clock for driving animations.
pub(super) clock: Clock,
@@ -246,6 +251,8 @@ impl<W: LayoutElement> Workspace<W> {
let shadow_config =
compute_workspace_shadow_config(options.overview.workspace_shadow, view_size);
+ let background_color = options.layout.background_color.to_array_unpremul();
+
Self {
scrolling,
floating,
@@ -256,6 +263,7 @@ impl<W: LayoutElement> Workspace<W> {
view_size,
working_area,
shadow: Shadow::new(shadow_config),
+ background_buffer: SolidColorBuffer::new(view_size, background_color),
output: Some(output),
clock,
base_options,
@@ -309,6 +317,8 @@ impl<W: LayoutElement> Workspace<W> {
let shadow_config =
compute_workspace_shadow_config(options.overview.workspace_shadow, view_size);
+ let background_color = options.layout.background_color.to_array_unpremul();
+
Self {
scrolling,
floating,
@@ -320,6 +330,7 @@ impl<W: LayoutElement> Workspace<W> {
view_size,
working_area,
shadow: Shadow::new(shadow_config),
+ background_buffer: SolidColorBuffer::new(view_size, background_color),
clock,
base_options,
options,
@@ -409,6 +420,9 @@ impl<W: LayoutElement> Workspace<W> {
compute_workspace_shadow_config(options.overview.workspace_shadow, self.view_size);
self.shadow.update_config(shadow_config);
+ let background_color = options.layout.background_color.to_array_unpremul();
+ self.background_buffer.set_color(background_color);
+
self.base_options = base_options;
self.options = options;
}
@@ -563,6 +577,8 @@ impl<W: LayoutElement> Workspace<W> {
self.shadow.update_config(shadow_config);
}
+ self.background_buffer.resize(size);
+
if scale_transform_changed {
for window in self.windows() {
window.set_preferred_scale_transform(self.scale, self.transform);
@@ -1513,6 +1529,15 @@ impl<W: LayoutElement> Workspace<W> {
self.shadow.render(renderer, Point::from((0., 0.)))
}
+ pub fn render_background(&self) -> SolidColorRenderElement {
+ SolidColorRenderElement::from_buffer(
+ &self.background_buffer,
+ Point::new(0., 0.),
+ 1.,
+ Kind::Unspecified,
+ )
+ }
+
pub fn render_above_top_layer(&self) -> bool {
self.scrolling.render_above_top_layer()
}
@@ -1831,6 +1856,12 @@ impl<W: LayoutElement> Workspace<W> {
assert!(self.view_size.w > 0.);
assert!(self.view_size.h > 0.);
+ assert_eq!(self.background_buffer.size(), self.view_size);
+ assert_eq!(
+ self.background_buffer.color().components(),
+ options.layout.background_color.to_array_unpremul(),
+ );
+
assert_eq!(self.view_size, self.scrolling.view_size());
assert_eq!(self.working_area, self.scrolling.parent_area());
assert_eq!(&self.clock, self.scrolling.clock());