From edb21bd1e1634705f235562688e076bfe5df9b06 Mon Sep 17 00:00:00 2001 From: nicm Date: Tue, 28 Apr 2015 10:43:13 +0000 Subject: [PATCH] Add select-layout -o to undo the last layout change (apply the previously set layout). --- usr.bin/tmux/cmd-select-layout.c | 71 ++++++++++++++++++++++---------- usr.bin/tmux/tmux.1 | 12 +++--- usr.bin/tmux/tmux.h | 3 +- usr.bin/tmux/window.c | 3 +- 4 files changed, 60 insertions(+), 29 deletions(-) diff --git a/usr.bin/tmux/cmd-select-layout.c b/usr.bin/tmux/cmd-select-layout.c index 02fedb615f2..8f209415831 100644 --- a/usr.bin/tmux/cmd-select-layout.c +++ b/usr.bin/tmux/cmd-select-layout.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cmd-select-layout.c,v 1.24 2014/10/20 22:34:31 nicm Exp $ */ +/* $OpenBSD: cmd-select-layout.c,v 1.25 2015/04/28 10:43:13 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott @@ -18,6 +18,8 @@ #include +#include + #include "tmux.h" /* @@ -28,8 +30,8 @@ enum cmd_retval cmd_select_layout_exec(struct cmd *, struct cmd_q *); const struct cmd_entry cmd_select_layout_entry = { "select-layout", "selectl", - "npt:", 0, 1, - "[-np] " CMD_TARGET_WINDOW_USAGE " [layout-name]", + "nopt:", 0, 1, + "[-nop] " CMD_TARGET_WINDOW_USAGE " [layout-name]", 0, cmd_select_layout_exec }; @@ -55,46 +57,71 @@ cmd_select_layout_exec(struct cmd *self, struct cmd_q *cmdq) { struct args *args = self->args; struct winlink *wl; + struct window *w; const char *layoutname; + char *oldlayout; int next, previous, layout; if ((wl = cmd_find_window(cmdq, args_get(args, 't'), NULL)) == NULL) return (CMD_RETURN_ERROR); - server_unzoom_window(wl->window); + w = wl->window; + + server_unzoom_window(w); next = self->entry == &cmd_next_layout_entry; - if (args_has(self->args, 'n')) + if (args_has(args, 'n')) next = 1; previous = self->entry == &cmd_previous_layout_entry; - if (args_has(self->args, 'p')) + if (args_has(args, 'p')) previous = 1; + oldlayout = w->old_layout; + w->old_layout = layout_dump(w->layout_root); + if (next || previous) { if (next) - layout = layout_set_next(wl->window); + layout_set_next(w); else - layout = layout_set_previous(wl->window); - server_redraw_window(wl->window); - return (CMD_RETURN_NORMAL); + layout_set_previous(w); + goto changed; } - if (args->argc == 0) - layout = wl->window->lastlayout; - else - layout = layout_set_lookup(args->argv[0]); - if (layout != -1) { - layout = layout_set_select(wl->window, layout); - server_redraw_window(wl->window); - return (CMD_RETURN_NORMAL); + if (!args_has(args, 'o')) { + if (args->argc == 0) + layout = w->lastlayout; + else + layout = layout_set_lookup(args->argv[0]); + if (layout != -1) { + layout_set_select(w, layout); + goto changed; + } } - if (args->argc != 0) { + if (args->argc != 0) layoutname = args->argv[0]; - if (layout_parse(wl->window, layoutname) == -1) { + else if (args_has(args, 'o')) + layoutname = oldlayout; + else + layoutname = NULL; + + if (layoutname != NULL) { + if (layout_parse(w, layoutname) == -1) { cmdq_error(cmdq, "can't set layout: %s", layoutname); - return (CMD_RETURN_ERROR); + goto error; } - server_redraw_window(wl->window); + goto changed; } + + free(oldlayout); return (CMD_RETURN_NORMAL); + +changed: + free(oldlayout); + server_redraw_window(w); + return (CMD_RETURN_NORMAL); + +error: + free(w->old_layout); + w->old_layout = oldlayout; + return (CMD_RETURN_ERROR); } diff --git a/usr.bin/tmux/tmux.1 b/usr.bin/tmux/tmux.1 index 517a82a3dd5..d77481662fb 100644 --- a/usr.bin/tmux/tmux.1 +++ b/usr.bin/tmux/tmux.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: tmux.1,v 1.423 2015/04/27 16:25:57 nicm Exp $ +.\" $OpenBSD: tmux.1,v 1.424 2015/04/28 10:43:14 nicm Exp $ .\" .\" Copyright (c) 2007 Nicholas Marriott .\" @@ -14,7 +14,7 @@ .\" IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING .\" OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: April 27 2015 $ +.Dd $Mdocdate: April 28 2015 $ .Dt TMUX 1 .Os .Sh NAME @@ -442,8 +442,8 @@ otherwise the current window in .Em session is chosen. .Pp -The following special tokens are available to indicate particular windows. Each -has a single-character alternative form. +The following special tokens are available to indicate particular windows. +Each has a single-character alternative form. .Bl -column "XXXXXXXXXX" "X" .It Sy "Token" Ta Sy "" Ta Sy "Meaning" .It Li "{start}" Ta "^" Ta "The lowest-numbered window" @@ -1775,7 +1775,7 @@ lower) with .Fl U or downward (numerically higher). .It Xo Ic select-layout -.Op Fl np +.Op Fl nop .Op Fl t Ar target-window .Op Ar layout-name .Xc @@ -1792,6 +1792,8 @@ are equivalent to the and .Ic previous-layout commands. +.Fl o +applies the last set layout if possible (undoes the most recent layout change). .It Xo Ic select-pane .Op Fl DdegLlRU .Op Fl P Ar style diff --git a/usr.bin/tmux/tmux.h b/usr.bin/tmux/tmux.h index 16ba87b72a0..fd426568e36 100644 --- a/usr.bin/tmux/tmux.h +++ b/usr.bin/tmux/tmux.h @@ -1,4 +1,4 @@ -/* $OpenBSD: tmux.h,v 1.502 2015/04/27 16:25:57 nicm Exp $ */ +/* $OpenBSD: tmux.h,v 1.503 2015/04/28 10:43:14 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -965,6 +965,7 @@ struct window { int lastlayout; struct layout_cell *layout_root; struct layout_cell *saved_layout_root; + char *old_layout; u_int sx; u_int sy; diff --git a/usr.bin/tmux/window.c b/usr.bin/tmux/window.c index 0dab301e427..6a692fc5d84 100644 --- a/usr.bin/tmux/window.c +++ b/usr.bin/tmux/window.c @@ -1,4 +1,4 @@ -/* $OpenBSD: window.c,v 1.126 2015/04/25 18:56:05 nicm Exp $ */ +/* $OpenBSD: window.c,v 1.127 2015/04/28 10:43:14 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -344,6 +344,7 @@ window_destroy(struct window *w) if (w->layout_root != NULL) layout_free(w); + free(w->old_layout); if (event_initialized(&w->name_timer)) evtimer_del(&w->name_timer); -- 2.20.1