git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 2/3] terminal: set VMIN and VTIME in non-canonical mode

From
Junio C Hamano <gitster@pobox.com>
Date
Feb 16, 2022, 21:40 UTC
Message-ID
<xmqqpmnmcwwu.fsf@gitster.g>
In-Reply-To
<02009172e081ab5c4de8e2476c1142f97b41698e.1645008873.git.gitgitgadget@gmail.com>
"Phillip Wood via GitGitGadget" <gitgitgadget@gmail.com> writes:
Show 7 quoted lines
> From: Phillip Wood <phillip.wood@dunelm.org.uk>
>
> 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.
Makes sense.
Show 18 quoted lines
>
> Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
> ---
>  compat/terminal.c | 10 +++++++++-
>  1 file changed, 9 insertions(+), 1 deletion(-)
>
> diff --git a/compat/terminal.c b/compat/terminal.c
> index 20803badd03..d882dfa06e3 100644
> --- a/compat/terminal.c
> +++ b/compat/terminal.c
> @@ -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;
> +	}

Quite sensible. I wonder if we can simplify the "are we looking at an ESC that is the first byte of a multi-byte control sequence?" logic in the caller by using inter-character delay, but it is probably better to go one step at a time like this patch does.

Show 13 quoted lines
>  	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);

Interesting. So each call to read_key_without_echo() ends up being a run_command("stty -icanon min 1 time 0") followed by a read followed by another "stty".

At least while in -icanon mode, VEOF and VEOL do not take effect, and the potential overlap would not matter. It really depends on what happens upon restore.

Do we have similar "let's hope" on the tcsetattr() side, too?
>  		}
>  
>  		if (bits & ENABLE_ECHO_INPUT) {
Thanks.
Previous: Phillip Wood via GitGitGadgetNext: Phillip Wood
Message 4 of 18 in “a couple of read_key_without_echo() fixes”
  1. 0/3 a couple of read_key_without_echo() fixesPhillip Wood via GitGitGadget, Feb 16, 2022
  2. 1/3 terminal: pop signal handler when terminal is restoredPhillip Wood via GitGitGadget, Feb 16, 2022
  3. 2/3 terminal: set VMIN and VTIME in non-canonical modePhillip Wood via GitGitGadget, Feb 16, 2022
  4. Junio C HamanoFeb 16, 2022
  5. Phillip WoodFeb 17, 2022
  6. 3/3 add -p: disable stdin buffering when interactive.singlekey is setPhillip Wood via GitGitGadget, Feb 16, 2022
  7. Junio C HamanoFeb 16, 2022
  8. 0/4 a couple of read_key_without_echo() fixesPhillip Wood via GitGitGadget, Feb 22, 2022
  9. 1/4 terminal: always reset terminal when reading without echoPhillip Wood via GitGitGadget, Feb 22, 2022
  10. 2/4 terminal: pop signal handler when terminal is restoredPhillip Wood via GitGitGadget, Feb 22, 2022
  11. 3/4 terminal: set VMIN and VTIME in non-canonical modePhillip Wood via GitGitGadget, Feb 22, 2022
  12. 4/4 add -p: disable stdin buffering when interactive.singlekey is setPhillip Wood via GitGitGadget, Feb 22, 2022
  13. Junio C HamanoFeb 23, 2022
  14. Phillip WoodFeb 24, 2022
  15. Carlo ArenasMar 22, 2022
  16. Junio C HamanoMar 23, 2022
  17. Johannes SchindelinMar 24, 2022
  18. Phillip WoodMar 28, 2022

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.