mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	Fix how popup height is calculated to take embedded newlines into account.
This commit is contained in:
		@@ -237,7 +237,7 @@ cmd_display_popup_exec(struct cmd *self, struct cmdq_item *item)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (nlines != 0)
 | 
			
		||||
		h = nlines + 2;
 | 
			
		||||
		h = popup_height(nlines, lines) + 2;
 | 
			
		||||
	else
 | 
			
		||||
		h = c->tty.sy / 2;
 | 
			
		||||
	if (args_has(args, 'h')) {
 | 
			
		||||
@@ -262,6 +262,10 @@ cmd_display_popup_exec(struct cmd *self, struct cmdq_item *item)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (w > c->tty.sx - 1)
 | 
			
		||||
		w = c->tty.sx - 1;
 | 
			
		||||
	if (h > c->tty.sy - 1)
 | 
			
		||||
		h = c->tty.sy - 1;
 | 
			
		||||
	cmd_display_menu_get_position(c, item, args, &px, &py, w, h);
 | 
			
		||||
 | 
			
		||||
	value = args_get(args, 'd');
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										20
									
								
								popup.c
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								popup.c
									
									
									
									
									
								
							@@ -349,6 +349,22 @@ popup_job_complete_cb(struct job *job)
 | 
			
		||||
		server_client_clear_overlay(pd->c);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
u_int
 | 
			
		||||
popup_height(u_int nlines, const char **lines)
 | 
			
		||||
{
 | 
			
		||||
	char	*copy, *next, *loop;
 | 
			
		||||
	u_int	 i, height = 0;
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < nlines; i++) {
 | 
			
		||||
		copy = next = xstrdup(lines[i]);
 | 
			
		||||
		while ((loop = strsep(&next, "\n")) != NULL)
 | 
			
		||||
			height++;
 | 
			
		||||
		free(copy);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return (height);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
u_int
 | 
			
		||||
popup_width(struct cmdq_item *item, u_int nlines, const char **lines,
 | 
			
		||||
    struct client *c, struct cmd_find_state *fs)
 | 
			
		||||
@@ -372,8 +388,8 @@ popup_width(struct cmdq_item *item, u_int nlines, const char **lines,
 | 
			
		||||
				width = tmpwidth;
 | 
			
		||||
			free(tmp);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
		free(copy);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	format_free(ft);
 | 
			
		||||
	return (width);
 | 
			
		||||
@@ -394,8 +410,6 @@ popup_display(int flags, struct cmdq_item *item, u_int px, u_int py, u_int sx,
 | 
			
		||||
		return (-1);
 | 
			
		||||
	if (c->tty.sx < sx || c->tty.sy < sy)
 | 
			
		||||
		return (-1);
 | 
			
		||||
	if (nlines > sy - 2)
 | 
			
		||||
		nlines = sy - 2;
 | 
			
		||||
 | 
			
		||||
	pd = xcalloc(1, sizeof *pd);
 | 
			
		||||
	pd->item = item;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								tmux.h
									
									
									
									
									
								
							@@ -2763,6 +2763,7 @@ int		 menu_display(struct menu *, int, struct cmdq_item *, u_int,
 | 
			
		||||
#define POPUP_CLOSEEXIT 0x2
 | 
			
		||||
u_int		 popup_width(struct cmdq_item *, u_int, const char **,
 | 
			
		||||
		    struct client *, struct cmd_find_state *);
 | 
			
		||||
u_int		 popup_height(u_int, const char **);
 | 
			
		||||
int		 popup_display(int, struct cmdq_item *, u_int, u_int, u_int,
 | 
			
		||||
		    u_int, u_int, const char **, const char *, const char *,
 | 
			
		||||
		    const char *, struct client *, struct cmd_find_state *);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user