version 1.47, 2017/06/04 09:02:36 |
version 1.48, 2017/10/05 13:29:18 |
|
|
|
|
#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(""); |
|
|
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. */ |
|
|
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. */ |
|
|
{ |
{ |
free(s->title); |
free(s->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. */ |