diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/layout/mod.rs | 2 | ||||
| -rw-r--r-- | src/layout/tile.rs | 2 | ||||
| -rw-r--r-- | src/layout/workspace.rs | 2 | ||||
| -rw-r--r-- | src/niri.rs | 2 | ||||
| -rw-r--r-- | src/render_helpers/render_elements.rs | 42 | ||||
| -rw-r--r-- | src/screenshot_ui.rs | 153 |
6 files changed, 45 insertions, 158 deletions
diff --git a/src/layout/mod.rs b/src/layout/mod.rs index 947b8cea..9692e73d 100644 --- a/src/layout/mod.rs +++ b/src/layout/mod.rs @@ -64,7 +64,7 @@ pub mod tile; pub mod workspace; niri_render_elements! { - LayoutElementRenderElement => { + LayoutElementRenderElement<R> => { Wayland = WaylandSurfaceRenderElement<R>, SolidColor = SolidColorRenderElement, } diff --git a/src/layout/tile.rs b/src/layout/tile.rs index 54c38d15..fa1d1e5d 100644 --- a/src/layout/tile.rs +++ b/src/layout/tile.rs @@ -51,7 +51,7 @@ pub struct Tile<W: LayoutElement> { } niri_render_elements! { - TileRenderElement => { + TileRenderElement<R> => { LayoutElement = LayoutElementRenderElement<R>, SolidColor = RelocateRenderElement<SolidColorRenderElement>, Offscreen = RescaleRenderElement<OffscreenRenderElement>, diff --git a/src/layout/workspace.rs b/src/layout/workspace.rs index 0c09195a..5e872340 100644 --- a/src/layout/workspace.rs +++ b/src/layout/workspace.rs @@ -76,7 +76,7 @@ pub struct Workspace<W: LayoutElement> { pub struct OutputId(String); niri_render_elements! { - WorkspaceRenderElement => { + WorkspaceRenderElement<R> => { Tile = TileRenderElement<R>, } } diff --git a/src/niri.rs b/src/niri.rs index ec9444b9..dbe9cdc8 100644 --- a/src/niri.rs +++ b/src/niri.rs @@ -2961,7 +2961,7 @@ impl ClientData for ClientState { } niri_render_elements! { - OutputRenderElements => { + OutputRenderElements<R> => { Monitor = MonitorRenderElement<R>, Wayland = WaylandSurfaceRenderElement<R>, NamedPointer = MemoryRenderBufferRenderElement<R>, diff --git a/src/render_helpers/render_elements.rs b/src/render_helpers/render_elements.rs index 1f100536..8b30e1ac 100644 --- a/src/render_helpers/render_elements.rs +++ b/src/render_helpers/render_elements.rs @@ -2,13 +2,39 @@ // This macro does it for us. #[macro_export] macro_rules! niri_render_elements { + // The two callable variants: with <R> and without <R>. They include From impls because nested + // repetitions ($type and $variant with + and $R with ?) don't work properly. + ($name:ident<R> => { $($variant:ident = $type:ty),+ $(,)? }) => { + $crate::niri_render_elements!(@impl $name () ($name<R>) => { $($variant = $type),+ }); + + $(impl<R: $crate::render_helpers::renderer::NiriRenderer> From<$type> for $name<R> { + fn from(x: $type) -> Self { + Self::$variant(x) + } + })+ + }; + ($name:ident => { $($variant:ident = $type:ty),+ $(,)? }) => { + $crate::niri_render_elements!(@impl $name ($name) () => { $($variant = $type),+ }); + + $(impl From<$type> for $name { + fn from(x: $type) -> Self { + Self::$variant(x) + } + })+ + }; + + // The internal variant that generates most of the code. $name_no_R and $name_R are necessary + // for the impl RenderElement<SomeRenderer> for $name<SomeRenderer>: since $R does not appear + // in this line, we cannot condition based on $R like elsewhere, so we condition on duplicate + // names instead. Like this: $($name_R<SomeRenderer>)? $($name_no_R)? so only one is chosen. + (@impl $name:ident ($($name_no_R:ident)?) ($($name_R:ident<$R:ident>)?) => { $($variant:ident = $type:ty),+ }) => { #[derive(Debug)] - pub enum $name<R: $crate::render_helpers::renderer::NiriRenderer> { + pub enum $name$(<$R: $crate::render_helpers::renderer::NiriRenderer>)? { $($variant($type)),+ } - impl<R: $crate::render_helpers::renderer::NiriRenderer> smithay::backend::renderer::element::Element for $name<R> { + impl$(<$R: $crate::render_helpers::renderer::NiriRenderer>)? smithay::backend::renderer::element::Element for $name$(<$R>)? { fn id(&self) -> &smithay::backend::renderer::element::Id { match self { $($name::$variant(elem) => elem.id()),+ @@ -68,7 +94,9 @@ macro_rules! niri_render_elements { } } - impl smithay::backend::renderer::element::RenderElement<smithay::backend::renderer::gles::GlesRenderer> for $name<smithay::backend::renderer::gles::GlesRenderer> { + impl smithay::backend::renderer::element::RenderElement<smithay::backend::renderer::gles::GlesRenderer> + for $($name_R<smithay::backend::renderer::gles::GlesRenderer>)? $($name_no_R)? + { fn draw( &self, frame: &mut smithay::backend::renderer::gles::GlesFrame<'_>, @@ -91,7 +119,7 @@ macro_rules! niri_render_elements { } impl<'render> smithay::backend::renderer::element::RenderElement<$crate::backend::tty::TtyRenderer<'render>> - for $name<$crate::backend::tty::TtyRenderer<'render>> + for $($name_R<$crate::backend::tty::TtyRenderer<'render>>)? $($name_no_R)? { fn draw( &self, @@ -116,11 +144,5 @@ macro_rules! niri_render_elements { } } } - - $(impl<R: $crate::render_helpers::renderer::NiriRenderer> From<$type> for $name<R> { - fn from(x: $type) -> Self { - Self::$variant(x) - } - })+ }; } diff --git a/src/screenshot_ui.rs b/src/screenshot_ui.rs index b632e3bf..897761a1 100644 --- a/src/screenshot_ui.rs +++ b/src/screenshot_ui.rs @@ -10,15 +10,14 @@ use smithay::backend::allocator::Fourcc; use smithay::backend::input::{ButtonState, MouseButton}; use smithay::backend::renderer::element::solid::{SolidColorBuffer, SolidColorRenderElement}; use smithay::backend::renderer::element::texture::{TextureBuffer, TextureRenderElement}; -use smithay::backend::renderer::element::{Element, Id, Kind, RenderElement, UnderlyingStorage}; -use smithay::backend::renderer::gles::{GlesError, GlesFrame, GlesRenderer, GlesTexture}; -use smithay::backend::renderer::utils::CommitCounter; +use smithay::backend::renderer::element::Kind; +use smithay::backend::renderer::gles::{GlesRenderer, GlesTexture}; use smithay::backend::renderer::ExportMem; use smithay::input::keyboard::{Keysym, ModifiersState}; use smithay::output::{Output, WeakOutput}; -use smithay::utils::{Buffer, Physical, Point, Rectangle, Scale, Size, Transform}; +use smithay::utils::{Physical, Point, Rectangle, Size, Transform}; -use crate::backend::tty::{TtyFrame, TtyRenderer, TtyRendererError}; +use crate::niri_render_elements; use crate::render_helpers::primary_gpu_texture::PrimaryGpuTextureRenderElement; const BORDER: i32 = 2; @@ -49,10 +48,11 @@ pub struct OutputData { locations: [Point<i32, Physical>; 8], } -#[derive(Debug)] -pub enum ScreenshotUiRenderElement { - Screenshot(PrimaryGpuTextureRenderElement), - SolidColor(SolidColorRenderElement), +niri_render_elements! { + ScreenshotUiRenderElement => { + Screenshot = PrimaryGpuTextureRenderElement, + SolidColor = SolidColorRenderElement, + } } impl ScreenshotUi { @@ -451,138 +451,3 @@ pub fn rect_from_corner_points( let y2 = max(a.y, b.y); Rectangle::from_extemities((x1, y1), (x2 + scale, y2 + scale)) } - -// Manual RenderElement implementation due to AsGlesFrame requirement. -impl Element for ScreenshotUiRenderElement { - fn id(&self) -> &Id { - match self { - Self::Screenshot(elem) => elem.id(), - Self::SolidColor(elem) => elem.id(), - } - } - - fn current_commit(&self) -> CommitCounter { - match self { - Self::Screenshot(elem) => elem.current_commit(), - Self::SolidColor(elem) => elem.current_commit(), - } - } - - fn geometry(&self, scale: Scale<f64>) -> Rectangle<i32, Physical> { - match self { - Self::Screenshot(elem) => elem.geometry(scale), - Self::SolidColor(elem) => elem.geometry(scale), - } - } - - fn transform(&self) -> Transform { - match self { - Self::Screenshot(elem) => elem.transform(), - Self::SolidColor(elem) => elem.transform(), - } - } - - fn src(&self) -> Rectangle<f64, Buffer> { - match self { - Self::Screenshot(elem) => elem.src(), - Self::SolidColor(elem) => elem.src(), - } - } - - fn damage_since( - &self, - scale: Scale<f64>, - commit: Option<CommitCounter>, - ) -> Vec<Rectangle<i32, Physical>> { - match self { - Self::Screenshot(elem) => elem.damage_since(scale, commit), - Self::SolidColor(elem) => elem.damage_since(scale, commit), - } - } - - fn opaque_regions(&self, scale: Scale<f64>) -> Vec<Rectangle<i32, Physical>> { - match self { - Self::Screenshot(elem) => elem.opaque_regions(scale), - Self::SolidColor(elem) => elem.opaque_regions(scale), - } - } - - fn alpha(&self) -> f32 { - match self { - Self::Screenshot(elem) => elem.alpha(), - Self::SolidColor(elem) => elem.alpha(), - } - } - - fn kind(&self) -> Kind { - match self { - Self::Screenshot(elem) => elem.kind(), - Self::SolidColor(elem) => elem.kind(), - } - } -} - -impl RenderElement<GlesRenderer> for ScreenshotUiRenderElement { - fn draw( - &self, - frame: &mut GlesFrame<'_>, - src: Rectangle<f64, Buffer>, - dst: Rectangle<i32, Physical>, - damage: &[Rectangle<i32, Physical>], - ) -> Result<(), GlesError> { - match self { - Self::Screenshot(elem) => { - RenderElement::<GlesRenderer>::draw(&elem, frame, src, dst, damage) - } - Self::SolidColor(elem) => { - RenderElement::<GlesRenderer>::draw(&elem, frame, src, dst, damage) - } - } - } - - fn underlying_storage(&self, _renderer: &mut GlesRenderer) -> Option<UnderlyingStorage> { - // If scanout for things other than Wayland buffers is implemented, this will need to take - // the target GPU into account. - None - } -} - -impl<'render> RenderElement<TtyRenderer<'render>> for ScreenshotUiRenderElement { - fn draw( - &self, - frame: &mut TtyFrame<'render, '_>, - src: Rectangle<f64, Buffer>, - dst: Rectangle<i32, Physical>, - damage: &[Rectangle<i32, Physical>], - ) -> Result<(), TtyRendererError<'render>> { - match self { - Self::Screenshot(elem) => { - RenderElement::<TtyRenderer<'render>>::draw(&elem, frame, src, dst, damage) - } - Self::SolidColor(elem) => { - RenderElement::<TtyRenderer<'render>>::draw(&elem, frame, src, dst, damage) - } - } - } - - fn underlying_storage( - &self, - _renderer: &mut TtyRenderer<'render>, - ) -> Option<UnderlyingStorage> { - // If scanout for things other than Wayland buffers is implemented, this will need to take - // the target GPU into account. - None - } -} - -impl From<SolidColorRenderElement> for ScreenshotUiRenderElement { - fn from(x: SolidColorRenderElement) -> Self { - Self::SolidColor(x) - } -} - -impl From<PrimaryGpuTextureRenderElement> for ScreenshotUiRenderElement { - fn from(x: PrimaryGpuTextureRenderElement) -> Self { - Self::Screenshot(x) - } -} |
