mirror of
https://github.com/tmux/tmux.git
synced 2025-03-22 12:58:48 +00:00
Make the marked pane a cmd_find_state.
This commit is contained in:
parent
d5999f8b5c
commit
12da13c9d1
109
cmd-find.c
109
cmd-find.c
@ -792,6 +792,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.
|
||||||
@ -814,17 +875,14 @@ cmd_find_target(struct cmd_find_state *fs, struct cmd_q *cmdq,
|
|||||||
|
|
||||||
/* Find current state. */
|
/* Find current state. */
|
||||||
cmd_find_clear_state(¤t, cmdq, flags);
|
cmd_find_clear_state(¤t, cmdq, flags);
|
||||||
if (server_check_marked() && (flags & CMD_FIND_DEFAULT_MARKED)) {
|
if (server_check_marked() && (flags & CMD_FIND_DEFAULT_MARKED))
|
||||||
current.s = marked_session;
|
cmd_find_copy_state(¤t, &marked_pane);
|
||||||
current.wl = marked_winlink;
|
else {
|
||||||
current.idx = current.wl->idx;
|
if (cmd_find_current_session(¤t) != 0) {
|
||||||
current.w = current.wl->window;
|
if (~flags & CMD_FIND_QUIET)
|
||||||
current.wp = marked_window_pane;
|
cmdq_error(cmdq, "no current session");
|
||||||
}
|
goto error;
|
||||||
if (current.s == NULL && cmd_find_current_session(¤t) != 0) {
|
}
|
||||||
if (~flags & CMD_FIND_QUIET)
|
|
||||||
cmdq_error(cmdq, "no current session");
|
|
||||||
goto error;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clear new state. */
|
/* Clear new state. */
|
||||||
@ -868,11 +926,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1068,29 +1122,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)
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
56
server.c
56
server.c
@ -41,18 +41,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);
|
||||||
@ -68,22 +64,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? */
|
||||||
@ -92,9 +84,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());
|
||||||
}
|
}
|
||||||
@ -103,25 +95,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
7
tmux.h
@ -1766,6 +1766,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 */
|
||||||
@ -1844,9 +1847,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);
|
||||||
|
4
window.c
4
window.c
@ -568,7 +568,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) {
|
||||||
@ -691,7 +691,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';
|
||||||
|
Loading…
Reference in New Issue
Block a user