Add wl_touch support

Fixes #1
This commit is contained in:
Shawn Wallace 2024-04-29 19:35:46 -04:00
parent 7aaf98e5e0
commit e70cb81751
4 changed files with 78 additions and 3 deletions

View file

@ -6,6 +6,7 @@ use wayland_client::protocol::{
wl_buffer::WlBuffer, wl_callback::WlCallback, wl_compositor::WlCompositor, wl_buffer::WlBuffer, wl_callback::WlCallback, wl_compositor::WlCompositor,
wl_keyboard::WlKeyboard, wl_output::WlOutput, wl_pointer::WlPointer, wl_registry::WlRegistry, wl_keyboard::WlKeyboard, wl_output::WlOutput, wl_pointer::WlPointer, wl_registry::WlRegistry,
wl_seat::WlSeat, wl_shm::WlShm, wl_shm_pool::WlShmPool, wl_surface::WlSurface, wl_seat::WlSeat, wl_shm::WlShm, wl_shm_pool::WlShmPool, wl_surface::WlSurface,
wl_touch::WlTouch,
}; };
use wayland_client::{delegate_noop, Connection, Dispatch, EventQueue, Proxy, QueueHandle}; use wayland_client::{delegate_noop, Connection, Dispatch, EventQueue, Proxy, QueueHandle};
use wayland_protocols::wp::relative_pointer::zv1::client::{ use wayland_protocols::wp::relative_pointer::zv1::client::{
@ -198,3 +199,4 @@ push_events!(ZwpRelativePointerV1);
push_events!(WlDrm); push_events!(WlDrm);
push_events!(DmabufFeedback); push_events!(DmabufFeedback);
push_events!(XdgOutput); push_events!(XdgOutput);
push_events!(WlTouch);

View file

@ -27,7 +27,7 @@ use wayland_server::{
protocol::{ protocol::{
wl_buffer::WlBuffer, wl_callback::WlCallback, wl_compositor::WlCompositor, wl_buffer::WlBuffer, wl_callback::WlCallback, wl_compositor::WlCompositor,
wl_keyboard::WlKeyboard, wl_output::WlOutput, wl_pointer::WlPointer, wl_seat::WlSeat, wl_keyboard::WlKeyboard, wl_output::WlOutput, wl_pointer::WlPointer, wl_seat::WlSeat,
wl_shm::WlShm, wl_shm_pool::WlShmPool, wl_surface::WlSurface, wl_shm::WlShm, wl_shm_pool::WlShmPool, wl_surface::WlSurface, wl_touch::WlTouch,
}, },
Dispatch, DisplayHandle, GlobalDispatch, Resource, Dispatch, DisplayHandle, GlobalDispatch, Resource,
}; };
@ -313,6 +313,27 @@ impl<C: XConnection> Dispatch<WlKeyboard, ObjectKey> for ServerState<C> {
} }
} }
impl<C: XConnection> Dispatch<WlTouch, ObjectKey> for ServerState<C> {
fn request(
state: &mut Self,
_: &wayland_server::Client,
_: &WlTouch,
request: <WlTouch as Resource>::Request,
key: &ObjectKey,
_: &DisplayHandle,
_: &mut wayland_server::DataInit<'_, Self>,
) {
match request {
Request::<WlTouch>::Release => {
let Touch { client, .. }: &_ = state.objects[*key].as_ref();
client.release();
state.objects.remove(*key);
}
_ => unreachable!(),
}
}
}
impl<C: XConnection> Dispatch<WlSeat, ObjectKey> for ServerState<C> { impl<C: XConnection> Dispatch<WlSeat, ObjectKey> for ServerState<C> {
fn request( fn request(
state: &mut Self, state: &mut Self,
@ -345,6 +366,16 @@ impl<C: XConnection> Dispatch<WlSeat, ObjectKey> for ServerState<C> {
Keyboard { client, server }.into() Keyboard { client, server }.into()
}); });
} }
Request::<WlSeat>::GetTouch { id } => {
state
.objects
.insert_from_other_objects([*key], |[seat_obj], key| {
let Seat { client, .. }: &Seat = seat_obj.try_into().unwrap();
let client = client.get_touch(&state.qh, key);
let server = data_init.init(id, key);
Touch { client, server }.into()
});
}
other => warn!("unhandled seat request: {other:?}"), other => warn!("unhandled seat request: {other:?}"),
} }
} }

View file

@ -17,7 +17,7 @@ use wayland_protocols::{
}; };
use wayland_server::protocol::{ use wayland_server::protocol::{
wl_buffer::WlBuffer, wl_keyboard::WlKeyboard, wl_output::WlOutput, wl_pointer::WlPointer, wl_buffer::WlBuffer, wl_keyboard::WlKeyboard, wl_output::WlOutput, wl_pointer::WlPointer,
wl_seat::WlSeat, wl_seat::WlSeat, wl_touch::WlTouch,
}; };
/// Lord forgive me, I am a sinner, who's probably gonna sin again /// Lord forgive me, I am a sinner, who's probably gonna sin again
@ -514,6 +514,47 @@ impl HandleEvent for Keyboard {
} }
} }
pub type Touch = GenericObject<WlTouch, client::wl_touch::WlTouch>;
impl HandleEvent for Touch {
type Event = client::wl_touch::Event;
fn handle_event<C: XConnection>(&mut self, event: Self::Event, state: &mut ServerState<C>) {
simple_event_shunt! {
self.server, event: client::wl_touch::Event => [
Down {
serial,
time,
|surface| state.get_server_surface_from_client(surface),
id,
x,
y
},
Up {
serial,
time,
id
},
Motion {
time,
id,
x,
y
},
Frame,
Cancel,
Shape {
id,
major,
minor
},
Orientation {
id,
orientation
}
]
}
}
}
pub type Output = GenericObject<WlOutput, client::wl_output::WlOutput>; pub type Output = GenericObject<WlOutput, client::wl_output::WlOutput>;
impl HandleEvent for Output { impl HandleEvent for Output {
type Event = client::wl_output::Event; type Event = client::wl_output::Event;

View file

@ -295,7 +295,8 @@ pub(crate) enum Object {
RelativePointer(RelativePointer), RelativePointer(RelativePointer),
DmabufFeedback(DmabufFeedback), DmabufFeedback(DmabufFeedback),
Drm(Drm), Drm(Drm),
XdgOutput(XdgOutput) XdgOutput(XdgOutput),
Touch(Touch)
} }
} }