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/workspace.rs | |
| 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/workspace.rs')
| -rw-r--r-- | src/layout/workspace.rs | 31 |
1 files changed, 31 insertions, 0 deletions
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()); |
