=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/format.c,v retrieving revision 1.53 retrieving revision 1.54 diff -c -r1.53 -r1.54 *** src/usr.bin/tmux/format.c 2014/12/01 14:30:18 1.53 --- src/usr.bin/tmux/format.c 2014/12/02 23:19:45 1.54 *************** *** 1,4 **** ! /* $OpenBSD: format.c,v 1.53 2014/12/01 14:30:18 nicm Exp $ */ /* * Copyright (c) 2011 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: format.c,v 1.54 2014/12/02 23:19:45 nicm Exp $ */ /* * Copyright (c) 2011 Nicholas Marriott *************** *** 39,46 **** char *format_get_command(struct window_pane *); void format_window_pane_tabs(struct format_tree *, struct window_pane *); /* Format key-value replacement entry. */ ! RB_GENERATE(format_tree, format_entry, entry, format_cmp); /* Format tree comparison function. */ int --- 39,64 ---- char *format_get_command(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. */ ! 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. */ int *************** *** 116,123 **** struct format_tree *ft; char host[MAXHOSTNAMELEN], *ptr; ! ft = xmalloc(sizeof *ft); ! RB_INIT(ft); if (gethostname(host, sizeof host) == 0) { format_add(ft, "host", "%s", host); --- 134,141 ---- struct format_tree *ft; char host[MAXHOSTNAMELEN], *ptr; ! ft = xcalloc(1, sizeof *ft); ! RB_INIT(&ft->tree); if (gethostname(host, sizeof host) == 0) { format_add(ft, "host", "%s", host); *************** *** 133,146 **** void format_free(struct format_tree *ft) { ! struct format_entry *fe, *fe_next; ! fe_next = RB_MIN(format_tree, ft); ! while (fe_next != NULL) { ! fe = fe_next; ! fe_next = RB_NEXT(format_tree, ft, fe); ! ! RB_REMOVE(format_tree, ft, fe); free(fe->value); free(fe->key); free(fe); --- 151,160 ---- void format_free(struct format_tree *ft) { ! struct format_entry *fe, *fe1; ! RB_FOREACH_SAFE(fe, format_rb_tree, &ft->tree, fe1) { ! RB_REMOVE(format_rb_tree, &ft->tree, fe); free(fe->value); free(fe->key); free(fe); *************** *** 164,170 **** xvasprintf(&fe->value, fmt, ap); va_end(ap); ! fe_now = RB_INSERT(format_tree, ft, fe); if (fe_now != NULL) { free(fe_now->value); fe_now->value = fe->value; --- 178,184 ---- xvasprintf(&fe->value, fmt, ap); va_end(ap); ! fe_now = RB_INSERT(format_rb_tree, &ft->tree, fe); if (fe_now != NULL) { free(fe_now->value); fe_now->value = fe->value; *************** *** 178,186 **** format_find(struct format_tree *ft, const char *key) { struct format_entry *fe, fe_find; fe_find.key = (char *) key; ! fe = RB_FIND(format_tree, ft, &fe_find); if (fe == NULL) return (NULL); return (fe->value); --- 192,223 ---- format_find(struct format_tree *ft, const char *key) { 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 = RB_FIND(format_rb_tree, &ft->tree, &fe_find); if (fe == NULL) return (NULL); return (fe->value); *************** *** 205,211 **** copy[keylen] = '\0'; /* Is there a length limit or whatnot? */ ! if (!islower((u_char) *copy) && *copy != '?') { while (*copy != ':' && *copy != '\0') { switch (*copy) { case '=': --- 242,248 ---- copy[keylen] = '\0'; /* Is there a length limit or whatnot? */ ! if (!islower((u_char) *copy) && *copy != '@' && *copy != '?') { while (*copy != ':' && *copy != '\0') { switch (*copy) { case '=': *************** *** 388,393 **** --- 425,432 ---- char *tim; time_t t; + ft->s = s; + format_add(ft, "session_name", "%s", s->name); format_add(ft, "session_windows", "%u", winlink_count(&s->windows)); format_add(ft, "session_width", "%u", s->sx); *************** *** 417,422 **** --- 456,464 ---- time_t t; struct session *s; + if (ft->s == NULL) + ft->s = c->session; + format_add(ft, "client_height", "%u", c->tty.sy); format_add(ft, "client_width", "%u", c->tty.sx); if (c->tty.path != NULL) *************** *** 462,467 **** --- 504,511 ---- { char *layout; + ft->w = w; + layout = layout_dump(w); format_add(ft, "window_id", "@%u", w->id); *************** *** 483,488 **** --- 527,535 ---- struct window *w = wl->window; char *flags; + if (ft->w == NULL) + ft->w = wl->window; + flags = window_printable_flags(s, wl); format_window(ft, w); *************** *** 534,539 **** --- 581,589 ---- unsigned long long size; u_int i, idx; char *cmd; + + if (ft->w == NULL) + ft->w = wp->window; size = 0; for (i = 0; i < gd->hsize; i++) {