diff options
author | Nicholas Marriott <nicm@cvs.openbsd.org> | 2009-09-20 17:27:19 +0000 |
---|---|---|
committer | Nicholas Marriott <nicm@cvs.openbsd.org> | 2009-09-20 17:27:19 +0000 |
commit | e185d96b67da57e91f8dd5ddd4fcdd07b40d107c (patch) | |
tree | 4d86360e97bb9a9ca968041c2814570b6529aef4 | |
parent | 28685deadaee80d11edf63ab705a896433e4f3c5 (diff) |
Move some common and untidy code for window link/unlink into generic functions
instead of duplicating it in move/link window..
-rw-r--r-- | usr.bin/tmux/cmd-kill-pane.c | 3 | ||||
-rw-r--r-- | usr.bin/tmux/cmd-kill-window.c | 3 | ||||
-rw-r--r-- | usr.bin/tmux/cmd-link-window.c | 48 | ||||
-rw-r--r-- | usr.bin/tmux/cmd-move-window.c | 63 | ||||
-rw-r--r-- | usr.bin/tmux/cmd-unlink-window.c | 14 | ||||
-rw-r--r-- | usr.bin/tmux/server-fn.c | 56 | ||||
-rw-r--r-- | usr.bin/tmux/tmux.h | 5 |
7 files changed, 81 insertions, 111 deletions
diff --git a/usr.bin/tmux/cmd-kill-pane.c b/usr.bin/tmux/cmd-kill-pane.c index cda85b40e2e..35cadea7acb 100644 --- a/usr.bin/tmux/cmd-kill-pane.c +++ b/usr.bin/tmux/cmd-kill-pane.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cmd-kill-pane.c,v 1.6 2009/07/30 13:45:56 nicm Exp $ */ +/* $OpenBSD: cmd-kill-pane.c,v 1.7 2009/09/20 17:27:18 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> @@ -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/usr.bin/tmux/cmd-kill-window.c b/usr.bin/tmux/cmd-kill-window.c index c6b7576f55a..e54f6161133 100644 --- a/usr.bin/tmux/cmd-kill-window.c +++ b/usr.bin/tmux/cmd-kill-window.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cmd-kill-window.c,v 1.5 2009/07/26 12:58:44 nicm Exp $ */ +/* $OpenBSD: cmd-kill-window.c,v 1.6 2009/09/20 17:27:18 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -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/usr.bin/tmux/cmd-link-window.c b/usr.bin/tmux/cmd-link-window.c index 67f10605824..39914a3f234 100644 --- a/usr.bin/tmux/cmd-link-window.c +++ b/usr.bin/tmux/cmd-link-window.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cmd-link-window.c,v 1.5 2009/08/13 20:11:58 nicm Exp $ */ +/* $OpenBSD: cmd-link-window.c,v 1.6 2009/09/20 17:27:18 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -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/usr.bin/tmux/cmd-move-window.c b/usr.bin/tmux/cmd-move-window.c index c4e6cf3ea57..360b8b883d5 100644 --- a/usr.bin/tmux/cmd-move-window.c +++ b/usr.bin/tmux/cmd-move-window.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cmd-move-window.c,v 1.5 2009/08/13 20:11:58 nicm Exp $ */ +/* $OpenBSD: cmd-move-window.c,v 1.6 2009/09/20 17:27:18 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net> @@ -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/usr.bin/tmux/cmd-unlink-window.c b/usr.bin/tmux/cmd-unlink-window.c index ee21d121648..831caa7db8e 100644 --- a/usr.bin/tmux/cmd-unlink-window.c +++ b/usr.bin/tmux/cmd-unlink-window.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cmd-unlink-window.c,v 1.4 2009/07/26 12:58:44 nicm Exp $ */ +/* $OpenBSD: cmd-unlink-window.c,v 1.5 2009/09/20 17:27:18 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -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/usr.bin/tmux/server-fn.c b/usr.bin/tmux/server-fn.c index 8a811020b95..8121c84e47a 100644 --- a/usr.bin/tmux/server-fn.c +++ b/usr.bin/tmux/server-fn.c @@ -1,4 +1,4 @@ -/* $OpenBSD: server-fn.c,v 1.20 2009/09/20 14:58:12 nicm Exp $ */ +/* $OpenBSD: server-fn.c,v 1.21 2009/09/20 17:27:18 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -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/usr.bin/tmux/tmux.h b/usr.bin/tmux/tmux.h index 752b43f8727..324dcc17a2c 100644 --- a/usr.bin/tmux/tmux.h +++ b/usr.bin/tmux/tmux.h @@ -1,4 +1,4 @@ -/* $OpenBSD: tmux.h,v 1.105 2009/09/16 12:35:04 nicm Exp $ */ +/* $OpenBSD: tmux.h,v 1.106 2009/09/20 17:27:18 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -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 *); |