winit-core:winit: add tablet input support

The API is integrated into the `WindowEvent::Pointer*` API and is
present in form of `TabletTool` variant on corresponding data entries.

For now implemented for Web, Windows, and with limitations for Wayland.

Fixes #99.

Co-authored-by: daxpedda <daxpedda@gmail.com>
This commit is contained in:
Kirill Chibisov
2025-10-07 21:42:36 +09:00
committed by GitHub
parent ffcdf80192
commit f046e778aa
23 changed files with 1206 additions and 204 deletions

View File

@@ -24,7 +24,7 @@ use crate::event_loop::ActiveEventLoop;
use crate::main_thread::MainThreadMarker;
use crate::monitor::MonitorHandler;
use crate::r#async::DispatchRunner;
use crate::web_sys::event::mouse_button_to_id;
use crate::web_sys::event::ButtonsState;
use crate::window::Inner;
use crate::{backend, event, EventLoop, PollStrategy, WaitUntilStrategy};
@@ -318,8 +318,10 @@ impl Shared {
// chorded button event
let device_id = event::mkdid(event.pointer_id());
if let Some(button) = backend::event::mouse_button(&event) {
let state = if backend::event::mouse_buttons(&event).contains(button.into()) {
if let Some(button) = backend::event::raw_button(&event) {
let state = if backend::event::pointer_buttons(&event)
.contains(ButtonsState::from_bits_retain(button))
{
ElementState::Pressed
} else {
ElementState::Released
@@ -327,10 +329,7 @@ impl Shared {
runner.send_event(Event::DeviceEvent {
device_id,
event: DeviceEvent::Button {
button: mouse_button_to_id(button).into(),
state,
},
event: DeviceEvent::Button { button: button.into(), state },
});
return;
@@ -338,14 +337,16 @@ impl Shared {
// pointer move event
let mut delta = backend::event::MouseDelta::init(&navigator, &event);
runner.send_events(backend::event::pointer_move_event(event).map(|event| {
let delta = delta.delta(&event).to_physical(backend::scale_factor(&window));
runner.send_events(backend::event::pointer_move_event(event).map(
|event: web_sys::PointerEvent| {
let delta = delta.delta(&event).to_physical(backend::scale_factor(&window));
Event::DeviceEvent {
device_id,
event: DeviceEvent::PointerMotion { delta: (delta.x, delta.y) },
}
}));
Event::DeviceEvent {
device_id,
event: DeviceEvent::PointerMotion { delta: (delta.x, delta.y) },
}
},
));
}),
));
let runner = self.clone();
@@ -375,11 +376,11 @@ impl Shared {
return;
}
let button = backend::event::mouse_button(&event).expect("no mouse button pressed");
let button = backend::event::raw_button(&event).expect("no pointer button pressed");
runner.send_event(Event::DeviceEvent {
device_id: event::mkdid(event.pointer_id()),
event: DeviceEvent::Button {
button: mouse_button_to_id(button).into(),
button: button.into(),
state: ElementState::Pressed,
},
});
@@ -394,11 +395,11 @@ impl Shared {
return;
}
let button = backend::event::mouse_button(&event).expect("no mouse button pressed");
let button = backend::event::raw_button(&event).expect("no pointer button pressed");
runner.send_event(Event::DeviceEvent {
device_id: event::mkdid(event.pointer_id()),
event: DeviceEvent::Button {
button: mouse_button_to_id(button).into(),
button: button.into(),
state: ElementState::Released,
},
});