aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/ui.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvim/ui.c')
-rw-r--r--src/nvim/ui.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/src/nvim/ui.c b/src/nvim/ui.c
index 685da77b39..c6c09c80d7 100644
--- a/src/nvim/ui.c
+++ b/src/nvim/ui.c
@@ -61,6 +61,9 @@ static bool pending_mode_info_update = false;
static bool pending_mode_update = false;
static handle_T cursor_grid_handle = DEFAULT_GRID_HANDLE;
+static bool has_mouse = false;
+static int pending_has_mouse = -1;
+
#if MIN_LOG_LEVEL > DEBUG_LOG_LEVEL
# define UI_LOG(funname)
#else
@@ -220,6 +223,7 @@ void ui_refresh(void)
ui_mode_info_set();
pending_mode_update = true;
ui_cursor_shape();
+ pending_has_mouse = -1;
}
int ui_pum_get_height(void)
@@ -459,10 +463,69 @@ void ui_flush(void)
ui_call_mode_change(cstr_as_string(full_name), ui_mode_idx);
pending_mode_update = false;
}
+ if (pending_has_mouse != has_mouse) {
+ (has_mouse ? ui_call_mouse_on : ui_call_mouse_off)();
+ pending_has_mouse = has_mouse;
+ }
ui_call_flush();
}
+
+/// Check if 'mouse' is active for the current mode
+///
+/// TODO(bfredl): precompute the State -> active mapping when 'mouse' changes,
+/// then this can be checked directly in ui_flush()
+void ui_check_mouse(void)
+{
+ has_mouse = false;
+ // Be quick when mouse is off.
+ if (*p_mouse == NUL) {
+ return;
+ }
+
+ int checkfor = MOUSE_NORMAL; // assume normal mode
+ if (VIsual_active) {
+ checkfor = MOUSE_VISUAL;
+ } else if (State == HITRETURN || State == ASKMORE || State == SETWSIZE) {
+ checkfor = MOUSE_RETURN;
+ } else if (State & INSERT) {
+ checkfor = MOUSE_INSERT;
+ } else if (State & CMDLINE) {
+ checkfor = MOUSE_COMMAND;
+ } else if (State == CONFIRM || State == EXTERNCMD) {
+ checkfor = ' '; // don't use mouse for ":confirm" or ":!cmd"
+ }
+
+ // mouse should be active if at least one of the following is true:
+ // - "c" is in 'mouse', or
+ // - 'a' is in 'mouse' and "c" is in MOUSE_A, or
+ // - the current buffer is a help file and 'h' is in 'mouse' and we are in a
+ // normal editing mode (not at hit-return message).
+ for (char_u *p = p_mouse; *p; p++) {
+ switch (*p) {
+ case 'a':
+ if (vim_strchr((char_u *)MOUSE_A, checkfor) != NULL) {
+ has_mouse = true;
+ return;
+ }
+ break;
+ case MOUSE_HELP:
+ if (checkfor != MOUSE_RETURN && curbuf->b_help) {
+ has_mouse = true;
+ return;
+ }
+ break;
+ default:
+ if (checkfor == *p) {
+ has_mouse = true;
+ return;
+ }
+ }
+ }
+}
+
/// Check if current mode has changed.
+///
/// May update the shape of the cursor.
void ui_cursor_shape(void)
{