Skip to content

Commit 0a878e6

Browse files
committed
More forgiving CSI-u input parsing
1 parent f151977 commit 0a878e6

File tree

1 file changed

+13
-13
lines changed

1 file changed

+13
-13
lines changed

src/term/input_parser.rs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use anyhow::{anyhow, bail};
1+
use anyhow::{anyhow, bail, Context};
22
use crossterm::event::{
33
KeyCode, KeyEvent, KeyEventKind, KeyEventState, KeyModifiers, MediaKeyCode,
44
ModifierKeyCode, MouseButton, MouseEvent, MouseEventKind,
@@ -296,10 +296,11 @@ where
296296

297297
let (mods, kind) = if let Some(mods_param) = params.next() {
298298
let mut mods_param = mods_param.split(':');
299-
let mods =
300-
parse_modifiers(mods_param.next().unwrap_or_default().parse::<u8>()?);
299+
let mods = parse_modifiers(
300+
mods_param.next().unwrap_or("0").parse::<u8>().unwrap_or(0),
301+
);
301302
let kind = parse_key_event_kind(
302-
mods_param.next().unwrap_or("").parse().unwrap_or_default(),
303+
mods_param.next().unwrap_or("").parse().unwrap_or(0),
303304
);
304305
(mods, kind)
305306
} else {
@@ -330,7 +331,8 @@ where
330331
} else {
331332
// CSI unicode-key-code:alternate-key-codes ; modifiers:event-type ; text-as-codepoints u
332333

333-
let (code, alt_code, mods_param, kind) = parse_csi_u(params)?;
334+
let (code, alt_code, mods_param, kind) =
335+
parse_csi_u(params).context("parse_csi_u")?;
334336

335337
let mut mods = parse_modifiers(mods_param);
336338
let kind = parse_key_event_kind(kind);
@@ -564,20 +566,18 @@ fn parse_csi_u(params: &[u8]) -> anyhow::Result<(u32, Option<u32>, u8, u8)> {
564566
let params = str::from_utf8(params)?;
565567
let mut params = params.split(';');
566568

567-
let code_param = params.next().ok_or_else(|| anyhow!("No code param"))?;
569+
let code_param = params.next().unwrap_or("");
568570
let mut code_param = code_param.split(':');
569-
let code = code_param.next().ok_or_else(|| anyhow!("No code param"))?;
571+
let code = code_param.next().unwrap_or("0");
570572
let code = code.parse::<u32>()?;
571573

572-
let alt_code = code_param.next().map(|c| c.parse::<u32>()).transpose()?;
574+
let alt_code = code_param.next().map(|c| c.parse::<u32>().ok()).flatten();
573575

574576
let mods_param = params.next().unwrap_or("0");
575577
let mut mods_param = mods_param.split(':');
576-
let mods = mods_param
577-
.next()
578-
.ok_or_else(|| anyhow!("No modifiers param"))?;
579-
let mods = mods.parse::<u8>()?;
580-
let kind = mods_param.next().map_or(Ok(1), |n| n.parse::<u8>())?;
578+
let mods = mods_param.next().unwrap_or("0");
579+
let mods = mods.parse::<u8>().unwrap_or(0);
580+
let kind = mods_param.next().unwrap_or("1").parse::<u8>().unwrap_or(1);
581581

582582
Ok((code, alt_code, mods, kind))
583583
}

0 commit comments

Comments
 (0)