mirror of
https://github.com/tmux/tmux.git
synced 2025-03-25 15:28:49 +00:00
Sync OpenBSD patchset 381:
Clean up by introducing a wrapper struct for mouse clicks rather than passing three u_chars around. As a side-effect this fixes incorrectly rejecting high cursor positions (because it was comparing them as signed char), reported by Tom Doherty.
This commit is contained in:
parent
323469723b
commit
b26ea8462e
10
input-keys.c
10
input-keys.c
@ -1,4 +1,4 @@
|
|||||||
/* $Id: input-keys.c,v 1.29 2009-07-28 22:37:02 tcunha Exp $ */
|
/* $Id: input-keys.c,v 1.30 2009-10-12 00:18:19 tcunha Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
||||||
@ -219,12 +219,12 @@ input_key(struct window_pane *wp, int key)
|
|||||||
|
|
||||||
/* Handle input mouse. */
|
/* Handle input mouse. */
|
||||||
void
|
void
|
||||||
input_mouse(struct window_pane *wp, u_char b, u_char x, u_char y)
|
input_mouse(struct window_pane *wp, struct mouse_event *m)
|
||||||
{
|
{
|
||||||
if (wp->screen->mode & MODE_MOUSE) {
|
if (wp->screen->mode & MODE_MOUSE) {
|
||||||
buffer_write(wp->out, "\033[M", 3);
|
buffer_write(wp->out, "\033[M", 3);
|
||||||
buffer_write8(wp->out, b + 32);
|
buffer_write8(wp->out, m->b + 32);
|
||||||
buffer_write8(wp->out, x + 33);
|
buffer_write8(wp->out, m->x + 33);
|
||||||
buffer_write8(wp->out, y + 33);
|
buffer_write8(wp->out, m->y + 33);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
10
server.c
10
server.c
@ -1,4 +1,4 @@
|
|||||||
/* $Id: server.c,v 1.202 2009-10-12 00:14:44 tcunha Exp $ */
|
/* $Id: server.c,v 1.203 2009-10-12 00:18:19 tcunha Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
||||||
@ -883,9 +883,9 @@ server_handle_client(struct client *c)
|
|||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
struct key_binding *bd;
|
struct key_binding *bd;
|
||||||
struct keylist *keylist;
|
struct keylist *keylist;
|
||||||
|
struct mouse_event mouse;
|
||||||
int key, status, xtimeout, mode, isprefix;
|
int key, status, xtimeout, mode, isprefix;
|
||||||
u_int i;
|
u_int i;
|
||||||
u_char mouse[3];
|
|
||||||
|
|
||||||
xtimeout = options_get_number(&c->session->options, "repeat-time");
|
xtimeout = options_get_number(&c->session->options, "repeat-time");
|
||||||
if (xtimeout != 0 && c->flags & CLIENT_REPEAT) {
|
if (xtimeout != 0 && c->flags & CLIENT_REPEAT) {
|
||||||
@ -897,7 +897,7 @@ server_handle_client(struct client *c)
|
|||||||
|
|
||||||
/* Process keys. */
|
/* Process keys. */
|
||||||
keylist = options_get_data(&c->session->options, "prefix");
|
keylist = options_get_data(&c->session->options, "prefix");
|
||||||
while (tty_keys_next(&c->tty, &key, mouse) == 0) {
|
while (tty_keys_next(&c->tty, &key, &mouse) == 0) {
|
||||||
if (c->session == NULL)
|
if (c->session == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -925,10 +925,10 @@ server_handle_client(struct client *c)
|
|||||||
/* Check for mouse keys. */
|
/* Check for mouse keys. */
|
||||||
if (key == KEYC_MOUSE) {
|
if (key == KEYC_MOUSE) {
|
||||||
if (options_get_number(oo, "mouse-select-pane")) {
|
if (options_get_number(oo, "mouse-select-pane")) {
|
||||||
window_set_active_at(w, mouse[1], mouse[2]);
|
window_set_active_at(w, mouse.x, mouse.y);
|
||||||
wp = w->active;
|
wp = w->active;
|
||||||
}
|
}
|
||||||
window_pane_mouse(wp, c, mouse[0], mouse[1], mouse[2]);
|
window_pane_mouse(wp, c, &mouse);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
18
tmux.h
18
tmux.h
@ -1,4 +1,4 @@
|
|||||||
/* $Id: tmux.h,v 1.466 2009-10-12 00:12:33 tcunha Exp $ */
|
/* $Id: tmux.h,v 1.467 2009-10-12 00:18:19 tcunha Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
||||||
@ -672,13 +672,14 @@ struct input_ctx {
|
|||||||
*/
|
*/
|
||||||
struct client;
|
struct client;
|
||||||
struct window;
|
struct window;
|
||||||
|
struct mouse_event;
|
||||||
struct window_mode {
|
struct window_mode {
|
||||||
struct screen *(*init)(struct window_pane *);
|
struct screen *(*init)(struct window_pane *);
|
||||||
void (*free)(struct window_pane *);
|
void (*free)(struct window_pane *);
|
||||||
void (*resize)(struct window_pane *, u_int, u_int);
|
void (*resize)(struct window_pane *, u_int, u_int);
|
||||||
void (*key)(struct window_pane *, struct client *, int);
|
void (*key)(struct window_pane *, struct client *, int);
|
||||||
void (*mouse)(struct window_pane *,
|
void (*mouse)(struct window_pane *,
|
||||||
struct client *, u_char, u_char, u_char);
|
struct client *, struct mouse_event *);
|
||||||
void (*timer)(struct window_pane *);
|
void (*timer)(struct window_pane *);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -949,6 +950,13 @@ struct tty_ctx {
|
|||||||
u_int orlower;
|
u_int orlower;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Mouse input. */
|
||||||
|
struct mouse_event {
|
||||||
|
u_char b;
|
||||||
|
u_char x;
|
||||||
|
u_char y;
|
||||||
|
};
|
||||||
|
|
||||||
/* Client connection. */
|
/* Client connection. */
|
||||||
struct client {
|
struct client {
|
||||||
struct imsgbuf ibuf;
|
struct imsgbuf ibuf;
|
||||||
@ -1283,7 +1291,7 @@ int tty_keys_cmp(struct tty_key *, struct tty_key *);
|
|||||||
RB_PROTOTYPE(tty_keys, tty_key, entry, tty_keys_cmp);
|
RB_PROTOTYPE(tty_keys, tty_key, entry, tty_keys_cmp);
|
||||||
void tty_keys_init(struct tty *);
|
void tty_keys_init(struct tty *);
|
||||||
void tty_keys_free(struct tty *);
|
void tty_keys_free(struct tty *);
|
||||||
int tty_keys_next(struct tty *, int *, u_char *);
|
int tty_keys_next(struct tty *, int *, struct mouse_event *);
|
||||||
|
|
||||||
/* options-cmd.c */
|
/* options-cmd.c */
|
||||||
const char *set_option_print(
|
const char *set_option_print(
|
||||||
@ -1540,7 +1548,7 @@ void input_parse(struct window_pane *);
|
|||||||
|
|
||||||
/* input-key.c */
|
/* input-key.c */
|
||||||
void input_key(struct window_pane *, int);
|
void input_key(struct window_pane *, int);
|
||||||
void input_mouse(struct window_pane *, u_char, u_char, u_char);
|
void input_mouse(struct window_pane *, struct mouse_event *);
|
||||||
|
|
||||||
/* colour.c */
|
/* colour.c */
|
||||||
void colour_set_fg(struct grid_cell *, int);
|
void colour_set_fg(struct grid_cell *, int);
|
||||||
@ -1703,7 +1711,7 @@ void window_pane_reset_mode(struct window_pane *);
|
|||||||
void window_pane_parse(struct window_pane *);
|
void window_pane_parse(struct window_pane *);
|
||||||
void window_pane_key(struct window_pane *, struct client *, int);
|
void window_pane_key(struct window_pane *, struct client *, int);
|
||||||
void window_pane_mouse(struct window_pane *,
|
void window_pane_mouse(struct window_pane *,
|
||||||
struct client *, u_char, u_char, u_char);
|
struct client *, struct mouse_event *);
|
||||||
int window_pane_visible(struct window_pane *);
|
int window_pane_visible(struct window_pane *);
|
||||||
char *window_pane_search(
|
char *window_pane_search(
|
||||||
struct window_pane *, const char *, u_int *);
|
struct window_pane *, const char *, u_int *);
|
||||||
|
23
tty-keys.c
23
tty-keys.c
@ -1,4 +1,4 @@
|
|||||||
/* $Id: tty-keys.c,v 1.30 2009-09-20 22:11:27 tcunha Exp $ */
|
/* $Id: tty-keys.c,v 1.31 2009-10-12 00:18:19 tcunha Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
||||||
@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
void tty_keys_add(struct tty *, const char *, int, int);
|
void tty_keys_add(struct tty *, const char *, int, int);
|
||||||
int tty_keys_parse_xterm(struct tty *, char *, size_t, size_t *);
|
int tty_keys_parse_xterm(struct tty *, char *, size_t, size_t *);
|
||||||
int tty_keys_parse_mouse(struct tty *, char *, size_t, size_t *, u_char *);
|
int tty_keys_parse_mouse(char *, size_t, size_t *, struct mouse_event *);
|
||||||
|
|
||||||
struct tty_key_ent {
|
struct tty_key_ent {
|
||||||
enum tty_code_code code;
|
enum tty_code_code code;
|
||||||
@ -231,7 +231,7 @@ tty_keys_find(struct tty *tty, char *buf, size_t len, size_t *size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
tty_keys_next(struct tty *tty, int *key, u_char *mouse)
|
tty_keys_next(struct tty *tty, int *key, struct mouse_event *mouse)
|
||||||
{
|
{
|
||||||
struct tty_key *tk;
|
struct tty_key *tk;
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
@ -269,7 +269,7 @@ tty_keys_next(struct tty *tty, int *key, u_char *mouse)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Not found. Is this a mouse key press? */
|
/* Not found. Is this a mouse key press? */
|
||||||
*key = tty_keys_parse_mouse(tty, buf, len, &size, mouse);
|
*key = tty_keys_parse_mouse(buf, len, &size, mouse);
|
||||||
if (*key != KEYC_NONE) {
|
if (*key != KEYC_NONE) {
|
||||||
buffer_remove(tty->in, size);
|
buffer_remove(tty->in, size);
|
||||||
goto found;
|
goto found;
|
||||||
@ -331,8 +331,7 @@ found:
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
tty_keys_parse_mouse(
|
tty_keys_parse_mouse(char *buf, size_t len, size_t *size, struct mouse_event *m)
|
||||||
unused struct tty *tty, char *buf, size_t len, size_t *size, u_char *mouse)
|
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Mouse sequences are \033[M followed by three characters indicating
|
* Mouse sequences are \033[M followed by three characters indicating
|
||||||
@ -344,12 +343,14 @@ tty_keys_parse_mouse(
|
|||||||
return (KEYC_NONE);
|
return (KEYC_NONE);
|
||||||
*size = 6;
|
*size = 6;
|
||||||
|
|
||||||
if (buf[3] < 32 || buf[4] < 33 || buf[5] < 33)
|
m->b = buf[3];
|
||||||
|
m->x = buf[4];
|
||||||
|
m->y = buf[5];
|
||||||
|
if (m->b < 32 || m->x < 33 || m->y < 33)
|
||||||
return (KEYC_NONE);
|
return (KEYC_NONE);
|
||||||
|
m->b -= 32;
|
||||||
mouse[0] = buf[3] - 32;
|
m->x -= 33;
|
||||||
mouse[1] = buf[4] - 33;
|
m->y -= 33;
|
||||||
mouse[2] = buf[5] - 33;
|
|
||||||
return (KEYC_MOUSE);
|
return (KEYC_MOUSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $Id: window-choose.c,v 1.23 2009-09-11 14:13:52 tcunha Exp $ */
|
/* $Id: window-choose.c,v 1.24 2009-10-12 00:18:19 tcunha Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
|
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
|
||||||
@ -27,7 +27,7 @@ void window_choose_free(struct window_pane *);
|
|||||||
void window_choose_resize(struct window_pane *, u_int, u_int);
|
void window_choose_resize(struct window_pane *, u_int, u_int);
|
||||||
void window_choose_key(struct window_pane *, struct client *, int);
|
void window_choose_key(struct window_pane *, struct client *, int);
|
||||||
void window_choose_mouse(
|
void window_choose_mouse(
|
||||||
struct window_pane *, struct client *, u_char, u_char, u_char);
|
struct window_pane *, struct client *, struct mouse_event *);
|
||||||
|
|
||||||
void window_choose_redraw_screen(struct window_pane *);
|
void window_choose_redraw_screen(struct window_pane *);
|
||||||
void window_choose_write_line(
|
void window_choose_write_line(
|
||||||
@ -264,22 +264,22 @@ window_choose_key(struct window_pane *wp, unused struct client *c, int key)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
window_choose_mouse(struct window_pane *wp,
|
window_choose_mouse(
|
||||||
unused struct client *c, u_char b, u_char x, u_char y)
|
struct window_pane *wp, unused struct client *c, struct mouse_event *m)
|
||||||
{
|
{
|
||||||
struct window_choose_mode_data *data = wp->modedata;
|
struct window_choose_mode_data *data = wp->modedata;
|
||||||
struct screen *s = &data->screen;
|
struct screen *s = &data->screen;
|
||||||
struct window_choose_mode_item *item;
|
struct window_choose_mode_item *item;
|
||||||
u_int idx;
|
u_int idx;
|
||||||
|
|
||||||
if ((b & 3) == 3)
|
if ((m->b & 3) == 3)
|
||||||
return;
|
return;
|
||||||
if (x >= screen_size_x(s))
|
if (m->x >= screen_size_x(s))
|
||||||
return;
|
return;
|
||||||
if (y >= screen_size_y(s))
|
if (m->y >= screen_size_y(s))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
idx = data->top + y;
|
idx = data->top + m->y;
|
||||||
if (idx >= ARRAY_LENGTH(&data->list))
|
if (idx >= ARRAY_LENGTH(&data->list))
|
||||||
return;
|
return;
|
||||||
data->selected = idx;
|
data->selected = idx;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $Id: window-copy.c,v 1.87 2009-10-06 14:10:10 tcunha Exp $ */
|
/* $Id: window-copy.c,v 1.88 2009-10-12 00:18:19 tcunha Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
||||||
@ -29,7 +29,7 @@ void window_copy_resize(struct window_pane *, u_int, u_int);
|
|||||||
void window_copy_key(struct window_pane *, struct client *, int);
|
void window_copy_key(struct window_pane *, struct client *, int);
|
||||||
int window_copy_key_input(struct window_pane *, int);
|
int window_copy_key_input(struct window_pane *, int);
|
||||||
void window_copy_mouse(
|
void window_copy_mouse(
|
||||||
struct window_pane *, struct client *, u_char, u_char, u_char);
|
struct window_pane *, struct client *, struct mouse_event *);
|
||||||
|
|
||||||
void window_copy_redraw_lines(struct window_pane *, u_int, u_int);
|
void window_copy_redraw_lines(struct window_pane *, u_int, u_int);
|
||||||
void window_copy_redraw_screen(struct window_pane *);
|
void window_copy_redraw_screen(struct window_pane *);
|
||||||
@ -418,20 +418,20 @@ window_copy_key_input(struct window_pane *wp, int key)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
window_copy_mouse(struct window_pane *wp,
|
window_copy_mouse(
|
||||||
unused struct client *c, u_char b, u_char x, u_char y)
|
struct window_pane *wp, unused struct client *c, struct mouse_event *m)
|
||||||
{
|
{
|
||||||
struct window_copy_mode_data *data = wp->modedata;
|
struct window_copy_mode_data *data = wp->modedata;
|
||||||
struct screen *s = &data->screen;
|
struct screen *s = &data->screen;
|
||||||
|
|
||||||
if ((b & 3) == 3)
|
if ((m->b & 3) == 3)
|
||||||
return;
|
return;
|
||||||
if (x >= screen_size_x(s))
|
if (m->x >= screen_size_x(s))
|
||||||
return;
|
return;
|
||||||
if (y >= screen_size_y(s))
|
if (m->y >= screen_size_y(s))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
window_copy_update_cursor(wp, x, y);
|
window_copy_update_cursor(wp, m->x, m->y);
|
||||||
if (window_copy_update_selection(wp))
|
if (window_copy_update_selection(wp))
|
||||||
window_copy_redraw_screen(wp);
|
window_copy_redraw_screen(wp);
|
||||||
}
|
}
|
||||||
|
18
window.c
18
window.c
@ -1,4 +1,4 @@
|
|||||||
/* $Id: window.c,v 1.113 2009-10-12 00:04:56 tcunha Exp $ */
|
/* $Id: window.c,v 1.114 2009-10-12 00:18:19 tcunha Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
||||||
@ -660,25 +660,23 @@ window_pane_key(struct window_pane *wp, struct client *c, int key)
|
|||||||
|
|
||||||
void
|
void
|
||||||
window_pane_mouse(
|
window_pane_mouse(
|
||||||
struct window_pane *wp, struct client *c, u_char b, u_char x, u_char y)
|
struct window_pane *wp, struct client *c, struct mouse_event *m)
|
||||||
{
|
{
|
||||||
if (!window_pane_visible(wp))
|
if (!window_pane_visible(wp))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* XXX convert from 1-based? */
|
if (m->x < wp->xoff || m->x >= wp->xoff + wp->sx)
|
||||||
|
|
||||||
if (x < wp->xoff || x >= wp->xoff + wp->sx)
|
|
||||||
return;
|
return;
|
||||||
if (y < wp->yoff || y >= wp->yoff + wp->sy)
|
if (m->y < wp->yoff || m->y >= wp->yoff + wp->sy)
|
||||||
return;
|
return;
|
||||||
x -= wp->xoff;
|
m->x -= wp->xoff;
|
||||||
y -= wp->yoff;
|
m->y -= wp->yoff;
|
||||||
|
|
||||||
if (wp->mode != NULL) {
|
if (wp->mode != NULL) {
|
||||||
if (wp->mode->mouse != NULL)
|
if (wp->mode->mouse != NULL)
|
||||||
wp->mode->mouse(wp, c, b, x, y);
|
wp->mode->mouse(wp, c, m);
|
||||||
} else if (wp->fd != -1)
|
} else if (wp->fd != -1)
|
||||||
input_mouse(wp, b, x, y);
|
input_mouse(wp, m);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
Loading…
Reference in New Issue
Block a user