wayland.compositor: DispatchData available in the callback
This commit is contained in:
parent
aaa6e625e9
commit
3f01f978f8
|
@ -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<RefCell<MyWindowMap>>,
|
||||
}
|
||||
|
||||
pub fn init_shell(
|
||||
pub fn init_shell<Backend: 'static>(
|
||||
display: &mut Display,
|
||||
#[cfg(feature = "egl")] egl_reader: Rc<RefCell<Option<EGLBufferReader>>>,
|
||||
log: ::slog::Logger,
|
||||
) -> ShellHandles {
|
||||
// TODO: this is awkward...
|
||||
let almost_window_map = Rc::new(RefCell::new(None::<Rc<RefCell<MyWindowMap>>>));
|
||||
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::<AnvilState<Backend>>().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();
|
||||
|
|
|
@ -97,7 +97,7 @@ impl<Backend: Default + 'static> AnvilState<Backend> {
|
|||
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::<Backend>(&mut display.borrow_mut(), egl_reader, log.clone());
|
||||
#[cfg(not(feature = "egl"))]
|
||||
let shell_handles = init_shell(&mut display.borrow_mut(), log.clone());
|
||||
|
||||
|
|
|
@ -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<R, Impl>(
|
|||
) -> wl_compositor::WlCompositor
|
||||
where
|
||||
R: Default + Send + 'static,
|
||||
Impl: FnMut(SurfaceEvent, wl_surface::WlSurface, CompositorToken<R>) + 'static,
|
||||
Impl: for<'a> FnMut(SurfaceEvent, wl_surface::WlSurface, CompositorToken<R>, 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<R> = dyn FnMut(SurfaceEvent, wl_surface::WlSurface, CompositorToken<R>);
|
||||
type SurfaceImplemFn<R> =
|
||||
dyn for<'a> FnMut(SurfaceEvent, wl_surface::WlSurface, CompositorToken<R>, DispatchData<'a>);
|
||||
|
||||
// Internal implementation data of surfaces
|
||||
pub(crate) struct SurfaceImplem<R> {
|
||||
|
@ -53,7 +54,8 @@ pub(crate) struct SurfaceImplem<R> {
|
|||
impl<R> SurfaceImplem<R> {
|
||||
fn make<Impl>(log: ::slog::Logger, implem: Rc<RefCell<Impl>>) -> SurfaceImplem<R>
|
||||
where
|
||||
Impl: FnMut(SurfaceEvent, wl_surface::WlSurface, CompositorToken<R>) + 'static,
|
||||
Impl: for<'a> FnMut(SurfaceEvent, wl_surface::WlSurface, CompositorToken<R>, DispatchData<'a>)
|
||||
+ 'static,
|
||||
{
|
||||
SurfaceImplem { log, implem }
|
||||
}
|
||||
|
@ -63,7 +65,12 @@ impl<R> SurfaceImplem<R>
|
|||
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::<R>::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::<R>::with_data(&surface, |d| d.buffer_transform = transform);
|
||||
|
@ -131,11 +138,11 @@ fn implement_surface<R, Impl>(
|
|||
) -> wl_surface::WlSurface
|
||||
where
|
||||
R: Default + Send + 'static,
|
||||
Impl: FnMut(SurfaceEvent, wl_surface::WlSurface, CompositorToken<R>) + 'static,
|
||||
Impl: for<'a> FnMut(SurfaceEvent, wl_surface::WlSurface, CompositorToken<R>, 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::<R>::cleanup(&surface)));
|
||||
surface.as_ref().user_data().set_threadsafe(SurfaceData::<R>::new);
|
||||
|
|
|
@ -39,7 +39,7 @@
|
|||
//! // Call the init function:
|
||||
//! let (token, _, _) = compositor_init::<MyRoles, _, _>(
|
||||
//! &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<R, Impl, L>(
|
|||
where
|
||||
L: Into<Option<::slog::Logger>>,
|
||||
R: Default + RoleType + Role<SubsurfaceRole> + Send + 'static,
|
||||
Impl: FnMut(SurfaceEvent, WlSurface, CompositorToken<R>) + 'static,
|
||||
Impl: for<'a> FnMut(SurfaceEvent, WlSurface, CompositorToken<R>, DispatchData<'a>) + 'static,
|
||||
{
|
||||
let log = crate::slog_or_fallback(logger).new(o!("smithay_module" => "compositor_handler"));
|
||||
let implem = Rc::new(RefCell::new(implem));
|
||||
|
|
|
@ -41,7 +41,7 @@
|
|||
//! define_roles!(Roles => [DnDIcon, DnDIconRole]);
|
||||
//!
|
||||
//! # let mut display = wayland_server::Display::new();
|
||||
//! # let (compositor_token, _, _) = compositor_init::<Roles, _, _>(&mut display, |_, _, _| {}, None);
|
||||
//! # let (compositor_token, _, _) = compositor_init::<Roles, _, _>(&mut display, |_, _, _, _| {}, None);
|
||||
//! // init the data device:
|
||||
//! init_data_device(
|
||||
//! &mut display, // the display
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
//! # let mut display = wayland_server::Display::new();
|
||||
//! # let (compositor_token, _, _) = smithay::wayland::compositor::compositor_init::<MyRoles, _, _>(
|
||||
//! # &mut display,
|
||||
//! # |_, _, _| {},
|
||||
//! # |_, _, _, _| {},
|
||||
//! # None
|
||||
//! # );
|
||||
//! init_explicit_synchronization_global(
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
//! define_roles!(Roles => [CursorImage, CursorImageRole]);
|
||||
//!
|
||||
//! # let mut display = wayland_server::Display::new();
|
||||
//! # let (compositor_token, _, _) = compositor_init::<Roles, _, _>(&mut display, |_, _, _| {}, None);
|
||||
//! # let (compositor_token, _, _) = compositor_init::<Roles, _, _>(&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::<Roles, _, _>(&mut display, |_, _, _| {}, None);
|
||||
/// # let (compositor_token, _, _) = compositor_init::<Roles, _, _>(&mut display, |_, _, _, _| {}, None);
|
||||
/// # let (mut seat, seat_global) = Seat::new(
|
||||
/// # &mut display,
|
||||
/// # "seat-0".into(),
|
||||
|
|
|
@ -45,7 +45,7 @@
|
|||
//! # let mut display = wayland_server::Display::new();
|
||||
//! # let (compositor_token, _, _) = smithay::wayland::compositor::compositor_init::<MyRoles, _, _>(
|
||||
//! # &mut display,
|
||||
//! # |_, _, _| {},
|
||||
//! # |_, _, _, _| {},
|
||||
//! # None
|
||||
//! # );
|
||||
//! let (shell_state, _) = wl_shell_init(
|
||||
|
|
|
@ -50,7 +50,7 @@
|
|||
//! # let mut display = wayland_server::Display::new();
|
||||
//! # let (compositor_token, _, _) = smithay::wayland::compositor::compositor_init::<MyRoles, _, _>(
|
||||
//! # &mut display,
|
||||
//! # |_, _, _| {},
|
||||
//! # |_, _, _, _| {},
|
||||
//! # None
|
||||
//! # );
|
||||
//! let (shell_state, _, _) = xdg_shell_init(
|
||||
|
|
Loading…
Reference in New Issue