=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/layout.c,v retrieving revision 1.10 retrieving revision 1.11 diff -c -r1.10 -r1.11 *** src/usr.bin/tmux/layout.c 2012/03/17 22:35:09 1.10 --- src/usr.bin/tmux/layout.c 2012/04/01 13:18:38 1.11 *************** *** 1,4 **** ! /* $OpenBSD: layout.c,v 1.10 2012/03/17 22:35:09 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: layout.c,v 1.11 2012/04/01 13:18:38 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott *************** *** 19,24 **** --- 19,25 ---- #include #include + #include #include "tmux.h" *************** *** 744,747 **** --- 745,819 ---- layout_fix_panes(wp->window, wp->window->sx, wp->window->sy); } notify_window_layout_changed(wp->window); + } + + /* Add layout to list. */ + void + layout_list_add(struct window *w) + { + struct last_layout *ll, *ll_last; + char *layout; + u_int limit; + + layout = layout_dump(w); + + ll_last = w->layout_list_last; + if (ll_last != NULL && strcmp(ll_last->layout, layout) == 0) { + free(layout); + return; + } + + ll = xmalloc(sizeof *ll); + ll->layout = layout; + if (ll_last == NULL) + TAILQ_INSERT_TAIL(&w->layout_list, ll, entry); + else + TAILQ_INSERT_AFTER(&w->layout_list, ll_last, ll, entry); + w->layout_list_size++; + w->layout_list_last = ll; + + limit = options_get_number(&w->options, "layout-history"); + while (w->layout_list_size > limit) { + ll = TAILQ_LAST(&w->layout_list, last_layouts); + if (ll == w->layout_list_last) + ll = TAILQ_FIRST(&w->layout_list); + + TAILQ_REMOVE(&w->layout_list, ll, entry); + w->layout_list_size--; + + xfree(ll->layout); + xfree(ll); + } + } + + /* Apply next layout from list. */ + const char * + layout_list_redo(struct window *w) + { + struct last_layout *ll, *ll_last; + + ll_last = w->layout_list_last; + if (ll_last == NULL) + return (NULL); + ll = TAILQ_NEXT(ll_last, entry); + if (ll == NULL) + return (NULL); + w->layout_list_last = ll; + return (ll->layout); + } + + /* Apply previous layout from list. */ + const char * + layout_list_undo(struct window *w) + { + struct last_layout *ll, *ll_last; + + ll_last = w->layout_list_last; + if (ll_last == NULL) + return (NULL); + ll = TAILQ_PREV(ll_last, last_layouts, entry); + if (ll == NULL) + return (NULL); + w->layout_list_last = ll; + return (ll->layout); }