mirror of
				https://github.com/tmux/tmux.git
				synced 2025-10-26 12:27:15 +00:00 
			
		
		
		
	Merge branch 'obsd-master'
This commit is contained in:
		
							
								
								
									
										73
									
								
								cmd-find.c
									
									
									
									
									
								
							
							
						
						
									
										73
									
								
								cmd-find.c
									
									
									
									
									
								
							| @@ -75,38 +75,12 @@ static const char *cmd_find_pane_table[][2] = { | |||||||
| 	{ NULL, NULL } | 	{ NULL, NULL } | ||||||
| }; | }; | ||||||
|  |  | ||||||
| /* Get session from TMUX if present. */ |  | ||||||
| static struct session * |  | ||||||
| cmd_find_try_TMUX(struct client *c) |  | ||||||
| { |  | ||||||
| 	struct environ_entry	*envent; |  | ||||||
| 	char			 tmp[256]; |  | ||||||
| 	long long		 pid; |  | ||||||
| 	u_int			 session; |  | ||||||
| 	struct session		*s; |  | ||||||
|  |  | ||||||
| 	envent = environ_find(c->environ, "TMUX"); |  | ||||||
| 	if (envent == NULL) |  | ||||||
| 		return (NULL); |  | ||||||
|  |  | ||||||
| 	if (sscanf(envent->value, "%255[^,],%lld,%d", tmp, &pid, &session) != 3) |  | ||||||
| 		return (NULL); |  | ||||||
| 	if (pid != getpid()) |  | ||||||
| 		return (NULL); |  | ||||||
| 	log_debug("%s: client %p TMUX %s (session $%u)", __func__, c, |  | ||||||
| 	    envent->value, session); |  | ||||||
|  |  | ||||||
| 	s = session_find_by_id(session); |  | ||||||
| 	if (s != NULL) |  | ||||||
| 		log_debug("%s: session $%u still exists", __func__, s->id); |  | ||||||
| 	return (s); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /* Find pane containing client if any. */ | /* Find pane containing client if any. */ | ||||||
| static struct window_pane * | static struct window_pane * | ||||||
| cmd_find_inside_pane(struct client *c) | cmd_find_inside_pane(struct client *c) | ||||||
| { | { | ||||||
| 	struct window_pane	*wp; | 	struct window_pane	*wp; | ||||||
|  | 	struct environ_entry	*envent; | ||||||
|  |  | ||||||
| 	if (c == NULL) | 	if (c == NULL) | ||||||
| 		return (NULL); | 		return (NULL); | ||||||
| @@ -115,6 +89,11 @@ cmd_find_inside_pane(struct client *c) | |||||||
| 		if (wp->fd != -1 && strcmp(wp->tty, c->ttyname) == 0) | 		if (wp->fd != -1 && strcmp(wp->tty, c->ttyname) == 0) | ||||||
| 			break; | 			break; | ||||||
| 	} | 	} | ||||||
|  | 	if (wp == NULL) { | ||||||
|  | 		envent = environ_find(c->environ, "TMUX_PANE"); | ||||||
|  | 		if (envent != NULL) | ||||||
|  | 			wp = window_pane_find_by_id_str(envent->value); | ||||||
|  | 	} | ||||||
| 	if (wp != NULL) | 	if (wp != NULL) | ||||||
| 		log_debug("%s: got pane %%%u (%s)", __func__, wp->id, wp->tty); | 		log_debug("%s: got pane %%%u (%s)", __func__, wp->id, wp->tty); | ||||||
| 	return (wp); | 	return (wp); | ||||||
| @@ -879,8 +858,6 @@ cmd_find_from_mouse(struct cmd_find_state *fs, struct mouse_event *m, int flags) | |||||||
| int | int | ||||||
| cmd_find_from_client(struct cmd_find_state *fs, struct client *c, int flags) | cmd_find_from_client(struct cmd_find_state *fs, struct client *c, int flags) | ||||||
| { | { | ||||||
| 	struct session		*s; |  | ||||||
| 	struct winlink		*wl; |  | ||||||
| 	struct window_pane	*wp; | 	struct window_pane	*wp; | ||||||
|  |  | ||||||
| 	/* If no client, treat as from nothing. */ | 	/* If no client, treat as from nothing. */ | ||||||
| @@ -902,30 +879,6 @@ cmd_find_from_client(struct cmd_find_state *fs, struct client *c, int flags) | |||||||
| 	if (wp == NULL) | 	if (wp == NULL) | ||||||
| 		goto unknown_pane; | 		goto unknown_pane; | ||||||
|  |  | ||||||
| 	/* If we have a session in TMUX, see if it has this pane. */ |  | ||||||
| 	s = cmd_find_try_TMUX(c); |  | ||||||
| 	if (s != NULL) { |  | ||||||
| 		RB_FOREACH(wl, winlinks, &s->windows) { |  | ||||||
| 			if (window_has_pane(wl->window, wp)) |  | ||||||
| 				break; |  | ||||||
| 		} |  | ||||||
| 		if (wl != NULL) { |  | ||||||
| 			log_debug("%s: session $%u has pane %%%u", __func__, |  | ||||||
| 			    s->id, wp->id); |  | ||||||
|  |  | ||||||
| 			fs->s = s; |  | ||||||
| 			fs->wl = s->curw; /* use current session */ |  | ||||||
| 			fs->w = fs->wl->window; |  | ||||||
| 			fs->wp = fs->w->active; /* use active pane */ |  | ||||||
|  |  | ||||||
| 			cmd_find_log_state(__func__, fs); |  | ||||||
| 			return (0); |  | ||||||
| 		} else { |  | ||||||
| 			log_debug("%s: session $%u does not have pane %%%u", |  | ||||||
| 			    __func__, s->id, wp->id); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/* | 	/* | ||||||
| 	 * Don't have a session, or it doesn't have this pane. Try all | 	 * Don't have a session, or it doesn't have this pane. Try all | ||||||
| 	 * sessions. | 	 * sessions. | ||||||
| @@ -947,17 +900,7 @@ cmd_find_from_client(struct cmd_find_state *fs, struct client *c, int flags) | |||||||
| 	return (0); | 	return (0); | ||||||
|  |  | ||||||
| unknown_pane: | unknown_pane: | ||||||
| 	/* | 	/* We can't find the pane so need to guess. */ | ||||||
| 	 * We're not running in a known pane, but maybe this client has TMUX |  | ||||||
| 	 * in the environment. That'd give us a session. |  | ||||||
| 	 */ |  | ||||||
| 	s = cmd_find_try_TMUX(c); |  | ||||||
| 	if (s != NULL) { |  | ||||||
| 		cmd_find_from_session(fs, s, flags); |  | ||||||
| 		return (0); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/* Otherwise we need to guess. */ |  | ||||||
| 	return (cmd_find_from_nothing(fs, flags)); | 	return (cmd_find_from_nothing(fs, flags)); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -1005,6 +948,8 @@ cmd_find_target(struct cmd_find_state *fs, struct cmdq_item *item, | |||||||
| 		strlcat(tmp, "CANFAIL,", sizeof tmp); | 		strlcat(tmp, "CANFAIL,", sizeof tmp); | ||||||
| 	if (*tmp != '\0') | 	if (*tmp != '\0') | ||||||
| 		tmp[strlen(tmp) - 1] = '\0'; | 		tmp[strlen(tmp) - 1] = '\0'; | ||||||
|  | 	else | ||||||
|  | 		strlcat(tmp, "NONE", sizeof tmp); | ||||||
| 	log_debug("%s: target %s, type %s, item %p, flags %s", __func__, | 	log_debug("%s: target %s, type %s, item %p, flags %s", __func__, | ||||||
| 	    target == NULL ? "none" : target, s, item, tmp); | 	    target == NULL ? "none" : target, s, item, tmp); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -67,10 +67,11 @@ cmd_if_shell_exec(struct cmd *self, struct cmdq_item *item) | |||||||
| 	struct cmd_if_shell_data	*cdata; | 	struct cmd_if_shell_data	*cdata; | ||||||
| 	char				*shellcmd, *cmd; | 	char				*shellcmd, *cmd; | ||||||
| 	struct cmdq_item		*new_item; | 	struct cmdq_item		*new_item; | ||||||
|  | 	struct cmd_find_state		*fs = &item->target; | ||||||
| 	struct client			*c = cmd_find_client(item, NULL, 1); | 	struct client			*c = cmd_find_client(item, NULL, 1); | ||||||
| 	struct session			*s = item->target.s; | 	struct session			*s = fs->s; | ||||||
| 	struct winlink			*wl = item->target.wl; | 	struct winlink			*wl = fs->wl; | ||||||
| 	struct window_pane		*wp = item->target.wp; | 	struct window_pane		*wp = fs->wp; | ||||||
| 	struct cmd_parse_input		 pi; | 	struct cmd_parse_input		 pi; | ||||||
| 	struct cmd_parse_result		*pr; | 	struct cmd_parse_result		*pr; | ||||||
|  |  | ||||||
| @@ -92,7 +93,7 @@ cmd_if_shell_exec(struct cmd *self, struct cmdq_item *item) | |||||||
| 		pi.line = self->line; | 		pi.line = self->line; | ||||||
| 		pi.item = item; | 		pi.item = item; | ||||||
| 		pi.c = c; | 		pi.c = c; | ||||||
| 		cmd_find_copy_state(&pi.fs, &item->target); | 		cmd_find_copy_state(&pi.fs, fs); | ||||||
|  |  | ||||||
| 		pr = cmd_parse_from_string(cmd, &pi); | 		pr = cmd_parse_from_string(cmd, &pi); | ||||||
| 		switch (pr->status) { | 		switch (pr->status) { | ||||||
| @@ -103,7 +104,7 @@ cmd_if_shell_exec(struct cmd *self, struct cmdq_item *item) | |||||||
| 			free(pr->error); | 			free(pr->error); | ||||||
| 			return (CMD_RETURN_ERROR); | 			return (CMD_RETURN_ERROR); | ||||||
| 		case CMD_PARSE_SUCCESS: | 		case CMD_PARSE_SUCCESS: | ||||||
| 			new_item = cmdq_get_command(pr->cmdlist, NULL, m, 0); | 			new_item = cmdq_get_command(pr->cmdlist, fs, m, 0); | ||||||
| 			cmdq_insert_after(item, new_item); | 			cmdq_insert_after(item, new_item); | ||||||
| 			cmd_list_free(pr->cmdlist); | 			cmd_list_free(pr->cmdlist); | ||||||
| 			break; | 			break; | ||||||
| @@ -137,7 +138,7 @@ cmd_if_shell_exec(struct cmd *self, struct cmdq_item *item) | |||||||
| 	cdata->input.c = c; | 	cdata->input.c = c; | ||||||
| 	if (cdata->input.c != NULL) | 	if (cdata->input.c != NULL) | ||||||
| 		cdata->input.c->references++; | 		cdata->input.c->references++; | ||||||
| 	cmd_find_copy_state(&cdata->input.fs, &item->target); | 	cmd_find_copy_state(&cdata->input.fs, fs); | ||||||
|  |  | ||||||
| 	if (job_run(shellcmd, s, server_client_get_cwd(item->client, s), NULL, | 	if (job_run(shellcmd, s, server_client_get_cwd(item->client, s), NULL, | ||||||
| 	    cmd_if_shell_callback, cmd_if_shell_free, cdata, 0) == NULL) { | 	    cmd_if_shell_callback, cmd_if_shell_free, cdata, 0) == NULL) { | ||||||
|   | |||||||
| @@ -168,10 +168,7 @@ layout_parse(struct window *w, const char *layout) | |||||||
| 	/* Update pane offsets and sizes. */ | 	/* Update pane offsets and sizes. */ | ||||||
| 	layout_fix_offsets(lc); | 	layout_fix_offsets(lc); | ||||||
| 	layout_fix_panes(w); | 	layout_fix_panes(w); | ||||||
|  | 	recalculate_sizes(); | ||||||
| 	/* Then resize the layout back to the original window size. */ |  | ||||||
| 	layout_resize(w, sx, sy); |  | ||||||
| 	window_resize(w, sx, sy); |  | ||||||
|  |  | ||||||
| 	layout_print_cell(lc, __func__, 0); | 	layout_print_cell(lc, __func__, 0); | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Thomas Adam
					Thomas Adam