Input vocabulary, defined in crcbl_core::input and re-exported so a
consumer of the event stream needs one use rather than two.
See the crate docs for why these live in crcbl-core.
One finger on a touchscreen, for as long as it stays down.
Unique among the contacts that are down at the same moment, stable from the
TouchPhase::Began that starts a gesture to the
Ended or Cancelled that
finishes it, and free to be reused after that. Those three sentences are
the whole contract, and the third is the one that bites: a consumer keying
per-gesture state off this — which finger is holding the movement stick —
must drop that state when the contact ends, or the next finger to land
inherits it.
A contact is not a device. Two fingers on one screen are one DeviceId and
two ContactIds, which is exactly why the id could not be folded into the
device: a per-device registry cannot represent a second finger.
The numbering is the platform’s (a browser pointerId, a wl_touch id, a
Win32 pointer id) and is meaningless to compare against a literal or across
windows — like Scancode, it exists to be matched against other ids from
the same stream.