mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 09:44:18 +00:00 
			
		
		
		
	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:
		@@ -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);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										8
									
								
								server.c
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								server.c
									
									
									
									
									
								
							@@ -880,9 +880,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) {
 | 
				
			||||||
@@ -894,7 +894,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;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -922,10 +922,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;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								tmux.h
									
									
									
									
									
								
							@@ -674,13 +674,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 *);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -951,6 +952,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;
 | 
				
			||||||
@@ -1285,7 +1293,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(
 | 
				
			||||||
@@ -1542,7 +1550,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);
 | 
				
			||||||
@@ -1705,7 +1713,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 *);
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										21
									
								
								tty-keys.c
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								tty-keys.c
									
									
									
									
									
								
							@@ -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);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								window.c
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								window.c
									
									
									
									
									
								
							@@ -653,25 +653,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
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user