From 9b5f5ed8e8f74a9a615dfb6f5975b2f054d6d1fd Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Sun, 20 Sep 2009 17:27:18 +0000 Subject: [PATCH] Move some common and untidy code for window link/unlink into generic functions instead of duplicating it in move/link window.. --- cmd-kill-pane.c | 1 + cmd-kill-window.c | 1 + cmd-link-window.c | 46 ++++++---------------------------- cmd-move-window.c | 61 ++++++--------------------------------------- cmd-unlink-window.c | 12 +-------- server-fn.c | 54 ++++++++++++++++++++++++++++++++++++++- tmux.h | 3 +++ 7 files changed, 74 insertions(+), 104 deletions(-) diff --git a/cmd-kill-pane.c b/cmd-kill-pane.c index 1548a75e..38d0daef 100644 --- a/cmd-kill-pane.c +++ b/cmd-kill-pane.c @@ -52,6 +52,7 @@ cmd_kill_pane_exec(struct cmd *self, struct cmd_ctx *ctx) if (window_count_panes(wl->window) == 1) { /* Only one pane, kill the window. */ server_kill_window(wl->window); + recalculate_sizes(); return (0); } diff --git a/cmd-kill-window.c b/cmd-kill-window.c index ed15fb33..d213a90e 100644 --- a/cmd-kill-window.c +++ b/cmd-kill-window.c @@ -47,6 +47,7 @@ cmd_kill_window_exec(struct cmd *self, struct cmd_ctx *ctx) return (-1); server_kill_window(wl->window); + recalculate_sizes(); return (0); } diff --git a/cmd-link-window.c b/cmd-link-window.c index c13dbc90..cbc0b083 100644 --- a/cmd-link-window.c +++ b/cmd-link-window.c @@ -44,54 +44,22 @@ cmd_link_window_exec(struct cmd *self, struct cmd_ctx *ctx) { struct cmd_srcdst_data *data = self->data; struct session *dst; - struct winlink *wl_src, *wl_dst; + struct winlink *wl; char *cause; - int idx; + int idx, kflag, dflag; - if ((wl_src = cmd_find_window(ctx, data->src, NULL)) == NULL) + if ((wl = cmd_find_window(ctx, data->src, NULL)) == NULL) return (-1); if ((idx = cmd_find_index(ctx, data->dst, &dst)) == -2) return (-1); - wl_dst = NULL; - if (idx != -1) - wl_dst = winlink_find_by_index(&dst->windows, idx); - if (wl_dst != NULL) { - if (wl_dst->window == wl_src->window) - return (0); - - if (data->chflags & CMD_CHFLAG('k')) { - /* - * Can't use session_detach as it will destroy session - * if this makes it empty. - */ - session_alert_cancel(dst, wl_dst); - winlink_stack_remove(&dst->lastw, wl_dst); - winlink_remove(&dst->windows, wl_dst); - - /* Force select/redraw if current. */ - if (wl_dst == dst->curw) { - data->chflags &= ~CMD_CHFLAG('d'); - dst->curw = NULL; - } - } - } - - if (idx == -1) - idx = -1 - options_get_number(&dst->options, "base-index"); - wl_dst = session_attach(dst, wl_src->window, idx, &cause); - if (wl_dst == NULL) { - ctx->error(ctx, "create session failed: %s", cause); + kflag = data->chflags & CMD_CHFLAG('k'); + dflag = data->chflags & CMD_CHFLAG('d'); + if (server_link_window(wl, dst, idx, kflag, !dflag, &cause) != 0) { + ctx->error(ctx, "can't create session: %s", cause); xfree(cause); return (-1); } - - if (data->chflags & CMD_CHFLAG('d')) - server_status_session(dst); - else { - session_select(dst, wl_dst->idx); - server_redraw_session(dst); - } recalculate_sizes(); return (0); diff --git a/cmd-move-window.c b/cmd-move-window.c index 1cf72f94..de00f2dd 100644 --- a/cmd-move-window.c +++ b/cmd-move-window.c @@ -44,68 +44,23 @@ cmd_move_window_exec(struct cmd *self, struct cmd_ctx *ctx) { struct cmd_srcdst_data *data = self->data; struct session *src, *dst; - struct winlink *wl_src, *wl_dst; - struct client *c; - u_int i; - int destroyed, idx; + struct winlink *wl; char *cause; + int idx, kflag, dflag; - if ((wl_src = cmd_find_window(ctx, data->src, &src)) == NULL) + if ((wl = cmd_find_window(ctx, data->src, &src)) == NULL) return (-1); if ((idx = cmd_find_index(ctx, data->dst, &dst)) == -2) return (-1); - wl_dst = NULL; - if (idx != -1) - wl_dst = winlink_find_by_index(&dst->windows, idx); - if (wl_dst != NULL) { - if (wl_dst->window == wl_src->window) - return (0); - - if (data->chflags & CMD_CHFLAG('k')) { - /* - * Can't use session_detach as it will destroy session - * if this makes it empty. - */ - session_alert_cancel(dst, wl_dst); - winlink_stack_remove(&dst->lastw, wl_dst); - winlink_remove(&dst->windows, wl_dst); - - /* Force select/redraw if current. */ - if (wl_dst == dst->curw) { - data->chflags &= ~CMD_CHFLAG('d'); - dst->curw = NULL; - } - } - } - - if (idx == -1) - idx = -1 - options_get_number(&dst->options, "base-index"); - wl_dst = session_attach(dst, wl_src->window, idx, &cause); - if (wl_dst == NULL) { - ctx->error(ctx, "attach window failed: %s", cause); + kflag = data->chflags & CMD_CHFLAG('k'); + dflag = data->chflags & CMD_CHFLAG('d'); + if (server_link_window(wl, dst, idx, kflag, !dflag, &cause) != 0) { + ctx->error(ctx, "can't create session: %s", cause); xfree(cause); return (-1); } - - destroyed = session_detach(src, wl_src); - for (i = 0; i < ARRAY_LENGTH(&clients); i++) { - c = ARRAY_ITEM(&clients, i); - if (c == NULL || c->session != src) - continue; - if (destroyed) { - c->session = NULL; - server_write_client(c, MSG_EXIT, NULL, 0); - } else - server_redraw_client(c); - } - - if (data->chflags & CMD_CHFLAG('d')) - server_status_session(dst); - else { - session_select(dst, wl_dst->idx); - server_redraw_session(dst); - } + server_unlink_window(src, wl); recalculate_sizes(); return (0); diff --git a/cmd-unlink-window.c b/cmd-unlink-window.c index fd72b252..5c9f811b 100644 --- a/cmd-unlink-window.c +++ b/cmd-unlink-window.c @@ -55,17 +55,7 @@ cmd_unlink_window_exec(struct cmd *self, struct cmd_ctx *ctx) return (-1); } - destroyed = session_detach(s, wl); - for (i = 0; i < ARRAY_LENGTH(&clients); i++) { - c = ARRAY_ITEM(&clients, i); - if (c == NULL || c->session != s) - continue; - if (destroyed) { - c->session = NULL; - server_write_client(c, MSG_EXIT, NULL, 0); - } else - server_redraw_client(c); - } + server_unlink_window(s, wl); recalculate_sizes(); return (0); diff --git a/server-fn.c b/server-fn.c index 4bb2ed92..e3cee410 100644 --- a/server-fn.c +++ b/server-fn.c @@ -286,7 +286,59 @@ server_kill_window(struct window *w) else server_redraw_session(s); } - recalculate_sizes(); +} + +int +server_link_window( + struct winlink *srcwl, struct session *dst, int dstidx, + int killflag, int selectflag, char **cause) +{ + struct winlink *dstwl; + + dstwl = NULL; + if (dstidx != -1) + dstwl = winlink_find_by_index(&dst->windows, dstidx); + if (dstwl != NULL) { + if (dstwl->window == srcwl->window) + return (0); + if (killflag) { + /* + * Can't use session_detach as it will destroy session + * if this makes it empty. + */ + session_alert_cancel(dst, dstwl); + winlink_stack_remove(&dst->lastw, dstwl); + winlink_remove(&dst->windows, dstwl); + + /* Force select/redraw if current. */ + if (dstwl == dst->curw) + selectflag = 1; + } + } + + if (dstidx == -1) + dstidx = -1 - options_get_number(&dst->options, "base-index"); + dstwl = session_attach(dst, srcwl->window, dstidx, cause); + if (dstwl == NULL) + return (-1); + + if (!selectflag) + server_status_session(dst); + else { + session_select(dst, dstwl->idx); + server_redraw_session(dst); + } + + return (0); +} + +void +server_unlink_window(struct session *s, struct winlink *wl) +{ + if (session_detach(s, wl)) + server_destroy_session(s); + else + server_redraw_session(s); } void diff --git a/tmux.h b/tmux.h index 0c5d2686..c6d77b40 100644 --- a/tmux.h +++ b/tmux.h @@ -1456,6 +1456,9 @@ void server_status_window(struct window *); void server_lock(void); int server_unlock(const char *); void server_kill_window(struct window *); +int server_link_window( + struct winlink *, struct session *, int, int, int, char **); +void server_unlink_window(struct session *, struct winlink *); void server_destroy_session(struct session *); void server_set_identify(struct client *); void server_clear_identify(struct client *);