]> granicus.if.org Git - vim/commitdiff
patch 8.1.0140: recording into a register has focus events v8.1.0140
authorBram Moolenaar <Bram@vim.org>
Tue, 3 Jul 2018 12:48:15 +0000 (14:48 +0200)
committerBram Moolenaar <Bram@vim.org>
Tue, 3 Jul 2018 12:48:15 +0000 (14:48 +0200)
Problem:    Recording into a register has focus events. (Michael Naumann)
Solution:   Don't record K_FOCUSGAINED and K_FOCUSLOST. (closes #3143)

src/getchar.c
src/version.c

index ce7508c569627649d9e81179aa85f8b5c03b8aec..cc43ef24a653daf8badc7a6759356ba2c38374c0 100644 (file)
@@ -1246,27 +1246,43 @@ del_typebuf(int len, int offset)
     static void
 gotchars(char_u *chars, int len)
 {
-    char_u     *s = chars;
-    int                c;
-    char_u     buf[2];
-    int                todo = len;
-
-    /* remember how many chars were last recorded */
-    if (reg_recording != 0)
-       last_recorded_len += len;
+    char_u             *s = chars;
+    int                        i;
+    static char_u      buf[4];
+    static int         buflen = 0;
+    int                        todo = len;
 
-    buf[1] = NUL;
     while (todo--)
     {
+       buf[buflen++] = *s++;
+
+       // When receiving a special key sequence, store it until we have all
+       // the bytes and we can decide what to do with it.
+       if (buflen == 1 && buf[0] == K_SPECIAL)
+           continue;
+       if (buflen == 2)
+           continue;
+       if (buflen == 3 && buf[1] == KS_EXTRA
+                      && (buf[2] == KE_FOCUSGAINED || buf[2] == KE_FOCUSLOST))
+       {
+           // Drop K_FOCUSGAINED and K_FOCUSLOST, they are not useful in a
+           // recording.
+           buflen = 0;
+           continue;
+       }
+
        /* Handle one byte at a time; no translation to be done. */
-       c = *s++;
-       updatescript(c);
+       for (i = 0; i < buflen; ++i)
+           updatescript(buf[i]);
 
        if (reg_recording != 0)
        {
-           buf[0] = c;
-           add_buff(&recordbuff, buf, 1L);
+           buf[buflen] = NUL;
+           add_buff(&recordbuff, buf, (long)buflen);
+           /* remember how many chars were last recorded */
+           last_recorded_len += buflen;
        }
+       buflen = 0;
     }
     may_sync_undo();
 
index 0fdf075f209eac3d6e66f78ed659c698275fd362..512001c1e2099cdf4c633d062c201a74b625759c 100644 (file)
@@ -789,6 +789,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    140,
 /**/
     139,
 /**/