mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 09:44:18 +00:00 
			
		
		
		
	Sync OpenBSD patchset 812:
Support all four of the xterm mouse modes. Based on a diff from hsim at gmx.li.
This commit is contained in:
		@@ -1,4 +1,4 @@
 | 
			
		||||
/* $Id: input-keys.c,v 1.45 2010-09-07 19:32:58 nicm Exp $ */
 | 
			
		||||
/* $Id: input-keys.c,v 1.46 2010-12-30 22:27:38 tcunha Exp $ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
			
		||||
@@ -203,7 +203,7 @@ input_mouse(struct window_pane *wp, struct mouse_event *m)
 | 
			
		||||
{
 | 
			
		||||
	char	out[8];
 | 
			
		||||
 | 
			
		||||
	if (wp->screen->mode & MODE_MOUSE) {
 | 
			
		||||
	if (wp->screen->mode & ALL_MOUSE_MODES) {
 | 
			
		||||
		xsnprintf(out, sizeof out,
 | 
			
		||||
		    "\033[M%c%c%c", m->b + 32, m->x + 33, m->y + 33);
 | 
			
		||||
		bufferevent_write(wp->event, out, strlen(out));
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										23
									
								
								input.c
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								input.c
									
									
									
									
									
								
							@@ -1,4 +1,4 @@
 | 
			
		||||
/* $Id: input.c,v 1.111 2010-12-25 23:43:53 tcunha Exp $ */
 | 
			
		||||
/* $Id: input.c,v 1.112 2010-12-30 22:27:38 tcunha Exp $ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
			
		||||
@@ -953,7 +953,7 @@ input_esc_dispatch(struct input_ctx *ictx)
 | 
			
		||||
		screen_write_insertmode(sctx, 0);
 | 
			
		||||
		screen_write_kcursormode(sctx, 0);
 | 
			
		||||
		screen_write_kkeypadmode(sctx, 0);
 | 
			
		||||
		screen_write_mousemode(sctx, 0);
 | 
			
		||||
		screen_write_mousemode_off(sctx);
 | 
			
		||||
 | 
			
		||||
		screen_write_clearscreen(sctx);
 | 
			
		||||
		screen_write_cursormove(sctx, 0, 0);
 | 
			
		||||
@@ -1156,7 +1156,10 @@ input_csi_dispatch(struct input_ctx *ictx)
 | 
			
		||||
			screen_write_cursormode(&ictx->ctx, 0);
 | 
			
		||||
			break;
 | 
			
		||||
		case 1000:
 | 
			
		||||
			screen_write_mousemode(&ictx->ctx, 0);
 | 
			
		||||
		case 1001:
 | 
			
		||||
		case 1002:
 | 
			
		||||
		case 1003:
 | 
			
		||||
			screen_write_mousemode_off(&ictx->ctx);
 | 
			
		||||
			break;
 | 
			
		||||
		case 1049:
 | 
			
		||||
			window_pane_alternate_off(wp, &ictx->cell);
 | 
			
		||||
@@ -1192,7 +1195,19 @@ input_csi_dispatch(struct input_ctx *ictx)
 | 
			
		||||
			screen_write_cursormode(&ictx->ctx, 1);
 | 
			
		||||
			break;
 | 
			
		||||
		case 1000:
 | 
			
		||||
			screen_write_mousemode(&ictx->ctx, 1);
 | 
			
		||||
			screen_write_mousemode_on(
 | 
			
		||||
			    &ictx->ctx, MODE_MOUSE_STANDARD);
 | 
			
		||||
			break;
 | 
			
		||||
		case 1001:
 | 
			
		||||
			screen_write_mousemode_on(
 | 
			
		||||
			    &ictx->ctx, MODE_MOUSE_HIGHLIGHT);
 | 
			
		||||
			break;
 | 
			
		||||
		case 1002:
 | 
			
		||||
			screen_write_mousemode_on(
 | 
			
		||||
			    &ictx->ctx, MODE_MOUSE_BUTTON);
 | 
			
		||||
			break;
 | 
			
		||||
		case 1003:
 | 
			
		||||
			screen_write_mousemode_on(&ictx->ctx, MODE_MOUSE_ANY);
 | 
			
		||||
			break;
 | 
			
		||||
		case 1049:
 | 
			
		||||
			window_pane_alternate_on(wp, &ictx->cell);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
/* $Id: screen-write.c,v 1.90 2010-06-16 18:09:23 micahcowan Exp $ */
 | 
			
		||||
/* $Id: screen-write.c,v 1.91 2010-12-30 22:27:38 tcunha Exp $ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
			
		||||
@@ -829,16 +829,23 @@ screen_write_insertmode(struct screen_write_ctx *ctx, int state)
 | 
			
		||||
		s->mode &= ~MODE_INSERT;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Set mouse mode.  */
 | 
			
		||||
/* Set mouse mode off. */
 | 
			
		||||
void
 | 
			
		||||
screen_write_mousemode(struct screen_write_ctx *ctx, int state)
 | 
			
		||||
screen_write_mousemode_off(struct screen_write_ctx *ctx)
 | 
			
		||||
{
 | 
			
		||||
	struct screen	*s = ctx->s;
 | 
			
		||||
 | 
			
		||||
	if (state)
 | 
			
		||||
		s->mode |= MODE_MOUSE;
 | 
			
		||||
	else
 | 
			
		||||
		s->mode &= ~MODE_MOUSE;
 | 
			
		||||
	s->mode &= ~ALL_MOUSE_MODES;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Set mouse mode on. */
 | 
			
		||||
void
 | 
			
		||||
screen_write_mousemode_on(struct screen_write_ctx *ctx, int mode)
 | 
			
		||||
{
 | 
			
		||||
	struct screen	*s = ctx->s;
 | 
			
		||||
 | 
			
		||||
	s->mode &= ~ALL_MOUSE_MODES;
 | 
			
		||||
	s->mode |= mode;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Line feed. */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
/* $Id: server-client.c,v 1.48 2010-12-22 15:31:00 tcunha Exp $ */
 | 
			
		||||
/* $Id: server-client.c,v 1.49 2010-12-30 22:27:38 tcunha Exp $ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
			
		||||
@@ -449,7 +449,7 @@ server_client_reset_state(struct client *c)
 | 
			
		||||
	mode = s->mode;
 | 
			
		||||
	if (TAILQ_NEXT(TAILQ_FIRST(&w->panes), entry) != NULL &&
 | 
			
		||||
	    options_get_number(oo, "mouse-select-pane"))
 | 
			
		||||
		mode |= MODE_MOUSE;
 | 
			
		||||
		mode |= MODE_MOUSE_STANDARD;
 | 
			
		||||
	tty_update_mode(&c->tty, mode);
 | 
			
		||||
	tty_reset(&c->tty);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										16
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								tmux.h
									
									
									
									
									
								
							@@ -1,4 +1,4 @@
 | 
			
		||||
/* $Id: tmux.h,v 1.592 2010-12-30 20:41:08 nicm Exp $ */
 | 
			
		||||
/* $Id: tmux.h,v 1.593 2010-12-30 22:27:38 tcunha Exp $ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
			
		||||
@@ -543,9 +543,14 @@ struct mode_key_table {
 | 
			
		||||
#define MODE_INSERT 0x2
 | 
			
		||||
#define MODE_KCURSOR 0x4
 | 
			
		||||
#define MODE_KKEYPAD 0x8	/* set = application, clear = number */
 | 
			
		||||
#define MODE_MOUSE 0x10
 | 
			
		||||
#define MODE_MOUSEMOTION 0x20
 | 
			
		||||
#define MODE_WRAP 0x40		/* whether lines wrap */
 | 
			
		||||
#define MODE_WRAP 0x10		/* whether lines wrap */
 | 
			
		||||
#define MODE_MOUSE_STANDARD 0x20
 | 
			
		||||
#define MODE_MOUSE_HIGHLIGHT 0x40
 | 
			
		||||
#define MODE_MOUSE_BUTTON 0x80
 | 
			
		||||
#define MODE_MOUSE_ANY 0x100
 | 
			
		||||
 | 
			
		||||
#define ALL_MOUSE_MODES (MODE_MOUSE_STANDARD| \
 | 
			
		||||
    MODE_MOUSE_HIGHLIGHT|MODE_MOUSE_BUTTON|MODE_MOUSE_ANY)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * A single UTF-8 character.
 | 
			
		||||
@@ -1806,7 +1811,8 @@ void	 screen_write_cursormode(struct screen_write_ctx *, int);
 | 
			
		||||
void	 screen_write_reverseindex(struct screen_write_ctx *);
 | 
			
		||||
void	 screen_write_scrollregion(struct screen_write_ctx *, u_int, u_int);
 | 
			
		||||
void	 screen_write_insertmode(struct screen_write_ctx *, int);
 | 
			
		||||
void	 screen_write_mousemode(struct screen_write_ctx *, int);
 | 
			
		||||
void	 screen_write_mousemode_on(struct screen_write_ctx *, int);
 | 
			
		||||
void	 screen_write_mousemode_off(struct screen_write_ctx *);
 | 
			
		||||
void	 screen_write_linefeed(struct screen_write_ctx *, int);
 | 
			
		||||
void	 screen_write_linefeedscreen(struct screen_write_ctx *, int);
 | 
			
		||||
void	 screen_write_carriagereturn(struct screen_write_ctx *);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										26
									
								
								tty.c
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								tty.c
									
									
									
									
									
								
							@@ -1,4 +1,4 @@
 | 
			
		||||
/* $Id: tty.c,v 1.197 2010-12-06 21:57:56 nicm Exp $ */
 | 
			
		||||
/* $Id: tty.c,v 1.198 2010-12-30 22:27:38 tcunha Exp $ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
			
		||||
@@ -403,17 +403,25 @@ tty_update_mode(struct tty *tty, int mode)
 | 
			
		||||
		else
 | 
			
		||||
			tty_putcode(tty, TTYC_CIVIS);
 | 
			
		||||
	}
 | 
			
		||||
	if (changed & (MODE_MOUSE|MODE_MOUSEMOTION)) {
 | 
			
		||||
		if (mode & MODE_MOUSE) {
 | 
			
		||||
			if (mode & MODE_MOUSEMOTION)
 | 
			
		||||
				tty_puts(tty, "\033[?1003h");
 | 
			
		||||
			else
 | 
			
		||||
	if (changed & ALL_MOUSE_MODES) {
 | 
			
		||||
		if (mode & ALL_MOUSE_MODES) {
 | 
			
		||||
			if (mode & MODE_MOUSE_STANDARD)
 | 
			
		||||
				tty_puts(tty, "\033[?1000h");
 | 
			
		||||
			else if (mode & MODE_MOUSE_HIGHLIGHT)
 | 
			
		||||
				tty_puts(tty, "\033[?1001h");
 | 
			
		||||
			else if (mode & MODE_MOUSE_BUTTON)
 | 
			
		||||
				tty_puts(tty, "\033[?1002h");
 | 
			
		||||
			else if (mode & MODE_MOUSE_ANY)
 | 
			
		||||
				tty_puts(tty, "\033[?1003h");
 | 
			
		||||
		} else {
 | 
			
		||||
			if (mode & MODE_MOUSEMOTION)
 | 
			
		||||
				tty_puts(tty, "\033[?1003l");
 | 
			
		||||
			else
 | 
			
		||||
			if (tty->mode & MODE_MOUSE_STANDARD)
 | 
			
		||||
				tty_puts(tty, "\033[?1000l");
 | 
			
		||||
			else if (tty->mode & MODE_MOUSE_HIGHLIGHT)
 | 
			
		||||
				tty_puts(tty, "\033[?1001l");
 | 
			
		||||
			else if (tty->mode & MODE_MOUSE_BUTTON)
 | 
			
		||||
				tty_puts(tty, "\033[?1002l");
 | 
			
		||||
			else if (tty->mode & MODE_MOUSE_ANY)
 | 
			
		||||
				tty_puts(tty, "\033[?1003l");
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if (changed & MODE_KKEYPAD) {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
/* $Id: window-choose.c,v 1.30 2010-05-22 21:56:04 micahcowan Exp $ */
 | 
			
		||||
/* $Id: window-choose.c,v 1.31 2010-12-30 22:27:38 tcunha Exp $ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
			
		||||
@@ -127,7 +127,7 @@ window_choose_init(struct window_pane *wp)
 | 
			
		||||
	screen_init(s, screen_size_x(&wp->base), screen_size_y(&wp->base), 0);
 | 
			
		||||
	s->mode &= ~MODE_CURSOR;
 | 
			
		||||
	if (options_get_number(&wp->window->options, "mode-mouse"))
 | 
			
		||||
		s->mode |= MODE_MOUSE;
 | 
			
		||||
		s->mode |= MODE_MOUSE_STANDARD;
 | 
			
		||||
 | 
			
		||||
	keys = options_get_number(&wp->window->options, "mode-keys");
 | 
			
		||||
	if (keys == MODEKEY_EMACS)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
/* $Id: window-copy.c,v 1.125 2010-12-11 17:57:28 nicm Exp $ */
 | 
			
		||||
/* $Id: window-copy.c,v 1.126 2010-12-30 22:27:38 tcunha Exp $ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
			
		||||
@@ -180,7 +180,7 @@ window_copy_init(struct window_pane *wp)
 | 
			
		||||
	s = &data->screen;
 | 
			
		||||
	screen_init(s, screen_size_x(&wp->base), screen_size_y(&wp->base), 0);
 | 
			
		||||
	if (options_get_number(&wp->window->options, "mode-mouse"))
 | 
			
		||||
		s->mode |= MODE_MOUSE;
 | 
			
		||||
		s->mode |= MODE_MOUSE_STANDARD;
 | 
			
		||||
 | 
			
		||||
	keys = options_get_number(&wp->window->options, "mode-keys");
 | 
			
		||||
	if (keys == MODEKEY_EMACS)
 | 
			
		||||
@@ -787,13 +787,14 @@ window_copy_mouse(
 | 
			
		||||
	 * If already reading motion, move the cursor while buttons are still
 | 
			
		||||
	 * pressed, or stop the selection on their release.
 | 
			
		||||
	 */
 | 
			
		||||
	if (s->mode & MODE_MOUSEMOTION) {
 | 
			
		||||
	if (s->mode & MODE_MOUSE_ANY) {
 | 
			
		||||
		if ((m->b & MOUSE_BUTTON) != MOUSE_UP) {
 | 
			
		||||
			window_copy_update_cursor(wp, m->x, m->y);
 | 
			
		||||
			if (window_copy_update_selection(wp))
 | 
			
		||||
				window_copy_redraw_screen(wp);
 | 
			
		||||
		} else {
 | 
			
		||||
			s->mode &= ~MODE_MOUSEMOTION;
 | 
			
		||||
			s->mode &= ~MODE_MOUSE_ANY;
 | 
			
		||||
			s->mode |= MODE_MOUSE_STANDARD;
 | 
			
		||||
			if (sess != NULL) {
 | 
			
		||||
				window_copy_copy_selection(wp, sess);
 | 
			
		||||
				window_pane_reset_mode(wp);
 | 
			
		||||
@@ -802,9 +803,10 @@ window_copy_mouse(
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Otherwise i other buttons pressed, start selection and motion. */
 | 
			
		||||
	/* Otherwise if other buttons pressed, start selection and motion. */
 | 
			
		||||
	if ((m->b & MOUSE_BUTTON) != MOUSE_UP) {
 | 
			
		||||
		s->mode |= MODE_MOUSEMOTION;
 | 
			
		||||
		s->mode &= ~MODE_MOUSE_STANDARD;
 | 
			
		||||
		s->mode |= MODE_MOUSE_ANY;
 | 
			
		||||
 | 
			
		||||
		window_copy_update_cursor(wp, m->x, m->y);
 | 
			
		||||
		window_copy_start_selection(wp);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user