@@ -2,7 +2,8 @@ use std::io;
22
33use crate :: event:: {
44 Event , KeyCode , KeyEvent , KeyEventKind , KeyEventState , KeyModifiers , KeyboardEnhancementFlags ,
5- MediaKeyCode , ModifierKeyCode , MouseButton , MouseEvent , MouseEventKind , ThemeMode ,
5+ MediaKeyCode , ModifierKeyCode , MouseButton , MouseEvent , MouseEventKind , SynchronizedOutputMode ,
6+ ThemeMode ,
67} ;
78
89use super :: super :: super :: InternalEvent ;
@@ -181,6 +182,7 @@ pub(crate) fn parse_csi(buffer: &[u8]) -> io::Result<Option<InternalEvent>> {
181182 b'u' => return parse_csi_keyboard_enhancement_flags ( buffer) ,
182183 b'c' => return parse_csi_primary_device_attributes ( buffer) ,
183184 b'n' => return parse_csi_theme_mode ( buffer) ,
185+ b'y' => return parse_csi_synchronized_output_mode ( buffer) ,
184186 _ => None ,
185187 } ,
186188 b'0' ..=b'9' => {
@@ -327,6 +329,36 @@ fn parse_csi_theme_mode(buffer: &[u8]) -> io::Result<Option<InternalEvent>> {
327329 ) ) ) )
328330}
329331
332+ fn parse_csi_synchronized_output_mode ( buffer : & [ u8 ] ) -> io:: Result < Option < InternalEvent > > {
333+ // ESC [ ? 2026 ; 0 $ y
334+ assert ! ( buffer. starts_with( b"\x1B [?" ) ) ;
335+ assert ! ( buffer. ends_with( b"y" ) ) ;
336+
337+ let s = std:: str:: from_utf8 ( & buffer[ 3 ..buffer. len ( ) - 1 ] )
338+ . map_err ( |_| could_not_parse_event_error ( ) ) ?;
339+ let s = match s. strip_suffix ( '$' ) {
340+ Some ( s) => s,
341+ None => return Ok ( None ) ,
342+ } ;
343+
344+ let mut split = s. split ( ';' ) ;
345+
346+ if next_parsed :: < u16 > ( & mut split) ? != 2026 {
347+ return Ok ( None ) ;
348+ }
349+
350+ let synchronized_output_mode = match next_parsed :: < u8 > ( & mut split) ? {
351+ 1 => SynchronizedOutputMode :: Set ,
352+ 2 => SynchronizedOutputMode :: Reset ,
353+ 0 | 4 => SynchronizedOutputMode :: NotSupported ,
354+ _ => return Ok ( None ) ,
355+ } ;
356+
357+ Ok ( Some ( InternalEvent :: SynchronizedOutputMode (
358+ synchronized_output_mode,
359+ ) ) )
360+ }
361+
330362fn parse_modifiers ( mask : u8 ) -> KeyModifiers {
331363 let modifier_mask = mask. saturating_sub ( 1 ) ;
332364 let mut modifiers = KeyModifiers :: empty ( ) ;
0 commit comments