mirror of
https://github.com/tmux/tmux.git
synced 2025-09-02 13:37:12 +00:00
If a mouse position was above the maximum supported by the normal mouse
protocol (223), tmux was allowing it to wrap around. However, since tmux was not correctly handling this on input, other programs also do not handle it correctly, and the alternative SGR mouse mode is now widespread, this seems unnecessary, so remove this feature. Also define some constants to make it clearer what the numbers mean. Mostly from Leonid S Usov in GitHub issue 3165.
This commit is contained in:
31
input-keys.c
31
input-keys.c
@ -606,19 +606,34 @@ input_key_get_mouse(struct screen *s, struct mouse_event *m, u_int x, u_int y,
|
||||
len = xsnprintf(buf, sizeof buf, "\033[<%u;%u;%u%c",
|
||||
m->sgr_b, x + 1, y + 1, m->sgr_type);
|
||||
} else if (s->mode & MODE_MOUSE_UTF8) {
|
||||
if (m->b > 0x7ff - 32 || x > 0x7ff - 33 || y > 0x7ff - 33)
|
||||
if (m->b > MOUSE_PARAM_UTF8_MAX - MOUSE_PARAM_BTN_OFF ||
|
||||
x > MOUSE_PARAM_UTF8_MAX - MOUSE_PARAM_POS_OFF ||
|
||||
y > MOUSE_PARAM_UTF8_MAX - MOUSE_PARAM_POS_OFF)
|
||||
return (0);
|
||||
len = xsnprintf(buf, sizeof buf, "\033[M");
|
||||
len += input_key_split2(m->b + 32, &buf[len]);
|
||||
len += input_key_split2(x + 33, &buf[len]);
|
||||
len += input_key_split2(y + 33, &buf[len]);
|
||||
len += input_key_split2(m->b + MOUSE_PARAM_BTN_OFF, &buf[len]);
|
||||
len += input_key_split2(x + MOUSE_PARAM_POS_OFF, &buf[len]);
|
||||
len += input_key_split2(y + MOUSE_PARAM_POS_OFF, &buf[len]);
|
||||
} else {
|
||||
if (m->b > 223)
|
||||
if (m->b + MOUSE_PARAM_BTN_OFF > MOUSE_PARAM_MAX)
|
||||
return (0);
|
||||
|
||||
len = xsnprintf(buf, sizeof buf, "\033[M");
|
||||
buf[len++] = m->b + 32;
|
||||
buf[len++] = x + 33;
|
||||
buf[len++] = y + 33;
|
||||
buf[len++] = m->b + MOUSE_PARAM_BTN_OFF;
|
||||
|
||||
/*
|
||||
* The incoming x and y may be out of the range which can be
|
||||
* supported by the "normal" mouse protocol. Clamp the
|
||||
* coordinates to the supported range.
|
||||
*/
|
||||
if (x + MOUSE_PARAM_POS_OFF > MOUSE_PARAM_MAX)
|
||||
buf[len++] = MOUSE_PARAM_MAX;
|
||||
else
|
||||
buf[len++] = x + MOUSE_PARAM_POS_OFF;
|
||||
if (y + MOUSE_PARAM_POS_OFF > MOUSE_PARAM_MAX)
|
||||
buf[len++] = MOUSE_PARAM_MAX;
|
||||
else
|
||||
buf[len++] = y + MOUSE_PARAM_POS_OFF;
|
||||
}
|
||||
|
||||
*rbuf = buf;
|
||||
|
Reference in New Issue
Block a user