mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 09:26:05 +00:00 
			
		
		
		
	Make positions hidden by overlays range-based rather than character-based,
from Anindya Mukherjee.
This commit is contained in:
		
							
								
								
									
										49
									
								
								popup.c
									
									
									
									
									
								
							
							
						
						
									
										49
									
								
								popup.c
									
									
									
									
									
								
							@@ -157,18 +157,49 @@ popup_mode_cb(__unused struct client *c, void *data, u_int *cx, u_int *cy)
 | 
			
		||||
	return (&pd->s);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
popup_check_cb(struct client *c, void *data, u_int px, u_int py)
 | 
			
		||||
/* Return parts of the input range which are not obstructed by the popup. */
 | 
			
		||||
static void
 | 
			
		||||
popup_check_cb(struct client* c, void *data, u_int px, u_int py, u_int nx,
 | 
			
		||||
    struct overlay_ranges *r)
 | 
			
		||||
{
 | 
			
		||||
	struct popup_data	*pd = data;
 | 
			
		||||
	struct overlay_ranges	 or[2];
 | 
			
		||||
	u_int			 i, j, k = 0;
 | 
			
		||||
 | 
			
		||||
	if (pd->md != NULL && menu_check_cb(c, pd->md, px, py) == 0)
 | 
			
		||||
		return (0);
 | 
			
		||||
	if (px < pd->px || px > pd->px + pd->sx - 1)
 | 
			
		||||
		return (1);
 | 
			
		||||
	if (py < pd->py || py > pd->py + pd->sy - 1)
 | 
			
		||||
		return (1);
 | 
			
		||||
	return (0);
 | 
			
		||||
	if (pd->md != NULL) {
 | 
			
		||||
		/* Check each returned range for the menu against the popup. */
 | 
			
		||||
		menu_check_cb(c, pd->md, px, py, nx, r);
 | 
			
		||||
		for (i = 0; i < 2; i++) {
 | 
			
		||||
			server_client_overlay_range(pd->px, pd->py, pd->sx,
 | 
			
		||||
			    pd->sy, r->px[i], py, r->nx[i], &or[i]);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/*
 | 
			
		||||
		 * or has up to OVERLAY_MAX_RANGES non-overlapping ranges,
 | 
			
		||||
		 * ordered from left to right. Collect them in the output.
 | 
			
		||||
		 */
 | 
			
		||||
		for (i = 0; i < 2; i++) {
 | 
			
		||||
			/* Each or[i] only has 2 ranges. */
 | 
			
		||||
			for (j = 0; j < 2; j++) {
 | 
			
		||||
				if (or[i].nx[j] > 0) {
 | 
			
		||||
					r->px[k] = or[i].px[j];
 | 
			
		||||
					r->nx[k] = or[i].nx[j];
 | 
			
		||||
					k++;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* Zero remaining ranges if any. */
 | 
			
		||||
		for (i = k; i < OVERLAY_MAX_RANGES; i++) {
 | 
			
		||||
			r->px[i] = 0;
 | 
			
		||||
			r->nx[i] = 0;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	server_client_overlay_range(pd->px, pd->py, pd->sx, pd->sy, px, py, nx,
 | 
			
		||||
	    r);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user