From 746840a11913222052081210dc99c2082100da4c Mon Sep 17 00:00:00 2001 From: Ivan Molodetskikh Date: Thu, 10 Aug 2023 09:57:13 +0400 Subject: Add cursor drawing with a colored rectangle --- src/backend.rs | 7 +++++-- src/niri.rs | 35 ++++++++++++++++++++++++++++++++++- src/tty.rs | 7 +++++-- src/winit.rs | 7 +++++-- 4 files changed, 49 insertions(+), 7 deletions(-) diff --git a/src/backend.rs b/src/backend.rs index e190ed05..7dcc0121 100644 --- a/src/backend.rs +++ b/src/backend.rs @@ -1,7 +1,7 @@ use smithay::backend::renderer::element::surface::WaylandSurfaceRenderElement; use smithay::backend::renderer::gles::GlesRenderer; -use smithay::desktop::space::SpaceRenderElements; +use crate::niri::OutputRenderElements; use crate::Niri; pub trait Backend { @@ -10,6 +10,9 @@ pub trait Backend { fn render( &mut self, niri: &mut Niri, - elements: &[SpaceRenderElements>], + elements: &[OutputRenderElements< + GlesRenderer, + WaylandSurfaceRenderElement, + >], ); } diff --git a/src/niri.rs b/src/niri.rs index 6318fd95..8a0d0f03 100644 --- a/src/niri.rs +++ b/src/niri.rs @@ -2,7 +2,11 @@ use std::os::unix::io::AsRawFd; use std::sync::Arc; use std::time::Duration; -use smithay::desktop::space::space_render_elements; +use smithay::backend::renderer::element::render_elements; +use smithay::backend::renderer::element::solid::SolidColorRenderElement; +use smithay::backend::renderer::utils::CommitCounter; +use smithay::backend::renderer::ImportAll; +use smithay::desktop::space::{space_render_elements, SpaceRenderElements}; use smithay::desktop::{Space, Window, WindowSurfaceType}; use smithay::input::keyboard::XkbConfig; use smithay::input::{Seat, SeatState}; @@ -139,6 +143,29 @@ impl Niri { 1., ) .unwrap(); + + let mut elements: Vec<_> = elements + .into_iter() + .map(OutputRenderElements::from) + .collect(); + elements.insert( + 0, + OutputRenderElements::Pointer(SolidColorRenderElement::new( + smithay::backend::renderer::element::Id::new(), + smithay::utils::Rectangle { + loc: self + .seat + .get_pointer() + .unwrap() + .current_location() + .to_physical_precise_round(1.), + size: (16, 16).into(), + }, + CommitCounter::default(), + [1., 0.5, 0., 1.], + )), + ); + backend.render(self, &elements); let output = self.output.as_ref().unwrap(); @@ -155,6 +182,12 @@ impl Niri { } } +render_elements! { + pub OutputRenderElements where R: ImportAll; + Space=SpaceRenderElements, + Pointer = SolidColorRenderElement, +} + #[derive(Default)] pub struct ClientState { pub compositor_state: CompositorClientState, diff --git a/src/tty.rs b/src/tty.rs index b2a7e61a..b286bd36 100644 --- a/src/tty.rs +++ b/src/tty.rs @@ -16,7 +16,6 @@ use smithay::backend::renderer::{Bind, ImportEgl}; use smithay::backend::session::libseat::LibSeatSession; use smithay::backend::session::{Event as SessionEvent, Session}; use smithay::backend::udev::{self, UdevBackend, UdevEvent}; -use smithay::desktop::space::SpaceRenderElements; use smithay::output::{Mode, Output, OutputModeSource, PhysicalProperties, Subpixel}; use smithay::reexports::calloop::timer::{TimeoutAction, Timer}; use smithay::reexports::calloop::{LoopHandle, RegistrationToken}; @@ -31,6 +30,7 @@ use smithay::utils::DeviceFd; use smithay_drm_extras::edid::EdidInfo; use crate::backend::Backend; +use crate::niri::OutputRenderElements; use crate::{LoopData, Niri}; const BACKGROUND_COLOR: [f32; 4] = [0.1, 0.1, 0.1, 1.]; @@ -66,7 +66,10 @@ impl Backend for Tty { fn render( &mut self, niri: &mut Niri, - elements: &[SpaceRenderElements>], + elements: &[OutputRenderElements< + GlesRenderer, + WaylandSurfaceRenderElement, + >], ) { let output_device = self.output_device.as_mut().unwrap(); let drm_compositor = &mut output_device.drm_compositor; diff --git a/src/winit.rs b/src/winit.rs index b1e9bf65..65ce5b3c 100644 --- a/src/winit.rs +++ b/src/winit.rs @@ -4,13 +4,13 @@ use smithay::backend::renderer::damage::OutputDamageTracker; use smithay::backend::renderer::element::surface::WaylandSurfaceRenderElement; use smithay::backend::renderer::gles::GlesRenderer; use smithay::backend::winit::{self, WinitError, WinitEvent, WinitEventLoop, WinitGraphicsBackend}; -use smithay::desktop::space::SpaceRenderElements; use smithay::output::{Mode, Output, PhysicalProperties, Subpixel}; use smithay::reexports::calloop::timer::{TimeoutAction, Timer}; use smithay::reexports::calloop::LoopHandle; use smithay::utils::{Rectangle, Transform}; use crate::backend::Backend; +use crate::niri::OutputRenderElements; use crate::{LoopData, Niri}; pub struct Winit { @@ -32,7 +32,10 @@ impl Backend for Winit { fn render( &mut self, _niri: &mut Niri, - elements: &[SpaceRenderElements>], + elements: &[OutputRenderElements< + GlesRenderer, + WaylandSurfaceRenderElement, + >], ) { let size = self.backend.window_size().physical_size; let damage = Rectangle::from_loc_and_size((0, 0), size); -- cgit