version 1.53, 2014/12/01 14:30:18 |
version 1.54, 2014/12/02 23:19:45 |
|
|
char *format_get_command(struct window_pane *); |
char *format_get_command(struct window_pane *); |
void format_window_pane_tabs(struct format_tree *, struct window_pane *); |
void format_window_pane_tabs(struct format_tree *, struct window_pane *); |
|
|
|
/* Entry in format tree. */ |
|
struct format_entry { |
|
char *key; |
|
char *value; |
|
|
|
RB_ENTRY(format_entry) entry; |
|
}; |
|
|
|
/* Tree of format entries. */ |
|
struct format_tree { |
|
struct window *w; |
|
struct session *s; |
|
|
|
RB_HEAD(format_rb_tree, format_entry) tree; |
|
}; |
|
|
/* Format key-value replacement entry. */ |
/* Format key-value replacement entry. */ |
RB_GENERATE(format_tree, format_entry, entry, format_cmp); |
int format_cmp(struct format_entry *, struct format_entry *); |
|
RB_PROTOTYPE(format_rb_tree, format_entry, entry, format_cmp); |
|
RB_GENERATE(format_rb_tree, format_entry, entry, format_cmp); |
|
|
/* Format tree comparison function. */ |
/* Format tree comparison function. */ |
int |
int |
|
|
struct format_tree *ft; |
struct format_tree *ft; |
char host[MAXHOSTNAMELEN], *ptr; |
char host[MAXHOSTNAMELEN], *ptr; |
|
|
ft = xmalloc(sizeof *ft); |
ft = xcalloc(1, sizeof *ft); |
RB_INIT(ft); |
RB_INIT(&ft->tree); |
|
|
if (gethostname(host, sizeof host) == 0) { |
if (gethostname(host, sizeof host) == 0) { |
format_add(ft, "host", "%s", host); |
format_add(ft, "host", "%s", host); |
|
|
void |
void |
format_free(struct format_tree *ft) |
format_free(struct format_tree *ft) |
{ |
{ |
struct format_entry *fe, *fe_next; |
struct format_entry *fe, *fe1; |
|
|
fe_next = RB_MIN(format_tree, ft); |
RB_FOREACH_SAFE(fe, format_rb_tree, &ft->tree, fe1) { |
while (fe_next != NULL) { |
RB_REMOVE(format_rb_tree, &ft->tree, fe); |
fe = fe_next; |
|
fe_next = RB_NEXT(format_tree, ft, fe); |
|
|
|
RB_REMOVE(format_tree, ft, fe); |
|
free(fe->value); |
free(fe->value); |
free(fe->key); |
free(fe->key); |
free(fe); |
free(fe); |
|
|
xvasprintf(&fe->value, fmt, ap); |
xvasprintf(&fe->value, fmt, ap); |
va_end(ap); |
va_end(ap); |
|
|
fe_now = RB_INSERT(format_tree, ft, fe); |
fe_now = RB_INSERT(format_rb_tree, &ft->tree, fe); |
if (fe_now != NULL) { |
if (fe_now != NULL) { |
free(fe_now->value); |
free(fe_now->value); |
fe_now->value = fe->value; |
fe_now->value = fe->value; |
|
|
format_find(struct format_tree *ft, const char *key) |
format_find(struct format_tree *ft, const char *key) |
{ |
{ |
struct format_entry *fe, fe_find; |
struct format_entry *fe, fe_find; |
|
struct options_entry *o; |
|
static char s[16]; |
|
|
|
o = options_find(&global_options, key); |
|
if (o == NULL && ft->w != NULL) |
|
o = options_find(&ft->w->options, key); |
|
if (o == NULL) |
|
o = options_find(&global_w_options, key); |
|
if (o == NULL && ft->s != NULL) |
|
o = options_find(&ft->s->options, key); |
|
if (o == NULL) |
|
o = options_find(&global_s_options, key); |
|
if (o != NULL) { |
|
switch (o->type) { |
|
case OPTIONS_STRING: |
|
return (o->str); |
|
case OPTIONS_NUMBER: |
|
snprintf(s, sizeof s, "%lld", o->num); |
|
return (s); |
|
case OPTIONS_STYLE: |
|
return (style_tostring(&o->style)); |
|
} |
|
} |
|
|
fe_find.key = (char *) key; |
fe_find.key = (char *) key; |
fe = RB_FIND(format_tree, ft, &fe_find); |
fe = RB_FIND(format_rb_tree, &ft->tree, &fe_find); |
if (fe == NULL) |
if (fe == NULL) |
return (NULL); |
return (NULL); |
return (fe->value); |
return (fe->value); |
|
|
copy[keylen] = '\0'; |
copy[keylen] = '\0'; |
|
|
/* Is there a length limit or whatnot? */ |
/* Is there a length limit or whatnot? */ |
if (!islower((u_char) *copy) && *copy != '?') { |
if (!islower((u_char) *copy) && *copy != '@' && *copy != '?') { |
while (*copy != ':' && *copy != '\0') { |
while (*copy != ':' && *copy != '\0') { |
switch (*copy) { |
switch (*copy) { |
case '=': |
case '=': |
|
|
char *tim; |
char *tim; |
time_t t; |
time_t t; |
|
|
|
ft->s = s; |
|
|
format_add(ft, "session_name", "%s", s->name); |
format_add(ft, "session_name", "%s", s->name); |
format_add(ft, "session_windows", "%u", winlink_count(&s->windows)); |
format_add(ft, "session_windows", "%u", winlink_count(&s->windows)); |
format_add(ft, "session_width", "%u", s->sx); |
format_add(ft, "session_width", "%u", s->sx); |
|
|
time_t t; |
time_t t; |
struct session *s; |
struct session *s; |
|
|
|
if (ft->s == NULL) |
|
ft->s = c->session; |
|
|
format_add(ft, "client_height", "%u", c->tty.sy); |
format_add(ft, "client_height", "%u", c->tty.sy); |
format_add(ft, "client_width", "%u", c->tty.sx); |
format_add(ft, "client_width", "%u", c->tty.sx); |
if (c->tty.path != NULL) |
if (c->tty.path != NULL) |
|
|
{ |
{ |
char *layout; |
char *layout; |
|
|
|
ft->w = w; |
|
|
layout = layout_dump(w); |
layout = layout_dump(w); |
|
|
format_add(ft, "window_id", "@%u", w->id); |
format_add(ft, "window_id", "@%u", w->id); |
|
|
struct window *w = wl->window; |
struct window *w = wl->window; |
char *flags; |
char *flags; |
|
|
|
if (ft->w == NULL) |
|
ft->w = wl->window; |
|
|
flags = window_printable_flags(s, wl); |
flags = window_printable_flags(s, wl); |
|
|
format_window(ft, w); |
format_window(ft, w); |
|
|
unsigned long long size; |
unsigned long long size; |
u_int i, idx; |
u_int i, idx; |
char *cmd; |
char *cmd; |
|
|
|
if (ft->w == NULL) |
|
ft->w = wp->window; |
|
|
size = 0; |
size = 0; |
for (i = 0; i < gd->hsize; i++) { |
for (i = 0; i < gd->hsize; i++) { |