mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 09:26:05 +00:00 
			
		
		
		
	Fix size check for splitw -f and top level pane size for tiled layout,
problems reported by Thomas Sattler.
This commit is contained in:
		@@ -450,8 +450,7 @@ layout_set_tiled(struct window *w)
 | 
			
		||||
	/* Free old tree and create a new root. */
 | 
			
		||||
	layout_free(w);
 | 
			
		||||
	lc = w->layout_root = layout_create_cell(NULL);
 | 
			
		||||
	layout_set_size(lc, (width + 1) * columns - 1,
 | 
			
		||||
	    (height + 1) * rows - 1, 0, 0);
 | 
			
		||||
	layout_set_size(lc, w->sx, w->sy, 0, 0);
 | 
			
		||||
	layout_make_node(lc, LAYOUT_TOPBOTTOM);
 | 
			
		||||
 | 
			
		||||
	/* Create a grid of the cells. */
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										19
									
								
								layout.c
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								layout.c
									
									
									
									
									
								
							@@ -722,7 +722,7 @@ layout_set_size_check(struct window *w, struct layout_cell *lc,
 | 
			
		||||
    enum layout_type type, int size)
 | 
			
		||||
{
 | 
			
		||||
	struct layout_cell	*lcchild;
 | 
			
		||||
	u_int			new_size, available, previous, count, idx;
 | 
			
		||||
	u_int			 new_size, available, previous, count, idx;
 | 
			
		||||
 | 
			
		||||
	/* Cells with no children must just be bigger than minimum. */
 | 
			
		||||
	if (lc->type == LAYOUT_WINDOWPANE)
 | 
			
		||||
@@ -736,6 +736,9 @@ layout_set_size_check(struct window *w, struct layout_cell *lc,
 | 
			
		||||
 | 
			
		||||
	/* Check new size will work for each child. */
 | 
			
		||||
	if (lc->type == type) {
 | 
			
		||||
		if (available < (count * 2) - 1)
 | 
			
		||||
			return (0);
 | 
			
		||||
 | 
			
		||||
		if (type == LAYOUT_LEFTRIGHT)
 | 
			
		||||
			previous = lc->sx;
 | 
			
		||||
		else
 | 
			
		||||
@@ -745,13 +748,17 @@ layout_set_size_check(struct window *w, struct layout_cell *lc,
 | 
			
		||||
		TAILQ_FOREACH(lcchild, &lc->cells, entry) {
 | 
			
		||||
			new_size = layout_new_pane_size(w, previous, lcchild,
 | 
			
		||||
			    type, size, count - idx, available);
 | 
			
		||||
			if (new_size > available)
 | 
			
		||||
				return (0);
 | 
			
		||||
 | 
			
		||||
			available -= (new_size + 1);
 | 
			
		||||
			if (idx == count - 1) {
 | 
			
		||||
				if (new_size > available)
 | 
			
		||||
					return (0);
 | 
			
		||||
				available -= new_size;
 | 
			
		||||
			} else {
 | 
			
		||||
				if (new_size + 1 > available)
 | 
			
		||||
					return (0);
 | 
			
		||||
				available -= new_size + 1;
 | 
			
		||||
			}
 | 
			
		||||
			if (!layout_set_size_check(w, lcchild, type, new_size))
 | 
			
		||||
				return (0);
 | 
			
		||||
 | 
			
		||||
			idx++;
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user