Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ opengl = [
uuid = [] # Deprecated; this feature was provided by the now unneeded uuid dependency

[dependencies]
keyboard-types = { version = "0.6.1", default-features = false }
keyboard-types = { version = "0.8.3" }
raw-window-handle = "0.6.2"
dpi = "0.1.2"

Expand Down
86 changes: 43 additions & 43 deletions src/platform/macos/keyboard.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
//! Conversion of platform keyboard event into cross-platform event.

use crate::keyboard::code_to_location;
use keyboard_types::{Code, Key, KeyState, KeyboardEvent, Modifiers};
use keyboard_types::{Code, Key, KeyState, KeyboardEvent, Modifiers, NamedKey};
use objc2_app_kit::{NSEvent, NSEventModifierFlags, NSEventType};
use std::cell::Cell;

Expand Down Expand Up @@ -185,50 +185,50 @@ fn key_code_to_code(key_code: u16) -> Code {
/// NativeKeyToDOMKeyName.h.
fn code_to_key(code: Code) -> Option<Key> {
Some(match code {
Code::Escape => Key::Escape,
Code::ShiftLeft | Code::ShiftRight => Key::Shift,
Code::AltLeft | Code::AltRight => Key::Alt,
Code::MetaLeft | Code::MetaRight => Key::Meta,
Code::ControlLeft | Code::ControlRight => Key::Control,
Code::CapsLock => Key::CapsLock,
Code::Escape => Key::Named(NamedKey::Escape),
Code::ShiftLeft | Code::ShiftRight => Key::Named(NamedKey::Shift),
Code::AltLeft | Code::AltRight => Key::Named(NamedKey::Alt),
Code::MetaLeft | Code::MetaRight => Key::Named(NamedKey::Meta),
Code::ControlLeft | Code::ControlRight => Key::Named(NamedKey::Control),
Code::CapsLock => Key::Named(NamedKey::CapsLock),
// kVK_ANSI_KeypadClear
Code::NumLock => Key::Clear,
Code::Fn => Key::Fn,
Code::F1 => Key::F1,
Code::F2 => Key::F2,
Code::F3 => Key::F3,
Code::F4 => Key::F4,
Code::F5 => Key::F5,
Code::F6 => Key::F6,
Code::F7 => Key::F7,
Code::F8 => Key::F8,
Code::F9 => Key::F9,
Code::F10 => Key::F10,
Code::F11 => Key::F11,
Code::F12 => Key::F12,
Code::Pause => Key::Pause,
Code::ScrollLock => Key::ScrollLock,
Code::PrintScreen => Key::PrintScreen,
Code::Insert => Key::Insert,
Code::Delete => Key::Delete,
Code::Tab => Key::Tab,
Code::Backspace => Key::Backspace,
Code::ContextMenu => Key::ContextMenu,
Code::NumLock => Key::Named(NamedKey::NumLock),
Code::Fn => Key::Named(NamedKey::Fn),
Code::F1 => Key::Named(NamedKey::F1),
Code::F2 => Key::Named(NamedKey::F2),
Code::F3 => Key::Named(NamedKey::F3),
Code::F4 => Key::Named(NamedKey::F4),
Code::F5 => Key::Named(NamedKey::F5),
Code::F6 => Key::Named(NamedKey::F6),
Code::F7 => Key::Named(NamedKey::F7),
Code::F8 => Key::Named(NamedKey::F8),
Code::F9 => Key::Named(NamedKey::F9),
Code::F10 => Key::Named(NamedKey::F10),
Code::F11 => Key::Named(NamedKey::F11),
Code::F12 => Key::Named(NamedKey::F12),
Code::Pause => Key::Named(NamedKey::Pause),
Code::ScrollLock => Key::Named(NamedKey::ScrollLock),
Code::PrintScreen => Key::Named(NamedKey::PrintScreen),
Code::Insert => Key::Named(NamedKey::Insert),
Code::Delete => Key::Named(NamedKey::Delete),
Code::Tab => Key::Named(NamedKey::Tab),
Code::Backspace => Key::Named(NamedKey::Backspace),
Code::ContextMenu => Key::Named(NamedKey::ContextMenu),
// kVK_JIS_Kana
Code::Lang1 => Key::KanjiMode,
Code::Lang1 => Key::Named(NamedKey::KanjiMode),
// kVK_JIS_Eisu
Code::Lang2 => Key::Eisu,
Code::Home => Key::Home,
Code::End => Key::End,
Code::PageUp => Key::PageUp,
Code::PageDown => Key::PageDown,
Code::ArrowLeft => Key::ArrowLeft,
Code::ArrowRight => Key::ArrowRight,
Code::ArrowUp => Key::ArrowUp,
Code::ArrowDown => Key::ArrowDown,
Code::Enter => Key::Enter,
Code::NumpadEnter => Key::Enter,
Code::Help => Key::Help,
Code::Lang2 => Key::Named(NamedKey::Eisu),
Code::Home => Key::Named(NamedKey::Home),
Code::End => Key::Named(NamedKey::End),
Code::PageUp => Key::Named(NamedKey::PageUp),
Code::PageDown => Key::Named(NamedKey::PageDown),
Code::ArrowLeft => Key::Named(NamedKey::ArrowLeft),
Code::ArrowRight => Key::Named(NamedKey::ArrowRight),
Code::ArrowUp => Key::Named(NamedKey::ArrowUp),
Code::ArrowDown => Key::Named(NamedKey::ArrowDown),
Code::Enter => Key::Named(NamedKey::Enter),
Code::NumpadEnter => Key::Named(NamedKey::Enter),
Code::Help => Key::Named(NamedKey::Help),
_ => return None,
})
}
Expand Down Expand Up @@ -315,7 +315,7 @@ impl KeyboardState {
Key::Character(chars_ignoring)
} else {
// There may be more heroic things we can do here.
Key::Unidentified
Key::Named(NamedKey::Unidentified)
}
}
};
Expand Down
174 changes: 87 additions & 87 deletions src/platform/win/keyboard.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ use std::collections::{HashMap, HashSet};
use std::mem;
use std::ops::RangeInclusive;

use keyboard_types::{Code, Key, KeyState, KeyboardEvent, Location, Modifiers};
use keyboard_types::{Code, Key, KeyState, KeyboardEvent, Location, Modifiers, NamedKey};
use windows_sys::Win32::{
Foundation::{HWND, LPARAM, WPARAM},
System::SystemServices::{MK_CONTROL, MK_SHIFT},
Expand Down Expand Up @@ -247,104 +247,104 @@ fn scan_to_code(scan_code: u32) -> Code {

fn vk_to_key(vk: VkCode) -> Option<Key> {
Some(match vk as u16 {
VK_CANCEL => Key::Cancel,
VK_BACK => Key::Backspace,
VK_TAB => Key::Tab,
VK_CLEAR => Key::Clear,
VK_RETURN => Key::Enter,
VK_SHIFT | VK_LSHIFT | VK_RSHIFT => Key::Shift,
VK_CONTROL | VK_LCONTROL | VK_RCONTROL => Key::Control,
VK_MENU | VK_LMENU | VK_RMENU => Key::Alt,
VK_PAUSE => Key::Pause,
VK_CAPITAL => Key::CapsLock,
VK_CANCEL => Key::Named(NamedKey::Cancel),
VK_BACK => Key::Named(NamedKey::Backspace),
VK_TAB => Key::Named(NamedKey::Tab),
VK_CLEAR => Key::Named(NamedKey::Clear),
VK_RETURN => Key::Named(NamedKey::Enter),
VK_SHIFT | VK_LSHIFT | VK_RSHIFT => Key::Named(NamedKey::Shift),
VK_CONTROL | VK_LCONTROL | VK_RCONTROL => Key::Named(NamedKey::Control),
VK_MENU | VK_LMENU | VK_RMENU => Key::Named(NamedKey::Alt),
VK_PAUSE => Key::Named(NamedKey::Pause),
VK_CAPITAL => Key::Named(NamedKey::CapsLock),
// TODO: disambiguate kana and hangul? same vk
VK_KANA => Key::KanaMode,
VK_JUNJA => Key::JunjaMode,
VK_FINAL => Key::FinalMode,
VK_KANJI => Key::KanjiMode,
VK_ESCAPE => Key::Escape,
VK_NONCONVERT => Key::NonConvert,
VK_ACCEPT => Key::Accept,
VK_PRIOR => Key::PageUp,
VK_NEXT => Key::PageDown,
VK_END => Key::End,
VK_HOME => Key::Home,
VK_LEFT => Key::ArrowLeft,
VK_UP => Key::ArrowUp,
VK_RIGHT => Key::ArrowRight,
VK_DOWN => Key::ArrowDown,
VK_SELECT => Key::Select,
VK_PRINT => Key::Print,
VK_EXECUTE => Key::Execute,
VK_SNAPSHOT => Key::PrintScreen,
VK_INSERT => Key::Insert,
VK_DELETE => Key::Delete,
VK_HELP => Key::Help,
VK_LWIN | VK_RWIN => Key::Meta,
VK_APPS => Key::ContextMenu,
VK_SLEEP => Key::Standby,
VK_F1 => Key::F1,
VK_F2 => Key::F2,
VK_F3 => Key::F3,
VK_F4 => Key::F4,
VK_F5 => Key::F5,
VK_F6 => Key::F6,
VK_F7 => Key::F7,
VK_F8 => Key::F8,
VK_F9 => Key::F9,
VK_F10 => Key::F10,
VK_F11 => Key::F11,
VK_F12 => Key::F12,
VK_NUMLOCK => Key::NumLock,
VK_SCROLL => Key::ScrollLock,
VK_BROWSER_BACK => Key::BrowserBack,
VK_BROWSER_FORWARD => Key::BrowserForward,
VK_BROWSER_REFRESH => Key::BrowserRefresh,
VK_BROWSER_STOP => Key::BrowserStop,
VK_BROWSER_SEARCH => Key::BrowserSearch,
VK_BROWSER_FAVORITES => Key::BrowserFavorites,
VK_BROWSER_HOME => Key::BrowserHome,
VK_VOLUME_MUTE => Key::AudioVolumeMute,
VK_VOLUME_DOWN => Key::AudioVolumeDown,
VK_VOLUME_UP => Key::AudioVolumeUp,
VK_MEDIA_NEXT_TRACK => Key::MediaTrackNext,
VK_MEDIA_PREV_TRACK => Key::MediaTrackPrevious,
VK_MEDIA_STOP => Key::MediaStop,
VK_MEDIA_PLAY_PAUSE => Key::MediaPlayPause,
VK_LAUNCH_MAIL => Key::LaunchMail,
VK_LAUNCH_MEDIA_SELECT => Key::LaunchMediaPlayer,
VK_LAUNCH_APP1 => Key::LaunchApplication1,
VK_LAUNCH_APP2 => Key::LaunchApplication2,
VK_OEM_ATTN => Key::Alphanumeric,
VK_CONVERT => Key::Convert,
VK_MODECHANGE => Key::ModeChange,
VK_PROCESSKEY => Key::Process,
VK_ATTN => Key::Attn,
VK_CRSEL => Key::CrSel,
VK_EXSEL => Key::ExSel,
VK_EREOF => Key::EraseEof,
VK_PLAY => Key::Play,
VK_ZOOM => Key::ZoomToggle,
VK_OEM_CLEAR => Key::Clear,
VK_KANA => Key::Named(NamedKey::KanaMode),
VK_JUNJA => Key::Named(NamedKey::JunjaMode),
VK_FINAL => Key::Named(NamedKey::FinalMode),
VK_KANJI => Key::Named(NamedKey::KanjiMode),
VK_ESCAPE => Key::Named(NamedKey::Escape),
VK_NONCONVERT => Key::Named(NamedKey::NonConvert),
VK_ACCEPT => Key::Named(NamedKey::Accept),
VK_PRIOR => Key::Named(NamedKey::PageUp),
VK_NEXT => Key::Named(NamedKey::PageDown),
VK_END => Key::Named(NamedKey::End),
VK_HOME => Key::Named(NamedKey::Home),
VK_LEFT => Key::Named(NamedKey::ArrowLeft),
VK_UP => Key::Named(NamedKey::ArrowUp),
VK_RIGHT => Key::Named(NamedKey::ArrowRight),
VK_DOWN => Key::Named(NamedKey::ArrowDown),
VK_SELECT => Key::Named(NamedKey::Select),
VK_PRINT => Key::Named(NamedKey::Print),
VK_EXECUTE => Key::Named(NamedKey::Execute),
VK_SNAPSHOT => Key::Named(NamedKey::PrintScreen),
VK_INSERT => Key::Named(NamedKey::Insert),
VK_DELETE => Key::Named(NamedKey::Delete),
VK_HELP => Key::Named(NamedKey::Help),
VK_LWIN | VK_RWIN => Key::Named(NamedKey::Meta),
VK_APPS => Key::Named(NamedKey::ContextMenu),
VK_SLEEP => Key::Named(NamedKey::Standby),
VK_F1 => Key::Named(NamedKey::F1),
VK_F2 => Key::Named(NamedKey::F2),
VK_F3 => Key::Named(NamedKey::F3),
VK_F4 => Key::Named(NamedKey::F4),
VK_F5 => Key::Named(NamedKey::F5),
VK_F6 => Key::Named(NamedKey::F6),
VK_F7 => Key::Named(NamedKey::F7),
VK_F8 => Key::Named(NamedKey::F8),
VK_F9 => Key::Named(NamedKey::F9),
VK_F10 => Key::Named(NamedKey::F10),
VK_F11 => Key::Named(NamedKey::F11),
VK_F12 => Key::Named(NamedKey::F12),
VK_NUMLOCK => Key::Named(NamedKey::NumLock),
VK_SCROLL => Key::Named(NamedKey::ScrollLock),
VK_BROWSER_BACK => Key::Named(NamedKey::BrowserBack),
VK_BROWSER_FORWARD => Key::Named(NamedKey::BrowserForward),
VK_BROWSER_REFRESH => Key::Named(NamedKey::BrowserRefresh),
VK_BROWSER_STOP => Key::Named(NamedKey::BrowserStop),
VK_BROWSER_SEARCH => Key::Named(NamedKey::BrowserSearch),
VK_BROWSER_FAVORITES => Key::Named(NamedKey::BrowserFavorites),
VK_BROWSER_HOME => Key::Named(NamedKey::BrowserHome),
VK_VOLUME_MUTE => Key::Named(NamedKey::AudioVolumeMute),
VK_VOLUME_DOWN => Key::Named(NamedKey::AudioVolumeDown),
VK_VOLUME_UP => Key::Named(NamedKey::AudioVolumeUp),
VK_MEDIA_NEXT_TRACK => Key::Named(NamedKey::MediaTrackNext),
VK_MEDIA_PREV_TRACK => Key::Named(NamedKey::MediaTrackPrevious),
VK_MEDIA_STOP => Key::Named(NamedKey::MediaStop),
VK_MEDIA_PLAY_PAUSE => Key::Named(NamedKey::MediaPlayPause),
VK_LAUNCH_MAIL => Key::Named(NamedKey::LaunchMail),
VK_LAUNCH_MEDIA_SELECT => Key::Named(NamedKey::LaunchMediaPlayer),
VK_LAUNCH_APP1 => Key::Named(NamedKey::LaunchApplication1),
VK_LAUNCH_APP2 => Key::Named(NamedKey::LaunchApplication2),
VK_OEM_ATTN => Key::Named(NamedKey::Alphanumeric),
VK_CONVERT => Key::Named(NamedKey::Convert),
VK_MODECHANGE => Key::Named(NamedKey::ModeChange),
VK_PROCESSKEY => Key::Named(NamedKey::Process),
VK_ATTN => Key::Named(NamedKey::Attn),
VK_CRSEL => Key::Named(NamedKey::CrSel),
VK_EXSEL => Key::Named(NamedKey::ExSel),
VK_EREOF => Key::Named(NamedKey::EraseEof),
VK_PLAY => Key::Named(NamedKey::Play),
VK_ZOOM => Key::Named(NamedKey::ZoomToggle),
VK_OEM_CLEAR => Key::Named(NamedKey::Clear),
_ => return None,
})
}

fn code_unit_to_key(code_unit: u32) -> Key {
match code_unit {
0x8 | 0x7F => Key::Backspace,
0x9 => Key::Tab,
0xA | 0xD => Key::Enter,
0x1B => Key::Escape,
0x8 | 0x7F => Key::Named(NamedKey::Backspace),
0x9 => Key::Named(NamedKey::Tab),
0xA | 0xD => Key::Named(NamedKey::Enter),
0x1B => Key::Named(NamedKey::Escape),
_ if code_unit >= 0x20 => {
if let Some(c) = std::char::from_u32(code_unit) {
Key::Character(c.to_string())
} else {
// UTF-16 error, very unlikely
Key::Unidentified
Key::Named(NamedKey::Unidentified)
}
}
_ => Key::Unidentified,
_ => Key::Named(NamedKey::Unidentified),
}
}

Expand Down Expand Up @@ -490,7 +490,7 @@ impl KeyboardState {
if let Ok(s) = String::from_utf16(&self.stash_utf16) {
Key::Character(s)
} else {
Key::Unidentified
Key::Named(NamedKey::Unidentified)
}
};
self.stash_utf16.clear();
Expand Down Expand Up @@ -659,7 +659,7 @@ impl KeyboardState {
} else {
let mapped = self.map_vk(vk);
if mapped >= (1 << 31) {
Key::Dead
Key::Named(NamedKey::Dead)
} else {
code_unit_to_key(mapped)
}
Expand Down
Loading
Loading