@@ -268,7 +268,7 @@ pub struct Parser {
268268 bracketed_paste : bool ,
269269 bracketed_paste_buf : Vec < u8 > ,
270270 x10_mouse_want : bool ,
271- x10_mouse_buf : [ u8 ; 3 ] ,
271+ x10_mouse_buf : [ char ; 3 ] ,
272272 x10_mouse_len : usize ,
273273}
274274
@@ -281,7 +281,7 @@ impl Parser {
281281 bracketed_paste : false ,
282282 bracketed_paste_buf : Vec :: new ( ) ,
283283 x10_mouse_want : false ,
284- x10_mouse_buf : [ 0 ; 3 ] ,
284+ x10_mouse_buf : [ '\0' ; 3 ] ,
285285 x10_mouse_len : 0 ,
286286 }
287287 }
@@ -535,27 +535,35 @@ impl<'input> Stream<'_, '_, 'input> {
535535 /// This is so puzzling to me. The existence of this function makes me unhappy.
536536 #[ cold]
537537 fn parse_x10_mouse_coordinates ( & mut self ) -> Option < Input < ' input > > {
538- self . parser . x10_mouse_len +=
539- self . stream . read ( & mut self . parser . x10_mouse_buf [ self . parser . x10_mouse_len ..] ) ;
538+ while self . parser . x10_mouse_len < 3 && !self . stream . done ( ) {
539+ self . parser . x10_mouse_buf [ self . parser . x10_mouse_len ] = self . stream . next_char ( ) ;
540+ self . parser . x10_mouse_len += 1 ;
541+ }
540542 if self . parser . x10_mouse_len < 3 {
541543 return None ;
542544 }
543545
544- let button = self . parser . x10_mouse_buf [ 0 ] & 0b11 ;
545- let modifier = self . parser . x10_mouse_buf [ 0 ] & 0b11100 ;
546+ let b = self . parser . x10_mouse_buf [ 0 ] as u32 ;
546547 let x = self . parser . x10_mouse_buf [ 1 ] as CoordType - 0x21 ;
547548 let y = self . parser . x10_mouse_buf [ 2 ] as CoordType - 0x21 ;
548- let action = match button {
549+ let action = match b & 0b11 {
549550 0 => InputMouseState :: Left ,
550551 1 => InputMouseState :: Middle ,
551552 2 => InputMouseState :: Right ,
552553 _ => InputMouseState :: None ,
553554 } ;
554- let modifiers = match modifier {
555- 4 => kbmod:: SHIFT ,
556- 8 => kbmod:: ALT ,
557- 16 => kbmod:: CTRL ,
558- _ => kbmod:: NONE ,
555+ let modifiers = {
556+ let mut m = kbmod:: NONE ;
557+ if ( b & 0b00100 ) != 0 {
558+ m |= kbmod:: SHIFT ;
559+ }
560+ if ( b & 0b01000 ) != 0 {
561+ m |= kbmod:: ALT ;
562+ }
563+ if ( b & 0b10000 ) != 0 {
564+ m |= kbmod:: CTRL ;
565+ }
566+ m
559567 } ;
560568
561569 self . parser . x10_mouse_want = false ;
0 commit comments