123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669 |
- use crate::input_data::{decode_key_location, encode_key_location};
- use dioxus_core::Event;
- use keyboard_types::{Code, Key, Location, Modifiers};
- use std::convert::TryInto;
- use std::fmt::{Debug, Formatter};
- use std::str::FromStr;
- #[cfg(feature = "serialize")]
- fn resilient_deserialize_code<'de, D>(deserializer: D) -> Result<Code, D::Error>
- where
- D: serde::Deserializer<'de>,
- {
- use serde::Deserialize;
- // If we fail to deserialize the code for any reason, just return Unidentified instead of failing.
- Ok(Code::deserialize(deserializer).unwrap_or(Code::Unidentified))
- }
- pub type KeyboardEvent = Event<KeyboardData>;
- #[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
- #[derive(Clone, PartialEq, Eq)]
- pub struct KeyboardData {
- #[deprecated(
- since = "0.3.0",
- note = "This may not work in all environments. Use key() instead."
- )]
- pub char_code: u32,
- /// Identify which "key" was entered.
- #[deprecated(since = "0.3.0", note = "use key() instead")]
- pub key: String,
- /// Get the key code as an enum Variant.
- #[deprecated(
- since = "0.3.0",
- note = "This may not work in all environments. Use code() instead."
- )]
- pub key_code: KeyCode,
- /// the physical key on the keyboard
- #[cfg_attr(
- feature = "serialize",
- serde(deserialize_with = "resilient_deserialize_code")
- )]
- code: Code,
- /// Indicate if the `alt` modifier key was pressed during this keyboard event
- #[deprecated(since = "0.3.0", note = "use modifiers() instead")]
- pub alt_key: bool,
- /// Indicate if the `ctrl` modifier key was pressed during this keyboard event
- #[deprecated(since = "0.3.0", note = "use modifiers() instead")]
- pub ctrl_key: bool,
- /// Indicate if the `meta` modifier key was pressed during this keyboard event
- #[deprecated(since = "0.3.0", note = "use modifiers() instead")]
- pub meta_key: bool,
- /// Indicate if the `shift` modifier key was pressed during this keyboard event
- #[deprecated(since = "0.3.0", note = "use modifiers() instead")]
- pub shift_key: bool,
- #[deprecated(since = "0.3.0", note = "use location() instead")]
- pub location: usize,
- #[deprecated(since = "0.3.0", note = "use is_auto_repeating() instead")]
- pub repeat: bool,
- #[deprecated(since = "0.3.0", note = "use code() or key() instead")]
- pub which: usize,
- }
- impl_event! {
- KeyboardData;
- /// onkeydown
- onkeydown
- /// onkeypress
- onkeypress
- /// onkeyup
- onkeyup
- }
- impl KeyboardData {
- pub fn new(
- key: Key,
- code: Code,
- location: Location,
- is_auto_repeating: bool,
- modifiers: Modifiers,
- ) -> Self {
- #[allow(deprecated)]
- KeyboardData {
- char_code: key.legacy_charcode(),
- key: key.to_string(),
- key_code: KeyCode::from_raw_code(
- key.legacy_keycode()
- .try_into()
- .expect("could not convert keycode to u8"),
- ),
- code,
- alt_key: modifiers.contains(Modifiers::ALT),
- ctrl_key: modifiers.contains(Modifiers::CONTROL),
- meta_key: modifiers.contains(Modifiers::META),
- shift_key: modifiers.contains(Modifiers::SHIFT),
- location: encode_key_location(location),
- repeat: is_auto_repeating,
- which: key
- .legacy_charcode()
- .try_into()
- .expect("could not convert charcode to usize"),
- }
- }
- /// The value of the key pressed by the user, taking into consideration the state of modifier keys such as Shift as well as the keyboard locale and layout.
- pub fn key(&self) -> Key {
- #[allow(deprecated)]
- FromStr::from_str(&self.key).unwrap_or(Key::Unidentified)
- }
- /// A physical key on the keyboard (as opposed to the character generated by pressing the key). In other words, this property returns a value that isn't altered by keyboard layout or the state of the modifier keys.
- pub fn code(&self) -> Code {
- self.code
- }
- /// The set of modifier keys which were pressed when the event occurred
- pub fn modifiers(&self) -> Modifiers {
- let mut modifiers = Modifiers::empty();
- #[allow(deprecated)]
- {
- if self.alt_key {
- modifiers.insert(Modifiers::ALT);
- }
- if self.ctrl_key {
- modifiers.insert(Modifiers::CONTROL);
- }
- if self.meta_key {
- modifiers.insert(Modifiers::META);
- }
- if self.shift_key {
- modifiers.insert(Modifiers::SHIFT);
- }
- }
- modifiers
- }
- /// The location of the key on the keyboard or other input device.
- pub fn location(&self) -> Location {
- #[allow(deprecated)]
- decode_key_location(self.location)
- }
- /// `true` iff the key is being held down such that it is automatically repeating.
- pub fn is_auto_repeating(&self) -> bool {
- #[allow(deprecated)]
- self.repeat
- }
- }
- impl Debug for KeyboardData {
- fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
- f.debug_struct("KeyboardData")
- .field("key", &self.key())
- .field("code", &self.code())
- .field("modifiers", &self.modifiers())
- .field("location", &self.location())
- .field("is_auto_repeating", &self.is_auto_repeating())
- .finish()
- }
- }
- #[cfg(feature = "serialize")]
- impl<'de> serde::Deserialize<'de> for KeyCode {
- fn deserialize<D>(deserializer: D) -> Result<KeyCode, D::Error>
- where
- D: serde::Deserializer<'de>,
- {
- // We could be deserializing a unicode character, so we need to use u64 even if the output only takes u8
- let value = u64::deserialize(deserializer)?;
- if let Ok(smaller_uint) = value.try_into() {
- Ok(KeyCode::from_raw_code(smaller_uint))
- } else {
- Ok(KeyCode::Unknown)
- }
- }
- }
- #[cfg_attr(feature = "serialize", derive(serde_repr::Serialize_repr))]
- #[derive(Clone, Copy, Debug, Eq, PartialEq)]
- #[repr(u8)]
- pub enum KeyCode {
- // That key has no keycode, = 0
- // break, = 3
- // backspace / delete, = 8
- // tab, = 9
- // clear, = 12
- // enter, = 13
- // shift, = 16
- // ctrl, = 17
- // alt, = 18
- // pause/break, = 19
- // caps lock, = 20
- // hangul, = 21
- // hanja, = 25
- // escape, = 27
- // conversion, = 28
- // non-conversion, = 29
- // spacebar, = 32
- // page up, = 33
- // page down, = 34
- // end, = 35
- // home, = 36
- // left arrow, = 37
- // up arrow, = 38
- // right arrow, = 39
- // down arrow, = 40
- // select, = 41
- // print, = 42
- // execute, = 43
- // Print Screen, = 44
- // insert, = 45
- // delete, = 46
- // help, = 47
- // 0, = 48
- // 1, = 49
- // 2, = 50
- // 3, = 51
- // 4, = 52
- // 5, = 53
- // 6, = 54
- // 7, = 55
- // 8, = 56
- // 9, = 57
- // :, = 58
- // semicolon (firefox), equals, = 59
- // <, = 60
- // equals (firefox), = 61
- // ß, = 63
- // @ (firefox), = 64
- // a, = 65
- // b, = 66
- // c, = 67
- // d, = 68
- // e, = 69
- // f, = 70
- // g, = 71
- // h, = 72
- // i, = 73
- // j, = 74
- // k, = 75
- // l, = 76
- // m, = 77
- // n, = 78
- // o, = 79
- // p, = 80
- // q, = 81
- // r, = 82
- // s, = 83
- // t, = 84
- // u, = 85
- // v, = 86
- // w, = 87
- // x, = 88
- // y, = 89
- // z, = 90
- // Windows Key / Left ⌘ / Chromebook Search key, = 91
- // right window key, = 92
- // Windows Menu / Right ⌘, = 93
- // sleep, = 95
- // numpad 0, = 96
- // numpad 1, = 97
- // numpad 2, = 98
- // numpad 3, = 99
- // numpad 4, = 100
- // numpad 5, = 101
- // numpad 6, = 102
- // numpad 7, = 103
- // numpad 8, = 104
- // numpad 9, = 105
- // multiply, = 106
- // add, = 107
- // numpad period (firefox), = 108
- // subtract, = 109
- // decimal point, = 110
- // divide, = 111
- // f1, = 112
- // f2, = 113
- // f3, = 114
- // f4, = 115
- // f5, = 116
- // f6, = 117
- // f7, = 118
- // f8, = 119
- // f9, = 120
- // f10, = 121
- // f11, = 122
- // f12, = 123
- // f13, = 124
- // f14, = 125
- // f15, = 126
- // f16, = 127
- // f17, = 128
- // f18, = 129
- // f19, = 130
- // f20, = 131
- // f21, = 132
- // f22, = 133
- // f23, = 134
- // f24, = 135
- // f25, = 136
- // f26, = 137
- // f27, = 138
- // f28, = 139
- // f29, = 140
- // f30, = 141
- // f31, = 142
- // f32, = 143
- // num lock, = 144
- // scroll lock, = 145
- // airplane mode, = 151
- // ^, = 160
- // !, = 161
- // ؛ (arabic semicolon), = 162
- // #, = 163
- // $, = 164
- // ù, = 165
- // page backward, = 166
- // page forward, = 167
- // refresh, = 168
- // closing paren (AZERTY), = 169
- // *, = 170
- // ~ + * key, = 171
- // home key, = 172
- // minus (firefox), mute/unmute, = 173
- // decrease volume level, = 174
- // increase volume level, = 175
- // next, = 176
- // previous, = 177
- // stop, = 178
- // play/pause, = 179
- // e-mail, = 180
- // mute/unmute (firefox), = 181
- // decrease volume level (firefox), = 182
- // increase volume level (firefox), = 183
- // semi-colon / ñ, = 186
- // equal sign, = 187
- // comma, = 188
- // dash, = 189
- // period, = 190
- // forward slash / ç, = 191
- // grave accent / ñ / æ / ö, = 192
- // ?, / or °, = 193
- // numpad period (chrome), = 194
- // open bracket, = 219
- // back slash, = 220
- // close bracket / å, = 221
- // single quote / ø / ä, = 222
- // `, = 223
- // left or right ⌘ key (firefox), = 224
- // altgr, = 225
- // < /git >, left back slash, = 226
- // GNOME Compose Key, = 230
- // ç, = 231
- // XF86Forward, = 233
- // XF86Back, = 234
- // non-conversion, = 235
- // alphanumeric, = 240
- // hiragana/katakana, = 242
- // half-width/full-width, = 243
- // kanji, = 244
- // unlock trackpad (Chrome/Edge), = 251
- // toggle touchpad, = 255
- NA = 0,
- Break = 3,
- Backspace = 8,
- Tab = 9,
- Clear = 12,
- Enter = 13,
- Shift = 16,
- Ctrl = 17,
- Alt = 18,
- Pause = 19,
- CapsLock = 20,
- // hangul, = 21
- // hanja, = 25
- Escape = 27,
- // conversion, = 28
- // non-conversion, = 29
- Space = 32,
- PageUp = 33,
- PageDown = 34,
- End = 35,
- Home = 36,
- LeftArrow = 37,
- UpArrow = 38,
- RightArrow = 39,
- DownArrow = 40,
- // select, = 41
- // print, = 42
- // execute, = 43
- // Print Screen, = 44
- Insert = 45,
- Delete = 46,
- // help, = 47
- Num0 = 48,
- Num1 = 49,
- Num2 = 50,
- Num3 = 51,
- Num4 = 52,
- Num5 = 53,
- Num6 = 54,
- Num7 = 55,
- Num8 = 56,
- Num9 = 57,
- // :, = 58
- // semicolon (firefox), equals, = 59
- // <, = 60
- // equals (firefox), = 61
- // ß, = 63
- // @ (firefox), = 64
- A = 65,
- B = 66,
- C = 67,
- D = 68,
- E = 69,
- F = 70,
- G = 71,
- H = 72,
- I = 73,
- J = 74,
- K = 75,
- L = 76,
- M = 77,
- N = 78,
- O = 79,
- P = 80,
- Q = 81,
- R = 82,
- S = 83,
- T = 84,
- U = 85,
- V = 86,
- W = 87,
- X = 88,
- Y = 89,
- Z = 90,
- LeftWindow = 91,
- RightWindow = 92,
- SelectKey = 93,
- Numpad0 = 96,
- Numpad1 = 97,
- Numpad2 = 98,
- Numpad3 = 99,
- Numpad4 = 100,
- Numpad5 = 101,
- Numpad6 = 102,
- Numpad7 = 103,
- Numpad8 = 104,
- Numpad9 = 105,
- Multiply = 106,
- Add = 107,
- Subtract = 109,
- DecimalPoint = 110,
- Divide = 111,
- F1 = 112,
- F2 = 113,
- F3 = 114,
- F4 = 115,
- F5 = 116,
- F6 = 117,
- F7 = 118,
- F8 = 119,
- F9 = 120,
- F10 = 121,
- F11 = 122,
- F12 = 123,
- // f13, = 124
- // f14, = 125
- // f15, = 126
- // f16, = 127
- // f17, = 128
- // f18, = 129
- // f19, = 130
- // f20, = 131
- // f21, = 132
- // f22, = 133
- // f23, = 134
- // f24, = 135
- // f25, = 136
- // f26, = 137
- // f27, = 138
- // f28, = 139
- // f29, = 140
- // f30, = 141
- // f31, = 142
- // f32, = 143
- NumLock = 144,
- ScrollLock = 145,
- // airplane mode, = 151
- // ^, = 160
- // !, = 161
- // ؛ (arabic semicolon), = 162
- // #, = 163
- // $, = 164
- // ù, = 165
- // page backward, = 166
- // page forward, = 167
- // refresh, = 168
- // closing paren (AZERTY), = 169
- // *, = 170
- // ~ + * key, = 171
- // home key, = 172
- // minus (firefox), mute/unmute, = 173
- // decrease volume level, = 174
- // increase volume level, = 175
- // next, = 176
- // previous, = 177
- // stop, = 178
- // play/pause, = 179
- // e-mail, = 180
- // mute/unmute (firefox), = 181
- // decrease volume level (firefox), = 182
- // increase volume level (firefox), = 183
- Semicolon = 186,
- EqualSign = 187,
- Comma = 188,
- Dash = 189,
- Period = 190,
- ForwardSlash = 191,
- GraveAccent = 192,
- // ?, / or °, = 193
- // numpad period (chrome), = 194
- OpenBracket = 219,
- BackSlash = 220,
- CloseBraket = 221,
- SingleQuote = 222,
- // `, = 223
- // left or right ⌘ key (firefox), = 224
- // altgr, = 225
- // < /git >, left back slash, = 226
- // GNOME Compose Key, = 230
- // ç, = 231
- // XF86Forward, = 233
- // XF86Back, = 234
- // non-conversion, = 235
- // alphanumeric, = 240
- // hiragana/katakana, = 242
- // half-width/full-width, = 243
- // kanji, = 244
- // unlock trackpad (Chrome/Edge), = 251
- // toggle touchpad, = 255
- Unknown,
- }
- impl KeyCode {
- pub fn from_raw_code(i: u8) -> Self {
- use KeyCode::*;
- match i {
- 8 => Backspace,
- 9 => Tab,
- 13 => Enter,
- 16 => Shift,
- 17 => Ctrl,
- 18 => Alt,
- 19 => Pause,
- 20 => CapsLock,
- 27 => Escape,
- 33 => PageUp,
- 34 => PageDown,
- 35 => End,
- 36 => Home,
- 37 => LeftArrow,
- 38 => UpArrow,
- 39 => RightArrow,
- 40 => DownArrow,
- 45 => Insert,
- 46 => Delete,
- 48 => Num0,
- 49 => Num1,
- 50 => Num2,
- 51 => Num3,
- 52 => Num4,
- 53 => Num5,
- 54 => Num6,
- 55 => Num7,
- 56 => Num8,
- 57 => Num9,
- 65 => A,
- 66 => B,
- 67 => C,
- 68 => D,
- 69 => E,
- 70 => F,
- 71 => G,
- 72 => H,
- 73 => I,
- 74 => J,
- 75 => K,
- 76 => L,
- 77 => M,
- 78 => N,
- 79 => O,
- 80 => P,
- 81 => Q,
- 82 => R,
- 83 => S,
- 84 => T,
- 85 => U,
- 86 => V,
- 87 => W,
- 88 => X,
- 89 => Y,
- 90 => Z,
- 91 => LeftWindow,
- 92 => RightWindow,
- 93 => SelectKey,
- 96 => Numpad0,
- 97 => Numpad1,
- 98 => Numpad2,
- 99 => Numpad3,
- 100 => Numpad4,
- 101 => Numpad5,
- 102 => Numpad6,
- 103 => Numpad7,
- 104 => Numpad8,
- 105 => Numpad9,
- 106 => Multiply,
- 107 => Add,
- 109 => Subtract,
- 110 => DecimalPoint,
- 111 => Divide,
- 112 => F1,
- 113 => F2,
- 114 => F3,
- 115 => F4,
- 116 => F5,
- 117 => F6,
- 118 => F7,
- 119 => F8,
- 120 => F9,
- 121 => F10,
- 122 => F11,
- 123 => F12,
- 144 => NumLock,
- 145 => ScrollLock,
- 186 => Semicolon,
- 187 => EqualSign,
- 188 => Comma,
- 189 => Dash,
- 190 => Period,
- 191 => ForwardSlash,
- 192 => GraveAccent,
- 219 => OpenBracket,
- 220 => BackSlash,
- 221 => CloseBraket,
- 222 => SingleQuote,
- _ => Unknown,
- }
- }
- // get the raw code
- pub fn raw_code(&self) -> u32 {
- *self as u32
- }
- }
|