mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 01:34:18 +00:00 
			
		
		
		
	Fix two copy mode problems:
1. In vi mode the selection doesn't include the last character if you moved the cursor up or left. 2. In emacs mode the selection includes the last character if you moved the cursor to the left. From Balazs Kezes.
This commit is contained in:
		
							
								
								
									
										23
									
								
								screen.c
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								screen.c
									
									
									
									
									
								
							@@ -276,6 +276,7 @@ int
 | 
				
			|||||||
screen_check_selection(struct screen *s, u_int px, u_int py)
 | 
					screen_check_selection(struct screen *s, u_int px, u_int py)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct screen_sel	*sel = &s->sel;
 | 
						struct screen_sel	*sel = &s->sel;
 | 
				
			||||||
 | 
						u_int			 xx;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!sel->flag)
 | 
						if (!sel->flag)
 | 
				
			||||||
		return (0);
 | 
							return (0);
 | 
				
			||||||
@@ -325,16 +326,24 @@ screen_check_selection(struct screen *s, u_int px, u_int py)
 | 
				
			|||||||
			if (py < sel->sy || py > sel->ey)
 | 
								if (py < sel->sy || py > sel->ey)
 | 
				
			||||||
				return (0);
 | 
									return (0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if ((py == sel->sy && px < sel->sx)
 | 
								if (py == sel->sy && px < sel->sx)
 | 
				
			||||||
			    || (py == sel->ey && px > sel->ex))
 | 
									return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (py == sel->ey && px > sel->ex)
 | 
				
			||||||
				return (0);
 | 
									return (0);
 | 
				
			||||||
		} else if (sel->sy > sel->ey) {
 | 
							} else if (sel->sy > sel->ey) {
 | 
				
			||||||
			/* starting line > ending line -- upward selection. */
 | 
								/* starting line > ending line -- upward selection. */
 | 
				
			||||||
			if (py > sel->sy || py < sel->ey)
 | 
								if (py > sel->sy || py < sel->ey)
 | 
				
			||||||
				return (0);
 | 
									return (0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if ((py == sel->sy && px >= sel->sx)
 | 
								if (py == sel->ey && px < sel->ex)
 | 
				
			||||||
			    || (py == sel->ey && px < sel->ex))
 | 
									return (0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (sel->modekeys == MODEKEY_EMACS)
 | 
				
			||||||
 | 
									xx = sel->sx - 1;
 | 
				
			||||||
 | 
								else
 | 
				
			||||||
 | 
									xx = sel->sx;
 | 
				
			||||||
 | 
								if (py == sel->sy && px > xx)
 | 
				
			||||||
				return (0);
 | 
									return (0);
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			/* starting line == ending line. */
 | 
								/* starting line == ending line. */
 | 
				
			||||||
@@ -343,7 +352,11 @@ screen_check_selection(struct screen *s, u_int px, u_int py)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			if (sel->ex < sel->sx) {
 | 
								if (sel->ex < sel->sx) {
 | 
				
			||||||
				/* cursor (ex) is on the left */
 | 
									/* cursor (ex) is on the left */
 | 
				
			||||||
				if (px > sel->sx || px < sel->ex)
 | 
									if (sel->modekeys == MODEKEY_EMACS)
 | 
				
			||||||
 | 
										xx = sel->sx - 1;
 | 
				
			||||||
 | 
									else
 | 
				
			||||||
 | 
										xx = sel->sx;
 | 
				
			||||||
 | 
									if (px > xx || px < sel->ex)
 | 
				
			||||||
					return (0);
 | 
										return (0);
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				/* selection start (sx) is on the left */
 | 
									/* selection start (sx) is on the left */
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								tmux.h
									
									
									
									
									
								
							@@ -794,6 +794,7 @@ LIST_HEAD(joblist, job);
 | 
				
			|||||||
struct screen_sel {
 | 
					struct screen_sel {
 | 
				
			||||||
	int		 flag;
 | 
						int		 flag;
 | 
				
			||||||
	int		 rectflag;
 | 
						int		 rectflag;
 | 
				
			||||||
 | 
						int		 modekeys;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	u_int		 sx;
 | 
						u_int		 sx;
 | 
				
			||||||
	u_int		 sy;
 | 
						u_int		 sy;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -199,6 +199,7 @@ window_copy_init(struct window_pane *wp)
 | 
				
			|||||||
		mode_key_init(&data->mdata, &mode_key_tree_emacs_copy);
 | 
							mode_key_init(&data->mdata, &mode_key_tree_emacs_copy);
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		mode_key_init(&data->mdata, &mode_key_tree_vi_copy);
 | 
							mode_key_init(&data->mdata, &mode_key_tree_vi_copy);
 | 
				
			||||||
 | 
						s->sel.modekeys = keys;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	data->backing = NULL;
 | 
						data->backing = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user