=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/cmd-select-layout.c,v retrieving revision 1.24 retrieving revision 1.25 diff -c -r1.24 -r1.25 *** src/usr.bin/tmux/cmd-select-layout.c 2014/10/20 22:34:31 1.24 --- src/usr.bin/tmux/cmd-select-layout.c 2015/04/28 10:43:13 1.25 *************** *** 1,4 **** ! /* $OpenBSD: cmd-select-layout.c,v 1.24 2014/10/20 22:34:31 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: cmd-select-layout.c,v 1.25 2015/04/28 10:43:13 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott *************** *** 18,23 **** --- 18,25 ---- #include + #include + #include "tmux.h" /* *************** *** 28,35 **** const struct cmd_entry cmd_select_layout_entry = { "select-layout", "selectl", ! "npt:", 0, 1, ! "[-np] " CMD_TARGET_WINDOW_USAGE " [layout-name]", 0, cmd_select_layout_exec }; --- 30,37 ---- const struct cmd_entry cmd_select_layout_entry = { "select-layout", "selectl", ! "nopt:", 0, 1, ! "[-nop] " CMD_TARGET_WINDOW_USAGE " [layout-name]", 0, cmd_select_layout_exec }; *************** *** 55,100 **** { struct args *args = self->args; struct winlink *wl; const char *layoutname; 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); next = self->entry == &cmd_next_layout_entry; ! if (args_has(self->args, 'n')) next = 1; previous = self->entry == &cmd_previous_layout_entry; ! if (args_has(self->args, 'p')) previous = 1; if (next || previous) { if (next) ! layout = layout_set_next(wl->window); else ! layout = layout_set_previous(wl->window); ! server_redraw_window(wl->window); ! return (CMD_RETURN_NORMAL); } ! 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->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); } return (CMD_RETURN_NORMAL); } --- 57,127 ---- { 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); ! w = wl->window; + server_unzoom_window(w); + next = self->entry == &cmd_next_layout_entry; ! if (args_has(args, 'n')) next = 1; previous = self->entry == &cmd_previous_layout_entry; ! 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_set_next(w); else ! layout_set_previous(w); ! goto changed; } ! 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) 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); + + changed: + free(oldlayout); + server_redraw_window(w); + return (CMD_RETURN_NORMAL); + + error: + free(w->old_layout); + w->old_layout = oldlayout; + return (CMD_RETURN_ERROR); }