Subject: Re: bug#37782: Emacs 27 client adding [I] to the beginning of the buffer

From: Carlos Pita <[email-masked]>
Date: Sat, 19 Oct 2019 00:20:05 -0300

After hours and hours (and hours) of life sucking debugging I found
out the offending code (in read_key_sequence):

    if ((FIXNUMP (key) && XFIXNUM (key) == -2) /* wrong_kboard_jmpbuf */
/* When switching to a new tty (with a new keyboard),
   read_char returns the new buffer, rather than -2
   (Bug#5095).  This is because `terminal-init-xterm'
   calls read-char, which eats the wrong_kboard_jmpbuf
   return.  Any better way to fix this? -- cyd  */
|| (interrupted_kboard != current_kboard))
  {
   ....
   mock_input = 0;
   goto replay_entire_sequence;
  }

The problem with the fix for #5095 is that it's dropping the current
event, which is a valid char event and not -2. Thus, the first esc
char sent by the terminal after turning on focus tracking is lost and
we get `[`, `I` events separately inserted into the buffer afterwards.

Attached is a patch that replays key as mock input when it's not -2.

Can I ask for some of my hidpi fringe or colorized comint/python
history patches to be merged in exchange ;) ?

Best regards
--
Carlos
From 0e98bdf5aa485c2b4164c9627ec34b7b54892352 Mon Sep 17 00:00:00 2001
From: memeplex <[email-masked]>
Date: Sat, 19 Oct 2019 00:13:15 -0300
Subject: [PATCH] Replay key if kboard is interrupted while initializing
 (Bug#37782)

* src/keyboard.c (read_key_sequence): Add key as mock_input and replay
sequence using new keyboard.
---
 src/keyboard.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/src/keyboard.c b/src/keyboard.c
index d67d18a801..5a214833ed 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -9580,7 +9580,16 @@ read_key_sequence (Lisp_Object *keybuf, Lisp_Object prompt,
 		       Fcons (make_lispy_switch_frame (frame),
 			      KVAR (interrupted_kboard, kbd_queue)));
 		  }
-		mock_input = 0;
+                if (FIXNUMP (key) && XFIXNUM (key) == -2)
+                  mock_input = 0;
+                else
+                  {
+                    /* If interrupted while initializing terminal, we
+                       need to replay the interrupting key.  See
+                       Bug#5095 and Bug#37782.  */
+                    mock_input = 1;
+                    keybuf[0] = key;
+                  }
 		goto replay_entire_sequence;
 	      }
 	  }
-- 
2.20.1