diff --git a/anvil/src/shell.rs b/anvil/src/shell.rs index a56657c..6e20ceb 100644 --- a/anvil/src/shell.rs +++ b/anvil/src/shell.rs @@ -36,7 +36,10 @@ use smithay::{ }, }; -use crate::window_map::{Kind as SurfaceKind, WindowMap}; +use crate::{ + state::AnvilState, + window_map::{Kind as SurfaceKind, WindowMap}, +}; #[cfg(feature = "xwayland")] use crate::xwayland::X11SurfaceRole; @@ -308,22 +311,18 @@ pub struct ShellHandles { pub window_map: Rc>, } -pub fn init_shell( +pub fn init_shell( display: &mut Display, #[cfg(feature = "egl")] egl_reader: Rc>>, log: ::slog::Logger, ) -> ShellHandles { - // TODO: this is awkward... - let almost_window_map = Rc::new(RefCell::new(None::>>)); - let almost_window_map_compositor = almost_window_map.clone(); - // Create the compositor let (compositor_token, _, _) = compositor_init( display, - move |request, surface, ctoken| match request { + move |request, surface, ctoken, mut ddata| match request { SurfaceEvent::Commit => { - let window_map = almost_window_map_compositor.borrow(); - let window_map = window_map.as_ref().unwrap(); + let anvil_state = ddata.get::>().unwrap(); + let window_map = anvil_state.window_map.as_ref(); #[cfg(feature = "egl")] { surface_commit(&surface, ctoken, egl_reader.borrow().as_ref(), &*window_map) @@ -339,7 +338,6 @@ pub fn init_shell( // Init a window map, to track the location of our windows let window_map = Rc::new(RefCell::new(WindowMap::new(compositor_token))); - *almost_window_map.borrow_mut() = Some(window_map.clone()); // init the xdg_shell let xdg_window_map = window_map.clone(); diff --git a/anvil/src/state.rs b/anvil/src/state.rs index 24d358d..06d088d 100644 --- a/anvil/src/state.rs +++ b/anvil/src/state.rs @@ -97,7 +97,7 @@ impl AnvilState { init_shm_global(&mut display.borrow_mut(), vec![], log.clone()); #[cfg(feature = "egl")] - let shell_handles = init_shell(&mut display.borrow_mut(), egl_reader, log.clone()); + let shell_handles = init_shell::(&mut display.borrow_mut(), egl_reader, log.clone()); #[cfg(not(feature = "egl"))] let shell_handles = init_shell(&mut display.borrow_mut(), log.clone()); diff --git a/src/wayland/compositor/handlers.rs b/src/wayland/compositor/handlers.rs index 292d03d..06241cf 100644 --- a/src/wayland/compositor/handlers.rs +++ b/src/wayland/compositor/handlers.rs @@ -2,7 +2,7 @@ use std::{cell::RefCell, ops::Deref as _, rc::Rc, sync::Mutex}; use wayland_server::{ protocol::{wl_compositor, wl_region, wl_subcompositor, wl_subsurface, wl_surface}, - Filter, Main, + DispatchData, Filter, Main, }; use super::{ @@ -22,7 +22,7 @@ pub(crate) fn implement_compositor( ) -> wl_compositor::WlCompositor where R: Default + Send + 'static, - Impl: FnMut(SurfaceEvent, wl_surface::WlSurface, CompositorToken) + 'static, + Impl: for<'a> FnMut(SurfaceEvent, wl_surface::WlSurface, CompositorToken, DispatchData<'a>) + 'static, { compositor.quick_assign(move |_compositor, request, _| match request { wl_compositor::Request::CreateSurface { id } => { @@ -42,7 +42,8 @@ where * wl_surface */ -type SurfaceImplemFn = dyn FnMut(SurfaceEvent, wl_surface::WlSurface, CompositorToken); +type SurfaceImplemFn = + dyn for<'a> FnMut(SurfaceEvent, wl_surface::WlSurface, CompositorToken, DispatchData<'a>); // Internal implementation data of surfaces pub(crate) struct SurfaceImplem { @@ -53,7 +54,8 @@ pub(crate) struct SurfaceImplem { impl SurfaceImplem { fn make(log: ::slog::Logger, implem: Rc>) -> SurfaceImplem where - Impl: FnMut(SurfaceEvent, wl_surface::WlSurface, CompositorToken) + 'static, + Impl: for<'a> FnMut(SurfaceEvent, wl_surface::WlSurface, CompositorToken, DispatchData<'a>) + + 'static, { SurfaceImplem { log, implem } } @@ -63,7 +65,12 @@ impl SurfaceImplem where R: 'static, { - fn receive_surface_request(&mut self, req: wl_surface::Request, surface: wl_surface::WlSurface) { + fn receive_surface_request<'a>( + &mut self, + req: wl_surface::Request, + surface: wl_surface::WlSurface, + ddata: DispatchData<'a>, + ) { match req { wl_surface::Request::Attach { buffer, x, y } => { SurfaceData::::with_data(&surface, |d| { @@ -103,7 +110,7 @@ where wl_surface::Request::Commit => { let mut user_impl = self.implem.borrow_mut(); trace!(self.log, "Calling user implementation for wl_surface.commit"); - (&mut *user_impl)(SurfaceEvent::Commit, surface, CompositorToken::make()); + (&mut *user_impl)(SurfaceEvent::Commit, surface, CompositorToken::make(), ddata); } wl_surface::Request::SetBufferTransform { transform } => { SurfaceData::::with_data(&surface, |d| d.buffer_transform = transform); @@ -131,11 +138,11 @@ fn implement_surface( ) -> wl_surface::WlSurface where R: Default + Send + 'static, - Impl: FnMut(SurfaceEvent, wl_surface::WlSurface, CompositorToken) + 'static, + Impl: for<'a> FnMut(SurfaceEvent, wl_surface::WlSurface, CompositorToken, DispatchData<'a>) + 'static, { surface.quick_assign({ let mut implem = SurfaceImplem::make(log, implem); - move |surface, req, _| implem.receive_surface_request(req, surface.deref().clone()) + move |surface, req, ddata| implem.receive_surface_request(req, surface.deref().clone(), ddata) }); surface.assign_destructor(Filter::new(|surface, _, _| SurfaceData::::cleanup(&surface))); surface.as_ref().user_data().set_threadsafe(SurfaceData::::new); diff --git a/src/wayland/compositor/mod.rs b/src/wayland/compositor/mod.rs index 70175b3..9d6a3ee 100644 --- a/src/wayland/compositor/mod.rs +++ b/src/wayland/compositor/mod.rs @@ -39,7 +39,7 @@ //! // Call the init function: //! let (token, _, _) = compositor_init::( //! &mut display, -//! |request, surface, compositor_token| { +//! |request, surface, compositor_token, dispatch_data| { //! /* //! Your handling of the user requests. //! */ @@ -84,7 +84,7 @@ use wayland_server::{ protocol::{ wl_buffer, wl_callback, wl_compositor, wl_output, wl_region, wl_subcompositor, wl_surface::WlSurface, }, - Display, Filter, Global, UserDataMap, + DispatchData, Display, Filter, Global, UserDataMap, }; /// Description of a part of a surface that @@ -514,7 +514,7 @@ pub fn compositor_init( where L: Into>, R: Default + RoleType + Role + Send + 'static, - Impl: FnMut(SurfaceEvent, WlSurface, CompositorToken) + 'static, + Impl: for<'a> FnMut(SurfaceEvent, WlSurface, CompositorToken, DispatchData<'a>) + 'static, { let log = crate::slog_or_fallback(logger).new(o!("smithay_module" => "compositor_handler")); let implem = Rc::new(RefCell::new(implem)); diff --git a/src/wayland/data_device/mod.rs b/src/wayland/data_device/mod.rs index b585985..1baeffb 100644 --- a/src/wayland/data_device/mod.rs +++ b/src/wayland/data_device/mod.rs @@ -41,7 +41,7 @@ //! define_roles!(Roles => [DnDIcon, DnDIconRole]); //! //! # let mut display = wayland_server::Display::new(); -//! # let (compositor_token, _, _) = compositor_init::(&mut display, |_, _, _| {}, None); +//! # let (compositor_token, _, _) = compositor_init::(&mut display, |_, _, _, _| {}, None); //! // init the data device: //! init_data_device( //! &mut display, // the display diff --git a/src/wayland/explicit_synchronization/mod.rs b/src/wayland/explicit_synchronization/mod.rs index 0a8012f..bf826b5 100644 --- a/src/wayland/explicit_synchronization/mod.rs +++ b/src/wayland/explicit_synchronization/mod.rs @@ -31,7 +31,7 @@ //! # let mut display = wayland_server::Display::new(); //! # let (compositor_token, _, _) = smithay::wayland::compositor::compositor_init::( //! # &mut display, -//! # |_, _, _| {}, +//! # |_, _, _, _| {}, //! # None //! # ); //! init_explicit_synchronization_global( diff --git a/src/wayland/seat/mod.rs b/src/wayland/seat/mod.rs index 2281b7b..447d93f 100644 --- a/src/wayland/seat/mod.rs +++ b/src/wayland/seat/mod.rs @@ -18,7 +18,7 @@ //! define_roles!(Roles => [CursorImage, CursorImageRole]); //! //! # let mut display = wayland_server::Display::new(); -//! # let (compositor_token, _, _) = compositor_init::(&mut display, |_, _, _| {}, None); +//! # let (compositor_token, _, _) = compositor_init::(&mut display, |_, _, _, _| {}, None); //! // insert the seat: //! let (seat, seat_global) = Seat::new( //! &mut display, // the display @@ -204,7 +204,7 @@ impl Seat { /// # define_roles!(Roles => [CursorImage, CursorImageRole]); /// # /// # let mut display = wayland_server::Display::new(); - /// # let (compositor_token, _, _) = compositor_init::(&mut display, |_, _, _| {}, None); + /// # let (compositor_token, _, _) = compositor_init::(&mut display, |_, _, _, _| {}, None); /// # let (mut seat, seat_global) = Seat::new( /// # &mut display, /// # "seat-0".into(), diff --git a/src/wayland/shell/legacy/mod.rs b/src/wayland/shell/legacy/mod.rs index 01b1a3a..20c89ae 100644 --- a/src/wayland/shell/legacy/mod.rs +++ b/src/wayland/shell/legacy/mod.rs @@ -45,7 +45,7 @@ //! # let mut display = wayland_server::Display::new(); //! # let (compositor_token, _, _) = smithay::wayland::compositor::compositor_init::( //! # &mut display, -//! # |_, _, _| {}, +//! # |_, _, _, _| {}, //! # None //! # ); //! let (shell_state, _) = wl_shell_init( diff --git a/src/wayland/shell/xdg/mod.rs b/src/wayland/shell/xdg/mod.rs index 7e3c2b7..f66232b 100644 --- a/src/wayland/shell/xdg/mod.rs +++ b/src/wayland/shell/xdg/mod.rs @@ -50,7 +50,7 @@ //! # let mut display = wayland_server::Display::new(); //! # let (compositor_token, _, _) = smithay::wayland::compositor::compositor_init::( //! # &mut display, -//! # |_, _, _| {}, +//! # |_, _, _, _| {}, //! # None //! # ); //! let (shell_state, _, _) = xdg_shell_init(