Merge branch 'master' of ssh://git.code.sf.net/p/tmux/tmux-code

This commit is contained in:
Nicholas Marriott 2015-04-28 15:18:53 +01:00
commit 1ed5326f5a
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->argc == 0) if (!args_has(args, 'o')) {
layout = wl->window->lastlayout; if (args->argc == 0)
else layout = w->lastlayout;
layout = layout_set_lookup(args->argv[0]); else
if (layout != -1) { layout = layout_set_lookup(args->argv[0]);
layout = layout_set_select(wl->window, layout); if (layout != -1) {
server_redraw_window(wl->window); layout_set_select(w, layout);
return (CMD_RETURN_NORMAL); goto changed;
}
if (args->argc != 0) {
layoutname = args->argv[0];
if (layout_parse(wl->window, layoutname) == -1) {
cmdq_error(cmdq, "can't set layout: %s", layoutname);
return (CMD_RETURN_ERROR);
} }
server_redraw_window(wl->window);
} }
if (args->argc != 0)
layoutname = args->argv[0];
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);
goto error;
}
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

@ -446,8 +446,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"
@ -1779,7 +1779,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
@ -1796,6 +1796,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

@ -963,6 +963,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

@ -343,6 +343,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);