diff --git a/cmd-set-option.c b/cmd-set-option.c index 7aa09eee..d1b7f331 100644 --- a/cmd-set-option.c +++ b/cmd-set-option.c @@ -117,7 +117,7 @@ cmd_set_option_exec(struct cmd *self, struct cmdq_item *item) if (*optstr == '@') return (cmd_set_option_user(self, item, optstr, valstr)); - /* Find the option entry, try each table. */ + /* Find the option entry. */ oe = NULL; if (options_table_find(optstr, &oe) != 0) { if (!args_has(args, 'q')) { @@ -184,7 +184,7 @@ cmd_set_option_exec(struct cmd *self, struct cmdq_item *item) return (CMD_RETURN_ERROR); } - /* Start or stop timers if necessary. */ + /* Update timers and so on for various options. */ if (strcmp(oe->name, "automatic-rename") == 0) { RB_FOREACH(w, windows, &windows) { if (w->active == NULL) @@ -207,8 +207,6 @@ cmd_set_option_exec(struct cmd *self, struct cmdq_item *item) RB_FOREACH(w, windows, &windows) w->flags |= WINDOW_STYLECHANGED; } - - /* When the pane-border-status option has been changed, resize panes. */ if (strcmp(oe->name, "pane-border-status") == 0) { RB_FOREACH(w, windows, &windows) layout_fix_panes(w, w->sx, w->sy); diff --git a/notify.c b/notify.c index 8c18cd44..bf984211 100644 --- a/notify.c +++ b/notify.c @@ -77,6 +77,8 @@ notify_callback(struct cmdq_item *item, void *data) { struct notify_entry *ne = data; + log_debug("%s: %s", __func__, ne->name); + if (strcmp(ne->name, "window-layout-changed") == 0) control_notify_window_layout_changed(ne->window); if (strcmp(ne->name, "window-unlinked") == 0) diff --git a/options-table.c b/options-table.c index b63abaec..a6bdda6f 100644 --- a/options-table.c +++ b/options-table.c @@ -947,8 +947,8 @@ options_table_print_entry(const struct options_table_entry *oe, xsnprintf(out, sizeof out, "%lld", o->num); break; case OPTIONS_TABLE_KEY: - xsnprintf(out, sizeof out, "%s", - key_string_lookup_key(o->num)); + s = key_string_lookup_key(o->num); + xsnprintf(out, sizeof out, "%s", s); break; case OPTIONS_TABLE_COLOUR: s = colour_tostring(o->num); diff --git a/options.c b/options.c index 845bd7d5..cb7f3d87 100644 --- a/options.c +++ b/options.c @@ -37,8 +37,6 @@ struct options { static int options_cmp(struct options_entry *, struct options_entry *); RB_GENERATE_STATIC(options_tree, options_entry, entry, options_cmp); -static void options_free1(struct options *, struct options_entry *); - static int options_cmp(struct options_entry *o1, struct options_entry *o2) { @@ -66,6 +64,28 @@ options_free1(struct options *oo, struct options_entry *o) free(o); } +static struct options_entry * +options_new(struct options *oo, const char *name, char **s) +{ + struct options_entry *o; + + if (s != NULL) + *s = NULL; + + if ((o = options_find1(oo, name)) == NULL) { + o = xmalloc(sizeof *o); + o->name = xstrdup(name); + RB_INSERT(options_tree, &oo->tree, o); + memcpy(&o->style, &grid_default_cell, sizeof o->style); + } else if (o->type == OPTIONS_STRING) { + if (s != NULL) + *s = o->str; + else + free(o->str); + } + return (o); +} + void options_free(struct options *oo) { @@ -129,21 +149,14 @@ options_set_string(struct options *oo, const char *name, const char *fmt, ...) va_list ap; char *s; - s = NULL; - if ((o = options_find1(oo, name)) == NULL) { - o = xmalloc(sizeof *o); - o->name = xstrdup(name); - RB_INSERT(options_tree, &oo->tree, o); - memcpy(&o->style, &grid_default_cell, sizeof o->style); - } else if (o->type == OPTIONS_STRING) - s = o->str; - va_start(ap, fmt); + + o = options_new(oo, name, &s); o->type = OPTIONS_STRING; xvasprintf(&o->str, fmt, ap); - va_end(ap); - free(s); + + va_end(ap); return (o); } @@ -164,16 +177,10 @@ options_set_number(struct options *oo, const char *name, long long value) { struct options_entry *o; - if ((o = options_find1(oo, name)) == NULL) { - o = xmalloc(sizeof *o); - o->name = xstrdup(name); - RB_INSERT(options_tree, &oo->tree, o); - memcpy(&o->style, &grid_default_cell, sizeof o->style); - } else if (o->type == OPTIONS_STRING) - free(o->str); - + o = options_new(oo, name, NULL); o->type = OPTIONS_NUMBER; o->num = value; + return (o); } @@ -205,15 +212,10 @@ options_set_style(struct options *oo, const char *name, const char *value, if (style_parse(&grid_default_cell, &tmpgc, value) == -1) return (NULL); - if (o == NULL) { - o = xmalloc(sizeof *o); - o->name = xstrdup(name); - RB_INSERT(options_tree, &oo->tree, o); - } else if (o->type == OPTIONS_STRING) - free(o->str); - + o = options_new(oo, name, NULL); o->type = OPTIONS_STYLE; memcpy(&o->style, &tmpgc, sizeof o->style); + return (o); } diff --git a/tmux.h b/tmux.h index ce9cb85c..e0087101 100644 --- a/tmux.h +++ b/tmux.h @@ -654,7 +654,7 @@ struct options_entry { long long num; struct grid_cell style; - RB_ENTRY(options_entry) entry; + RB_ENTRY(options_entry) entry; }; /* Scheduled job. */