pub struct Keystroke {
pub modifiers: Modifiers,
pub key: String,
pub key_char: Option<String>,
}Expand description
A key press, with the modifier keys that were held when it happened.
The platform creates a keystroke for each key press. To write one by hand, as a binding or a
test does, parse it from a string with Keystroke::parse:
let keystroke = Keystroke::parse("ctrl-shift-z").unwrap();
assert!(keystroke.modifiers.control);
assert!(keystroke.modifiers.shift);
assert_eq!(keystroke.key, "z");See keyboard input for the bigger picture.
Fields§
§modifiers: ModifiersThe modifier keys held when the key was pressed.
key: StringThe key that was pressed, named after the character printed on it, such as s, or a
name such as enter or pageup for keys without a character.
For option-s on macOS this is s, not ß. On layouts without ASCII letters, such as Thai,
this is the ASCII equivalent of the key, and the typed character is in key_char.
key_char: Option<String>The text the key would type with the current layout and modifiers, if any.
This is Some("s") for s, Some("ß") for option-s on a US macOS layout, and None for
cmd-s, because cmd doesn’t type text.
Implementations§
Source§impl Keystroke
impl Keystroke
Sourcepub fn should_match(&self, target: &KeybindingKeystroke) -> bool
pub fn should_match(&self, target: &KeybindingKeystroke) -> bool
Returns whether this keystroke, as typed, matches a keystroke in a keymap.
self is the keystroke the user typed and target is the one from the binding. Matching
first compares modifiers and key. It also accepts a target whose key is this keystroke’s
key_char, when the target’s modifiers are exactly this keystroke’s ctrl and cmd (on
Windows, when the target has no modifiers). That covers layouts where a binding
key sits behind option, such as $ on a Czech keyboard typed as alt-ç, and input methods
that turn a sequence of keys into one character.
Sourcepub fn parse(source: &str) -> Result<Self, InvalidKeystrokeError>
pub fn parse(source: &str) -> Result<Self, InvalidKeystrokeError>
Parses a keystroke from text such as cmd-s, ctrl-shift-tab or cmd--.
The syntax is zero or more modifiers, then a key, separated by -:
- Modifiers are
ctrl,alt,shift,fn,secondary,cmd,superandwin. They can come in any order and any case.cmd,superandwinall setModifiers::platform.secondarysetscmdon macOS andctrlon other platforms, which is whatModifiers::secondaryreports. - The key is the last part. Any other part must be a modifier. Key names are
case-insensitive and stored in lowercase, so
Tabandtabare the same key. Other text is accepted as a key without checking, but the names that platforms produce arespace,tab,enter,backspace,escape,delete,insert,home,end,pageup,pagedown,up,down,left,rightand function keys such asf1. - A single uppercase letter sets
shiftand uses the lowercase letter as the key, soSisshift-s. - A key of
-is written as an extra dash, socmd--iscmdand-. - A modifier with no key becomes the key. The first of
shift,ctrl,alt,cmdandfnthat is present is used, in that order. Its key is namedshift,control,alt,platformorfunction, and that modifier is cleared. Soctrlalone is the keycontrolwith no modifiers set. key->key_charsetskey_charto the text after->, for examplealt-s->ß.Keystroke::should_matchignores it when matching a binding.
§Errors
Returns InvalidKeystrokeError if a part before the key isn’t a modifier, as in
ctrl-a-b, or if -> isn’t followed by a key character.
§Examples
let save = Keystroke::parse("secondary-s").unwrap();
assert!(save.modifiers.secondary());
assert_eq!(save.key, "s");
let shifted = Keystroke::parse("S").unwrap();
assert!(shifted.modifiers.shift);
assert_eq!(shifted.key, "s");
assert!(Keystroke::parse("ctrl-a-b").is_err());See keyboard input for how bindings use these.
Sourcepub fn unparse(&self) -> String
pub fn unparse(&self) -> String
Returns text that Keystroke::parse reads back as this keystroke.
The platform’s name for cmd is used: cmd on macOS, super on Linux and win on
Windows. key_char is not included, so the result doesn’t round-trip when it is set.
Sourcepub fn is_ime_in_progress(&self) -> bool
pub fn is_ime_in_progress(&self) -> bool
Returns whether an input method is still composing text for this keystroke.
This is true when key_char is None, the key is printable or empty (not a named key such
as escape or f1), and none of cmd, ctrl, fn or alt is held. shift alone
doesn’t count.
Sourcepub fn with_simulated_ime(self) -> Self
pub fn with_simulated_ime(self) -> Self
Returns this keystroke with key_char set to the text it would type.
Simulated keystrokes use this so that they type text as a real key press does. It only
applies when key_char is None and none of cmd, ctrl, fn or alt is held. space,
tab and enter type a space, a tab and a newline. Other printable keys type their
character, uppercased when shift is held.
Trait Implementations§
Source§impl AsKeystroke for Keystroke
impl AsKeystroke for Keystroke
Source§fn as_keystroke(&self) -> &Keystroke
fn as_keystroke(&self) -> &Keystroke
Keystroke this value represents.Source§impl<'de> Deserialize<'de> for Keystroke
impl<'de> Deserialize<'de> for Keystroke
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
impl Eq for Keystroke
impl StructuralPartialEq for Keystroke
Auto Trait Implementations§
impl Freeze for Keystroke
impl RefUnwindSafe for Keystroke
impl Send for Keystroke
impl Sync for Keystroke
impl Unpin for Keystroke
impl UnsafeUnpin for Keystroke
impl UnwindSafe for Keystroke
Blanket Implementations§
Source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
D: AdaptFrom<S, Swp, Dwp, T>,
impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
D: AdaptFrom<S, Swp, Dwp, T>,
Source§fn adapt_into_using<M>(self, method: M) -> Dwhere
M: TransformMatrix<T>,
fn adapt_into_using<M>(self, method: M) -> Dwhere
M: TransformMatrix<T>,
replaced by palette::chromatic_adaptation::AdaptIntoUnclamped
Source§fn adapt_into(self) -> D
fn adapt_into(self) -> D
replaced by palette::chromatic_adaptation::AdaptIntoUnclamped
Source§impl<T, C> AdaptIntoUnclamped<T> for Cwhere
T: AdaptFromUnclamped<C>,
impl<T, C> AdaptIntoUnclamped<T> for Cwhere
T: AdaptFromUnclamped<C>,
Source§type Scalar = <T as AdaptFromUnclamped<C>>::Scalar
type Scalar = <T as AdaptFromUnclamped<C>>::Scalar
Source§fn adapt_into_unclamped_with<M>(self) -> Twhere
M: LmsToXyz<<C as AdaptIntoUnclamped<T>>::Scalar> + XyzToLms<<C as AdaptIntoUnclamped<T>>::Scalar>,
fn adapt_into_unclamped_with<M>(self) -> Twhere
M: LmsToXyz<<C as AdaptIntoUnclamped<T>>::Scalar> + XyzToLms<<C as AdaptIntoUnclamped<T>>::Scalar>,
Source§impl<T, C> ArraysFrom<C> for Twhere
C: IntoArrays<T>,
impl<T, C> ArraysFrom<C> for Twhere
C: IntoArrays<T>,
Source§fn arrays_from(colors: C) -> T
fn arrays_from(colors: C) -> T
Source§impl<T, C> ArraysInto<C> for Twhere
C: FromArrays<T>,
impl<T, C> ArraysInto<C> for Twhere
C: FromArrays<T>,
Source§fn arrays_into(self) -> C
fn arrays_into(self) -> C
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
T: FromCam16Unclamped<WpParam, U>,
impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
T: FromCam16Unclamped<WpParam, U>,
Source§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
parameters when converting.Source§fn cam16_into_unclamped(
self,
parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>,
) -> T
fn cam16_into_unclamped( self, parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>, ) -> T
self into C, using the provided parameters.impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
impl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
Source§fn components_from(colors: C) -> T
fn components_from(colors: C) -> T
Source§impl<T, C> ComponentsInto<C> for T
impl<T, C> ComponentsInto<C> for T
Source§fn components_into(self) -> C
fn components_into(self) -> C
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<T> FromAngle<T> for T
impl<T> FromAngle<T> for T
Source§fn from_angle(angle: T) -> T
fn from_angle(angle: T) -> T
angle.Source§impl<T, U> FromStimulus<U> for Twhere
U: IntoStimulus<T>,
impl<T, U> FromStimulus<U> for Twhere
U: IntoStimulus<T>,
Source§fn from_stimulus(other: U) -> T
fn from_stimulus(other: U) -> T
other into Self, while performing the appropriate scaling,
rounding and clamping.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T, U> IntoAngle<U> for Twhere
U: FromAngle<T>,
impl<T, U> IntoAngle<U> for Twhere
U: FromAngle<T>,
Source§fn into_angle(self) -> U
fn into_angle(self) -> U
T.Source§impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
T: Cam16FromUnclamped<WpParam, U>,
impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
T: Cam16FromUnclamped<WpParam, U>,
Source§type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
parameters when converting.Source§fn into_cam16_unclamped(
self,
parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>,
) -> T
fn into_cam16_unclamped( self, parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>, ) -> T
self into C, using the provided parameters.Source§impl<T, U> IntoColor<U> for Twhere
U: FromColor<T>,
impl<T, U> IntoColor<U> for Twhere
U: FromColor<T>,
Source§fn into_color(self) -> U
fn into_color(self) -> U
Source§impl<T, U> IntoColorUnclamped<U> for Twhere
U: FromColorUnclamped<T>,
impl<T, U> IntoColorUnclamped<U> for Twhere
U: FromColorUnclamped<T>,
Source§fn into_color_unclamped(self) -> U
fn into_color_unclamped(self) -> U
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoStimulus<T> for T
impl<T> IntoStimulus<T> for T
Source§fn into_stimulus(self) -> T
fn into_stimulus(self) -> T
self into T, while performing the appropriate scaling,
rounding and clamping.Source§impl<T> Pointable for T
impl<T> Pointable for T
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<R, P> ReadPrimitive<R> for P
impl<R, P> ReadPrimitive<R> for P
Source§fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
ReadEndian::read_from_little_endian().Source§impl<T, C> TryComponentsInto<C> for Twhere
C: TryFromComponents<T>,
impl<T, C> TryComponentsInto<C> for Twhere
C: TryFromComponents<T>,
Source§type Error = <C as TryFromComponents<T>>::Error
type Error = <C as TryFromComponents<T>>::Error
try_into_colors fails to cast.Source§fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
Source§impl<T, U> TryIntoColor<U> for Twhere
U: TryFromColor<T>,
impl<T, U> TryIntoColor<U> for Twhere
U: TryFromColor<T>,
Source§fn try_into_color(self) -> Result<U, OutOfBounds<U>>
fn try_into_color(self) -> Result<U, OutOfBounds<U>>
OutOfBounds error is returned which contains
the unclamped color. Read more