aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2023-08-15 16:40:54 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2023-08-15 16:40:54 +0400
commit162c74c259910cc889efab2c3c6e8aa3f62c99c2 (patch)
treec7b2417b16ae767946126ac6c82e03b87bf5c2f3
parent2465bba0858662d45ea1e5a321c6fbe11036d99f (diff)
downloadniri-162c74c259910cc889efab2c3c6e8aa3f62c99c2.tar.gz
niri-162c74c259910cc889efab2c3c6e8aa3f62c99c2.tar.bz2
niri-162c74c259910cc889efab2c3c6e8aa3f62c99c2.zip
Add dnd icon support
-rw-r--r--src/handlers/mod.rs23
-rw-r--r--src/niri.rs54
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) {