Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'helix-view/src/keyboard.rs')
-rw-r--r--helix-view/src/keyboard.rs212
1 files changed, 212 insertions, 0 deletions
diff --git a/helix-view/src/keyboard.rs b/helix-view/src/keyboard.rs
index c3831143..53d85889 100644
--- a/helix-view/src/keyboard.rs
+++ b/helix-view/src/keyboard.rs
@@ -60,6 +60,53 @@ impl From<termina::event::Modifiers> for KeyModifiers {
}
}
+#[cfg(all(feature = "term", windows))]
+impl From<KeyModifiers> for crossterm::event::KeyModifiers {
+ fn from(key_modifiers: KeyModifiers) -> Self {
+ use crossterm::event::KeyModifiers as CKeyModifiers;
+
+ let mut result = CKeyModifiers::NONE;
+
+ if key_modifiers.contains(KeyModifiers::SHIFT) {
+ result.insert(CKeyModifiers::SHIFT);
+ }
+ if key_modifiers.contains(KeyModifiers::CONTROL) {
+ result.insert(CKeyModifiers::CONTROL);
+ }
+ if key_modifiers.contains(KeyModifiers::ALT) {
+ result.insert(CKeyModifiers::ALT);
+ }
+ if key_modifiers.contains(KeyModifiers::SUPER) {
+ result.insert(CKeyModifiers::SUPER);
+ }
+
+ result
+ }
+}
+
+#[cfg(all(feature = "term", windows))]
+impl From<crossterm::event::KeyModifiers> for KeyModifiers {
+ fn from(val: crossterm::event::KeyModifiers) -> Self {
+ use crossterm::event::KeyModifiers as CKeyModifiers;
+
+ let mut result = KeyModifiers::NONE;
+
+ if val.contains(CKeyModifiers::SHIFT) {
+ result.insert(KeyModifiers::SHIFT);
+ }
+ if val.contains(CKeyModifiers::CONTROL) {
+ result.insert(KeyModifiers::CONTROL);
+ }
+ if val.contains(CKeyModifiers::ALT) {
+ result.insert(KeyModifiers::ALT);
+ }
+ if val.contains(CKeyModifiers::SUPER) {
+ result.insert(KeyModifiers::SUPER);
+ }
+
+ result
+ }
+}
/// Represents a media key (as part of [`KeyCode::Media`]).
#[derive(Debug, PartialOrd, Ord, PartialEq, Eq, Clone, Copy, Hash)]
pub enum MediaKeyCode {
@@ -137,6 +184,51 @@ impl From<termina::event::MediaKeyCode> for MediaKeyCode {
}
}
+#[cfg(all(feature = "term", windows))]
+impl From<MediaKeyCode> for crossterm::event::MediaKeyCode {
+ fn from(media_key_code: MediaKeyCode) -> Self {
+ use crossterm::event::MediaKeyCode as CMediaKeyCode;
+
+ match media_key_code {
+ MediaKeyCode::Play => CMediaKeyCode::Play,
+ MediaKeyCode::Pause => CMediaKeyCode::Pause,
+ MediaKeyCode::PlayPause => CMediaKeyCode::PlayPause,
+ MediaKeyCode::Reverse => CMediaKeyCode::Reverse,
+ MediaKeyCode::Stop => CMediaKeyCode::Stop,
+ MediaKeyCode::FastForward => CMediaKeyCode::FastForward,
+ MediaKeyCode::Rewind => CMediaKeyCode::Rewind,
+ MediaKeyCode::TrackNext => CMediaKeyCode::TrackNext,
+ MediaKeyCode::TrackPrevious => CMediaKeyCode::TrackPrevious,
+ MediaKeyCode::Record => CMediaKeyCode::Record,
+ MediaKeyCode::LowerVolume => CMediaKeyCode::LowerVolume,
+ MediaKeyCode::RaiseVolume => CMediaKeyCode::RaiseVolume,
+ MediaKeyCode::MuteVolume => CMediaKeyCode::MuteVolume,
+ }
+ }
+}
+
+#[cfg(all(feature = "term", windows))]
+impl From<crossterm::event::MediaKeyCode> for MediaKeyCode {
+ fn from(val: crossterm::event::MediaKeyCode) -> Self {
+ use crossterm::event::MediaKeyCode as CMediaKeyCode;
+
+ match val {
+ CMediaKeyCode::Play => MediaKeyCode::Play,
+ CMediaKeyCode::Pause => MediaKeyCode::Pause,
+ CMediaKeyCode::PlayPause => MediaKeyCode::PlayPause,
+ CMediaKeyCode::Reverse => MediaKeyCode::Reverse,
+ CMediaKeyCode::Stop => MediaKeyCode::Stop,
+ CMediaKeyCode::FastForward => MediaKeyCode::FastForward,
+ CMediaKeyCode::Rewind => MediaKeyCode::Rewind,
+ CMediaKeyCode::TrackNext => MediaKeyCode::TrackNext,
+ CMediaKeyCode::TrackPrevious => MediaKeyCode::TrackPrevious,
+ CMediaKeyCode::Record => MediaKeyCode::Record,
+ CMediaKeyCode::LowerVolume => MediaKeyCode::LowerVolume,
+ CMediaKeyCode::RaiseVolume => MediaKeyCode::RaiseVolume,
+ CMediaKeyCode::MuteVolume => MediaKeyCode::MuteVolume,
+ }
+ }
+}
/// Represents a media key (as part of [`KeyCode::Modifier`]).
#[derive(Debug, PartialOrd, Ord, PartialEq, Eq, Clone, Copy, Hash)]
pub enum ModifierKeyCode {
@@ -218,6 +310,53 @@ impl From<termina::event::ModifierKeyCode> for ModifierKeyCode {
}
}
+#[cfg(all(feature = "term", windows))]
+impl From<ModifierKeyCode> for crossterm::event::ModifierKeyCode {
+ fn from(modifier_key_code: ModifierKeyCode) -> Self {
+ use crossterm::event::ModifierKeyCode as CModifierKeyCode;
+
+ match modifier_key_code {
+ ModifierKeyCode::LeftShift => CModifierKeyCode::LeftShift,
+ ModifierKeyCode::LeftControl => CModifierKeyCode::LeftControl,
+ ModifierKeyCode::LeftAlt => CModifierKeyCode::LeftAlt,
+ ModifierKeyCode::LeftSuper => CModifierKeyCode::LeftSuper,
+ ModifierKeyCode::LeftHyper => CModifierKeyCode::LeftHyper,
+ ModifierKeyCode::LeftMeta => CModifierKeyCode::LeftMeta,
+ ModifierKeyCode::RightShift => CModifierKeyCode::RightShift,
+ ModifierKeyCode::RightControl => CModifierKeyCode::RightControl,
+ ModifierKeyCode::RightAlt => CModifierKeyCode::RightAlt,
+ ModifierKeyCode::RightSuper => CModifierKeyCode::RightSuper,
+ ModifierKeyCode::RightHyper => CModifierKeyCode::RightHyper,
+ ModifierKeyCode::RightMeta => CModifierKeyCode::RightMeta,
+ ModifierKeyCode::IsoLevel3Shift => CModifierKeyCode::IsoLevel3Shift,
+ ModifierKeyCode::IsoLevel5Shift => CModifierKeyCode::IsoLevel5Shift,
+ }
+ }
+}
+
+#[cfg(all(feature = "term", windows))]
+impl From<crossterm::event::ModifierKeyCode> for ModifierKeyCode {
+ fn from(val: crossterm::event::ModifierKeyCode) -> Self {
+ use crossterm::event::ModifierKeyCode as CModifierKeyCode;
+
+ match val {
+ CModifierKeyCode::LeftShift => ModifierKeyCode::LeftShift,
+ CModifierKeyCode::LeftControl => ModifierKeyCode::LeftControl,
+ CModifierKeyCode::LeftAlt => ModifierKeyCode::LeftAlt,
+ CModifierKeyCode::LeftSuper => ModifierKeyCode::LeftSuper,
+ CModifierKeyCode::LeftHyper => ModifierKeyCode::LeftHyper,
+ CModifierKeyCode::LeftMeta => ModifierKeyCode::LeftMeta,
+ CModifierKeyCode::RightShift => ModifierKeyCode::RightShift,
+ CModifierKeyCode::RightControl => ModifierKeyCode::RightControl,
+ CModifierKeyCode::RightAlt => ModifierKeyCode::RightAlt,
+ CModifierKeyCode::RightSuper => ModifierKeyCode::RightSuper,
+ CModifierKeyCode::RightHyper => ModifierKeyCode::RightHyper,
+ CModifierKeyCode::RightMeta => ModifierKeyCode::RightMeta,
+ CModifierKeyCode::IsoLevel3Shift => ModifierKeyCode::IsoLevel3Shift,
+ CModifierKeyCode::IsoLevel5Shift => ModifierKeyCode::IsoLevel5Shift,
+ }
+ }
+}
/// Represents a key.
#[derive(Debug, PartialOrd, Ord, PartialEq, Eq, Clone, Copy, Hash)]
pub enum KeyCode {
@@ -351,3 +490,76 @@ impl From<termina::event::KeyCode> for KeyCode {
}
}
}
+
+#[cfg(all(feature = "term", windows))]
+impl From<KeyCode> for crossterm::event::KeyCode {
+ fn from(key_code: KeyCode) -> Self {
+ use crossterm::event::KeyCode as CKeyCode;
+
+ match key_code {
+ KeyCode::Backspace => CKeyCode::Backspace,
+ KeyCode::Enter => CKeyCode::Enter,
+ KeyCode::Left => CKeyCode::Left,
+ KeyCode::Right => CKeyCode::Right,
+ KeyCode::Up => CKeyCode::Up,
+ KeyCode::Down => CKeyCode::Down,
+ KeyCode::Home => CKeyCode::Home,
+ KeyCode::End => CKeyCode::End,
+ KeyCode::PageUp => CKeyCode::PageUp,
+ KeyCode::PageDown => CKeyCode::PageDown,
+ KeyCode::Tab => CKeyCode::Tab,
+ KeyCode::Delete => CKeyCode::Delete,
+ KeyCode::Insert => CKeyCode::Insert,
+ KeyCode::F(f_number) => CKeyCode::F(f_number),
+ KeyCode::Char(character) => CKeyCode::Char(character),
+ KeyCode::Null => CKeyCode::Null,
+ KeyCode::Esc => CKeyCode::Esc,
+ KeyCode::CapsLock => CKeyCode::CapsLock,
+ KeyCode::ScrollLock => CKeyCode::ScrollLock,
+ KeyCode::NumLock => CKeyCode::NumLock,
+ KeyCode::PrintScreen => CKeyCode::PrintScreen,
+ KeyCode::Pause => CKeyCode::Pause,
+ KeyCode::Menu => CKeyCode::Menu,
+ KeyCode::KeypadBegin => CKeyCode::KeypadBegin,
+ KeyCode::Media(media_key_code) => CKeyCode::Media(media_key_code.into()),
+ KeyCode::Modifier(modifier_key_code) => CKeyCode::Modifier(modifier_key_code.into()),
+ }
+ }
+}
+
+#[cfg(all(feature = "term", windows))]
+impl From<crossterm::event::KeyCode> for KeyCode {
+ fn from(val: crossterm::event::KeyCode) -> Self {
+ use crossterm::event::KeyCode as CKeyCode;
+
+ match val {
+ CKeyCode::Backspace => KeyCode::Backspace,
+ CKeyCode::Enter => KeyCode::Enter,
+ CKeyCode::Left => KeyCode::Left,
+ CKeyCode::Right => KeyCode::Right,
+ CKeyCode::Up => KeyCode::Up,
+ CKeyCode::Down => KeyCode::Down,
+ CKeyCode::Home => KeyCode::Home,
+ CKeyCode::End => KeyCode::End,
+ CKeyCode::PageUp => KeyCode::PageUp,
+ CKeyCode::PageDown => KeyCode::PageDown,
+ CKeyCode::Tab => KeyCode::Tab,
+ CKeyCode::BackTab => unreachable!("BackTab should have been handled on KeyEvent level"),
+ CKeyCode::Delete => KeyCode::Delete,
+ CKeyCode::Insert => KeyCode::Insert,
+ CKeyCode::F(f_number) => KeyCode::F(f_number),
+ CKeyCode::Char(character) => KeyCode::Char(character),
+ CKeyCode::Null => KeyCode::Null,
+ CKeyCode::Esc => KeyCode::Esc,
+ CKeyCode::CapsLock => KeyCode::CapsLock,
+ CKeyCode::ScrollLock => KeyCode::ScrollLock,
+ CKeyCode::NumLock => KeyCode::NumLock,
+ CKeyCode::PrintScreen => KeyCode::PrintScreen,
+ CKeyCode::Pause => KeyCode::Pause,
+ CKeyCode::Menu => KeyCode::Menu,
+ CKeyCode::KeypadBegin => KeyCode::KeypadBegin,
+ CKeyCode::Media(media_key_code) => KeyCode::Media(media_key_code.into()),
+ CKeyCode::Modifier(modifier_key_code) => KeyCode::Modifier(modifier_key_code.into()),
+ }
+ }
+}