tui: fix handling of bg response after suspend (#11145)

`tui_terminal_after_startup` gets called right after resuming from
suspending (via `Ctrl-z`) already (not delayed as with the startup
itself), and would set `waiting_for_bg_response` to false then directly.
This results in the terminal response not being processed then anymore,
and leaking into Neovim itself.

This changes it to try 5 times always, which means that it typically
would stop after a few characters of input from the user typically, e.g.
with tmux, which does not send a reply.

While it might be better to have something based on the time (e.g. only
wait for max 1s), this appears to be easier to do.

Fixes regression in 8a4ae3d.
This commit is contained in:
Daniel Hahler
2019-10-03 08:04:24 +02:00
committed by GitHub
parent 30479417e8
commit f96d1e6bc4
4 changed files with 18 additions and 22 deletions

View File

@@ -27,7 +27,7 @@ void tinput_init(TermInput *input, Loop *loop)
input->loop = loop;
input->paste = 0;
input->in_fd = 0;
input->waiting_for_bg_response = false;
input->waiting_for_bg_response = 0;
input->key_buffer = rbuffer_new(KEY_BUFFER_SIZE);
uv_mutex_init(&input->key_buffer_mutex);
uv_cond_init(&input->key_buffer_cond);
@@ -444,7 +444,7 @@ static void set_bg_deferred(void **argv)
// [1] https://en.wikipedia.org/wiki/Luma_%28video%29
static bool handle_background_color(TermInput *input)
{
if (!input->waiting_for_bg_response) {
if (input->waiting_for_bg_response <= 0) {
return false;
}
size_t count = 0;
@@ -465,9 +465,13 @@ static bool handle_background_color(TermInput *input)
header_size = 10;
num_components = 4;
} else {
input->waiting_for_bg_response--;
if (input->waiting_for_bg_response == 0) {
DLOG("did not get a response for terminal background query");
}
return false;
}
input->waiting_for_bg_response = false;
input->waiting_for_bg_response = 0;
rbuffer_consumed(input->read_stream.buffer, header_size);
RBUFFER_EACH(input->read_stream.buffer, c, i) {
count = i + 1;

View File

@@ -12,7 +12,7 @@ typedef struct term_input {
// Phases: -1=all 0=disabled 1=first-chunk 2=continue 3=last-chunk
int8_t paste;
bool waiting;
bool waiting_for_bg_response;
int8_t waiting_for_bg_response;
TermKey *tk;
#if TERMKEY_VERSION_MAJOR > 0 || TERMKEY_VERSION_MINOR > 18
TermKey_Terminfo_Getstr_Hook *tk_ti_hook_fn; ///< libtermkey terminfo hook

View File

@@ -296,7 +296,7 @@ static void terminfo_start(UI *ui)
unibi_out(ui, unibi_keypad_xmit);
unibi_out(ui, unibi_clear_screen);
// Ask the terminal to send us the background color.
data->input.waiting_for_bg_response = true;
data->input.waiting_for_bg_response = 5;
unibi_out_ext(ui, data->unibi_ext.get_bg);
// Enable bracketed paste
unibi_out_ext(ui, data->unibi_ext.enable_bracketed_paste);
@@ -366,11 +366,6 @@ static void tui_terminal_after_startup(UI *ui)
// 2.3 bug(?) which caused slow drawing during startup. #7649
unibi_out_ext(ui, data->unibi_ext.enable_focus_reporting);
flush_buf(ui);
if (data->input.waiting_for_bg_response) {
DLOG("did not get a response for terminal background query");
data->input.waiting_for_bg_response = false;
}
}
static void tui_terminal_stop(UI *ui)