Merge branch 'obsd-master'

This commit is contained in:
Thomas Adam 2015-12-15 02:01:14 +00:00
commit 1a33ea9671
7 changed files with 119 additions and 103 deletions

View File

@ -248,7 +248,11 @@ cmd_find_current_session_with_client(struct cmd_find_state *fs)
{ {
struct window_pane *wp; struct window_pane *wp;
/* If this is running in a pane, that's great. */ /*
* If this is running in a pane, we can use that to limit the list of
* sessions to those containing that pane (we still use the current
* window in the best session).
*/
if (fs->cmdq->client->tty.path != NULL) { if (fs->cmdq->client->tty.path != NULL) {
RB_FOREACH(wp, window_pane_tree, &all_window_panes) { RB_FOREACH(wp, window_pane_tree, &all_window_panes) {
if (strcmp(wp->tty, fs->cmdq->client->tty.path) == 0) if (strcmp(wp->tty, fs->cmdq->client->tty.path) == 0)
@ -261,11 +265,8 @@ cmd_find_current_session_with_client(struct cmd_find_state *fs)
if (wp == NULL) if (wp == NULL)
goto unknown_pane; goto unknown_pane;
/* We now know the window and pane. */ /* Find the best session and winlink containing this pane. */
fs->w = wp->window; fs->w = wp->window;
fs->wp = wp;
/* Find the best session and winlink. */
if (cmd_find_best_session_with_window(fs) != 0) { if (cmd_find_best_session_with_window(fs) != 0) {
if (wp != NULL) { if (wp != NULL) {
/* /*
@ -277,6 +278,13 @@ cmd_find_current_session_with_client(struct cmd_find_state *fs)
} }
return (-1); return (-1);
} }
/* Use the current window and pane from this session. */
fs->wl = fs->s->curw;
fs->idx = fs->wl->idx;
fs->w = fs->wl->window;
fs->wp = fs->w->active;
return (0); return (0);
unknown_pane: unknown_pane:
@ -289,6 +297,7 @@ unknown_pane:
fs->idx = fs->wl->idx; fs->idx = fs->wl->idx;
fs->w = fs->wl->window; fs->w = fs->wl->window;
fs->wp = fs->w->active; fs->wp = fs->w->active;
return (0); return (0);
} }
@ -791,6 +800,67 @@ cmd_find_clear_state(struct cmd_find_state *fs, struct cmd_q *cmdq, int flags)
fs->idx = -1; fs->idx = -1;
} }
/* Check if a state if valid. */
int
cmd_find_valid_state(struct cmd_find_state *fs)
{
struct winlink *wl;
if (fs->s == NULL || fs->wl == NULL || fs->w == NULL || fs->wp == NULL)
return (0);
if (!session_alive(fs->s))
return (0);
RB_FOREACH(wl, winlinks, &fs->s->windows) {
if (wl->window == fs->w && wl == fs->wl)
break;
}
if (wl == NULL)
return (0);
if (fs->w != fs->wl->window)
return (0);
if (!window_has_pane(fs->w, fs->wp))
return (0);
return (window_pane_visible(fs->wp));
}
/* Copy a state. */
void
cmd_find_copy_state(struct cmd_find_state *dst, struct cmd_find_state *src)
{
dst->s = src->s;
dst->wl = src->wl;
dst->idx = dst->wl->idx;
dst->w = dst->wl->window;
dst->wp = src->wp;
}
/* Log the result. */
void
cmd_find_log_state(const char *prefix, struct cmd_find_state *fs)
{
if (fs->s != NULL)
log_debug("%s: s=$%u", prefix, fs->s->id);
else
log_debug("%s: s=none", prefix);
if (fs->wl != NULL) {
log_debug("%s: wl=%u %d w=@%u %s", prefix, fs->wl->idx,
fs->wl->window == fs->w, fs->w->id, fs->w->name);
} else
log_debug("%s: wl=none", prefix);
if (fs->wp != NULL)
log_debug("%s: wp=%%%u", prefix, fs->wp->id);
else
log_debug("%s: wp=none", prefix);
if (fs->idx != -1)
log_debug("%s: idx=%d", prefix, fs->idx);
else
log_debug("%s: idx=none", prefix);
}
/* /*
* Split target into pieces and resolve for the given type. Fills in the given * Split target into pieces and resolve for the given type. Fills in the given
* state. Returns 0 on success or -1 on error. * state. Returns 0 on success or -1 on error.
@ -811,24 +881,22 @@ cmd_find_target(struct cmd_find_state *fs, struct cmd_q *cmdq,
log_debug("%s: target %s, type %d", __func__, target, type); log_debug("%s: target %s, type %d", __func__, target, type);
log_debug("%s: cmdq %p, flags %#x", __func__, cmdq, flags); log_debug("%s: cmdq %p, flags %#x", __func__, cmdq, flags);
/* Find current state. */
cmd_find_clear_state(&current, cmdq, flags);
if (server_check_marked() && (flags & CMD_FIND_DEFAULT_MARKED)) {
current.s = marked_session;
current.wl = marked_winlink;
current.idx = current.wl->idx;
current.w = current.wl->window;
current.wp = marked_window_pane;
}
if (current.s == NULL && cmd_find_current_session(&current) != 0) {
if (~flags & CMD_FIND_QUIET)
cmdq_error(cmdq, "no current session");
goto error;
}
/* Clear new state. */ /* Clear new state. */
cmd_find_clear_state(fs, cmdq, flags); cmd_find_clear_state(fs, cmdq, flags);
fs->current = &current;
/* Find current state. */
fs->current = NULL;
if (server_check_marked() && (flags & CMD_FIND_DEFAULT_MARKED))
fs->current = &marked_pane;
if (fs->current == NULL) {
cmd_find_clear_state(&current, cmdq, flags);
if (cmd_find_current_session(&current) != 0) {
if (~flags & CMD_FIND_QUIET)
cmdq_error(cmdq, "no current session");
goto error;
}
fs->current = &current;
}
/* An empty or NULL target is the current. */ /* An empty or NULL target is the current. */
if (target == NULL || *target == '\0') if (target == NULL || *target == '\0')
@ -867,11 +935,7 @@ cmd_find_target(struct cmd_find_state *fs, struct cmd_q *cmdq,
cmdq_error(cmdq, "no marked target"); cmdq_error(cmdq, "no marked target");
goto error; goto error;
} }
fs->s = marked_session; cmd_find_copy_state(fs, &marked_pane);
fs->wl = marked_winlink;
fs->idx = fs->wl->idx;
fs->w = fs->wl->window;
fs->wp = marked_window_pane;
goto found; goto found;
} }
@ -1032,9 +1096,9 @@ cmd_find_target(struct cmd_find_state *fs, struct cmd_q *cmdq,
current: current:
/* Use the current session. */ /* Use the current session. */
cmd_find_copy_state(fs, fs->current);
if (flags & CMD_FIND_WINDOW_INDEX) if (flags & CMD_FIND_WINDOW_INDEX)
current.idx = -1; fs->idx = -1;
memcpy(fs, &current, sizeof *fs);
goto found; goto found;
error: error:
@ -1067,29 +1131,6 @@ no_pane:
goto error; goto error;
} }
/* Log the result. */
void
cmd_find_log_state(const char *prefix, struct cmd_find_state *fs)
{
if (fs->s != NULL)
log_debug("%s: s=$%u", prefix, fs->s->id);
else
log_debug("%s: s=none", prefix);
if (fs->wl != NULL) {
log_debug("%s: wl=%u %d w=@%u %s", prefix, fs->wl->idx,
fs->wl->window == fs->w, fs->w->id, fs->w->name);
} else
log_debug("%s: wl=none", prefix);
if (fs->wp != NULL)
log_debug("%s: wp=%%%u", prefix, fs->wp->id);
else
log_debug("%s: wp=none", prefix);
if (fs->idx != -1)
log_debug("%s: idx=%d", prefix, fs->idx);
else
log_debug("%s: idx=none", prefix);
}
/* Find the target client or report an error and return NULL. */ /* Find the target client or report an error and return NULL. */
struct client * struct client *
cmd_find_client(struct cmd_q *cmdq, const char *target, int quiet) cmd_find_client(struct cmd_q *cmdq, const char *target, int quiet)

View File

@ -39,7 +39,7 @@ const struct cmd_entry cmd_list_keys_entry = {
.args = { "t:T:", 0, 0 }, .args = { "t:T:", 0, 0 },
.usage = "[-t mode-table] [-T key-table]", .usage = "[-t mode-table] [-T key-table]",
.flags = 0, .flags = CMD_STARTSERVER,
.exec = cmd_list_keys_exec .exec = cmd_list_keys_exec
}; };
@ -50,7 +50,7 @@ const struct cmd_entry cmd_list_commands_entry = {
.args = { "", 0, 0 }, .args = { "", 0, 0 },
.usage = "", .usage = "",
.flags = 0, .flags = CMD_STARTSERVER,
.exec = cmd_list_keys_exec .exec = cmd_list_keys_exec
}; };

View File

@ -94,13 +94,13 @@ cmd_select_pane_exec(struct cmd *self, struct cmd_q *cmdq)
if (args_has(args, 'm') || args_has(args, 'M')) { if (args_has(args, 'm') || args_has(args, 'M')) {
if (args_has(args, 'm') && !window_pane_visible(wp)) if (args_has(args, 'm') && !window_pane_visible(wp))
return (CMD_RETURN_NORMAL); return (CMD_RETURN_NORMAL);
lastwp = marked_window_pane; lastwp = marked_pane.wp;
if (args_has(args, 'M') || server_is_marked(s, wl, wp)) if (args_has(args, 'M') || server_is_marked(s, wl, wp))
server_clear_marked(); server_clear_marked();
else else
server_set_marked(s, wl, wp); server_set_marked(s, wl, wp);
markedwp = marked_window_pane; markedwp = marked_pane.wp;
if (lastwp != NULL) { if (lastwp != NULL) {
server_redraw_window_borders(lastwp->window); server_redraw_window_borders(lastwp->window);

View File

@ -331,9 +331,9 @@ screen_redraw_draw_borders(struct client *c, int status, u_int top)
continue; continue;
active = screen_redraw_check_is(i, j, type, w, active = screen_redraw_check_is(i, j, type, w,
w->active, wp); w->active, wp);
if (server_is_marked(s, s->curw, marked_window_pane) && if (server_is_marked(s, s->curw, marked_pane.wp) &&
screen_redraw_check_is(i, j, type, w, screen_redraw_check_is(i, j, type, w,
marked_window_pane, wp)) { marked_pane.wp, wp)) {
if (active) if (active)
tty_attributes(tty, &m_active_gc, NULL); tty_attributes(tty, &m_active_gc, NULL);
else else

View File

@ -40,18 +40,14 @@
* Main server functions. * Main server functions.
*/ */
struct clients clients; struct clients clients;
struct tmuxproc *server_proc; struct tmuxproc *server_proc;
int server_fd; int server_fd;
int server_exit; int server_exit;
struct event server_ev_accept; struct event server_ev_accept;
struct session *marked_session; struct cmd_find_state marked_pane;
struct winlink *marked_winlink;
struct window *marked_window;
struct window_pane *marked_window_pane;
struct layout_cell *marked_layout_cell;
int server_create_socket(void); int server_create_socket(void);
int server_loop(void); int server_loop(void);
@ -67,22 +63,18 @@ void server_child_stopped(pid_t, int);
void void
server_set_marked(struct session *s, struct winlink *wl, struct window_pane *wp) server_set_marked(struct session *s, struct winlink *wl, struct window_pane *wp)
{ {
marked_session = s; cmd_find_clear_state(&marked_pane, NULL, 0);
marked_winlink = wl; marked_pane.s = s;
marked_window = wl->window; marked_pane.wl = wl;
marked_window_pane = wp; marked_pane.w = wl->window;
marked_layout_cell = wp->layout_cell; marked_pane.wp = wp;
} }
/* Clear marked pane. */ /* Clear marked pane. */
void void
server_clear_marked(void) server_clear_marked(void)
{ {
marked_session = NULL; cmd_find_clear_state(&marked_pane, NULL, 0);
marked_winlink = NULL;
marked_window = NULL;
marked_window_pane = NULL;
marked_layout_cell = NULL;
} }
/* Is this the marked pane? */ /* Is this the marked pane? */
@ -91,9 +83,9 @@ server_is_marked(struct session *s, struct winlink *wl, struct window_pane *wp)
{ {
if (s == NULL || wl == NULL || wp == NULL) if (s == NULL || wl == NULL || wp == NULL)
return (0); return (0);
if (marked_session != s || marked_winlink != wl) if (marked_pane.s != s || marked_pane.wl != wl)
return (0); return (0);
if (marked_window_pane != wp) if (marked_pane.wp != wp)
return (0); return (0);
return (server_check_marked()); return (server_check_marked());
} }
@ -102,25 +94,7 @@ server_is_marked(struct session *s, struct winlink *wl, struct window_pane *wp)
int int
server_check_marked(void) server_check_marked(void)
{ {
struct winlink *wl; return (cmd_find_valid_state(&marked_pane));
if (marked_window_pane == NULL)
return (0);
if (marked_layout_cell != marked_window_pane->layout_cell)
return (0);
if (!session_alive(marked_session))
return (0);
RB_FOREACH(wl, winlinks, &marked_session->windows) {
if (wl->window == marked_window && wl == marked_winlink)
break;
}
if (wl == NULL)
return (0);
if (!window_has_pane(marked_window, marked_window_pane))
return (0);
return (window_pane_visible(marked_window_pane));
} }
/* Create server socket. */ /* Create server socket. */

7
tmux.h
View File

@ -1768,6 +1768,9 @@ int cmd_find_target(struct cmd_find_state *, struct cmd_q *,
struct client *cmd_find_client(struct cmd_q *, const char *, int); struct client *cmd_find_client(struct cmd_q *, const char *, int);
void cmd_find_clear_state(struct cmd_find_state *, struct cmd_q *, void cmd_find_clear_state(struct cmd_find_state *, struct cmd_q *,
int); int);
int cmd_find_valid_state(struct cmd_find_state *);
void cmd_find_copy_state(struct cmd_find_state *,
struct cmd_find_state *);
void cmd_find_log_state(const char *, struct cmd_find_state *); void cmd_find_log_state(const char *, struct cmd_find_state *);
/* cmd.c */ /* cmd.c */
@ -1846,9 +1849,7 @@ void alerts_check_session(struct session *);
/* server.c */ /* server.c */
extern struct tmuxproc *server_proc; extern struct tmuxproc *server_proc;
extern struct clients clients; extern struct clients clients;
extern struct session *marked_session; extern struct cmd_find_state marked_pane;
extern struct winlink *marked_winlink;
extern struct window_pane *marked_window_pane;
void server_set_marked(struct session *, struct winlink *, void server_set_marked(struct session *, struct winlink *,
struct window_pane *); struct window_pane *);
void server_clear_marked(void); void server_clear_marked(void);

View File

@ -567,7 +567,7 @@ window_add_pane(struct window *w, u_int hlimit)
void void
window_lost_pane(struct window *w, struct window_pane *wp) window_lost_pane(struct window *w, struct window_pane *wp)
{ {
if (wp == marked_window_pane) if (wp == marked_pane.wp)
server_clear_marked(); server_clear_marked();
if (wp == w->active) { if (wp == w->active) {
@ -690,7 +690,7 @@ window_printable_flags(struct session *s, struct winlink *wl)
flags[pos++] = '*'; flags[pos++] = '*';
if (wl == TAILQ_FIRST(&s->lastw)) if (wl == TAILQ_FIRST(&s->lastw))
flags[pos++] = '-'; flags[pos++] = '-';
if (server_check_marked() && wl == marked_winlink) if (server_check_marked() && wl == marked_pane.wl)
flags[pos++] = 'M'; flags[pos++] = 'M';
if (wl->window->flags & WINDOW_ZOOMED) if (wl->window->flags & WINDOW_ZOOMED)
flags[pos++] = 'Z'; flags[pos++] = 'Z';