diff --git a/src/server/dispatch.rs b/src/server/dispatch.rs index 5bad71b..21acf44 100644 --- a/src/server/dispatch.rs +++ b/src/server/dispatch.rs @@ -8,6 +8,7 @@ use wayland_protocols::{ wp::{ fractional_scale::v1::client::wp_fractional_scale_v1::WpFractionalScaleV1, linux_dmabuf::zv1::{client as c_dmabuf, server as s_dmabuf}, + linux_drm_syncobj::v1::{client as c_sync, server as s_sync}, pointer_constraints::zv1::{ client::zwp_confined_pointer_v1::ZwpConfinedPointerV1 as ConfinedPointerClient, client::zwp_locked_pointer_v1::ZwpLockedPointerV1 as LockedPointerClient, @@ -1232,6 +1233,107 @@ impl Dispatch + Dispatch< + s_sync::wp_linux_drm_syncobj_manager_v1::WpLinuxDrmSyncobjManagerV1, + ClientGlobalWrapper, + > for InnerServerState +{ + fn request( + state: &mut Self, + _: &Client, + _: &s_sync::wp_linux_drm_syncobj_manager_v1::WpLinuxDrmSyncobjManagerV1, + request: ::Request, + client: &ClientGlobalWrapper< + c_sync::wp_linux_drm_syncobj_manager_v1::WpLinuxDrmSyncobjManagerV1, + >, + _: &DisplayHandle, + data_init: &mut wayland_server::DataInit<'_, Self>, + ) { + use s_sync::wp_linux_drm_syncobj_manager_v1::Request; + match request { + Request::GetSurface { id, surface } => { + let c_surface = state + .world + .get::<&client::wl_surface::WlSurface>(surface.data().copied().unwrap()) + .unwrap(); + let client = client.get_surface(&c_surface, &state.qh, ()); + data_init.init(id, client); + } + Request::ImportTimeline { id, fd } => { + let timeline = client.import_timeline(fd.as_fd(), &state.qh, ()); + data_init.init(id, timeline); + } + Request::Destroy => { + client.destroy(); + } + other => warn!("unhandled drm syncobj request: {other:?}"), + } + } +} + +impl + Dispatch< + s_sync::wp_linux_drm_syncobj_surface_v1::WpLinuxDrmSyncobjSurfaceV1, + c_sync::wp_linux_drm_syncobj_surface_v1::WpLinuxDrmSyncobjSurfaceV1, + > for InnerServerState +{ + fn request( + _: &mut Self, + _: &Client, + _: &s_sync::wp_linux_drm_syncobj_surface_v1::WpLinuxDrmSyncobjSurfaceV1, + request: ::Request, + client: &c_sync::wp_linux_drm_syncobj_surface_v1::WpLinuxDrmSyncobjSurfaceV1, + _: &DisplayHandle, + _: &mut wayland_server::DataInit<'_, Self>, + ) { + use s_sync::wp_linux_drm_syncobj_surface_v1::Request; + match request { + Request::SetAcquirePoint { + timeline, + point_hi, + point_lo, + } => { + let c_timeline: &c_sync::wp_linux_drm_syncobj_timeline_v1::WpLinuxDrmSyncobjTimelineV1 = timeline.data().unwrap(); + client.set_acquire_point(c_timeline, point_hi, point_lo); + } + Request::SetReleasePoint { + timeline, + point_hi, + point_lo, + } => { + let c_timeline: &c_sync::wp_linux_drm_syncobj_timeline_v1::WpLinuxDrmSyncobjTimelineV1 = timeline.data().unwrap(); + client.set_release_point(c_timeline, point_hi, point_lo); + } + Request::Destroy => client.destroy(), + other => warn!("unhandled drm syncobj surface request: {other:?}"), + } + } +} + +impl + Dispatch< + s_sync::wp_linux_drm_syncobj_timeline_v1::WpLinuxDrmSyncobjTimelineV1, + c_sync::wp_linux_drm_syncobj_timeline_v1::WpLinuxDrmSyncobjTimelineV1, + > for InnerServerState +{ + fn request( + _: &mut Self, + _: &Client, + _: &s_sync::wp_linux_drm_syncobj_timeline_v1::WpLinuxDrmSyncobjTimelineV1, + request: ::Request, + client: &c_sync::wp_linux_drm_syncobj_timeline_v1::WpLinuxDrmSyncobjTimelineV1, + _: &DisplayHandle, + _: &mut wayland_server::DataInit<'_, Self>, + ) { + use s_sync::wp_linux_drm_syncobj_timeline_v1::Request; + match request { + Request::Destroy => client.destroy(), + other => warn!("unhandled drm syncobj timeline request: {other:?}"), + } + } +} + #[derive(Clone)] pub(crate) struct ClientGlobalWrapper(Arc>); impl std::ops::Deref for ClientGlobalWrapper { @@ -1322,6 +1424,10 @@ global_dispatch_no_events!( s_tablet::zwp_tablet_manager_v2::ZwpTabletManagerV2, c_tablet::zwp_tablet_manager_v2::ZwpTabletManagerV2 ); +global_dispatch_no_events!( + s_sync::wp_linux_drm_syncobj_manager_v1::WpLinuxDrmSyncobjManagerV1, + c_sync::wp_linux_drm_syncobj_manager_v1::WpLinuxDrmSyncobjManagerV1 +); impl GlobalDispatch for InnerServerState { fn bind( diff --git a/src/server/mod.rs b/src/server/mod.rs index 96bfcb1..a110fab 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -34,6 +34,7 @@ use wayland_protocols::{ wp::{ fractional_scale::v1::client::wp_fractional_scale_manager_v1::WpFractionalScaleManagerV1, linux_dmabuf::zv1::{client as c_dmabuf, server as s_dmabuf}, + linux_drm_syncobj::v1::server::wp_linux_drm_syncobj_manager_v1::WpLinuxDrmSyncobjManagerV1, pointer_constraints::zv1::{ client::{zwp_confined_pointer_v1, zwp_locked_pointer_v1}, server::zwp_pointer_constraints_v1::ZwpPointerConstraintsV1, @@ -370,7 +371,8 @@ fn handle_globals<'a, S: X11Selection + 'static>( s_dmabuf::zwp_linux_dmabuf_v1::ZwpLinuxDmabufV1, ZxdgOutputManagerV1, ZwpPointerConstraintsV1, - ZwpTabletManagerV2 + ZwpTabletManagerV2, + WpLinuxDrmSyncobjManagerV1 ]; } } diff --git a/testwl/src/lib.rs b/testwl/src/lib.rs index b3c9fcd..2304415 100644 --- a/testwl/src/lib.rs +++ b/testwl/src/lib.rs @@ -6,6 +6,7 @@ use std::os::fd::{AsFd, BorrowedFd, OwnedFd}; use std::os::unix::net::UnixStream; use std::sync::{Arc, Mutex, OnceLock}; use std::time::Instant; +use wayland_protocols::wp::linux_drm_syncobj::v1::server::wp_linux_drm_syncobj_manager_v1::WpLinuxDrmSyncobjManagerV1; use wayland_protocols::wp::primary_selection::zv1::server::zwp_primary_selection_device_manager_v1::ZwpPrimarySelectionDeviceManagerV1; use wayland_protocols::wp::primary_selection::zv1::server::zwp_primary_selection_device_v1::ZwpPrimarySelectionDeviceV1; use wayland_protocols::wp::primary_selection::zv1::server::zwp_primary_selection_offer_v1::ZwpPrimarySelectionOfferV1; @@ -476,6 +477,7 @@ impl Server { dh.create_global::(1, ()); global_noop!(ZwpLinuxDmabufV1); global_noop!(ZwpRelativePointerManagerV1); + global_noop!(WpLinuxDrmSyncobjManagerV1); struct HandlerData; impl ObjectData for HandlerData {