]> git.ipfire.org Git - thirdparty/git.git/commitdiff
terminal: set VMIN and VTIME in non-canonical mode
authorPhillip Wood <phillip.wood@dunelm.org.uk>
Tue, 22 Feb 2022 18:53:34 +0000 (18:53 +0000)
committerJunio C Hamano <gitster@pobox.com>
Wed, 23 Feb 2022 21:30:06 +0000 (13:30 -0800)
If VMIN and VTIME are both set to zero then the terminal performs
non-blocking reads which means that read_key_without_echo() returns
EOF if there is no key press pending. This results in the user being
unable to select anything when running "git add -p".  Fix this by
explicitly setting VMIN and VTIME when enabling non-canonical mode.

Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
compat/terminal.c

index 11288cfe5c96680862c101441ffdcb4fd8755e1b..3620184e790ca93b29fd403ba884f337ca5ec4a1 100644 (file)
@@ -57,6 +57,10 @@ static int disable_bits(tcflag_t bits)
        t = old_term;
 
        t.c_lflag &= ~bits;
+       if (bits & ICANON) {
+               t.c_cc[VMIN] = 1;
+               t.c_cc[VTIME] = 0;
+       }
        if (!tcsetattr(term_fd, TCSAFLUSH, &t))
                return 0;
 
@@ -159,7 +163,11 @@ static int disable_bits(DWORD bits)
 
                if (bits & ENABLE_LINE_INPUT) {
                        string_list_append(&stty_restore, "icanon");
-                       strvec_push(&cp.args, "-icanon");
+                       /*
+                        * POSIX allows VMIN and VTIME to overlap with VEOF and
+                        * VEOL - let's hope that is not the case on windows.
+                        */
+                       strvec_pushl(&cp.args, "-icanon", "min", "1", "time", "0", NULL);
                }
 
                if (bits & ENABLE_ECHO_INPUT) {