Add select-layout -o to undo the last layout change (apply the previously

set layout).
This commit is contained in:
nicm 2015-04-28 10:43:13 +00:00
parent c2bc84aa4d
commit 771744426e
4 changed files with 59 additions and 28 deletions

View File

@ -18,6 +18,8 @@
#include <sys/types.h> #include <sys/types.h>
#include <stdlib.h>
#include "tmux.h" #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 = { const struct cmd_entry cmd_select_layout_entry = {
"select-layout", "selectl", "select-layout", "selectl",
"npt:", 0, 1, "nopt:", 0, 1,
"[-np] " CMD_TARGET_WINDOW_USAGE " [layout-name]", "[-nop] " CMD_TARGET_WINDOW_USAGE " [layout-name]",
0, 0,
cmd_select_layout_exec 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 args *args = self->args;
struct winlink *wl; struct winlink *wl;
struct window *w;
const char *layoutname; const char *layoutname;
char *oldlayout;
int next, previous, layout; int next, previous, layout;
if ((wl = cmd_find_window(cmdq, args_get(args, 't'), NULL)) == NULL) if ((wl = cmd_find_window(cmdq, args_get(args, 't'), NULL)) == NULL)
return (CMD_RETURN_ERROR); return (CMD_RETURN_ERROR);
server_unzoom_window(wl->window); w = wl->window;
server_unzoom_window(w);
next = self->entry == &cmd_next_layout_entry; next = self->entry == &cmd_next_layout_entry;
if (args_has(self->args, 'n')) if (args_has(args, 'n'))
next = 1; next = 1;
previous = self->entry == &cmd_previous_layout_entry; previous = self->entry == &cmd_previous_layout_entry;
if (args_has(self->args, 'p')) if (args_has(args, 'p'))
previous = 1; previous = 1;
oldlayout = w->old_layout;
w->old_layout = layout_dump(w->layout_root);
if (next || previous) { if (next || previous) {
if (next) if (next)
layout = layout_set_next(wl->window); layout_set_next(w);
else else
layout = layout_set_previous(wl->window); layout_set_previous(w);
server_redraw_window(wl->window); goto changed;
return (CMD_RETURN_NORMAL);
} }
if (!args_has(args, 'o')) {
if (args->argc == 0) if (args->argc == 0)
layout = wl->window->lastlayout; layout = w->lastlayout;
else else
layout = layout_set_lookup(args->argv[0]); layout = layout_set_lookup(args->argv[0]);
if (layout != -1) { if (layout != -1) {
layout = layout_set_select(wl->window, layout); layout_set_select(w, layout);
server_redraw_window(wl->window); goto changed;
return (CMD_RETURN_NORMAL); }
} }
if (args->argc != 0) { if (args->argc != 0)
layoutname = args->argv[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); 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); 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);
} }

8
tmux.1
View File

@ -442,8 +442,8 @@ otherwise the current window in
.Em session .Em session
is chosen. is chosen.
.Pp .Pp
The following special tokens are available to indicate particular windows. Each The following special tokens are available to indicate particular windows.
has a single-character alternative form. Each has a single-character alternative form.
.Bl -column "XXXXXXXXXX" "X" .Bl -column "XXXXXXXXXX" "X"
.It Sy "Token" Ta Sy "" Ta Sy "Meaning" .It Sy "Token" Ta Sy "" Ta Sy "Meaning"
.It Li "{start}" Ta "^" Ta "The lowest-numbered window" .It Li "{start}" Ta "^" Ta "The lowest-numbered window"
@ -1775,7 +1775,7 @@ lower) with
.Fl U .Fl U
or downward (numerically higher). or downward (numerically higher).
.It Xo Ic select-layout .It Xo Ic select-layout
.Op Fl np .Op Fl nop
.Op Fl t Ar target-window .Op Fl t Ar target-window
.Op Ar layout-name .Op Ar layout-name
.Xc .Xc
@ -1792,6 +1792,8 @@ are equivalent to the
and and
.Ic previous-layout .Ic previous-layout
commands. commands.
.Fl o
applies the last set layout if possible (undoes the most recent layout change).
.It Xo Ic select-pane .It Xo Ic select-pane
.Op Fl DdegLlRU .Op Fl DdegLlRU
.Op Fl P Ar style .Op Fl P Ar style

1
tmux.h
View File

@ -965,6 +965,7 @@ struct window {
int lastlayout; int lastlayout;
struct layout_cell *layout_root; struct layout_cell *layout_root;
struct layout_cell *saved_layout_root; struct layout_cell *saved_layout_root;
char *old_layout;
u_int sx; u_int sx;
u_int sy; u_int sy;

View File

@ -344,6 +344,7 @@ window_destroy(struct window *w)
if (w->layout_root != NULL) if (w->layout_root != NULL)
layout_free(w); layout_free(w);
free(w->old_layout);
if (event_initialized(&w->name_timer)) if (event_initialized(&w->name_timer))
evtimer_del(&w->name_timer); evtimer_del(&w->name_timer);