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/niri.rs | |
| parent | 2465bba0858662d45ea1e5a321c6fbe11036d99f (diff) | |
| download | niri-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.rs | 54 |
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) { |
