aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Hahler <git@thequod.de>2019-10-03 08:04:24 +0200
committerGitHub <noreply@github.com>2019-10-03 08:04:24 +0200
commitf96d1e6bc416fe0d1d11321234637695ff0e514e (patch)
treec9cf04d21a9fe8872dcda6e6256f455004e88872
parent30479417e808eac338025dbbfbd3724e158fb344 (diff)
downloadrneovim-f96d1e6bc416fe0d1d11321234637695ff0e514e.tar.gz
rneovim-f96d1e6bc416fe0d1d11321234637695ff0e514e.tar.bz2
rneovim-f96d1e6bc416fe0d1d11321234637695ff0e514e.zip
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.
-rw-r--r--src/nvim/tui/input.c10
-rw-r--r--src/nvim/tui/input.h2
-rw-r--r--src/nvim/tui/tui.c7
-rw-r--r--test/unit/tui_spec.lua21
4 files changed, 18 insertions, 22 deletions
diff --git a/src/nvim/tui/input.c b/src/nvim/tui/input.c
index 876f00e03e..844bc0db40 100644
--- a/src/nvim/tui/input.c
+++ b/src/nvim/tui/input.c
@@ -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;
diff --git a/src/nvim/tui/input.h b/src/nvim/tui/input.h
index 49ae32f00e..77bd6fa132 100644
--- a/src/nvim/tui/input.h
+++ b/src/nvim/tui/input.h
@@ -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
diff --git a/src/nvim/tui/tui.c b/src/nvim/tui/tui.c
index 956d4eb9da..150862bb18 100644
--- a/src/nvim/tui/tui.c
+++ b/src/nvim/tui/tui.c
@@ -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)
diff --git a/test/unit/tui_spec.lua b/test/unit/tui_spec.lua
index 47dbd87b71..e6b5c889d7 100644
--- a/test/unit/tui_spec.lua
+++ b/test/unit/tui_spec.lua
@@ -16,7 +16,7 @@ itp('handle_background_color', function()
local events = globals.main_loop.thread_events
-- Short-circuit when not waiting for response.
- term_input.waiting_for_bg_response = false
+ term_input.waiting_for_bg_response = 0
eq(false, handle_background_color(term_input))
local capacity = 100
@@ -27,9 +27,9 @@ itp('handle_background_color', function()
local term_response = '\027]11;'..colorspace..':'..color..'\007'
rbuffer.rbuffer_write(rbuf, to_cstr(term_response), #term_response)
- term_input.waiting_for_bg_response = true
+ term_input.waiting_for_bg_response = 1
eq(true, handle_background_color(term_input))
- eq(false, term_input.waiting_for_bg_response)
+ eq(0, term_input.waiting_for_bg_response)
eq(1, multiqueue.multiqueue_size(events))
local event = multiqueue.multiqueue_get(events)
@@ -101,10 +101,9 @@ itp('handle_background_color', function()
local term_response = '\027]11;rgba:f/f/f/f' -- missing '\007
rbuffer.rbuffer_write(rbuf, to_cstr(term_response), #term_response)
- term_input.waiting_for_bg_response = true
- eq(true, term_input.waiting_for_bg_response)
+ term_input.waiting_for_bg_response = 1
eq(false, handle_background_color(term_input))
- eq(false, term_input.waiting_for_bg_response)
+ eq(0, term_input.waiting_for_bg_response)
eq(0, multiqueue.multiqueue_size(events))
eq(0, rbuf.size)
@@ -114,10 +113,9 @@ itp('handle_background_color', function()
term_response = '123\027]11;rgba:f/f/f/f\007456'
rbuffer.rbuffer_write(rbuf, to_cstr(term_response), #term_response)
- term_input.waiting_for_bg_response = true
- eq(true, term_input.waiting_for_bg_response)
+ term_input.waiting_for_bg_response = 3
eq(false, handle_background_color(term_input))
- eq(true, term_input.waiting_for_bg_response)
+ eq(2, term_input.waiting_for_bg_response)
eq(0, multiqueue.multiqueue_size(events))
eq(#term_response, rbuf.size)
@@ -128,10 +126,9 @@ itp('handle_background_color', function()
term_response = '\027]11;rgba:f/f/f/f\007456'
rbuffer.rbuffer_write(rbuf, to_cstr(term_response), #term_response)
- term_input.waiting_for_bg_response = true
- eq(true, term_input.waiting_for_bg_response)
+ term_input.waiting_for_bg_response = 1
eq(true, handle_background_color(term_input))
- eq(false, term_input.waiting_for_bg_response)
+ eq(0, term_input.waiting_for_bg_response)
eq(1, multiqueue.multiqueue_size(events))
eq(3, rbuf.size)