diff options
author | nicm <nicm> | 2019-03-12 11:16:49 +0000 |
---|---|---|
committer | nicm <nicm> | 2019-03-12 11:16:49 +0000 |
commit | 3f6bfbaf2babcc7f08f628a82ff31b0b52014e58 (patch) | |
tree | ce4bf0c954cdfede0c2e86905bd85a9f565ed370 /format.c | |
parent | ff4c80d53df96bb46eaa64107673e42d402f0d49 (diff) | |
download | rtmux-3f6bfbaf2babcc7f08f628a82ff31b0b52014e58.tar.gz rtmux-3f6bfbaf2babcc7f08f628a82ff31b0b52014e58.tar.bz2 rtmux-3f6bfbaf2babcc7f08f628a82ff31b0b52014e58.zip |
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.
Diffstat (limited to 'format.c')
-rw-r--r-- | format.c | 38 |
1 files changed, 28 insertions, 10 deletions
@@ -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); |