mirror of
				https://github.com/tmux/tmux.git
				synced 2025-10-26 12:27:15 +00:00 
			
		
		
		
	Add -B flag to remove border from popup.
This commit is contained in:
		| @@ -51,8 +51,8 @@ const struct cmd_entry cmd_display_popup_entry = { | ||||
| 	.name = "display-popup", | ||||
| 	.alias = "popup", | ||||
|  | ||||
| 	.args = { "Cc:d:Eh:t:w:x:y:", 0, -1 }, | ||||
| 	.usage = "[-CE] [-c target-client] [-d start-directory] [-h height] " | ||||
| 	.args = { "BCc:d:Eh:t:w:x:y:", 0, -1 }, | ||||
| 	.usage = "[-BCE] [-c target-client] [-d start-directory] [-h height] " | ||||
| 	         CMD_TARGET_PANE_USAGE " [-w width] " | ||||
| 	         "[-x position] [-y position] [command]", | ||||
|  | ||||
| @@ -391,6 +391,8 @@ cmd_display_popup_exec(struct cmd *self, struct cmdq_item *item) | ||||
| 		flags |= POPUP_CLOSEEXITZERO; | ||||
| 	else if (args_has(args, 'E')) | ||||
| 		flags |= POPUP_CLOSEEXIT; | ||||
| 	if (args_has(args, 'B')) | ||||
| 		flags |= POPUP_NOBORDER; | ||||
| 	if (popup_display(flags, item, px, py, w, h, shellcmd, argc, argv, cwd, | ||||
| 	    tc, s, NULL, NULL) != 0) | ||||
| 		return (CMD_RETURN_NORMAL); | ||||
|   | ||||
							
								
								
									
										63
									
								
								popup.c
									
									
									
									
									
								
							
							
						
						
									
										63
									
								
								popup.c
									
									
									
									
									
								
							| @@ -91,8 +91,13 @@ popup_set_client_cb(struct tty_ctx *ttyctx, struct client *c) | ||||
| 	ttyctx->wsx = c->tty.sx; | ||||
| 	ttyctx->wsy = c->tty.sy; | ||||
|  | ||||
| 	if (pd->flags & POPUP_NOBORDER) { | ||||
| 		ttyctx->xoff = ttyctx->rxoff = pd->px; | ||||
| 		ttyctx->yoff = ttyctx->ryoff = pd->py; | ||||
| 	} else { | ||||
| 		ttyctx->xoff = ttyctx->rxoff = pd->px + 1; | ||||
| 		ttyctx->yoff = ttyctx->ryoff = pd->py + 1; | ||||
| 	} | ||||
|  | ||||
| 	return (1); | ||||
| } | ||||
| @@ -113,8 +118,13 @@ popup_mode_cb(struct client *c, u_int *cx, u_int *cy) | ||||
| { | ||||
| 	struct popup_data	*pd = c->overlay_data; | ||||
|  | ||||
| 	if (pd->flags & POPUP_NOBORDER) { | ||||
| 		*cx = pd->px + pd->s.cx; | ||||
| 		*cy = pd->py + pd->s.cy; | ||||
| 	} else { | ||||
| 		*cx = pd->px + 1 + pd->s.cx; | ||||
| 		*cy = pd->py + 1 + pd->s.cy; | ||||
| 	} | ||||
| 	return (&pd->s); | ||||
| } | ||||
|  | ||||
| @@ -145,8 +155,10 @@ popup_draw_cb(struct client *c, __unused struct screen_redraw_ctx *ctx0) | ||||
| 	screen_write_start(&ctx, &s); | ||||
| 	screen_write_clearscreen(&ctx, 8); | ||||
|  | ||||
| 	/* Skip drawing popup if the terminal is too small. */ | ||||
| 	if (pd->sx > 2 && pd->sy > 2) { | ||||
| 	if (pd->flags & POPUP_NOBORDER) { | ||||
| 		screen_write_cursormove(&ctx, 0, 0, 0); | ||||
| 		screen_write_fast_copy(&ctx, &pd->s, 0, 0, pd->sx, pd->sy); | ||||
| 	} else if (pd->sx > 2 && pd->sy > 2) { | ||||
| 		screen_write_box(&ctx, pd->sx, pd->sy); | ||||
| 		screen_write_cursormove(&ctx, 1, 1, 0); | ||||
| 		screen_write_fast_copy(&ctx, &pd->s, 0, 0, pd->sx - 2, | ||||
| @@ -218,7 +230,11 @@ popup_resize_cb(struct client *c) | ||||
| 		pd->px = pd->ppx; | ||||
|  | ||||
| 	/* Avoid zero size screens. */ | ||||
| 	if (pd->sx > 2 && pd->sy > 2) { | ||||
| 	if (pd->flags & POPUP_NOBORDER) { | ||||
| 		screen_resize(&pd->s, pd->sx, pd->sy, 0); | ||||
| 		if (pd->job != NULL) | ||||
| 			job_resize(pd->job, pd->sx, pd->sy ); | ||||
| 	} else if (pd->sx > 2 && pd->sy > 2) { | ||||
| 		screen_resize(&pd->s, pd->sx - 2, pd->sy - 2, 0); | ||||
| 		if (pd->job != NULL) | ||||
| 			job_resize(pd->job, pd->sx - 2, pd->sy - 2); | ||||
| @@ -254,18 +270,31 @@ popup_handle_drag(struct client *c, struct popup_data *pd, | ||||
| 		pd->ppy = py; | ||||
| 		server_redraw_client(c); | ||||
| 	} else if (pd->dragging == SIZE) { | ||||
| 		if (pd->flags & POPUP_NOBORDER) { | ||||
| 			if (m->x < pd->px + 1) | ||||
| 				return; | ||||
| 			if (m->y < pd->py + 1) | ||||
| 				return; | ||||
| 		} else { | ||||
| 			if (m->x < pd->px + 3) | ||||
| 				return; | ||||
| 			if (m->y < pd->py + 3) | ||||
| 				return; | ||||
| 		} | ||||
| 		pd->sx = m->x - pd->px; | ||||
| 		pd->sy = m->y - pd->py; | ||||
| 		pd->psx = pd->sx; | ||||
| 		pd->psy = pd->sy; | ||||
|  | ||||
| 		if (pd->flags & POPUP_NOBORDER) { | ||||
| 			screen_resize(&pd->s, pd->sx, pd->sy, 0); | ||||
| 			if (pd->job != NULL) | ||||
| 				job_resize(pd->job, pd->sx, pd->sy); | ||||
| 		} else { | ||||
| 			screen_resize(&pd->s, pd->sx - 2, pd->sy - 2, 0); | ||||
| 			if (pd->job != NULL) | ||||
| 				job_resize(pd->job, pd->sx - 2, pd->sy - 2); | ||||
| 		} | ||||
| 		server_redraw_client(c); | ||||
| 	} | ||||
| } | ||||
| @@ -277,6 +306,7 @@ popup_key_cb(struct client *c, struct key_event *event) | ||||
| 	struct mouse_event	*m = &event->m; | ||||
| 	const char		*buf; | ||||
| 	size_t			 len; | ||||
| 	u_int			 px, py; | ||||
|  | ||||
| 	if (KEYC_IS_MOUSE(event->key)) { | ||||
| 		if (pd->dragging != OFF) { | ||||
| @@ -292,10 +322,11 @@ popup_key_cb(struct client *c, struct key_event *event) | ||||
| 			return (0); | ||||
| 		} | ||||
| 		if ((m->b & MOUSE_MASK_META) || | ||||
| 		    m->x == pd->px || | ||||
| 		    ((~pd->flags & POPUP_NOBORDER) && | ||||
| 		    (m->x == pd->px || | ||||
| 		    m->x == pd->px + pd->sx - 1 || | ||||
| 		    m->y == pd->py || | ||||
| 		    m->y == pd->py + pd->sy - 1) { | ||||
| 		    m->y == pd->py + pd->sy - 1))) { | ||||
| 			if (!MOUSE_DRAG(m->b)) | ||||
| 				goto out; | ||||
| 			if (MOUSE_BUTTONS(m->lb) == 0) | ||||
| @@ -315,8 +346,14 @@ popup_key_cb(struct client *c, struct key_event *event) | ||||
| 	if (pd->job != NULL) { | ||||
| 		if (KEYC_IS_MOUSE(event->key)) { | ||||
| 			/* Must be inside, checked already. */ | ||||
| 			if (!input_key_get_mouse(&pd->s, m, m->x - pd->px - 1, | ||||
| 			    m->y - pd->py - 1, &buf, &len)) | ||||
| 			if (pd->flags & POPUP_NOBORDER) { | ||||
| 				px = m->x - pd->px; | ||||
| 				py = m->y - pd->py; | ||||
| 			} else { | ||||
| 				px = m->x - pd->px - 1; | ||||
| 				py = m->y - pd->py - 1; | ||||
| 			} | ||||
| 			if (!input_key_get_mouse(&pd->s, m, px, py, &buf, &len)) | ||||
| 				return (0); | ||||
| 			bufferevent_write(job_get_event(pd->job), buf, len); | ||||
| 			return (0); | ||||
| @@ -378,9 +415,19 @@ popup_display(int flags, struct cmdq_item *item, u_int px, u_int py, u_int sx, | ||||
|     struct client *c, struct session *s, popup_close_cb cb, void *arg) | ||||
| { | ||||
| 	struct popup_data	*pd; | ||||
| 	u_int			 jx, jy; | ||||
|  | ||||
| 	if (flags & POPUP_NOBORDER) { | ||||
| 		if (sx < 1 || sy < 1) | ||||
| 			return (-1); | ||||
| 		jx = sx; | ||||
| 		jy = sy; | ||||
| 	} else { | ||||
| 		if (sx < 3 || sy < 3) | ||||
| 			return (-1); | ||||
| 		jx = sx - 2; | ||||
| 		jy = sy - 2; | ||||
| 	} | ||||
| 	if (c->tty.sx < sx || c->tty.sy < sy) | ||||
| 		return (-1); | ||||
|  | ||||
| @@ -411,7 +458,7 @@ popup_display(int flags, struct cmdq_item *item, u_int px, u_int py, u_int sx, | ||||
|  | ||||
| 	pd->job = job_run(shellcmd, argc, argv, s, cwd, | ||||
| 	    popup_job_update_cb, popup_job_complete_cb, NULL, pd, | ||||
| 	    JOB_NOWAIT|JOB_PTY|JOB_KEEPWRITE, pd->sx - 2, pd->sy - 2); | ||||
| 	    JOB_NOWAIT|JOB_PTY|JOB_KEEPWRITE, jx, jy); | ||||
| 	pd->ictx = input_init(NULL, job_get_event(pd->job), &pd->palette); | ||||
|  | ||||
| 	server_client_set_overlay(c, 0, popup_check_cb, popup_mode_cb, | ||||
|   | ||||
							
								
								
									
										4
									
								
								tmux.1
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								tmux.1
									
									
									
									
									
								
							| @@ -5677,7 +5677,7 @@ lists the format variables and their values. | ||||
| forwards any input read from stdin to the empty pane given by | ||||
| .Ar target-pane . | ||||
| .It Xo Ic display-popup | ||||
| .Op Fl CE | ||||
| .Op Fl BCE | ||||
| .Op Fl c Ar target-client | ||||
| .Op Fl d Ar start-directory | ||||
| .Op Fl h Ar height | ||||
| @@ -5717,6 +5717,8 @@ and | ||||
| give the width and height - both may be a percentage (followed by | ||||
| .Ql % ) . | ||||
| If omitted, half of the terminal size is used. | ||||
| .Fl B | ||||
| does not surround the popup by a border. | ||||
| .Pp | ||||
| The | ||||
| .Fl C | ||||
|   | ||||
							
								
								
									
										1
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								tmux.h
									
									
									
									
									
								
							| @@ -3025,6 +3025,7 @@ int		 menu_display(struct menu *, int, struct cmdq_item *, u_int, | ||||
| /* popup.c */ | ||||
| #define POPUP_CLOSEEXIT 0x1 | ||||
| #define POPUP_CLOSEEXITZERO 0x2 | ||||
| #define POPUP_NOBORDER 0x4 | ||||
| typedef void (*popup_close_cb)(int, void *); | ||||
| typedef void (*popup_finish_edit_cb)(char *, size_t, void *); | ||||
| int		 popup_display(int, struct cmdq_item *, u_int, u_int, u_int, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 nicm
					nicm