1
0
Fork 0
forked from wry/wry

ei: implement ei_touchscreen v2

This commit is contained in:
Julian Orth 2024-11-27 13:15:56 +01:00
parent 1495cc1f22
commit f27e4253a1
6 changed files with 43 additions and 5 deletions

View file

@ -3,6 +3,7 @@
- Various bugfixes. - Various bugfixes.
- Add support fo ext-data-control-v1. - Add support fo ext-data-control-v1.
- Implement wl-fixes. - Implement wl-fixes.
- Implement ei_touchscreen v2.
# 1.7.0 (2024-10-25) # 1.7.0 (2024-10-25)

View file

@ -233,6 +233,7 @@ impl EiDeviceRequestHandler for EiDevice {
seat.touch_motion_at(time, id, x, y); seat.touch_motion_at(time, id, x, y);
} }
TouchChange::Up => seat.touch_up(time, id), TouchChange::Up => seat.touch_up(time, id),
TouchChange::Cancel => seat.touch_cancel(time, id),
} }
} }
seat.touch_frame(time); seat.touch_frame(time);

View file

@ -197,6 +197,19 @@ impl EiSeat {
} }
} }
pub fn handle_touch_cancel(&self, id: u32) {
if self.is_sender() {
return;
}
if let Some(b) = self.touchscreen.get() {
if self.client.versions.ei_touchscreen() >= EiVersion(2) {
b.send_cancel(id);
} else {
b.send_up(id);
}
}
}
pub fn handle_touch_frame(&self, time_usec: u64) { pub fn handle_touch_frame(&self, time_usec: u64) {
if self.is_sender() { if self.is_sender() {
return; return;

View file

@ -10,8 +10,8 @@ use {
utils::clonecell::UnsafeCellCloneSafe, utils::clonecell::UnsafeCellCloneSafe,
wire_ei::{ wire_ei::{
ei_touchscreen::{ ei_touchscreen::{
ClientDown, ClientMotion, ClientUp, EiTouchscreenRequestHandler, Release, ClientCancel, ClientDown, ClientMotion, ClientUp, EiTouchscreenRequestHandler,
ServerDown, ServerMotion, ServerUp, Release, ServerCancel, ServerDown, ServerMotion, ServerUp,
}, },
EiTouchscreenId, EiTouchscreenId,
}, },
@ -33,6 +33,7 @@ pub enum TouchChange {
Down(f32, f32), Down(f32, f32),
Motion(f32, f32), Motion(f32, f32),
Up, Up,
Cancel,
} }
unsafe impl UnsafeCellCloneSafe for TouchChange {} unsafe impl UnsafeCellCloneSafe for TouchChange {}
@ -65,12 +66,22 @@ impl EiTouchscreen {
}); });
} }
pub fn send_cancel(&self, touchid: u32) {
self.client.event(ServerCancel {
self_id: self.id,
touchid,
});
}
fn set_client_event(&self, touchid: u32, event: TouchChange) -> Result<(), EiTouchscreenError> { fn set_client_event(&self, touchid: u32, event: TouchChange) -> Result<(), EiTouchscreenError> {
match self.device.touch_changes.lock().entry(touchid) { match self.device.touch_changes.lock().entry(touchid) {
Entry::Occupied(mut o) => { Entry::Occupied(mut o) => {
use TouchChange::*; use TouchChange::*;
match (o.get(), event) { match (o.get(), event) {
(Motion(_, _), Motion(_, _)) | (Down(_, _), Down(_, _)) | (Up, Up) => { (Motion(_, _), Motion(_, _))
| (Down(_, _), Down(_, _))
| (Up, Up)
| (Cancel, Cancel) => {
o.insert(event); o.insert(event);
Ok(()) Ok(())
} }
@ -104,6 +115,10 @@ impl EiTouchscreenRequestHandler for EiTouchscreen {
fn client_up(&self, req: ClientUp, _slf: &Rc<Self>) -> Result<(), Self::Error> { fn client_up(&self, req: ClientUp, _slf: &Rc<Self>) -> Result<(), Self::Error> {
self.set_client_event(req.touchid, TouchChange::Up) self.set_client_event(req.touchid, TouchChange::Up)
} }
fn client_cancel(&self, req: ClientCancel, _slf: &Rc<Self>) -> Result<(), Self::Error> {
self.set_client_event(req.touchid, TouchChange::Cancel)
}
} }
ei_object_base! { ei_object_base! {

View file

@ -761,9 +761,9 @@ impl WlSeatGlobal {
self.touch_owner.motion(self, time_usec, id, x, y); self.touch_owner.motion(self, time_usec, id, x, y);
} }
fn touch_cancel(self: &Rc<Self>, time_usec: u64, id: i32) { pub fn touch_cancel(self: &Rc<Self>, time_usec: u64, id: i32) {
self.for_each_ei_seat(|ei_seat| { self.for_each_ei_seat(|ei_seat| {
ei_seat.handle_touch_up(id as _); ei_seat.handle_touch_cancel(id as _);
}); });
self.state.for_each_seat_tester(|t| { self.state.for_each_seat_tester(|t| {
t.send_touch_cancel(self.id, time_usec, id); t.send_touch_cancel(self.id, time_usec, id);

View file

@ -17,6 +17,10 @@ request client_up (sender) {
touchid: u32, touchid: u32,
} }
request client_cancel (sender, since = 2) {
touchid: u32,
}
event destroyed { event destroyed {
serial: u32, serial: u32,
} }
@ -36,3 +40,7 @@ event server_motion (receiver) {
event server_up (receiver) { event server_up (receiver) {
touchid: u32, touchid: u32,
} }
event server_cancel (receiver, since = 2) {
touchid: u32,
}