Skip to content

Commit

Permalink
Merge pull request neovim#13084 from erw7/fix-tui-cooked-mode
Browse files Browse the repository at this point in the history
tui: fix problem that TTY does not go into raw mode
  • Loading branch information
teto authored Oct 25, 2020
2 parents 7fef16e + 2e70fee commit 4ba5b4a
Showing 1 changed file with 16 additions and 1 deletion.
17 changes: 16 additions & 1 deletion src/nvim/tui/tui.c
Original file line number Diff line number Diff line change
Expand Up @@ -316,7 +316,13 @@ static void terminfo_start(UI *ui)
#ifdef WIN32
uv_tty_set_mode(&data->output_handle.tty, UV_TTY_MODE_RAW);
#else
uv_tty_set_mode(&data->output_handle.tty, UV_TTY_MODE_IO);
int retry_count = 10;
// A signal may cause uv_tty_set_mode() to fail (e.g., SIGCONT). Retry a
// few times. #12322
while (uv_tty_set_mode(&data->output_handle.tty, UV_TTY_MODE_IO) == UV_EINTR
&& retry_count > 0) {
retry_count--;
}
#endif
} else {
uv_pipe_init(&data->write_loop, &data->output_handle.pipe, 0);
Expand Down Expand Up @@ -1102,6 +1108,15 @@ static void tui_set_mode(UI *ui, ModeShape mode)
static void tui_mode_change(UI *ui, String mode, Integer mode_idx)
{
TUIData *data = ui->data;
#ifdef UNIX
// If stdin is not a TTY, the LHS of pipe may change the state of the TTY
// after calling uv_tty_set_mode. So, set the mode of the TTY again here.
// #13073
if (data->is_starting && data->input.in_fd == STDERR_FILENO) {
uv_tty_set_mode(&data->output_handle.tty, UV_TTY_MODE_NORMAL);
uv_tty_set_mode(&data->output_handle.tty, UV_TTY_MODE_IO);
}
#endif
tui_set_mode(ui, (ModeShape)mode_idx);
data->is_starting = false; // mode entered, no longer starting
data->showing_mode = (ModeShape)mode_idx;
Expand Down

0 comments on commit 4ba5b4a

Please sign in to comment.