mirror of
https://github.com/tmux/tmux.git
synced 2025-09-02 13:37:12 +00:00
Add support for the xterm(1) title stack, from Brad Town, GitHub issue
1075.
This commit is contained in:
25
input.c
25
input.c
@ -1693,12 +1693,33 @@ input_csi_dispatch_winops(struct input_ctx *ictx)
|
|||||||
/* FALLTHROUGH */
|
/* FALLTHROUGH */
|
||||||
case 9:
|
case 9:
|
||||||
case 10:
|
case 10:
|
||||||
case 22:
|
|
||||||
case 23:
|
|
||||||
m++;
|
m++;
|
||||||
if (input_get(ictx, m, 0, -1) == -1)
|
if (input_get(ictx, m, 0, -1) == -1)
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
|
case 22:
|
||||||
|
m++;
|
||||||
|
switch (input_get(ictx, m, 0, -1)) {
|
||||||
|
case -1:
|
||||||
|
return;
|
||||||
|
case 0:
|
||||||
|
case 2:
|
||||||
|
screen_push_title(ictx->ctx.s);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 23:
|
||||||
|
m++;
|
||||||
|
switch (input_get(ictx, m, 0, -1)) {
|
||||||
|
case -1:
|
||||||
|
return;
|
||||||
|
case 0:
|
||||||
|
case 2:
|
||||||
|
screen_pop_title(ictx->ctx.s);
|
||||||
|
server_status_window(ictx->wp->window);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case 18:
|
case 18:
|
||||||
input_reply(ictx, "\033[8;%u;%ut", wp->sy, wp->sx);
|
input_reply(ictx, "\033[8;%u;%ut", wp->sy, wp->sx);
|
||||||
break;
|
break;
|
||||||
|
68
screen.c
68
screen.c
@ -25,17 +25,44 @@
|
|||||||
|
|
||||||
#include "tmux.h"
|
#include "tmux.h"
|
||||||
|
|
||||||
|
struct screen_title_entry {
|
||||||
|
char *text;
|
||||||
|
|
||||||
|
TAILQ_ENTRY(screen_title_entry) entry;
|
||||||
|
};
|
||||||
|
TAILQ_HEAD(screen_titles, screen_title_entry);
|
||||||
|
|
||||||
static void screen_resize_x(struct screen *, u_int);
|
static void screen_resize_x(struct screen *, u_int);
|
||||||
static void screen_resize_y(struct screen *, u_int);
|
static void screen_resize_y(struct screen *, u_int);
|
||||||
|
|
||||||
static void screen_reflow(struct screen *, u_int);
|
static void screen_reflow(struct screen *, u_int);
|
||||||
|
|
||||||
|
/* Free titles stack. */
|
||||||
|
static void
|
||||||
|
screen_free_titles(struct screen *s)
|
||||||
|
{
|
||||||
|
struct screen_title_entry *title_entry;
|
||||||
|
|
||||||
|
if (s->titles == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
while ((title_entry = TAILQ_FIRST(s->titles)) != NULL) {
|
||||||
|
TAILQ_REMOVE(s->titles, title_entry, entry);
|
||||||
|
free(title_entry->text);
|
||||||
|
free(title_entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(s->titles);
|
||||||
|
s->titles = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* Create a new screen. */
|
/* Create a new screen. */
|
||||||
void
|
void
|
||||||
screen_init(struct screen *s, u_int sx, u_int sy, u_int hlimit)
|
screen_init(struct screen *s, u_int sx, u_int sy, u_int hlimit)
|
||||||
{
|
{
|
||||||
s->grid = grid_create(sx, sy, hlimit);
|
s->grid = grid_create(sx, sy, hlimit);
|
||||||
s->title = xstrdup("");
|
s->title = xstrdup("");
|
||||||
|
s->titles = NULL;
|
||||||
|
|
||||||
s->cstyle = 0;
|
s->cstyle = 0;
|
||||||
s->ccolour = xstrdup("");
|
s->ccolour = xstrdup("");
|
||||||
@ -61,6 +88,7 @@ screen_reinit(struct screen *s)
|
|||||||
grid_clear_lines(s->grid, s->grid->hsize, s->grid->sy, 8);
|
grid_clear_lines(s->grid, s->grid->hsize, s->grid->sy, 8);
|
||||||
|
|
||||||
screen_clear_selection(s);
|
screen_clear_selection(s);
|
||||||
|
screen_free_titles(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Destroy a screen. */
|
/* Destroy a screen. */
|
||||||
@ -70,7 +98,10 @@ screen_free(struct screen *s)
|
|||||||
free(s->tabs);
|
free(s->tabs);
|
||||||
free(s->title);
|
free(s->title);
|
||||||
free(s->ccolour);
|
free(s->ccolour);
|
||||||
|
|
||||||
grid_destroy(s->grid);
|
grid_destroy(s->grid);
|
||||||
|
|
||||||
|
screen_free_titles(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Reset tabs to default, eight spaces apart. */
|
/* Reset tabs to default, eight spaces apart. */
|
||||||
@ -111,6 +142,43 @@ screen_set_title(struct screen *s, const char *title)
|
|||||||
utf8_stravis(&s->title, title, VIS_OCTAL|VIS_CSTYLE|VIS_TAB|VIS_NL);
|
utf8_stravis(&s->title, title, VIS_OCTAL|VIS_CSTYLE|VIS_TAB|VIS_NL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Push the current title onto the stack. */
|
||||||
|
void
|
||||||
|
screen_push_title(struct screen *s)
|
||||||
|
{
|
||||||
|
struct screen_title_entry *title_entry;
|
||||||
|
|
||||||
|
if (s->titles == NULL) {
|
||||||
|
s->titles = xmalloc(sizeof *s->titles);
|
||||||
|
TAILQ_INIT(s->titles);
|
||||||
|
}
|
||||||
|
title_entry = xmalloc(sizeof *title_entry);
|
||||||
|
title_entry->text = xstrdup(s->title);
|
||||||
|
TAILQ_INSERT_HEAD(s->titles, title_entry, entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Pop a title from the stack and set it as the screen title. If the stack is
|
||||||
|
* empty, do nothing.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
screen_pop_title(struct screen *s)
|
||||||
|
{
|
||||||
|
struct screen_title_entry *title_entry;
|
||||||
|
|
||||||
|
if (s->titles == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
title_entry = TAILQ_FIRST(s->titles);
|
||||||
|
if (title_entry != NULL) {
|
||||||
|
screen_set_title(s, title_entry->text);
|
||||||
|
|
||||||
|
TAILQ_REMOVE(s->titles, title_entry, entry);
|
||||||
|
free(title_entry->text);
|
||||||
|
free(title_entry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Resize screen. */
|
/* Resize screen. */
|
||||||
void
|
void
|
||||||
screen_resize(struct screen *s, u_int sx, u_int sy, int reflow)
|
screen_resize(struct screen *s, u_int sx, u_int sy, int reflow)
|
||||||
|
4
tmux.h
4
tmux.h
@ -660,8 +660,10 @@ struct screen_sel {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* Virtual screen. */
|
/* Virtual screen. */
|
||||||
|
struct screen_titles;
|
||||||
struct screen {
|
struct screen {
|
||||||
char *title;
|
char *title;
|
||||||
|
struct screen_titles *titles;
|
||||||
|
|
||||||
struct grid *grid; /* grid data */
|
struct grid *grid; /* grid data */
|
||||||
|
|
||||||
@ -2082,6 +2084,8 @@ void screen_reset_tabs(struct screen *);
|
|||||||
void screen_set_cursor_style(struct screen *, u_int);
|
void screen_set_cursor_style(struct screen *, u_int);
|
||||||
void screen_set_cursor_colour(struct screen *, const char *);
|
void screen_set_cursor_colour(struct screen *, const char *);
|
||||||
void screen_set_title(struct screen *, const char *);
|
void screen_set_title(struct screen *, const char *);
|
||||||
|
void screen_push_title(struct screen *);
|
||||||
|
void screen_pop_title(struct screen *);
|
||||||
void screen_resize(struct screen *, u_int, u_int, int);
|
void screen_resize(struct screen *, u_int, u_int, int);
|
||||||
void screen_set_selection(struct screen *,
|
void screen_set_selection(struct screen *,
|
||||||
u_int, u_int, u_int, u_int, u_int, struct grid_cell *);
|
u_int, u_int, u_int, u_int, u_int, struct grid_cell *);
|
||||||
|
Reference in New Issue
Block a user