summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2019-12-06 04:01:48 +0100
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2019-12-06 04:01:48 +0100
commit65cac922b3ff6cf289319b9c12aab68aabea844a (patch)
tree245967a3368ac865c59855c8d4434ef76e516884
parent31b0b7f58071b42224fd56e9bb13ad67e7ffeff0 (diff)
downloadiced-65cac922b3ff6cf289319b9c12aab68aabea844a.tar.gz
iced-65cac922b3ff6cf289319b9c12aab68aabea844a.tar.bz2
iced-65cac922b3ff6cf289319b9c12aab68aabea844a.zip
Add `ModifiersState` to `keyboard::Event::Input`
-rw-r--r--native/src/input/keyboard.rs2
-rw-r--r--native/src/input/keyboard/event.rs7
-rw-r--r--native/src/input/keyboard/modifiers_state.rs15
-rw-r--r--native/src/widget/text_input.rs1
-rw-r--r--winit/src/application.rs2
-rw-r--r--winit/src/conversion.rs20
6 files changed, 44 insertions, 3 deletions
diff --git a/native/src/input/keyboard.rs b/native/src/input/keyboard.rs
index 57c24484..432e75ba 100644
--- a/native/src/input/keyboard.rs
+++ b/native/src/input/keyboard.rs
@@ -1,6 +1,8 @@
//! Build keyboard events.
mod event;
mod key_code;
+mod modifiers_state;
pub use event::Event;
pub use key_code::KeyCode;
+pub use modifiers_state::ModifiersState;
diff --git a/native/src/input/keyboard/event.rs b/native/src/input/keyboard/event.rs
index 8118f112..862f30c4 100644
--- a/native/src/input/keyboard/event.rs
+++ b/native/src/input/keyboard/event.rs
@@ -1,13 +1,13 @@
-use super::KeyCode;
+use super::{KeyCode, ModifiersState};
use crate::input::ButtonState;
-#[derive(Debug, Clone, Copy, PartialEq)]
/// A keyboard event.
///
/// _**Note:** This type is largely incomplete! If you need to track
/// additional events, feel free to [open an issue] and share your use case!_
///
/// [open an issue]: https://github.com/hecrj/iced/issues
+#[derive(Debug, Clone, Copy, PartialEq)]
pub enum Event {
/// A keyboard key was pressed or released.
Input {
@@ -16,6 +16,9 @@ pub enum Event {
/// The key identifier
key_code: KeyCode,
+
+ /// The state of the modifier keys
+ modifiers: ModifiersState,
},
/// A unicode character was received.
diff --git a/native/src/input/keyboard/modifiers_state.rs b/native/src/input/keyboard/modifiers_state.rs
new file mode 100644
index 00000000..4e3794b3
--- /dev/null
+++ b/native/src/input/keyboard/modifiers_state.rs
@@ -0,0 +1,15 @@
+/// The current state of the keyboard modifiers.
+#[derive(Debug, Clone, Copy, PartialEq)]
+pub struct ModifiersState {
+ /// Whether a shift key is pressed
+ pub shift: bool,
+
+ /// Whether a control key is pressed
+ pub control: bool,
+
+ /// Whether an alt key is pressed
+ pub alt: bool,
+
+ /// Whether a logo key is pressed (e.g. windows key, command key...)
+ pub logo: bool,
+}
diff --git a/native/src/widget/text_input.rs b/native/src/widget/text_input.rs
index dae772bc..cfa8b0f4 100644
--- a/native/src/widget/text_input.rs
+++ b/native/src/widget/text_input.rs
@@ -202,6 +202,7 @@ where
Event::Keyboard(keyboard::Event::Input {
key_code,
state: ButtonState::Pressed,
+ modifiers,
}) if self.state.is_focused => match key_code {
keyboard::KeyCode::Enter => {
if let Some(on_submit) = self.on_submit.clone() {
diff --git a/winit/src/application.rs b/winit/src/application.rs
index 3772a667..85d06d9b 100644
--- a/winit/src/application.rs
+++ b/winit/src/application.rs
@@ -319,6 +319,7 @@ pub trait Application: Sized {
winit::event::KeyboardInput {
virtual_keycode: Some(virtual_keycode),
state,
+ modifiers,
..
},
..
@@ -334,6 +335,7 @@ pub trait Application: Sized {
events.push(Event::Keyboard(keyboard::Event::Input {
key_code: conversion::key_code(virtual_keycode),
state: conversion::button_state(state),
+ modifiers: conversion::modifiers_state(modifiers),
}));
}
WindowEvent::CloseRequested => {
diff --git a/winit/src/conversion.rs b/winit/src/conversion.rs
index 03d583fb..0537d853 100644
--- a/winit/src/conversion.rs
+++ b/winit/src/conversion.rs
@@ -3,7 +3,10 @@
//! [`winit`]: https://github.com/rust-windowing/winit
//! [`iced_native`]: https://github.com/hecrj/iced/tree/master/native
use crate::{
- input::{keyboard::KeyCode, mouse, ButtonState},
+ input::{
+ keyboard::{KeyCode, ModifiersState},
+ mouse, ButtonState,
+ },
MouseCursor,
};
@@ -47,6 +50,21 @@ pub fn button_state(element_state: winit::event::ElementState) -> ButtonState {
}
}
+/// Convert some `ModifiersState` from [`winit`] to an [`iced_native`] modifiers state.
+///
+/// [`winit`]: https://github.com/rust-windowing/winit
+/// [`iced_native`]: https://github.com/hecrj/iced/tree/master/native
+pub fn modifiers_state(
+ modifiers: winit::event::ModifiersState,
+) -> ModifiersState {
+ ModifiersState {
+ shift: modifiers.shift,
+ control: modifiers.ctrl,
+ alt: modifiers.alt,
+ logo: modifiers.logo,
+ }
+}
+
/// Convert a `VirtualKeyCode` from [`winit`] to an [`iced_native`] key code.
///
/// [`winit`]: https://github.com/rust-windowing/winit