From 7df040f45115d3cfd85b2a8d58be4c8a488b6ebb Mon Sep 17 00:00:00 2001 From: andersrein Date: Mon, 23 Sep 2019 20:50:06 +0200 Subject: [PATCH] Wayland: Switched to using a reference to relative_pointer_manager_proxy when creating SeatData (#1179) * Fixed relative_pointer not being set up when the "zwp_relative_pointer_manager_v1" callback comes after the "wl_seat" callback * Ran cargo fmt * Updated changelog * Improved CHANGELOG * Switched to using Rc instead of Arc since all accesses to the relative_pointer_manager_proxy will happen on the same thread. * Forgot to run cargo fmt --- CHANGELOG.md | 1 + src/platform_impl/linux/wayland/event_loop.rs | 49 ++++++++++--------- 2 files changed, 28 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index adc5a793..5be8107c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ - On X11, return dummy monitor data to avoid panicking when no monitors exist. - On X11, prevent stealing input focus when creating a new window. Only steal input focus when entering fullscreen mode. +- On Wayland, fixed DeviceEvents for relative mouse movement is not always produced # 0.20.0 Alpha 3 (2019-08-14) diff --git a/src/platform_impl/linux/wayland/event_loop.rs b/src/platform_impl/linux/wayland/event_loop.rs index af8c8079..272fc832 100644 --- a/src/platform_impl/linux/wayland/event_loop.rs +++ b/src/platform_impl/linux/wayland/event_loop.rs @@ -148,7 +148,7 @@ impl EventLoop { let mut seat_manager = SeatManager { sink: sink.clone(), - relative_pointer_manager_proxy: None, + relative_pointer_manager_proxy: Rc::new(RefCell::new(None)), store: store.clone(), seats: seats.clone(), kbd_sender, @@ -164,13 +164,16 @@ impl EventLoop { version, } => { if interface == "zwp_relative_pointer_manager_v1" { - seat_manager.relative_pointer_manager_proxy = Some( - registry - .bind(version, id, move |pointer_manager| { - pointer_manager.implement_closure(|_, _| (), ()) - }) - .unwrap(), - ) + let relative_pointer_manager_proxy = registry + .bind(version, id, move |pointer_manager| { + pointer_manager.implement_closure(|_, _| (), ()) + }) + .unwrap(); + + *seat_manager + .relative_pointer_manager_proxy + .try_borrow_mut() + .unwrap() = Some(relative_pointer_manager_proxy); } if interface == "wl_seat" { seat_manager.add_seat(id, version, registry) @@ -493,7 +496,7 @@ struct SeatManager { store: Arc>, seats: Arc>>, kbd_sender: ::calloop::channel::Sender<(crate::event::WindowEvent, super::WindowId)>, - relative_pointer_manager_proxy: Option, + relative_pointer_manager_proxy: Rc>>, } impl SeatManager { @@ -505,7 +508,7 @@ impl SeatManager { store: self.store.clone(), pointer: None, relative_pointer: None, - relative_pointer_manager_proxy: self.relative_pointer_manager_proxy.as_ref().cloned(), + relative_pointer_manager_proxy: self.relative_pointer_manager_proxy.clone(), keyboard: None, touch: None, kbd_sender: self.kbd_sender.clone(), @@ -537,7 +540,7 @@ struct SeatData { kbd_sender: ::calloop::channel::Sender<(crate::event::WindowEvent, super::WindowId)>, pointer: Option, relative_pointer: Option, - relative_pointer_manager_proxy: Option, + relative_pointer_manager_proxy: Rc>>, keyboard: Option, touch: Option, modifiers_tracker: Arc>, @@ -557,17 +560,19 @@ impl SeatData { self.modifiers_tracker.clone(), )); - self.relative_pointer = - self.relative_pointer_manager_proxy - .as_ref() - .and_then(|manager| { - super::pointer::implement_relative_pointer( - self.sink.clone(), - self.pointer.as_ref().unwrap(), - manager, - ) - .ok() - }) + self.relative_pointer = self + .relative_pointer_manager_proxy + .try_borrow() + .unwrap() + .as_ref() + .and_then(|manager| { + super::pointer::implement_relative_pointer( + self.sink.clone(), + self.pointer.as_ref().unwrap(), + manager, + ) + .ok() + }) } // destroy pointer if applicable if !capabilities.contains(wl_seat::Capability::Pointer) {