aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThiago de Arruda <tpadilha84@gmail.com>2015-02-20 10:16:19 -0300
committerThiago de Arruda <tpadilha84@gmail.com>2015-02-20 10:16:19 -0300
commit2f04fd4e722e02a340af9676a78d165cc9a1069f (patch)
treea638154e09655a41c224ffeedf19234766b261c3 /src
parent8efb3607a7f6cefce450953c7f8d5e3299347bae (diff)
parent9894720a0557cb80e11d33cb3b3a8fbf23827b9c (diff)
downloadrneovim-2f04fd4e722e02a340af9676a78d165cc9a1069f.tar.gz
rneovim-2f04fd4e722e02a340af9676a78d165cc9a1069f.tar.bz2
rneovim-2f04fd4e722e02a340af9676a78d165cc9a1069f.zip
Merge PR #2025 'More fixes to the new TUI'
Diffstat (limited to 'src')
-rw-r--r--src/nvim/tui/term_input.inl27
-rw-r--r--src/nvim/tui/tui.c45
2 files changed, 43 insertions, 29 deletions
diff --git a/src/nvim/tui/term_input.inl b/src/nvim/tui/term_input.inl
index dba970e8f2..9a40a64ed9 100644
--- a/src/nvim/tui/term_input.inl
+++ b/src/nvim/tui/term_input.inl
@@ -10,8 +10,9 @@
struct term_input {
int in_fd;
+ bool paste_enabled;
TermKey *tk;
- uv_tty_t input_handle;
+ uv_pipe_t input_handle;
uv_timer_t timer_handle;
RBuffer *read_buffer;
RStream *read_stream;
@@ -111,17 +112,11 @@ static void timer_cb(uv_timer_t *handle);
static int get_key_code_timeout(void)
{
- Integer ms = 0;
- bool timeout = false;
- // Check 'timeout' and 'ttimeout' to determine if we should send ESC
- // after 'ttimeoutlen'. See :help 'ttimeout' for more information
+ Integer ms = -1;
+ // Check 'ttimeout' to determine if we should send ESC after 'ttimeoutlen'.
+ // See :help 'ttimeout' for more information
Error err = ERROR_INIT;
- timeout = vim_get_option(cstr_as_string("timeout"), &err).data.boolean;
- if (!timeout) {
- timeout = vim_get_option(cstr_as_string("ttimeout"), &err).data.boolean;
- }
-
- if (timeout) {
+ if (vim_get_option(cstr_as_string("ttimeout"), &err).data.boolean) {
ms = vim_get_option(cstr_as_string("ttimeoutlen"), &err).data.integer;
}
@@ -175,6 +170,9 @@ static bool handle_bracketed_paste(TermInput *input)
bool enable = ptr[4] == '0';
// Advance past the sequence
rbuffer_consumed(input->read_buffer, 6);
+ if (input->paste_enabled == enable) {
+ return true;
+ }
if (enable) {
// Get the current mode
int state = get_real_state();
@@ -190,6 +188,7 @@ static bool handle_bracketed_paste(TermInput *input)
}
}
input_enqueue(cstr_as_string(PASTETOGGLE_KEY));
+ input->paste_enabled = enable;
return true;
}
return false;
@@ -240,6 +239,7 @@ static void read_cb(RStream *rstream, void *rstream_data, bool eof)
static TermInput *term_input_new(void)
{
TermInput *rv = xmalloc(sizeof(TermInput));
+ rv->paste_enabled = false;
// read input from stderr if stdin is not a tty
rv->in_fd = os_isatty(0) ? 0 : (os_isatty(2) ? 2 : 0);
@@ -259,8 +259,8 @@ static TermInput *term_input_new(void)
int curflags = termkey_get_canonflags(rv->tk);
termkey_set_canonflags(rv->tk, curflags | TERMKEY_CANON_DELBS);
// setup input handle
- uv_tty_init(uv_default_loop(), &rv->input_handle, rv->in_fd, 1);
- uv_tty_set_mode(&rv->input_handle, UV_TTY_MODE_RAW);
+ uv_pipe_init(uv_default_loop(), &rv->input_handle, 0);
+ uv_pipe_open(&rv->input_handle, rv->in_fd);
rv->input_handle.data = NULL;
rv->read_buffer = rbuffer_new(0xfff);
rv->read_stream = rstream_new(read_cb, rv->read_buffer, rv);
@@ -279,7 +279,6 @@ static TermInput *term_input_new(void)
static void term_input_destroy(TermInput *input)
{
- uv_tty_reset_mode();
uv_timer_stop(&input->timer_handle);
rstream_stop(input->read_stream);
rstream_free(input->read_stream);
diff --git a/src/nvim/tui/tui.c b/src/nvim/tui/tui.c
index 57119b9030..5951408c42 100644
--- a/src/nvim/tui/tui.c
+++ b/src/nvim/tui/tui.c
@@ -49,9 +49,9 @@ typedef struct {
HlAttrs attrs, print_attrs;
Cell **screen;
struct {
- size_t enable_mouse, disable_mouse;
- size_t enable_bracketed_paste, disable_bracketed_paste;
- size_t enter_insert_mode, exit_insert_mode;
+ int enable_mouse, disable_mouse;
+ int enable_bracketed_paste, disable_bracketed_paste;
+ int enter_insert_mode, exit_insert_mode;
} unibi_ext;
} TUIData;
@@ -88,6 +88,12 @@ void tui_start(void)
data->can_use_terminal_scroll = true;
data->bufpos = 0;
data->option_cache = pmap_new(cstr_t)();
+ data->unibi_ext.enable_mouse = -1;
+ data->unibi_ext.disable_mouse = -1;
+ data->unibi_ext.enable_bracketed_paste = -1;
+ data->unibi_ext.disable_bracketed_paste = -1;
+ data->unibi_ext.enter_insert_mode = -1;
+ data->unibi_ext.exit_insert_mode = -1;
// write output to stderr if stdout is not a tty
data->out_fd = os_isatty(1) ? 1 : (os_isatty(2) ? 2 : 1);
@@ -113,6 +119,7 @@ void tui_start(void)
data->write_loop = xmalloc(sizeof(uv_loop_t));
uv_loop_init(data->write_loop);
uv_tty_init(data->write_loop, &data->output_handle, data->out_fd, 0);
+ uv_tty_set_mode(&data->output_handle, UV_TTY_MODE_RAW);
// Obtain screen dimensions
update_size(ui);
@@ -169,6 +176,7 @@ static void tui_stop(UI *ui)
// Disable bracketed paste
unibi_out(ui, (int)data->unibi_ext.disable_bracketed_paste);
flush_buf(ui);
+ uv_tty_reset_mode();
uv_close((uv_handle_t *)&data->output_handle, NULL);
uv_run(data->write_loop, UV_RUN_DEFAULT);
if (uv_loop_close(data->write_loop)) {
@@ -404,6 +412,11 @@ static void tui_scroll(UI *ui, int count)
data->params[1].i = bot;
unibi_out(ui, unibi_change_scroll_region);
unibi_goto(ui, top, left);
+ // also set default color attributes or some terminals can become funny
+ HlAttrs clear_attrs = EMPTY_ATTRS;
+ clear_attrs.foreground = data->fg;
+ clear_attrs.background = data->bg;
+ update_attrs(ui, clear_attrs);
}
// Compute start/stop/step for the loop below, also use terminal scroll
@@ -633,10 +646,12 @@ static void unibi_out(UI *ui, int unibi_index)
const char *str = NULL;
- if (unibi_index < unibi_string_begin_) {
- str = unibi_get_ext_str(data->ut, (unsigned)unibi_index);
- } else {
- str = unibi_get_str(data->ut, (unsigned)unibi_index);
+ if (unibi_index >= 0) {
+ if (unibi_index < unibi_string_begin_) {
+ str = unibi_get_ext_str(data->ut, (unsigned)unibi_index);
+ } else {
+ str = unibi_get_str(data->ut, (unsigned)unibi_index);
+ }
}
if (str) {
@@ -696,9 +711,9 @@ static void fix_terminfo(TUIData *data)
}
if (STARTS_WITH(term, "xterm") || STARTS_WITH(term, "rxvt") || inside_tmux) {
- data->unibi_ext.enable_bracketed_paste = unibi_add_ext_str(ut, NULL,
+ data->unibi_ext.enable_bracketed_paste = (int)unibi_add_ext_str(ut, NULL,
"\x1b[?2004h");
- data->unibi_ext.disable_bracketed_paste = unibi_add_ext_str(ut, NULL,
+ data->unibi_ext.disable_bracketed_paste = (int)unibi_add_ext_str(ut, NULL,
"\x1b[?2004l");
}
@@ -713,23 +728,23 @@ static void fix_terminfo(TUIData *data)
if ((term_prog && !strcmp(term_prog, "iTerm.app"))
|| os_getenv("ITERM_SESSION_ID") != NULL) {
// iterm
- data->unibi_ext.enter_insert_mode = unibi_add_ext_str(ut, NULL,
+ data->unibi_ext.enter_insert_mode = (int)unibi_add_ext_str(ut, NULL,
TMUX_WRAP("\x1b]50;CursorShape=1;BlinkingCursorEnabled=1\x07"));
- data->unibi_ext.exit_insert_mode = unibi_add_ext_str(ut, NULL,
+ data->unibi_ext.exit_insert_mode = (int)unibi_add_ext_str(ut, NULL,
TMUX_WRAP("\x1b]50;CursorShape=0;BlinkingCursorEnabled=0\x07"));
} else {
// xterm-like sequences for blinking bar and solid block
- data->unibi_ext.enter_insert_mode = unibi_add_ext_str(ut, NULL,
+ data->unibi_ext.enter_insert_mode = (int)unibi_add_ext_str(ut, NULL,
TMUX_WRAP("\x1b[5 q"));
- data->unibi_ext.exit_insert_mode = unibi_add_ext_str(ut, NULL,
+ data->unibi_ext.exit_insert_mode = (int)unibi_add_ext_str(ut, NULL,
TMUX_WRAP("\x1b[2 q"));
}
end:
// Fill some empty slots with common terminal strings
- data->unibi_ext.enable_mouse = unibi_add_ext_str(ut, NULL,
+ data->unibi_ext.enable_mouse = (int)unibi_add_ext_str(ut, NULL,
"\x1b[?1002h\x1b[?1006h");
- data->unibi_ext.disable_mouse = unibi_add_ext_str(ut, NULL,
+ data->unibi_ext.disable_mouse = (int)unibi_add_ext_str(ut, NULL,
"\x1b[?1002l\x1b[?1006l");
unibi_set_if_empty(ut, unibi_cursor_address, "\x1b[%i%p1%d;%p2%dH");
unibi_set_if_empty(ut, unibi_exit_attribute_mode, "\x1b[0;10m");