mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 09:26:05 +00:00 
			
		
		
		
	Rewrite of tmux mouse support which was a mess. Instead of having
options for "mouse-this" and "mouse-that", mouse events may be bound as
keys and there is one option "mouse" that turns on mouse support
entirely (set -g mouse on).
See the new MOUSE SUPPORT section of the man page for description of the
key names and new flags (-t= to specify the pane or window under mouse
as a target, and send-keys -M to pass through a mouse event).
The default builtin bindings for the mouse are:
    bind -n   MouseDown1Pane select-pane -t=; send-keys -M
    bind -n MouseDown1Status select-window -t=
    bind -n   MouseDrag1Pane copy-mode -M
    bind -n MouseDrag1Border resize-pane -M
To get the effect of turning mode-mouse off, do:
    unbind -n MouseDrag1Pane
    unbind -temacs-copy MouseDrag1Pane
The old mouse options are now gone, set-option -q may be used to
suppress warnings if mixing configuration files.
			
			
This commit is contained in:
		
							
								
								
									
										49
									
								
								window.c
									
									
									
									
									
								
							
							
						
						
									
										49
									
								
								window.c
									
									
									
									
									
								
							@@ -386,6 +386,18 @@ window_resize(struct window *w, u_int sx, u_int sy)
 | 
			
		||||
	w->sy = sy;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
window_has_pane(struct window *w, struct window_pane *wp)
 | 
			
		||||
{
 | 
			
		||||
	struct window_pane	*wp1;
 | 
			
		||||
 | 
			
		||||
	TAILQ_FOREACH(wp1, &w->panes, entry) {
 | 
			
		||||
		if (wp1 == wp)
 | 
			
		||||
			return (1);
 | 
			
		||||
	}
 | 
			
		||||
	return (0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
window_set_active_pane(struct window *w, struct window_pane *wp)
 | 
			
		||||
{
 | 
			
		||||
@@ -1052,52 +1064,37 @@ window_pane_reset_mode(struct window_pane *wp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
window_pane_key(struct window_pane *wp, struct session *sess, int key)
 | 
			
		||||
window_pane_key(struct window_pane *wp, struct client *c, struct session *s,
 | 
			
		||||
    int key, struct mouse_event *m)
 | 
			
		||||
{
 | 
			
		||||
	struct window_pane	*wp2;
 | 
			
		||||
 | 
			
		||||
	if (KEYC_IS_MOUSE(key) && m == NULL)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	if (wp->mode != NULL) {
 | 
			
		||||
		if (wp->mode->key != NULL)
 | 
			
		||||
			wp->mode->key(wp, sess, key);
 | 
			
		||||
			wp->mode->key(wp, c, s, key, m);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (wp->fd == -1 || wp->flags & PANE_INPUTOFF)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	input_key(wp, key);
 | 
			
		||||
	input_key(wp, key, m);
 | 
			
		||||
 | 
			
		||||
	if (KEYC_IS_MOUSE(key))
 | 
			
		||||
		return;
 | 
			
		||||
	if (options_get_number(&wp->window->options, "synchronize-panes")) {
 | 
			
		||||
		TAILQ_FOREACH(wp2, &wp->window->panes, entry) {
 | 
			
		||||
			if (wp2 == wp || wp2->mode != NULL)
 | 
			
		||||
				continue;
 | 
			
		||||
			if (wp2->fd != -1 && window_pane_visible(wp2))
 | 
			
		||||
				input_key(wp2, key);
 | 
			
		||||
				input_key(wp2, key, NULL);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
window_pane_mouse(struct window_pane *wp, struct session *sess,
 | 
			
		||||
    struct mouse_event *m)
 | 
			
		||||
{
 | 
			
		||||
	if (!window_pane_visible(wp))
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	if (m->x < wp->xoff || m->x >= wp->xoff + wp->sx)
 | 
			
		||||
		return;
 | 
			
		||||
	if (m->y < wp->yoff || m->y >= wp->yoff + wp->sy)
 | 
			
		||||
		return;
 | 
			
		||||
	m->x -= wp->xoff;
 | 
			
		||||
	m->y -= wp->yoff;
 | 
			
		||||
 | 
			
		||||
	if (wp->mode != NULL) {
 | 
			
		||||
		if (wp->mode->mouse != NULL &&
 | 
			
		||||
		    options_get_number(&wp->window->options, "mode-mouse"))
 | 
			
		||||
			wp->mode->mouse(wp, sess, m);
 | 
			
		||||
	} else if (wp->fd != -1)
 | 
			
		||||
		input_mouse(wp, sess, m);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
window_pane_visible(struct window_pane *wp)
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user