Skip to main content

PenPacket

Struct PenPacket 

Source
pub struct PenPacket {
    pub tool: PenKind,
    pub position: Point,
    pub pressure: f32,
    pub tilt: Option<(f32, f32)>,
    pub twist: Option<f32>,
    pub buttons: PenButtons,
    pub in_proximity: bool,
    pub down: bool,
    pub device_time_ms: Option<u32>,
}
Expand description

One digitizer packet, normalised.

A packet is a level, not an edge: it describes the tool’s complete state at one instant, and the translator derives the transitions (enter, down, up, leave, button changes) by comparing consecutive packets. That is the shape both backends produce naturally — Wayland accumulates axes and commits them on frame, Win32 fills one POINTER_PEN_INFO per message — and it means a dropped packet costs a sample, never a stuck button.

Fields§

§tool: PenKind

The tool the digitizer says is in use. The eraser end is a tool, not a button.

§position: Point

Window-logical position, already divided by the window’s scale factor.

§pressure: f32

Normalised tip pressure, 0.0..=1.0. 0.0 while hovering.

§tilt: Option<(f32, f32)>

(tilt_x, tilt_y) in degrees, each -90.0..=90.0, or None when the tool has no tilt axis.

§twist: Option<f32>

Barrel rotation in degrees, 0.0..=359.0, or None when the tool has no rotation axis.

§buttons: PenButtons

The stylus buttons held.

§in_proximity: bool

Whether the tool is within the digitizer’s detection range. A packet with in_proximity: false ends the hover session.

§down: bool

Whether the tip is touching the surface.

§device_time_ms: Option<u32>

The device’s own millisecond counter, on whatever clock the OS uses, or None from a source that has no clock at all.

Deliberately not an EventTime: the epoch is unknown. Wayland’s frame time is the compositor’s, Win32’s dwTime is GetTickCount’s, and neither has a known offset from the tree’s epoch, so as an absolute this number is a lie dressed as precision.

Within one drained batch it is exact as a relative, and that is the only way it is ever read: back_date places a batch on the tree’s timeline by anchoring the newest packet at the poll’s now and walking backwards through these deltas. That is what stops twenty packets spanning one drain from all claiming a single instant, which is what they did while this field did not exist.

A u32 because both platforms report one, wrap included: back_date reads the deltas with wrapping_sub, so a counter rolling over inside a batch costs nothing.

Implementations§

Source§

impl PenPacket

Source

pub fn hovering(tool: PenKind, position: Point) -> Self

A hovering packet: in proximity, tip up, no pressure, no buttons.

Source

pub fn out_of_proximity(tool: PenKind, position: Point) -> Self

The packet a tool leaving the digitizer’s range produces. Position is the last known one — the tool did not move, it stopped being seen.

Source

pub fn down_at(self, pressure: f32) -> Self

This packet with the tip in contact at pressure.

Source

pub const fn at_device_ms(self, ms: u32) -> Self

This packet stamped with the device’s own millisecond counter.

The value a shim reads off the digitizer — Wayland’s frame time, Win32’s dwTime. See device_time_ms for why it stays a raw counter rather than becoming an EventTime.

Trait Implementations§

Source§

impl Clone for PenPacket

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for PenPacket

Source§

impl Debug for PenPacket

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for PenPacket

Source§

fn eq(&self, other: &Self) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for PenPacket

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> Downcast<T> for T

Source§

fn downcast(&self) -> &T

Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send> ⓘ

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> Upcast<T> for T

Source§

fn upcast(&self) -> Option<&T>

Source§

impl<T> WasmNotSend for T
where T: Send,

Source§

impl<T> WasmNotSendSync for T

Source§

impl<T> WasmNotSync for T
where T: Sync,

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more