I've attached a patch which implements xterm's title stack
functionality for screens inside tmux.
diff --git a/input.c b/input.c
index b6c27cb..c7bf0a2 100644
--- a/input.c
+++ b/input.c
@@ -1493,8 +1493,6 @@ input_csi_dispatch_winops(struct input_ctx *ictx)
/* FALLTHROUGH */
case 9:
case 10:
- case 22:
- case 23:
m++;
if (input_get(ictx, m, 0, -1) == -1)
return;
@@ -1502,6 +1500,29 @@ input_csi_dispatch_winops(struct input_ctx *ictx)
case 18:
input_reply(ictx, "\033[8;%u;%u", wp->sy, wp->sx);
break;
+ case 22:
+ m++;
+ switch (input_get(ictx, m, 0, -1)) {
+ case 0:
+ case 2:
+ screen_save_title(ictx->wp->screen);
+ /* FALLTHROUGH */
+ default:
+ break;
+ }
+ break;
+ case 23:
+ m++;
+ switch (input_get(ictx, m, 0, -1)) {
+ case 0:
+ case 2:
+ screen_restore_title(ictx->wp->screen);
+ server_status_window(ictx->wp->window);
+ /* FALLTHROUGH */
+ default:
+ break;
+ }
+ break;
default:
log_debug("%s: unknown '%c'", __func__, ictx->ch);
break;
diff --git a/screen.c b/screen.c
index 7bfc015..63f34a0 100644
--- a/screen.c
+++ b/screen.c
@@ -44,6 +44,7 @@ screen_init(struct screen *s, u_int sx, u_int sy, u_int hlimit)
s->cstyle = 0;
s->ccolour = xstrdup("");
s->tabs = NULL;
+ ARRAY_INIT(&s->title_stack);
screen_reinit(s);
}
@@ -71,6 +72,12 @@ screen_reinit(struct screen *s)
void
screen_free(struct screen *s)
{
+ u_int i;
+
+ for (i = 0; i < ARRAY_LENGTH(&s->title_stack); i++)
+ free(ARRAY_ITEM(&s->title_stack, i));
+
+ ARRAY_FREE(&s->title_stack);
free(s->tabs);
free(s->title);
free(s->ccolour);
@@ -115,6 +122,29 @@ screen_set_title(struct screen *s, const char *title)
s->title = xstrdup(title);
}
+/* Save screen title on the title stack */
+void
+screen_save_title(struct screen *s)
+{
+ ARRAY_INSERT(&s->title_stack, 0, xstrdup(s->title));
+}
+
+/* Restore screen title from the title stack */
+void
+screen_restore_title(struct screen *s)
+{
+ char *t;
+
+ if (ARRAY_LENGTH(&s->title_stack) == 0)
+ return;
+
+ t = ARRAY_FIRST(&s->title_stack);
+ ARRAY_REMOVE(&s->title_stack, 0);
+
+ screen_set_title(s, t);
+ free(t);
+}
+
/* Resize screen. */
void
screen_resize(struct screen *s, u_int sx, u_int sy, int reflow)
diff --git a/tmux.h b/tmux.h
index fde94af..4871cbc 100644
--- a/tmux.h
+++ b/tmux.h
@@ -767,6 +767,7 @@ struct screen_sel {
/* Virtual screen. */
struct screen {
char *title;
+ ARRAY_DECL(, char *) title_stack;
struct grid *grid; /* grid data */
@@ -2091,6 +2092,8 @@ void screen_reset_tabs(struct screen *);
void screen_set_cursor_style(struct screen *, u_int);
void screen_set_cursor_colour(struct screen *, const char *);
void screen_set_title(struct screen *, const char *);
+void screen_save_title(struct screen *);
+void screen_restore_title(struct screen *);
void screen_resize(struct screen *, u_int, u_int, int);
void screen_set_selection(struct screen *,
u_int, u_int, u_int, u_int, u_int, struct grid_cell *);
------------------------------------------------------------------------------
"Accelerate Dev Cycles with Automated Cross-Browser Testing - For FREE
Instantly run your Selenium tests across 300+ browser/OS combos. Get
unparalleled scalability from the best Selenium testing platform available.
Simple to use. Nothing to install. Get started now for free."
http://p.sf.net/sfu/SauceLabs
_______________________________________________
tmux-users mailing list
tmux-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tmux-users