mirror of
https://github.com/tmux/tmux.git
synced 2025-09-01 20:57:00 +00:00
Allow multiple modes to be open in a pane. A stack of open modes is kept
and the previous restored when the top is exited. If a mode that is already on the stack is entered, the existing instance is moved to the top as the active mode rather than being opened new.
This commit is contained in:
38
format.c
38
format.c
@ -617,6 +617,22 @@ format_cb_session_group_list(struct format_tree *ft, struct format_entry *fe)
|
||||
evbuffer_free(buffer);
|
||||
}
|
||||
|
||||
/* Callback for pane_in_mode. */
|
||||
static void
|
||||
format_cb_pane_in_mode(struct format_tree *ft, struct format_entry *fe)
|
||||
{
|
||||
struct window_pane *wp = ft->wp;
|
||||
u_int n = 0;
|
||||
struct window_mode_entry *wme;
|
||||
|
||||
if (wp == NULL)
|
||||
return;
|
||||
|
||||
TAILQ_FOREACH(wme, &wp->modes, entry)
|
||||
n++;
|
||||
xasprintf(&fe->value, "%u", n);
|
||||
}
|
||||
|
||||
/* Merge a format tree. */
|
||||
static void
|
||||
format_merge(struct format_tree *ft, struct format_tree *from)
|
||||
@ -1495,10 +1511,11 @@ format_defaults_winlink(struct format_tree *ft, struct winlink *wl)
|
||||
void
|
||||
format_defaults_pane(struct format_tree *ft, struct window_pane *wp)
|
||||
{
|
||||
struct window *w = wp->window;
|
||||
struct grid *gd = wp->base.grid;
|
||||
int status = wp->status;
|
||||
u_int idx;
|
||||
struct window *w = wp->window;
|
||||
struct grid *gd = wp->base.grid;
|
||||
int status = wp->status;
|
||||
u_int idx;
|
||||
struct window_mode_entry *wme;
|
||||
|
||||
if (ft->w == NULL)
|
||||
ft->w = w;
|
||||
@ -1533,9 +1550,13 @@ format_defaults_pane(struct format_tree *ft, struct window_pane *wp)
|
||||
format_add(ft, "pane_at_right", "%d", wp->xoff + wp->sx == w->sx);
|
||||
format_add(ft, "pane_at_bottom", "%d", wp->yoff + wp->sy == w->sy);
|
||||
|
||||
format_add(ft, "pane_in_mode", "%d", wp->screen != &wp->base);
|
||||
if (wp->mode != NULL)
|
||||
format_add(ft, "pane_mode", "%s", wp->mode->mode->name);
|
||||
wme = TAILQ_FIRST(&wp->modes);
|
||||
if (wme != NULL) {
|
||||
format_add(ft, "pane_mode", "%s", wme->mode->name);
|
||||
if (wme->mode->formats != NULL)
|
||||
wme->mode->formats(wme, ft);
|
||||
}
|
||||
format_add_cb(ft, "pane_in_mode", format_cb_pane_in_mode);
|
||||
|
||||
format_add(ft, "pane_synchronized", "%d",
|
||||
!!options_get_number(w->options, "synchronize-panes"));
|
||||
@ -1552,9 +1573,6 @@ format_defaults_pane(struct format_tree *ft, struct window_pane *wp)
|
||||
format_add(ft, "scroll_region_upper", "%u", wp->base.rupper);
|
||||
format_add(ft, "scroll_region_lower", "%u", wp->base.rlower);
|
||||
|
||||
if (wp->mode != NULL && wp->mode->mode->formats != NULL)
|
||||
wp->mode->mode->formats(wp->mode, ft);
|
||||
|
||||
format_add(ft, "alternate_on", "%d", wp->saved_grid ? 1 : 0);
|
||||
format_add(ft, "alternate_saved_x", "%u", wp->saved_cx);
|
||||
format_add(ft, "alternate_saved_y", "%u", wp->saved_cy);
|
||||
|
Reference in New Issue
Block a user