pub enum Key<Str = SmolStr> {
Named(NamedKey),
Character(Str),
Unidentified(NativeKey),
Dead(Option<char>),
}
Expand description
Key represents the meaning of a keypress.
This is a superset of the UI Events Specification’s KeyboardEvent.key
with
additions:
- All simple variants are wrapped under the
Named
variant - The
Unidentified
variant here, can still identify a key through it’sNativeKeyCode
. - The
Dead
variant here, can specify the character which is inserted when pressing the dead-key twice.
Variants§
Named(NamedKey)
A simple (unparameterised) action
Character(Str)
A key string that corresponds to the character typed by the user, taking into account the user’s current locale setting, and any system-level keyboard mapping overrides that are in effect.
Unidentified(NativeKey)
This variant is used when the key cannot be translated to any other variant.
The native key is provided (if available) in order to allow the user to specify keybindings for keys which are not defined by this API, mainly through some sort of UI.
Dead(Option<char>)
Contains the text representation of the dead-key when available.
§Platform-specific
- Web: Always contains
None
Implementations§
Source§impl Key<SmolStr>
impl Key<SmolStr>
Sourcepub fn as_ref(&self) -> Key<&str>
pub fn as_ref(&self) -> Key<&str>
Convert Key::Character(SmolStr)
to Key::Character(&str)
so you can more easily match on
Key
. All other variants remain unchanged.
Examples found in repository?
77 fn window_event(
78 &mut self,
79 _event_loop: &ActiveEventLoop,
80 _window_id: WindowId,
81 event: WindowEvent,
82 ) {
83 info!("{event:?}");
84
85 match event {
86 WindowEvent::CloseRequested => {
87 self.close_requested = true;
88 }
89 WindowEvent::KeyboardInput {
90 event:
91 KeyEvent {
92 logical_key: key,
93 state: ElementState::Pressed,
94 ..
95 },
96 ..
97 } => match key.as_ref() {
98 // WARNING: Consider using `key_without_modifiers()` if available on your platform.
99 // See the `key_binding` example
100 Key::Character("1") => {
101 self.mode = Mode::Wait;
102 warn!("mode: {:?}", self.mode);
103 }
104 Key::Character("2") => {
105 self.mode = Mode::WaitUntil;
106 warn!("mode: {:?}", self.mode);
107 }
108 Key::Character("3") => {
109 self.mode = Mode::Poll;
110 warn!("mode: {:?}", self.mode);
111 }
112 Key::Character("r") => {
113 self.request_redraw = !self.request_redraw;
114 warn!("request_redraw: {}", self.request_redraw);
115 }
116 Key::Named(NamedKey::Escape) => {
117 self.close_requested = true;
118 }
119 _ => (),
120 },
121 WindowEvent::RedrawRequested => {
122 let window = self.window.as_ref().unwrap();
123 window.pre_present_notify();
124 fill::fill_window(window);
125 }
126 _ => (),
127 }
128 }
More examples
334 fn window_event(
335 &mut self,
336 event_loop: &ActiveEventLoop,
337 window_id: WindowId,
338 event: WindowEvent,
339 ) {
340 let window = match self.windows.get_mut(&window_id) {
341 Some(window) => window,
342 None => return,
343 };
344
345 match event {
346 WindowEvent::Resized(size) => {
347 window.resize(size);
348 }
349 WindowEvent::Focused(focused) => {
350 if focused {
351 info!("Window={window_id:?} focused");
352 } else {
353 info!("Window={window_id:?} unfocused");
354 }
355 }
356 WindowEvent::ScaleFactorChanged { scale_factor, .. } => {
357 info!("Window={window_id:?} changed scale to {scale_factor}");
358 }
359 WindowEvent::ThemeChanged(theme) => {
360 info!("Theme changed to {theme:?}");
361 window.set_theme(theme);
362 }
363 WindowEvent::RedrawRequested => {
364 if let Err(err) = window.draw() {
365 error!("Error drawing window: {err}");
366 }
367 }
368 WindowEvent::Occluded(occluded) => {
369 window.set_occluded(occluded);
370 }
371 WindowEvent::CloseRequested => {
372 info!("Closing Window={window_id:?}");
373 self.windows.remove(&window_id);
374 }
375 WindowEvent::ModifiersChanged(modifiers) => {
376 window.modifiers = modifiers.state();
377 info!("Modifiers changed to {:?}", window.modifiers);
378 }
379 WindowEvent::MouseWheel { delta, .. } => match delta {
380 MouseScrollDelta::LineDelta(x, y) => {
381 info!("Mouse wheel Line Delta: ({x},{y})");
382 }
383 MouseScrollDelta::PixelDelta(px) => {
384 info!("Mouse wheel Pixel Delta: ({},{})", px.x, px.y);
385 }
386 },
387 WindowEvent::KeyboardInput {
388 event,
389 is_synthetic: false,
390 ..
391 } => {
392 let mods = window.modifiers;
393
394 // Dispatch actions only on press.
395 if event.state.is_pressed() {
396 let action = if let Key::Character(ch) = event.logical_key.as_ref() {
397 Self::process_key_binding(&ch.to_uppercase(), &mods)
398 } else {
399 None
400 };
401
402 if let Some(action) = action {
403 self.handle_action(event_loop, window_id, action);
404 }
405 }
406 }
407 WindowEvent::MouseInput { button, state, .. } => {
408 let mods = window.modifiers;
409 if let Some(action) = state
410 .is_pressed()
411 .then(|| Self::process_mouse_binding(button, &mods))
412 .flatten()
413 {
414 self.handle_action(event_loop, window_id, action);
415 }
416 }
417 WindowEvent::CursorLeft { .. } => {
418 info!("Cursor left Window={window_id:?}");
419 window.cursor_left();
420 }
421 WindowEvent::CursorMoved { position, .. } => {
422 info!("Moved cursor to {position:?}");
423 window.cursor_moved(position);
424 }
425 WindowEvent::ActivationTokenDone { token: _token, .. } => {
426 #[cfg(any(x11_platform, wayland_platform))]
427 {
428 startup_notify::set_activation_token_env(_token);
429 if let Err(err) = self.create_window(event_loop, None) {
430 error!("Error creating new window: {err}");
431 }
432 }
433 }
434 WindowEvent::Ime(event) => match event {
435 Ime::Enabled => info!("IME enabled for Window={window_id:?}"),
436 Ime::Preedit(text, caret_pos) => {
437 info!("Preedit: {}, with caret at {:?}", text, caret_pos);
438 }
439 Ime::Commit(text) => {
440 info!("Committed: {}", text);
441 }
442 Ime::Disabled => info!("IME disabled for Window={window_id:?}"),
443 },
444 WindowEvent::PinchGesture { delta, .. } => {
445 window.zoom += delta;
446 let zoom = window.zoom;
447 if delta > 0.0 {
448 info!("Zoomed in {delta:.5} (now: {zoom:.5})");
449 } else {
450 info!("Zoomed out {delta:.5} (now: {zoom:.5})");
451 }
452 }
453 WindowEvent::RotationGesture { delta, .. } => {
454 window.rotated += delta;
455 let rotated = window.rotated;
456 if delta > 0.0 {
457 info!("Rotated counterclockwise {delta:.5} (now: {rotated:.5})");
458 } else {
459 info!("Rotated clockwise {delta:.5} (now: {rotated:.5})");
460 }
461 }
462 WindowEvent::PanGesture { delta, phase, .. } => {
463 window.panned.x += delta.x;
464 window.panned.y += delta.y;
465 info!("Panned ({delta:?})) (now: {:?}), {phase:?}", window.panned);
466 }
467 WindowEvent::DoubleTapGesture { .. } => {
468 info!("Smart zoom");
469 }
470 WindowEvent::TouchpadPressure { .. }
471 | WindowEvent::HoveredFileCancelled
472 | WindowEvent::KeyboardInput { .. }
473 | WindowEvent::CursorEntered { .. }
474 | WindowEvent::AxisMotion { .. }
475 | WindowEvent::DroppedFile(_)
476 | WindowEvent::HoveredFile(_)
477 | WindowEvent::Destroyed
478 | WindowEvent::Touch(_)
479 | WindowEvent::Moved(_) => (),
480 }
481 }
Source§impl Key
impl Key
Sourcepub fn to_text(&self) -> Option<&str>
pub fn to_text(&self) -> Option<&str>
Convert a key to its approximate textual equivalent.
§Examples
use rio_window::keyboard::{Key, NamedKey};
assert_eq!(Key::Character("a".into()).to_text(), Some("a"));
assert_eq!(Key::Named(NamedKey::Enter).to_text(), Some("\r"));
assert_eq!(Key::Named(NamedKey::F20).to_text(), None);
Trait Implementations§
Source§impl<Str: Ord> Ord for Key<Str>
impl<Str: Ord> Ord for Key<Str>
Source§impl<Str: PartialOrd> PartialOrd for Key<Str>
impl<Str: PartialOrd> PartialOrd for Key<Str>
impl<Str: Eq> Eq for Key<Str>
impl<Str> StructuralPartialEq for Key<Str>
Auto Trait Implementations§
impl<Str> Freeze for Key<Str>where
Str: Freeze,
impl<Str> RefUnwindSafe for Key<Str>where
Str: RefUnwindSafe,
impl<Str> Send for Key<Str>where
Str: Send,
impl<Str> Sync for Key<Str>where
Str: Sync,
impl<Str> Unpin for Key<Str>where
Str: Unpin,
impl<Str> UnwindSafe for Key<Str>where
Str: UnwindSafe,
Blanket Implementations§
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<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
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>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
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)
fn as_any(&self) -> &(dyn Any + 'static)
&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)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.