Skip to content

Commit 70286ff

Browse files
committed
Don't panic if we get an unexpected key code
It seems like we get media play/pause/mute/etc keys despite not emitting DISAMBIGUATE_ESCAPE_CODES(#4125). Make crossterm::event::KeyCode a TryInto for KeyCode instead of Into to let us ignore keys we don't care about.
1 parent 1bed2f3 commit 70286ff

File tree

3 files changed

+32
-20
lines changed

3 files changed

+32
-20
lines changed

helix-term/src/application.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -538,14 +538,22 @@ impl Application {
538538
jobs: &mut self.jobs,
539539
scroll: None,
540540
};
541-
// Handle key events
542541
let should_redraw = match event.unwrap() {
543542
CrosstermEvent::Resize(width, height) => {
544543
self.compositor.resize(width, height);
545544
self.compositor
546545
.handle_event(&Event::Resize(width, height), &mut cx)
547546
}
548-
event => self.compositor.handle_event(&event.into(), &mut cx),
547+
event => match &event.try_into() {
548+
Ok(event) => self.compositor.handle_event(event, &mut cx),
549+
Err(err) => {
550+
log::warn!(
551+
"Unable to convert crossterm event to helix event. Ignoring. Cause: {}",
552+
err
553+
);
554+
false
555+
}
556+
},
549557
};
550558

551559
if should_redraw && !self.editor.should_close() {

helix-view/src/input.rs

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -276,16 +276,17 @@ impl<'de> Deserialize<'de> for KeyEvent {
276276
}
277277

278278
#[cfg(feature = "term")]
279-
impl From<crossterm::event::Event> for Event {
280-
fn from(event: crossterm::event::Event) -> Self {
281-
match event {
282-
crossterm::event::Event::Key(key) => Self::Key(key.into()),
279+
impl TryFrom<crossterm::event::Event> for Event {
280+
type Error = anyhow::Error;
281+
fn try_from(event: crossterm::event::Event) -> Result<Self, Error> {
282+
Ok(match event {
283+
crossterm::event::Event::Key(key) => Self::Key(key.try_into()?),
283284
crossterm::event::Event::Mouse(mouse) => Self::Mouse(mouse.into()),
284285
crossterm::event::Event::Resize(w, h) => Self::Resize(w, h),
285286
crossterm::event::Event::FocusGained => Self::FocusGained,
286287
crossterm::event::Event::FocusLost => Self::FocusLost,
287288
crossterm::event::Event::Paste(s) => Self::Paste(s),
288-
}
289+
})
289290
}
290291
}
291292

@@ -334,25 +335,26 @@ impl From<crossterm::event::MouseButton> for MouseButton {
334335
}
335336

336337
#[cfg(feature = "term")]
337-
impl From<crossterm::event::KeyEvent> for KeyEvent {
338-
fn from(
338+
impl TryFrom<crossterm::event::KeyEvent> for KeyEvent {
339+
type Error = anyhow::Error;
340+
fn try_from(
339341
crossterm::event::KeyEvent {
340342
code, modifiers, ..
341343
}: crossterm::event::KeyEvent,
342-
) -> Self {
344+
) -> Result<Self, Error> {
343345
if code == crossterm::event::KeyCode::BackTab {
344346
// special case for BackTab -> Shift-Tab
345347
let mut modifiers: KeyModifiers = modifiers.into();
346348
modifiers.insert(KeyModifiers::SHIFT);
347-
Self {
349+
Ok(Self {
348350
code: KeyCode::Tab,
349351
modifiers,
350-
}
352+
})
351353
} else {
352-
Self {
353-
code: code.into(),
354+
Ok(Self {
355+
code: code.try_into()?,
354356
modifiers: modifiers.into(),
355-
}
357+
})
356358
}
357359
}
358360
}

helix-view/src/keyboard.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use anyhow::{bail, Error};
12
use bitflags::bitflags;
23

34
bitflags! {
@@ -124,11 +125,12 @@ impl From<KeyCode> for crossterm::event::KeyCode {
124125
}
125126

126127
#[cfg(feature = "term")]
127-
impl From<crossterm::event::KeyCode> for KeyCode {
128-
fn from(val: crossterm::event::KeyCode) -> Self {
128+
impl TryFrom<crossterm::event::KeyCode> for KeyCode {
129+
type Error = Error;
130+
fn try_from(val: crossterm::event::KeyCode) -> Result<Self, Error> {
129131
use crossterm::event::KeyCode as CKeyCode;
130132

131-
match val {
133+
Ok(match val {
132134
CKeyCode::Backspace => KeyCode::Backspace,
133135
CKeyCode::Enter => KeyCode::Enter,
134136
CKeyCode::Left => KeyCode::Left,
@@ -155,9 +157,9 @@ impl From<crossterm::event::KeyCode> for KeyCode {
155157
| CKeyCode::Menu
156158
| CKeyCode::KeypadBegin
157159
| CKeyCode::Media(_)
158-
| CKeyCode::Modifier(_) => unreachable!(
160+
| CKeyCode::Modifier(_) => bail!(
159161
"Shouldn't get this key without enabling DISAMBIGUATE_ESCAPE_CODES in crossterm"
160162
),
161-
}
163+
})
162164
}
163165
}

0 commit comments

Comments
 (0)