ei: implement ei_touchscreen v2
This commit is contained in:
parent
1495cc1f22
commit
f27e4253a1
6 changed files with 43 additions and 5 deletions
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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! {
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue