Read pen and finger Pointer Events in the web shell (capture phase) instead of
eframe's touch handlers, which can't tell a pen from a finger and see every
touch twice. The pen drives the pointer with its pressure and hovers; fingers
are touch contacts for pinch, two-finger pan and undo/redo taps. Once a pen
has been seen (remembered in localStorage), a finger or a resting palm never
presses a tool on the canvas, and a pen landing cancels fingers already down.
A long press drops the tool press and opens the context menu.
The page no longer scrolls, zooms or selects under touch, and the canvas
stays inside the safe areas of a full-screen app.
Preferences › Devices › Enable Touch Gestures (on by default) was stored
but nothing read it: no touch gesture was implemented.
- `touch::Taps` follows the fingers egui reports (winit reads them from
the system: WM_POINTER on Windows): fingers down together and lifted
within half a second, none moved more than 16 points, is a tap. Two
fingers undo, three redo, with the preference on.
- egui makes the first finger the pointer too, so it has pressed on the
canvas by the time a second lands: that press is dropped then (its tool
interaction rolled back), and the rest of the gesture presses nothing.
The tap so undoes what came before it, not the first finger's mark.
- A pen is one contact, so pen strokes and taps are unaffected; pinch zoom
is unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>