diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2025-09-21 20:26:49 +0300 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2025-10-02 09:33:08 +0300 |
| commit | a5e285865b97c008549b60aac29c6a14b7f4f8c0 (patch) | |
| tree | 718fecf648c0fdf43439a4a01a58b3b58c1703a8 /src/layout | |
| parent | d5f4e79e4c35d4f5a7a4a64e85e72fb1545ef2db (diff) | |
| download | niri-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.rs | 14 | ||||
| -rw-r--r-- | src/layout/workspace.rs | 31 |
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()); |
