aboutsummaryrefslogtreecommitdiff
path: root/src/niri.rs
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 /src/niri.rs
parent2465bba0858662d45ea1e5a321c6fbe11036d99f (diff)
downloadniri-162c74c259910cc889efab2c3c6e8aa3f62c99c2.tar.gz
niri-162c74c259910cc889efab2c3c6e8aa3f62c99c2.tar.bz2
niri-162c74c259910cc889efab2c3c6e8aa3f62c99c2.zip
Add dnd icon support
Diffstat (limited to 'src/niri.rs')
-rw-r--r--src/niri.rs54
1 files changed, 33 insertions, 21 deletions
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) {