diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2023-08-15 16:40:54 +0400 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2023-08-15 16:40:54 +0400 |
| commit | 162c74c259910cc889efab2c3c6e8aa3f62c99c2 (patch) | |
| tree | c7b2417b16ae767946126ac6c82e03b87bf5c2f3 /src | |
| parent | 2465bba0858662d45ea1e5a321c6fbe11036d99f (diff) | |
| download | niri-162c74c259910cc889efab2c3c6e8aa3f62c99c2.tar.gz niri-162c74c259910cc889efab2c3c6e8aa3f62c99c2.tar.bz2 niri-162c74c259910cc889efab2c3c6e8aa3f62c99c2.zip | |
Add dnd icon support
Diffstat (limited to 'src')
| -rw-r--r-- | src/handlers/mod.rs | 23 | ||||
| -rw-r--r-- | src/niri.rs | 54 |
2 files changed, 55 insertions, 22 deletions
diff --git a/src/handlers/mod.rs b/src/handlers/mod.rs index cc80a841..b327a9e4 100644 --- a/src/handlers/mod.rs +++ b/src/handlers/mod.rs @@ -4,6 +4,7 @@ mod xdg_shell; use smithay::input::pointer::CursorImageStatus; use smithay::input::{Seat, SeatHandler, SeatState}; +use smithay::reexports::wayland_server::protocol::wl_data_source::WlDataSource; use smithay::reexports::wayland_server::protocol::wl_surface::WlSurface; use smithay::reexports::wayland_server::Resource; use smithay::wayland::data_device::{ @@ -42,8 +43,28 @@ impl DataDeviceHandler for Niri { &self.data_device_state } } -impl ClientDndGrabHandler for Niri {} + +impl ClientDndGrabHandler for Niri { + fn started( + &mut self, + _source: Option<WlDataSource>, + icon: Option<WlSurface>, + _seat: Seat<Self>, + ) { + self.dnd_icon = icon; + // FIXME: more granular + self.queue_redraw_all(); + } + + fn dropped(&mut self, _seat: Seat<Self>) { + self.dnd_icon = None; + // FIXME: more granular + self.queue_redraw_all(); + } +} + impl ServerDndGrabHandler for Niri {} + delegate_data_device!(Niri); delegate_output!(Niri); diff --git a/src/niri.rs b/src/niri.rs index 1dab2b6e..30e72531 100644 --- a/src/niri.rs +++ b/src/niri.rs @@ -72,6 +72,7 @@ pub struct Niri { pub pointer_buffer: SolidColorBuffer, pub cursor_image: CursorImageStatus, + pub dnd_icon: Option<WlSurface>, } pub struct OutputState { @@ -176,6 +177,7 @@ impl Niri { seat, pointer_buffer, cursor_image: CursorImageStatus::Default, + dnd_icon: None, } } @@ -332,24 +334,9 @@ impl Niri { let output_pos = self.global_space.output_geometry(output).unwrap().loc; let pointer_pos = self.seat.get_pointer().unwrap().current_location() - output_pos.to_f64(); - if let CursorImageStatus::Surface(surface) = &mut self.cursor_image { - if !surface.alive() { - self.cursor_image = CursorImageStatus::Default; - } - } - - match &self.cursor_image { - CursorImageStatus::Hidden => vec![], - CursorImageStatus::Default => vec![OutputRenderElements::DefaultPointer( - SolidColorRenderElement::from_buffer( - &self.pointer_buffer, - pointer_pos.to_physical_precise_round(1.), - 1., - 1., - ), - )], - CursorImageStatus::Surface(surface) => { - let hotspot = with_states(surface, |states| { + let hotspot = if let CursorImageStatus::Surface(surface) = &mut self.cursor_image { + if surface.alive() { + with_states(surface, |states| { states .data_map .get::<Mutex<CursorImageAttributes>>() @@ -357,12 +344,37 @@ impl Niri { .lock() .unwrap() .hotspot - }); - let pos = (pointer_pos - hotspot.to_f64()).to_physical_precise_round(1.); + }) + } else { + self.cursor_image = CursorImageStatus::Default; + (0, 0).into() + } + } else { + (0, 0).into() + }; + let pointer_pos = (pointer_pos - hotspot.to_f64()).to_physical_precise_round(1.); - render_elements_from_surface_tree(renderer, surface, pos, 1., 1.) + let mut pointer_elements = match &self.cursor_image { + CursorImageStatus::Hidden => vec![], + CursorImageStatus::Default => vec![OutputRenderElements::DefaultPointer( + SolidColorRenderElement::from_buffer(&self.pointer_buffer, pointer_pos, 1., 1.), + )], + CursorImageStatus::Surface(surface) => { + render_elements_from_surface_tree(renderer, surface, pointer_pos, 1., 1.) } + }; + + if let Some(dnd_icon) = &self.dnd_icon { + pointer_elements.extend(render_elements_from_surface_tree( + renderer, + dnd_icon, + pointer_pos, + 1., + 1., + )); } + + pointer_elements } fn redraw(&mut self, backend: &mut dyn Backend, output: &Output) { |
