Add cursor drawing with a colored rectangle

This commit is contained in:
Ivan Molodetskikh
2023-08-10 09:57:13 +04:00
parent 9a5f891002
commit 746840a119
4 changed files with 49 additions and 7 deletions
+5 -2
View File
@@ -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<GlesRenderer, WaylandSurfaceRenderElement<GlesRenderer>>],
elements: &[OutputRenderElements<
GlesRenderer,
WaylandSurfaceRenderElement<GlesRenderer>,
>],
);
}
+34 -1
View File
@@ -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<R, E> where R: ImportAll;
Space=SpaceRenderElements<R, E>,
Pointer = SolidColorRenderElement,
}
#[derive(Default)]
pub struct ClientState {
pub compositor_state: CompositorClientState,
+5 -2
View File
@@ -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<GlesRenderer, WaylandSurfaceRenderElement<GlesRenderer>>],
elements: &[OutputRenderElements<
GlesRenderer,
WaylandSurfaceRenderElement<GlesRenderer>,
>],
) {
let output_device = self.output_device.as_mut().unwrap();
let drm_compositor = &mut output_device.drm_compositor;
+5 -2
View File
@@ -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<GlesRenderer, WaylandSurfaceRenderElement<GlesRenderer>>],
elements: &[OutputRenderElements<
GlesRenderer,
WaylandSurfaceRenderElement<GlesRenderer>,
>],
) {
let size = self.backend.window_size().physical_size;
let damage = Rectangle::from_loc_and_size((0, 0), size);