mirror of
https://github.com/tmate-io/tmate.git
synced 2025-08-18 09:30:04 +02:00
Sync OpenBSD patchset 1084:
Add a layout history which can be stepped through with select-layout -u and -U commands (bound to 'u' and 'U' by default).
This commit is contained in:
72
layout.c
72
layout.c
@@ -19,6 +19,7 @@
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "tmux.h"
|
||||
|
||||
@@ -745,3 +746,74 @@ layout_close_pane(struct window_pane *wp)
|
||||
}
|
||||
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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user