aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/layout/mod.rs2
-rw-r--r--src/layout/tile.rs2
-rw-r--r--src/layout/workspace.rs2
-rw-r--r--src/niri.rs2
-rw-r--r--src/render_helpers/render_elements.rs42
-rw-r--r--src/screenshot_ui.rs153
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)
- }
-}