aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThiago de Arruda <tpadilha84@gmail.com>2015-03-15 10:21:05 -0300
committerThiago de Arruda <tpadilha84@gmail.com>2015-03-15 10:30:59 -0300
commitc546875daf36936b9a6c0886a71c9edd1fdae6db (patch)
treeb20e159ef39a89e67c0a7738d96ef1f4afccd284
parentdbe719317cf71dd1951d8d478256b8735db12db0 (diff)
downloadrneovim-c546875daf36936b9a6c0886a71c9edd1fdae6db.tar.gz
rneovim-c546875daf36936b9a6c0886a71c9edd1fdae6db.tar.bz2
rneovim-c546875daf36936b9a6c0886a71c9edd1fdae6db.zip
ui: Replace cursor_{on,off} by busy_{stop,start}
Switching cursor off is only necessary in two occasions: - When redrawing to avoid terminal flickering - When the editor is busy The first can now be handled by the TUI, so most calls to ui_cursor_off can be removed from the core. So, before this commit it was only necessary to switch the cursor off to notify the user that nvim was running some long operation. Now the cursor_{on,off} functions have been replaced by busy_{stop,start} which can be handled in a UI-specific way(turning the cursor off or showing a busy indicator, for example). To make things even more simpler, nvim is always busy except when waiting for user input or other asynchronous events: It automatically switches to a non-busy state when the event loop is about to be entered for more than 100 milliseconds. `ui_busy_start` can be called when its not desired to change the busy state in the event loop (As its now done by functions that perform blocking shell invocations).
-rw-r--r--src/nvim/edit.c1
-rw-r--r--src/nvim/ex_cmds.c4
-rw-r--r--src/nvim/ex_docmd.c4
-rw-r--r--src/nvim/ex_getln.c5
-rw-r--r--src/nvim/getchar.c5
-rw-r--r--src/nvim/main.c1
-rw-r--r--src/nvim/message.c1
-rw-r--r--src/nvim/misc1.c2
-rw-r--r--src/nvim/misc2.c1
-rw-r--r--src/nvim/msgpack_rpc/remote_ui.c12
-rw-r--r--src/nvim/normal.c3
-rw-r--r--src/nvim/option.c1
-rw-r--r--src/nvim/os/event.h12
-rw-r--r--src/nvim/os/shell.c5
-rw-r--r--src/nvim/os_unix.c10
-rw-r--r--src/nvim/screen.c6
-rw-r--r--src/nvim/search.c1
-rw-r--r--src/nvim/tui/tui.c20
-rw-r--r--src/nvim/ui.c22
-rw-r--r--src/nvim/ui.h4
-rw-r--r--test/functional/ui/screen.lua13
21 files changed, 57 insertions, 76 deletions
diff --git a/src/nvim/edit.c b/src/nvim/edit.c
index 14b3968f2d..516278f34d 100644
--- a/src/nvim/edit.c
+++ b/src/nvim/edit.c
@@ -1400,7 +1400,6 @@ void display_dollar(colnr_T col)
if (!redrawing())
return;
- ui_cursor_off();
save_col = curwin->w_cursor.col;
curwin->w_cursor.col = col;
if (has_mbyte) {
diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c
index 739243cbee..c4b6b701d9 100644
--- a/src/nvim/ex_cmds.c
+++ b/src/nvim/ex_cmds.c
@@ -1063,9 +1063,7 @@ do_filter (
/* Create the shell command in allocated memory. */
cmd_buf = make_filter_cmd(cmd, itmp, otmp);
-
ui_cursor_goto((int)Rows - 1, 0);
- ui_cursor_on();
/*
* When not redirecting the output the command can write anything to the
@@ -1248,7 +1246,6 @@ do_shell (
// This ui_cursor_goto is required for when the '\n' resulted in a "delete line
// 1" command to the terminal.
ui_cursor_goto(msg_row, msg_col);
- ui_cursor_on();
(void)call_shell(cmd, flags, NULL);
did_check_timestamps = FALSE;
need_check_timestamps = TRUE;
@@ -1963,7 +1960,6 @@ void print_line(linenr_T lnum, int use_number, int list)
print_line_no_prefix(lnum, use_number, list);
if (save_silent) {
msg_putchar('\n');
- ui_cursor_on(); /* msg_start() switches it off */
ui_flush();
silent_mode = save_silent;
}
diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c
index 8167824a41..63d94dabc0 100644
--- a/src/nvim/ex_docmd.c
+++ b/src/nvim/ex_docmd.c
@@ -6381,9 +6381,7 @@ static void ex_sleep(exarg_T *eap)
void do_sleep(long msec)
{
long done;
-
- ui_cursor_on();
- ui_flush();
+ ui_flush(); // flush before waiting
for (done = 0; !got_int && done < msec; done += 1000L) {
os_delay(msec - done > 1000L ? 1000L : msec - done, true);
os_breakcheck();
diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c
index a7bb4afa70..c9e990b713 100644
--- a/src/nvim/ex_getln.c
+++ b/src/nvim/ex_getln.c
@@ -1364,7 +1364,6 @@ cmdline_changed:
if (ccline.cmdlen == 0)
i = 0;
else {
- ui_cursor_off(); /* so the user knows we're busy */
ui_flush();
++emsg_off; /* So it doesn't beep if bad expr */
/* Set the time limit to half a second. */
@@ -1701,10 +1700,6 @@ getexmodeline (
char_u *p;
int prev_char;
- /* Switch cursor on now. This avoids that it happens after the "\n", which
- * confuses the system function that computes tabstops. */
- ui_cursor_on();
-
/* always start in column 0; write a newline if necessary */
compute_cmdrow();
if ((msg_col || msg_didout) && promptc != '?')
diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c
index b3e274d952..41b3d9dda8 100644
--- a/src/nvim/getchar.c
+++ b/src/nvim/getchar.c
@@ -2379,11 +2379,6 @@ inchar (
int retesc = FALSE; /* return ESC with gotint */
int script_char;
- if (wait_time == -1L || wait_time > 100L) { /* flush output before waiting */
- ui_cursor_on();
- ui_flush();
- }
-
/*
* Don't reset these when at the hit-return prompt, otherwise an endless
* recursive loop may result (write error in swapfile, hit-return, timeout
diff --git a/src/nvim/main.c b/src/nvim/main.c
index a4f430e811..76fee17726 100644
--- a/src/nvim/main.c
+++ b/src/nvim/main.c
@@ -641,7 +641,6 @@ main_loop (
curwin->w_valid &= ~VALID_CROW;
}
setcursor();
- ui_cursor_on();
do_redraw = FALSE;
diff --git a/src/nvim/message.c b/src/nvim/message.c
index 3a68de8881..91c7d05ff4 100644
--- a/src/nvim/message.c
+++ b/src/nvim/message.c
@@ -998,7 +998,6 @@ void msg_start(void)
msg_starthere();
if (msg_silent == 0) {
msg_didout = FALSE; /* no output on current line yet */
- ui_cursor_off();
}
/* when redirecting, may need to start a new line. */
diff --git a/src/nvim/misc1.c b/src/nvim/misc1.c
index 3ed6b416d6..9c08a7c1f7 100644
--- a/src/nvim/misc1.c
+++ b/src/nvim/misc1.c
@@ -2364,8 +2364,6 @@ int get_keystroke(void)
mapped_ctrl_c = FALSE; /* mappings are not used here */
for (;; ) {
- ui_cursor_on();
- ui_flush();
/* Leave some room for check_termcode() to insert a key code into (max
* 5 chars plus NUL). And fix_input_buffer() can triple the number of
diff --git a/src/nvim/misc2.c b/src/nvim/misc2.c
index be5150fdc0..06196b32af 100644
--- a/src/nvim/misc2.c
+++ b/src/nvim/misc2.c
@@ -297,7 +297,6 @@ int call_shell(char_u *cmd, ShellOpts opts, char_u *extra_shell_arg)
smsg((char_u *)_("Calling shell to execute: \"%s\""),
cmd == NULL ? p_sh : cmd);
ui_putc('\n');
- ui_cursor_on();
verbose_leave();
}
diff --git a/src/nvim/msgpack_rpc/remote_ui.c b/src/nvim/msgpack_rpc/remote_ui.c
index 45b3dee0fd..b554d76bed 100644
--- a/src/nvim/msgpack_rpc/remote_ui.c
+++ b/src/nvim/msgpack_rpc/remote_ui.c
@@ -82,8 +82,8 @@ static Object remote_ui_attach(uint64_t channel_id, uint64_t request_id,
ui->clear = remote_ui_clear;
ui->eol_clear = remote_ui_eol_clear;
ui->cursor_goto = remote_ui_cursor_goto;
- ui->cursor_on = remote_ui_cursor_on;
- ui->cursor_off = remote_ui_cursor_off;
+ ui->busy_start = remote_ui_busy_start;
+ ui->busy_stop = remote_ui_busy_stop;
ui->mouse_on = remote_ui_mouse_on;
ui->mouse_off = remote_ui_mouse_off;
ui->insert_mode = remote_ui_insert_mode;
@@ -190,16 +190,16 @@ static void remote_ui_cursor_goto(UI *ui, int row, int col)
push_call(ui, "cursor_goto", args);
}
-static void remote_ui_cursor_on(UI *ui)
+static void remote_ui_busy_start(UI *ui)
{
Array args = ARRAY_DICT_INIT;
- push_call(ui, "cursor_on", args);
+ push_call(ui, "busy_start", args);
}
-static void remote_ui_cursor_off(UI *ui)
+static void remote_ui_busy_stop(UI *ui)
{
Array args = ARRAY_DICT_INIT;
- push_call(ui, "cursor_off", args);
+ push_call(ui, "busy_stop", args);
}
static void remote_ui_mouse_on(UI *ui)
diff --git a/src/nvim/normal.c b/src/nvim/normal.c
index 4c62b0c28d..a708aca136 100644
--- a/src/nvim/normal.c
+++ b/src/nvim/normal.c
@@ -983,7 +983,6 @@ getcount:
free(kmsg);
}
setcursor();
- ui_cursor_on();
ui_flush();
if (msg_scroll || emsg_on_display)
os_delay(1000L, true); /* wait at least one second */
@@ -2998,8 +2997,6 @@ static void display_showcmd(void)
{
int len;
- ui_cursor_off();
-
len = (int)STRLEN(showcmd_buf);
if (len == 0)
showcmd_is_clear = true;
diff --git a/src/nvim/option.c b/src/nvim/option.c
index a9e271517d..2998f89edb 100644
--- a/src/nvim/option.c
+++ b/src/nvim/option.c
@@ -3042,7 +3042,6 @@ theend:
silent_mode = FALSE;
info_message = TRUE; /* use mch_msg(), not mch_errmsg() */
msg_putchar('\n');
- ui_cursor_on(); /* msg_start() switches it off */
ui_flush();
silent_mode = TRUE;
info_message = FALSE; /* use mch_msg(), not mch_errmsg() */
diff --git a/src/nvim/os/event.h b/src/nvim/os/event.h
index f8139e978d..986db51431 100644
--- a/src/nvim/os/event.h
+++ b/src/nvim/os/event.h
@@ -8,9 +8,15 @@
#include "nvim/os/job_defs.h"
#include "nvim/os/time.h"
-// Poll for events until a condition is true or a timeout has passed
+void ui_busy_start(void);
+void ui_busy_stop(void);
+
+// Poll for events until a condition or timeout
#define event_poll_until(timeout, condition) \
do { \
+ if (timeout < 0 || timeout > 100) { \
+ ui_busy_stop(); \
+ } \
int remaining = timeout; \
uint64_t before = (remaining > 0) ? os_hrtime() : 0; \
while (!(condition)) { \
@@ -26,9 +32,13 @@
} \
} \
} \
+ if (timeout < 0 || timeout > 100) { \
+ ui_busy_start(); \
+ } \
} while (0)
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "os/event.h.generated.h"
#endif
+
#endif // NVIM_OS_EVENT_H
diff --git a/src/nvim/os/shell.c b/src/nvim/os/shell.c
index 8cf7e7161d..290d6a9ec9 100644
--- a/src/nvim/os/shell.c
+++ b/src/nvim/os/shell.c
@@ -99,7 +99,6 @@ int os_call_shell(char_u *cmd, ShellOpts opts, char_u *extra_args)
char *output = NULL, **output_ptr = NULL;
int current_state = State;
bool forward_output = true;
- ui_flush();
// While the child is running, ignore terminating signals
signal_reject_deadly();
@@ -239,7 +238,11 @@ static int shell(const char *cmd,
job_close_in(job);
}
+ // invoke busy_start here so event_poll_until wont change the busy state for
+ // the UI
+ ui_busy_start();
status = job_wait(job, -1);
+ ui_busy_stop();
// prepare the out parameters if requested
if (output) {
diff --git a/src/nvim/os_unix.c b/src/nvim/os_unix.c
index 5d8b4ad26a..8e4569033a 100644
--- a/src/nvim/os_unix.c
+++ b/src/nvim/os_unix.c
@@ -232,15 +232,7 @@ void mch_exit(int r)
{
exiting = TRUE;
- {
- ui_builtin_stop();
-
- // Cursor may have been switched off without calling starttermcap()
- // when doing "vim -u vimrc" and vimrc contains ":q". */
- if (full_screen) {
- ui_cursor_on();
- }
- }
+ ui_builtin_stop();
ui_flush();
ml_close_all(TRUE); /* remove all memfiles */
diff --git a/src/nvim/screen.c b/src/nvim/screen.c
index 757bdb34b1..04a092c4f7 100644
--- a/src/nvim/screen.c
+++ b/src/nvim/screen.c
@@ -416,7 +416,6 @@ void update_screen(int type)
search_hl.rm.regprog = NULL;
FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
if (wp->w_redr_type != 0) {
- ui_cursor_off();
if (!did_one) {
did_one = TRUE;
start_search_hl();
@@ -426,7 +425,6 @@ void update_screen(int type)
/* redraw status line after the window to minimize cursor movement */
if (wp->w_redr_status) {
- ui_cursor_off();
win_redr_status(wp);
}
}
@@ -521,7 +519,6 @@ void update_single_line(win_T *wp, linenr_T lnum)
*/
static void update_prepare(void)
{
- ui_cursor_off();
updating_screen = TRUE;
start_search_hl();
}
@@ -6566,7 +6563,6 @@ int showmode(void)
/* Position on the last line in the window, column 0 */
msg_pos_mode();
- ui_cursor_off();
attr = hl_attr(HLF_CM); /* Highlight mode */
if (do_mode) {
MSG_PUTS_ATTR("--", attr);
@@ -7015,7 +7011,6 @@ static void win_redr_ruler(win_T *wp, int always)
|| wp->w_buffer->b_ml.ml_line_count != wp->w_ru_line_count
|| wp->w_topfill != wp->w_ru_topfill
|| empty_line != wp->w_ru_empty) {
- ui_cursor_off();
int width;
int row;
@@ -7238,7 +7233,6 @@ void screen_resize(int width, int height)
setcursor();
}
}
- ui_cursor_on(); /* redrawing may have switched it off */
}
ui_flush();
--busy;
diff --git a/src/nvim/search.c b/src/nvim/search.c
index 6e2824bc8e..26ff9a5bad 100644
--- a/src/nvim/search.c
+++ b/src/nvim/search.c
@@ -2044,7 +2044,6 @@ showmatch (
p_siso = 0; /* don't use 'sidescrolloff' here */
showruler(FALSE);
setcursor();
- ui_cursor_on(); /* make sure that the cursor is shown */
ui_flush();
/* Restore dollar_vcol(), because setcursor() may call curs_rows()
* which resets it if the matching position is in a previous line
diff --git a/src/nvim/tui/tui.c b/src/nvim/tui/tui.c
index b95a22d48b..610419d12c 100644
--- a/src/nvim/tui/tui.c
+++ b/src/nvim/tui/tui.c
@@ -45,6 +45,7 @@ typedef struct {
int out_fd;
int old_height;
bool can_use_terminal_scroll;
+ bool busy;
HlAttrs attrs, print_attrs;
Cell **screen;
struct {
@@ -80,6 +81,7 @@ typedef struct {
void tui_start(void)
{
TUIData *data = xcalloc(1, sizeof(TUIData));
+ data->busy = true;
UI *ui = xcalloc(1, sizeof(UI));
ui->data = data;
data->attrs = data->print_attrs = EMPTY_ATTRS;
@@ -134,8 +136,8 @@ void tui_start(void)
ui->clear = tui_clear;
ui->eol_clear = tui_eol_clear;
ui->cursor_goto = tui_cursor_goto;
- ui->cursor_on = tui_cursor_on;
- ui->cursor_off = tui_cursor_off;
+ ui->busy_start = tui_busy_start;
+ ui->busy_stop = tui_busy_stop;
ui->mouse_on = tui_mouse_on;
ui->mouse_off = tui_mouse_off;
ui->insert_mode = tui_insert_mode;
@@ -342,14 +344,14 @@ static void tui_cursor_goto(UI *ui, int row, int col)
unibi_goto(ui, row, col);
}
-static void tui_cursor_on(UI *ui)
+static void tui_busy_start(UI *ui)
{
- unibi_out(ui, unibi_cursor_normal);
+ ((TUIData *)ui->data)->busy = true;
}
-static void tui_cursor_off(UI *ui)
+static void tui_busy_stop(UI *ui)
{
- unibi_out(ui, unibi_cursor_invisible);
+ ((TUIData *)ui->data)->busy = false;
}
static void tui_mouse_on(UI *ui)
@@ -527,7 +529,13 @@ static void tui_flush(UI *ui)
}
unibi_goto(ui, data->row, data->col);
+
+ if (!data->busy) {
+ unibi_out(ui, unibi_cursor_normal);
+ }
+
flush_buf(ui);
+ unibi_out(ui, unibi_cursor_invisible);
}
static void tui_suspend(UI *ui)
diff --git a/src/nvim/ui.c b/src/nvim/ui.c
index 62cc662b5b..0283e7bd62 100644
--- a/src/nvim/ui.c
+++ b/src/nvim/ui.c
@@ -44,7 +44,8 @@ static struct {
int top, bot, left, right;
} sr;
static int current_attr_code = 0;
-static bool cursor_enabled = true, pending_cursor_update = false;
+static bool pending_cursor_update = false;
+static int busy = 1;
static int height, width;
// This set of macros allow us to use UI_CALL to invoke any function on
@@ -150,24 +151,23 @@ void ui_resize(int new_width, int new_height)
UI_CALL(resize, width, height);
}
-void ui_cursor_on(void)
+void ui_busy_start(void)
{
- if (!cursor_enabled) {
- UI_CALL(cursor_on);
- cursor_enabled = true;
+ if (!(busy++)) {
+ UI_CALL(busy_start);
}
+ ui_flush();
}
-void ui_cursor_off(void)
+void ui_busy_stop(void)
{
- if (full_screen) {
- if (cursor_enabled) {
- UI_CALL(cursor_off);
- }
- cursor_enabled = false;
+ if (!(--busy)) {
+ UI_CALL(busy_stop);
}
+ ui_flush();
}
+
void ui_mouse_on(void)
{
UI_CALL(mouse_on);
diff --git a/src/nvim/ui.h b/src/nvim/ui.h
index 4bc3983578..71ed9b3097 100644
--- a/src/nvim/ui.h
+++ b/src/nvim/ui.h
@@ -20,8 +20,8 @@ struct ui_t {
void (*clear)(UI *ui);
void (*eol_clear)(UI *ui);
void (*cursor_goto)(UI *ui, int row, int col);
- void (*cursor_on)(UI *ui);
- void (*cursor_off)(UI *ui);
+ void (*busy_start)(UI *ui);
+ void (*busy_stop)(UI *ui);
void (*mouse_on)(UI *ui);
void (*mouse_off)(UI *ui);
void (*insert_mode)(UI *ui);
diff --git a/test/functional/ui/screen.lua b/test/functional/ui/screen.lua
index 585037466e..7ba90abde2 100644
--- a/test/functional/ui/screen.lua
+++ b/test/functional/ui/screen.lua
@@ -164,8 +164,9 @@ function Screen.new(width, height)
_mouse_enabled = true,
_attrs = {},
_cursor = {
- enabled = true, row = 1, col = 1
- }
+ row = 1, col = 1
+ },
+ _busy = true
}, Screen)
self:_handle_resize(width, height)
return self
@@ -282,12 +283,12 @@ function Screen:_handle_cursor_goto(row, col)
self._cursor.col = col + 1
end
-function Screen:_handle_cursor_on()
- self._cursor.enabled = true
+function Screen:_handle_busy_start()
+ self._busy = true
end
-function Screen:_handle_cursor_off()
- self._cursor.enabled = false
+function Screen:_handle_busy_stop()
+ self._busy = false
end
function Screen:_handle_mouse_on()