mirror of
https://github.com/neovim/neovim.git
synced 2025-10-17 15:21:47 +00:00
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:
@@ -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;
|
||||
|
@@ -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
|
||||
|
@@ -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)
|
||||
|
Reference in New Issue
Block a user