From 7335ef5792791e803b090fb9d54718604a0d7dab Mon Sep 17 00:00:00 2001 From: Tiago Cunha Date: Sun, 20 Sep 2009 22:15:32 +0000 Subject: [PATCH] Sync OpenBSD patchset 333: 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 | 3 ++- cmd-kill-window.c | 3 ++- cmd-link-window.c | 48 ++++++---------------------------- cmd-move-window.c | 63 +++++++-------------------------------------- cmd-unlink-window.c | 14 ++-------- server-fn.c | 56 ++++++++++++++++++++++++++++++++++++++-- tmux.h | 5 +++- 7 files changed, 81 insertions(+), 111 deletions(-) diff --git a/cmd-kill-pane.c b/cmd-kill-pane.c index 7ba8f6dd..4fc6cb5c 100644 --- a/cmd-kill-pane.c +++ b/cmd-kill-pane.c @@ -1,4 +1,4 @@ -/* $Id: cmd-kill-pane.c,v 1.12 2009-07-30 20:45:20 tcunha Exp $ */ +/* $Id: cmd-kill-pane.c,v 1.13 2009-09-20 22:15:32 tcunha Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott @@ -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 3a7bcc6d..e7ea472e 100644 --- a/cmd-kill-window.c +++ b/cmd-kill-window.c @@ -1,4 +1,4 @@ -/* $Id: cmd-kill-window.c,v 1.19 2009-07-28 22:12:16 tcunha Exp $ */ +/* $Id: cmd-kill-window.c,v 1.20 2009-09-20 22:15:32 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -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 7ab2a5d9..85106991 100644 --- a/cmd-link-window.c +++ b/cmd-link-window.c @@ -1,4 +1,4 @@ -/* $Id: cmd-link-window.c,v 1.32 2009-08-16 19:16:27 tcunha Exp $ */ +/* $Id: cmd-link-window.c,v 1.33 2009-09-20 22:15:32 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -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 941ffd57..de1f61f7 100644 --- a/cmd-move-window.c +++ b/cmd-move-window.c @@ -1,4 +1,4 @@ -/* $Id: cmd-move-window.c,v 1.9 2009-08-16 19:16:27 tcunha Exp $ */ +/* $Id: cmd-move-window.c,v 1.10 2009-09-20 22:15:32 tcunha Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott @@ -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 8903cb6c..ce3fa430 100644 --- a/cmd-unlink-window.c +++ b/cmd-unlink-window.c @@ -1,4 +1,4 @@ -/* $Id: cmd-unlink-window.c,v 1.16 2009-07-28 22:12:16 tcunha Exp $ */ +/* $Id: cmd-unlink-window.c,v 1.17 2009-09-20 22:15:32 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -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 0af2a16b..99c1d36d 100644 --- a/server-fn.c +++ b/server-fn.c @@ -1,4 +1,4 @@ -/* $Id: server-fn.c,v 1.88 2009-09-20 22:11:27 tcunha Exp $ */ +/* $Id: server-fn.c,v 1.89 2009-09-20 22:15:32 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -292,7 +292,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 cb9938bf..d7b324fe 100644 --- a/tmux.h +++ b/tmux.h @@ -1,4 +1,4 @@ -/* $Id: tmux.h,v 1.443 2009-09-16 12:36:27 nicm Exp $ */ +/* $Id: tmux.h,v 1.444 2009-09-20 22:15:32 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -1454,6 +1454,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 *);