summaryrefslogtreecommitdiff
path: root/src/term.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-09-23 21:16:54 +0200
committerBram Moolenaar <Bram@vim.org>2019-09-23 21:16:54 +0200
commitb8ff5c271ee5dcef6f63436b77e228e062ff9a0e (patch)
tree20f5187491c8eb4efb12a1f1eea94bfe19f07d04 /src/term.c
parent0f6629a08a9ae482956f5e70452ae78be569eadf (diff)
downloadvim-git-b8ff5c271ee5dcef6f63436b77e228e062ff9a0e.tar.gz
patch 8.1.2070: mouse code is spread outv8.1.2070
Problem: Mouse code is spread out. Solution: Move mouse terminal code parsing to mouse.c. (Yegappan Lakshmanan, closes #4966)
Diffstat (limited to 'src/term.c')
-rw-r--r--src/term.c767
1 files changed, 43 insertions, 724 deletions
diff --git a/src/term.c b/src/term.c
index 7d41a6100..2319453fb 100644
--- a/src/term.c
+++ b/src/term.c
@@ -82,11 +82,6 @@ static void req_more_codes_from_term(void);
static void got_code_from_term(char_u *code, int len);
static void check_for_codes_from_term(void);
#endif
-#if defined(FEAT_GUI) \
- || (defined(FEAT_MOUSE) && (!defined(UNIX) || defined(FEAT_MOUSE_XTERM) \
- || defined(FEAT_MOUSE_GPM) || defined(FEAT_SYSMOUSE)))
-static int get_bytes_from_buf(char_u *, char_u *, int);
-#endif
static void del_termcode_idx(int idx);
static int find_term_bykeys(char_u *src);
static int term_is_builtin(char_u *name);
@@ -3160,7 +3155,7 @@ get_long_from_buf(char_u *buf, long_u *val)
* from buf (between num_bytes and num_bytes*2), or -1 if not enough bytes were
* available.
*/
- static int
+ int
get_bytes_from_buf(char_u *buf, char_u *bytes, int num_bytes)
{
int len = 0;
@@ -4094,6 +4089,15 @@ get_termcode(int i)
return &termcodes[i].name[0];
}
+/*
+ * Returns the length of the terminal code at index 'idx'.
+ */
+ int
+get_termcode_len(int idx)
+{
+ return termcodes[idx].len;
+}
+
void
del_termcode(char_u *name)
{
@@ -4178,6 +4182,20 @@ set_mouse_topline(win_T *wp)
orig_topfill = wp->w_topfill;
# endif
}
+
+/*
+ * Returns TRUE if the top line and top fill of window 'wp' matches the saved
+ * topline and topfill.
+ */
+ int
+is_mouse_topline(win_T *wp)
+{
+ return orig_topline == wp->w_topline
+#ifdef FEAT_DIFF
+ && orig_topfill == wp->w_topfill
+#endif
+ ;
+}
#endif
/*
@@ -4216,28 +4234,6 @@ check_termcode(
char_u string[MAX_KEY_CODE_LEN + 1];
int i, j;
int idx = 0;
-#ifdef FEAT_MOUSE
-# if !defined(UNIX) || defined(FEAT_MOUSE_XTERM) || defined(FEAT_GUI) \
- || defined(FEAT_MOUSE_GPM) || defined(FEAT_SYSMOUSE)
- char_u bytes[6];
- int num_bytes;
-# endif
- int mouse_code = 0; /* init for GCC */
- int is_click, is_drag;
- int wheel_code = 0;
- int current_button;
- static int held_button = MOUSE_RELEASE;
- static int orig_num_clicks = 1;
- static int orig_mouse_code = 0x0;
-# ifdef CHECK_DOUBLE_CLICK
- static int orig_mouse_col = 0;
- static int orig_mouse_row = 0;
- static struct timeval orig_mouse_time = {0, 0};
- /* time of previous mouse click */
- struct timeval mouse_time; /* time of current mouse click */
- long timediff; /* elapsed time in msec */
-# endif
-#endif
int cpo_koffset;
cpo_koffset = (vim_strchr(p_cpo, CPO_KOFFSET) != NULL);
@@ -4958,8 +4954,10 @@ check_termcode(
|| key_name[1] == (int)KE_MOUSEDOWN
|| key_name[1] == (int)KE_MOUSEUP))
{
- num_bytes = get_bytes_from_buf(tp + slen, bytes, 4);
- if (num_bytes == -1) /* not enough coordinates */
+ char_u bytes[6];
+ int num_bytes = get_bytes_from_buf(tp + slen, bytes, 4);
+
+ if (num_bytes == -1) // not enough coordinates
return -1;
mouse_col = 128 * (bytes[0] - ' ' - 1) + bytes[1] - ' ' - 1;
mouse_row = 128 * (bytes[2] - ' ' - 1) + bytes[3] - ' ' - 1;
@@ -4992,695 +4990,9 @@ check_termcode(
|| key_name[0] == KS_SGR_MOUSE
|| key_name[0] == KS_SGR_MOUSE_RELEASE)
{
- is_click = is_drag = FALSE;
-
-# if !defined(UNIX) || defined(FEAT_MOUSE_XTERM) || defined(FEAT_GUI) \
- || defined(FEAT_MOUSE_GPM) || defined(FEAT_SYSMOUSE)
- if (key_name[0] == KS_MOUSE
-# ifdef FEAT_MOUSE_GPM
- || key_name[0] == KS_GPM_MOUSE
-# endif
- )
- {
- /*
- * For xterm we get "<t_mouse>scr", where
- * s == encoded button state:
- * 0x20 = left button down
- * 0x21 = middle button down
- * 0x22 = right button down
- * 0x23 = any button release
- * 0x60 = button 4 down (scroll wheel down)
- * 0x61 = button 5 down (scroll wheel up)
- * add 0x04 for SHIFT
- * add 0x08 for ALT
- * add 0x10 for CTRL
- * add 0x20 for mouse drag (0x40 is drag with left button)
- * add 0x40 for mouse move (0x80 is move, 0x81 too)
- * 0x43 (drag + release) is also move
- * c == column + ' ' + 1 == column + 33
- * r == row + ' ' + 1 == row + 33
- *
- * The coordinates are passed on through global variables.
- * Ugly, but this avoids trouble with mouse clicks at an
- * unexpected moment and allows for mapping them.
- */
- for (;;)
- {
-# ifdef FEAT_GUI
- if (gui.in_use)
- {
- /* GUI uses more bits for columns > 223 */
- num_bytes = get_bytes_from_buf(tp + slen, bytes, 5);
- if (num_bytes == -1) /* not enough coordinates */
- return -1;
- mouse_code = bytes[0];
- mouse_col = 128 * (bytes[1] - ' ' - 1)
- + bytes[2] - ' ' - 1;
- mouse_row = 128 * (bytes[3] - ' ' - 1)
- + bytes[4] - ' ' - 1;
- }
- else
-# endif
- {
- num_bytes = get_bytes_from_buf(tp + slen, bytes, 3);
- if (num_bytes == -1) /* not enough coordinates */
- return -1;
- mouse_code = bytes[0];
- mouse_col = bytes[1] - ' ' - 1;
- mouse_row = bytes[2] - ' ' - 1;
- }
- slen += num_bytes;
-
- /* If the following bytes is also a mouse code and it has
- * the same code, dump this one and get the next. This
- * makes dragging a whole lot faster. */
-# ifdef FEAT_GUI
- if (gui.in_use)
- j = 3;
- else
-# endif
- j = termcodes[idx].len;
- if (STRNCMP(tp, tp + slen, (size_t)j) == 0
- && tp[slen + j] == mouse_code
- && tp[slen + j + 1] != NUL
- && tp[slen + j + 2] != NUL
-# ifdef FEAT_GUI
- && (!gui.in_use
- || (tp[slen + j + 3] != NUL
- && tp[slen + j + 4] != NUL))
-# endif
- )
- slen += j;
- else
- break;
- }
- }
-
- if (key_name[0] == KS_URXVT_MOUSE
- || key_name[0] == KS_SGR_MOUSE
- || key_name[0] == KS_SGR_MOUSE_RELEASE)
- {
- /* URXVT 1015 mouse reporting mode:
- * Almost identical to xterm mouse mode, except the values
- * are decimal instead of bytes.
- *
- * \033[%d;%d;%dM
- * ^-- row
- * ^----- column
- * ^-------- code
- *
- * SGR 1006 mouse reporting mode:
- * Almost identical to xterm mouse mode, except the values
- * are decimal instead of bytes.
- *
- * \033[<%d;%d;%dM
- * ^-- row
- * ^----- column
- * ^-------- code
- *
- * \033[<%d;%d;%dm : mouse release event
- * ^-- row
- * ^----- column
- * ^-------- code
- */
- p = modifiers_start;
- if (p == NULL)
- return -1;
-
- mouse_code = getdigits(&p);
- if (*p++ != ';')
- return -1;
-
- /* when mouse reporting is SGR, add 32 to mouse code */
- if (key_name[0] == KS_SGR_MOUSE
- || key_name[0] == KS_SGR_MOUSE_RELEASE)
- mouse_code += 32;
-
- if (key_name[0] == KS_SGR_MOUSE_RELEASE)
- mouse_code |= MOUSE_RELEASE;
-
- mouse_col = getdigits(&p) - 1;
- if (*p++ != ';')
- return -1;
-
- mouse_row = getdigits(&p) - 1;
-
- /* The modifiers were the mouse coordinates, not the
- * modifier keys (alt/shift/ctrl/meta) state. */
- modifiers = 0;
- }
-
- if (key_name[0] == KS_MOUSE
-# ifdef FEAT_MOUSE_GPM
- || key_name[0] == KS_GPM_MOUSE
-# endif
-# ifdef FEAT_MOUSE_URXVT
- || key_name[0] == KS_URXVT_MOUSE
-# endif
- || key_name[0] == KS_SGR_MOUSE
- || key_name[0] == KS_SGR_MOUSE_RELEASE)
- {
-# if !defined(MSWIN)
- /*
- * Handle mouse events.
- * Recognize the xterm mouse wheel, but not in the GUI, the
- * Linux console with GPM and the MS-DOS or Win32 console
- * (multi-clicks use >= 0x60).
- */
- if (mouse_code >= MOUSEWHEEL_LOW
-# ifdef FEAT_GUI
- && !gui.in_use
-# endif
-# ifdef FEAT_MOUSE_GPM
- && key_name[0] != KS_GPM_MOUSE
-# endif
- )
- {
-# if defined(UNIX) && defined(FEAT_MOUSE_TTY)
- if (use_xterm_mouse() > 1 && mouse_code >= 0x80)
- /* mouse-move event, using MOUSE_DRAG works */
- mouse_code = MOUSE_DRAG;
- else
-# endif
- /* Keep the mouse_code before it's changed, so that we
- * remember that it was a mouse wheel click. */
- wheel_code = mouse_code;
- }
-# ifdef FEAT_MOUSE_XTERM
- else if (held_button == MOUSE_RELEASE
-# ifdef FEAT_GUI
- && !gui.in_use
-# endif
- && (mouse_code == 0x23 || mouse_code == 0x24
- || mouse_code == 0x40 || mouse_code == 0x41))
- {
- /* Apparently 0x23 and 0x24 are used by rxvt scroll wheel.
- * And 0x40 and 0x41 are used by some xterm emulator. */
- wheel_code = mouse_code - (mouse_code >= 0x40 ? 0x40 : 0x23)
- + MOUSEWHEEL_LOW;
- }
-# endif
-
-# if defined(UNIX) && defined(FEAT_MOUSE_TTY)
- else if (use_xterm_mouse() > 1)
- {
- if (mouse_code & MOUSE_DRAG_XTERM)
- mouse_code |= MOUSE_DRAG;
- }
-# endif
-# ifdef FEAT_XCLIPBOARD
- else if (!(mouse_code & MOUSE_DRAG & ~MOUSE_CLICK_MASK))
- {
- if ((mouse_code & MOUSE_RELEASE) == MOUSE_RELEASE)
- stop_xterm_trace();
- else
- start_xterm_trace(mouse_code);
- }
-# endif
-# endif
- }
-# endif /* !UNIX || FEAT_MOUSE_XTERM */
-# ifdef FEAT_MOUSE_NET
- if (key_name[0] == KS_NETTERM_MOUSE)
- {
- int mc, mr;
-
- /* expect a rather limited sequence like: balancing {
- * \033}6,45\r
- * '6' is the row, 45 is the column
- */
- p = tp + slen;
- mr = getdigits(&p);
- if (*p++ != ',')
- return -1;
- mc = getdigits(&p);
- if (*p++ != '\r')
- return -1;
-
- mouse_col = mc - 1;
- mouse_row = mr - 1;
- mouse_code = MOUSE_LEFT;
- slen += (int)(p - (tp + slen));
- }
-# endif /* FEAT_MOUSE_NET */
-# ifdef FEAT_MOUSE_JSB
- if (key_name[0] == KS_JSBTERM_MOUSE)
- {
- int mult, val, iter, button, status;
-
- /* JSBTERM Input Model
- * \033[0~zw uniq escape sequence
- * (L-x) Left button pressed - not pressed x not reporting
- * (M-x) Middle button pressed - not pressed x not reporting
- * (R-x) Right button pressed - not pressed x not reporting
- * (SDmdu) Single , Double click, m mouse move d button down
- * u button up
- * ### X cursor position padded to 3 digits
- * ### Y cursor position padded to 3 digits
- * (s-x) SHIFT key pressed - not pressed x not reporting
- * (c-x) CTRL key pressed - not pressed x not reporting
- * \033\\ terminating sequence
- */
-
- p = tp + slen;
- button = mouse_code = 0;
- switch (*p++)
- {
- case 'L': button = 1; break;
- case '-': break;
- case 'x': break; /* ignore sequence */
- default: return -1; /* Unknown Result */
- }
- switch (*p++)
- {
- case 'M': button |= 2; break;
- case '-': break;
- case 'x': break; /* ignore sequence */
- default: return -1; /* Unknown Result */
- }
- switch (*p++)
- {
- case 'R': button |= 4; break;
- case '-': break;
- case 'x': break; /* ignore sequence */
- default: return -1; /* Unknown Result */
- }
- status = *p++;
- for (val = 0, mult = 100, iter = 0; iter < 3; iter++,
- mult /= 10, p++)
- if (*p >= '0' && *p <= '9')
- val += (*p - '0') * mult;
- else
- return -1;
- mouse_col = val;
- for (val = 0, mult = 100, iter = 0; iter < 3; iter++,
- mult /= 10, p++)
- if (*p >= '0' && *p <= '9')
- val += (*p - '0') * mult;
- else
- return -1;
- mouse_row = val;
- switch (*p++)
- {
- case 's': button |= 8; break; /* SHIFT key Pressed */
- case '-': break; /* Not Pressed */
- case 'x': break; /* Not Reporting */
- default: return -1; /* Unknown Result */
- }
- switch (*p++)
- {
- case 'c': button |= 16; break; /* CTRL key Pressed */
- case '-': break; /* Not Pressed */
- case 'x': break; /* Not Reporting */
- default: return -1; /* Unknown Result */
- }
- if (*p++ != '\033')
- return -1;
- if (*p++ != '\\')
- return -1;
- switch (status)
- {
- case 'D': /* Double Click */
- case 'S': /* Single Click */
- if (button & 1) mouse_code |= MOUSE_LEFT;
- if (button & 2) mouse_code |= MOUSE_MIDDLE;
- if (button & 4) mouse_code |= MOUSE_RIGHT;
- if (button & 8) mouse_code |= MOUSE_SHIFT;
- if (button & 16) mouse_code |= MOUSE_CTRL;
- break;
- case 'm': /* Mouse move */
- if (button & 1) mouse_code |= MOUSE_LEFT;
- if (button & 2) mouse_code |= MOUSE_MIDDLE;
- if (button & 4) mouse_code |= MOUSE_RIGHT;
- if (button & 8) mouse_code |= MOUSE_SHIFT;
- if (button & 16) mouse_code |= MOUSE_CTRL;
- if ((button & 7) != 0)
- {
- held_button = mouse_code;
- mouse_code |= MOUSE_DRAG;
- }
- is_drag = TRUE;
- showmode();
- break;
- case 'd': /* Button Down */
- if (button & 1) mouse_code |= MOUSE_LEFT;
- if (button & 2) mouse_code |= MOUSE_MIDDLE;
- if (button & 4) mouse_code |= MOUSE_RIGHT;
- if (button & 8) mouse_code |= MOUSE_SHIFT;
- if (button & 16) mouse_code |= MOUSE_CTRL;
- break;
- case 'u': /* Button Up */
- if (button & 1)
- mouse_code |= MOUSE_LEFT | MOUSE_RELEASE;
- if (button & 2)
- mouse_code |= MOUSE_MIDDLE | MOUSE_RELEASE;
- if (button & 4)
- mouse_code |= MOUSE_RIGHT | MOUSE_RELEASE;
- if (button & 8)
- mouse_code |= MOUSE_SHIFT;
- if (button & 16)
- mouse_code |= MOUSE_CTRL;
- break;
- default: return -1; /* Unknown Result */
- }
-
- slen += (p - (tp + slen));
- }
-# endif /* FEAT_MOUSE_JSB */
-# ifdef FEAT_MOUSE_DEC
- if (key_name[0] == KS_DEC_MOUSE)
- {
- /* The DEC Locator Input Model
- * Netterm delivers the code sequence:
- * \033[2;4;24;80&w (left button down)
- * \033[3;0;24;80&w (left button up)
- * \033[6;1;24;80&w (right button down)
- * \033[7;0;24;80&w (right button up)
- * CSI Pe ; Pb ; Pr ; Pc ; Pp & w
- * Pe is the event code
- * Pb is the button code
- * Pr is the row coordinate
- * Pc is the column coordinate
- * Pp is the third coordinate (page number)
- * Pe, the event code indicates what event caused this report
- * The following event codes are defined:
- * 0 - request, the terminal received an explicit request
- * for a locator report, but the locator is unavailable
- * 1 - request, the terminal received an explicit request
- * for a locator report
- * 2 - left button down
- * 3 - left button up
- * 4 - middle button down
- * 5 - middle button up
- * 6 - right button down
- * 7 - right button up
- * 8 - fourth button down
- * 9 - fourth button up
- * 10 - locator outside filter rectangle
- * Pb, the button code, ASCII decimal 0-15 indicating which
- * buttons are down if any. The state of the four buttons
- * on the locator correspond to the low four bits of the
- * decimal value,
- * "1" means button depressed
- * 0 - no buttons down,
- * 1 - right,
- * 2 - middle,
- * 4 - left,
- * 8 - fourth
- * Pr is the row coordinate of the locator position in the page,
- * encoded as an ASCII decimal value.
- * If Pr is omitted, the locator position is undefined
- * (outside the terminal window for example).
- * Pc is the column coordinate of the locator position in the
- * page, encoded as an ASCII decimal value.
- * If Pc is omitted, the locator position is undefined
- * (outside the terminal window for example).
- * Pp is the page coordinate of the locator position
- * encoded as an ASCII decimal value.
- * The page coordinate may be omitted if the locator is on
- * page one (the default). We ignore it anyway.
- */
- int Pe, Pb, Pr, Pc;
-
- p = tp + slen;
-
- /* get event status */
- Pe = getdigits(&p);
- if (*p++ != ';')
- return -1;
-
- /* get button status */
- Pb = getdigits(&p);
- if (*p++ != ';')
- return -1;
-
- /* get row status */
- Pr = getdigits(&p);
- if (*p++ != ';')
- return -1;
-
- /* get column status */
- Pc = getdigits(&p);
-
- /* the page parameter is optional */
- if (*p == ';')
- {
- p++;
- (void)getdigits(&p);
- }
- if (*p++ != '&')
- return -1;
- if (*p++ != 'w')
- return -1;
-
- mouse_code = 0;
- switch (Pe)
- {
- case 0: return -1; /* position request while unavailable */
- case 1: /* a response to a locator position request includes
- the status of all buttons */
- Pb &= 7; /* mask off and ignore fourth button */
- if (Pb & 4)
- mouse_code = MOUSE_LEFT;
- if (Pb & 2)
- mouse_code = MOUSE_MIDDLE;
- if (Pb & 1)
- mouse_code = MOUSE_RIGHT;
- if (Pb)
- {
- held_button = mouse_code;
- mouse_code |= MOUSE_DRAG;
- WantQueryMouse = TRUE;
- }
- is_drag = TRUE;
- showmode();
- break;
- case 2: mouse_code = MOUSE_LEFT;
- WantQueryMouse = TRUE;
- break;
- case 3: mouse_code = MOUSE_RELEASE | MOUSE_LEFT;
- break;
- case 4: mouse_code = MOUSE_MIDDLE;
- WantQueryMouse = TRUE;
- break;
- case 5: mouse_code = MOUSE_RELEASE | MOUSE_MIDDLE;
- break;
- case 6: mouse_code = MOUSE_RIGHT;
- WantQueryMouse = TRUE;
- break;
- case 7: mouse_code = MOUSE_RELEASE | MOUSE_RIGHT;
- break;
- case 8: return -1; /* fourth button down */
- case 9: return -1; /* fourth button up */
- case 10: return -1; /* mouse outside of filter rectangle */
- default: return -1; /* should never occur */
- }
-
- mouse_col = Pc - 1;
- mouse_row = Pr - 1;
-
- slen += (int)(p - (tp + slen));
- }
-# endif /* FEAT_MOUSE_DEC */
-# ifdef FEAT_MOUSE_PTERM
- if (key_name[0] == KS_PTERM_MOUSE)
- {
- int button, num_clicks, action;
-
- p = tp + slen;
-
- action = getdigits(&p);
- if (*p++ != ';')
- return -1;
-
- mouse_row = getdigits(&p);
- if (*p++ != ';')
- return -1;
- mouse_col = getdigits(&p);
- if (*p++ != ';')
- return -1;
-
- button = getdigits(&p);
- mouse_code = 0;
-
- switch (button)
- {
- case 4: mouse_code = MOUSE_LEFT; break;
- case 1: mouse_code = MOUSE_RIGHT; break;
- case 2: mouse_code = MOUSE_MIDDLE; break;
- default: return -1;
- }
-
- switch (action)
- {
- case 31: /* Initial press */
- if (*p++ != ';')
- return -1;
-
- num_clicks = getdigits(&p); /* Not used */
- break;
-
- case 32: /* Release */
- mouse_code |= MOUSE_RELEASE;
- break;
-
- case 33: /* Drag */
- held_button = mouse_code;
- mouse_code |= MOUSE_DRAG;
- break;
-
- default:
- return -1;
- }
-
- if (*p++ != 't')
- return -1;
-
- slen += (p - (tp + slen));
- }
-# endif /* FEAT_MOUSE_PTERM */
-
- /* Interpret the mouse code */
- current_button = (mouse_code & MOUSE_CLICK_MASK);
- if (current_button == MOUSE_RELEASE
-# ifdef FEAT_MOUSE_XTERM
- && wheel_code == 0
-# endif
- )
- {
- /*
- * If we get a mouse drag or release event when
- * there is no mouse button held down (held_button ==
- * MOUSE_RELEASE), produce a K_IGNORE below.
- * (can happen when you hold down two buttons
- * and then let them go, or click in the menu bar, but not
- * on a menu, and drag into the text).
- */
- if ((mouse_code & MOUSE_DRAG) == MOUSE_DRAG)
- is_drag = TRUE;
- current_button = held_button;
- }
- else if (wheel_code == 0)
- {
-# ifdef CHECK_DOUBLE_CLICK
-# ifdef FEAT_MOUSE_GPM
- /*
- * Only for Unix, when GUI not active, we handle
- * multi-clicks here, but not for GPM mouse events.
- */
-# ifdef FEAT_GUI
- if (key_name[0] != KS_GPM_MOUSE && !gui.in_use)
-# else
- if (key_name[0] != KS_GPM_MOUSE)
-# endif
-# else
-# ifdef FEAT_GUI
- if (!gui.in_use)
-# endif
-# endif
- {
- /*
- * Compute the time elapsed since the previous mouse click.
- */
- gettimeofday(&mouse_time, NULL);
- if (orig_mouse_time.tv_sec == 0)
- {
- /*
- * Avoid computing the difference between mouse_time
- * and orig_mouse_time for the first click, as the
- * difference would be huge and would cause
- * multiplication overflow.
- */
- timediff = p_mouset;
- }
- else
- {
- timediff = (mouse_time.tv_usec
- - orig_mouse_time.tv_usec) / 1000;
- if (timediff < 0)
- --orig_mouse_time.tv_sec;
- timediff += (mouse_time.tv_sec
- - orig_mouse_time.tv_sec) * 1000;
- }
- orig_mouse_time = mouse_time;
- if (mouse_code == orig_mouse_code
- && timediff < p_mouset
- && orig_num_clicks != 4
- && orig_mouse_col == mouse_col
- && orig_mouse_row == mouse_row
- && ((orig_topline == curwin->w_topline
-#ifdef FEAT_DIFF
- && orig_topfill == curwin->w_topfill
-#endif
- )
- /* Double click in tab pages line also works
- * when window contents changes. */
- || (mouse_row == 0 && firstwin->w_winrow > 0))
- )
- ++orig_num_clicks;
- else
- orig_num_clicks = 1;
- orig_mouse_col = mouse_col;
- orig_mouse_row = mouse_row;
- orig_topline = curwin->w_topline;
-#ifdef FEAT_DIFF
- orig_topfill = curwin->w_topfill;
-#endif
- }
-# if defined(FEAT_GUI) || defined(FEAT_MOUSE_GPM)
- else
- orig_num_clicks = NUM_MOUSE_CLICKS(mouse_code);
-# endif
-# else
- orig_num_clicks = NUM_MOUSE_CLICKS(mouse_code);
-# endif
- is_click = TRUE;
- orig_mouse_code = mouse_code;
- }
- if (!is_drag)
- held_button = mouse_code & MOUSE_CLICK_MASK;
-
- /*
- * Translate the actual mouse event into a pseudo mouse event.
- * First work out what modifiers are to be used.
- */
- if (orig_mouse_code & MOUSE_SHIFT)
- modifiers |= MOD_MASK_SHIFT;
- if (orig_mouse_code & MOUSE_CTRL)
- modifiers |= MOD_MASK_CTRL;
- if (orig_mouse_code & MOUSE_ALT)
- modifiers |= MOD_MASK_ALT;
- if (orig_num_clicks == 2)
- modifiers |= MOD_MASK_2CLICK;
- else if (orig_num_clicks == 3)
- modifiers |= MOD_MASK_3CLICK;
- else if (orig_num_clicks == 4)
- modifiers |= MOD_MASK_4CLICK;
-
- /* Work out our pseudo mouse event. Note that MOUSE_RELEASE gets
- * added, then it's not mouse up/down. */
- key_name[0] = KS_EXTRA;
- if (wheel_code != 0
- && (wheel_code & MOUSE_RELEASE) != MOUSE_RELEASE)
- {
- if (wheel_code & MOUSE_CTRL)
- modifiers |= MOD_MASK_CTRL;
- if (wheel_code & MOUSE_ALT)
- modifiers |= MOD_MASK_ALT;
- key_name[1] = (wheel_code & 1)
- ? (int)KE_MOUSEUP : (int)KE_MOUSEDOWN;
- held_button = MOUSE_RELEASE;
- }
- else
- key_name[1] = get_pseudo_mouse_code(current_button,
- is_click, is_drag);
-
- /* Make sure the mouse position is valid. Some terminals may
- * return weird values. */
- if (mouse_col >= Columns)
- mouse_col = Columns - 1;
- if (mouse_row >= Rows)
- mouse_row = Rows - 1;
+ if (check_termcode_mouse(tp, &slen, key_name, modifiers_start, idx,
+ &modifiers) == -1)
+ return -1;
}
#endif /* FEAT_MOUSE */
@@ -5707,8 +5019,8 @@ check_termcode(
else if (key_name[0] == (int)KS_MENU)
{
long_u val;
+ int num_bytes = get_long_from_buf(tp + slen, &val);
- num_bytes = get_long_from_buf(tp + slen, &val);
if (num_bytes == -1)
return -1;
current_menu = (vimmenu_T *)val;
@@ -5726,8 +5038,10 @@ check_termcode(
# ifdef FEAT_GUI_TABLINE
else if (key_name[0] == (int)KS_TABLINE)
{
- /* Selecting tabline tab or using its menu. */
- num_bytes = get_bytes_from_buf(tp + slen, bytes, 1);
+ // Selecting tabline tab or using its menu.
+ char_u bytes[6];
+ int num_bytes = get_bytes_from_buf(tp + slen, bytes, 1);
+
if (num_bytes == -1)
return -1;
current_tab = (int)bytes[0];
@@ -5737,8 +5051,10 @@ check_termcode(
}
else if (key_name[0] == (int)KS_TABMENU)
{
- /* Selecting tabline tab or using its menu. */
- num_bytes = get_bytes_from_buf(tp + slen, bytes, 2);
+ // Selecting tabline tab or using its menu.
+ char_u bytes[6];
+ int num_bytes = get_bytes_from_buf(tp + slen, bytes, 2);
+
if (num_bytes == -1)
return -1;
current_tab = (int)bytes[0];
@@ -5750,6 +5066,8 @@ check_termcode(
else if (key_name[0] == (int)KS_VER_SCROLLBAR)
{
long_u val;
+ char_u bytes[6];
+ int num_bytes;
/* Get the last scrollbar event in the queue of the same type */
j = 0;
@@ -5778,6 +5096,7 @@ check_termcode(
else if (key_name[0] == (int)KS_HOR_SCROLLBAR)
{
long_u val;
+ int num_bytes;
/* Get the last horiz. scrollbar event in the queue */
j = 0;