Move hook format setup earlier and add a hook_client, GitHub issue 2809.

pull/2824/head
nicm 2021-08-12 08:05:11 +00:00
parent 7eea3d7ab8
commit 163908fe8a
5 changed files with 58 additions and 25 deletions

View File

@ -269,6 +269,15 @@ cmdq_add_format(struct cmdq_state *state, const char *key, const char *fmt, ...)
free(value); free(value);
} }
/* Add formats to command queue. */
void
cmdq_add_formats(struct cmdq_state *state, struct format_tree *ft)
{
if (state->formats == NULL)
state->formats = format_create(NULL, NULL, FORMAT_NONE, 0);
format_merge(state->formats, ft);
}
/* Merge formats from item. */ /* Merge formats from item. */
void void
cmdq_merge_formats(struct cmdq_item *item, struct format_tree *ft) cmdq_merge_formats(struct cmdq_item *item, struct format_tree *ft)

View File

@ -929,6 +929,9 @@ format_cb_pane_fg(struct format_tree *ft)
struct window_pane *wp = ft->wp; struct window_pane *wp = ft->wp;
struct grid_cell gc; struct grid_cell gc;
if (wp == NULL)
return (NULL);
tty_default_colours(&gc, wp); tty_default_colours(&gc, wp);
return (xstrdup(colour_tostring(gc.fg))); return (xstrdup(colour_tostring(gc.fg)));
} }
@ -940,6 +943,9 @@ format_cb_pane_bg(struct format_tree *ft)
struct window_pane *wp = ft->wp; struct window_pane *wp = ft->wp;
struct grid_cell gc; struct grid_cell gc;
if (wp == NULL)
return (NULL);
tty_default_colours(&gc, wp); tty_default_colours(&gc, wp);
return (xstrdup(colour_tostring(gc.bg))); return (xstrdup(colour_tostring(gc.bg)));
} }
@ -3079,6 +3085,22 @@ format_free(struct format_tree *ft)
free(ft); free(ft);
} }
/* Log each format. */
static void
format_log_debug_cb(const char *key, const char *value, void *arg)
{
const char *prefix = arg;
log_debug("%s: %s=%s", prefix, key, value);
}
/* Log a format tree. */
void
format_log_debug(struct format_tree *ft, const char *prefix)
{
format_each(ft, format_log_debug_cb, prefix);
}
/* Walk each format. */ /* Walk each format. */
void void
format_each(struct format_tree *ft, void (*cb)(const char *, const char *, format_each(struct format_tree *ft, void (*cb)(const char *, const char *,

View File

@ -26,31 +26,15 @@
struct notify_entry { struct notify_entry {
const char *name; const char *name;
struct cmd_find_state fs;
struct format_tree *formats;
struct client *client; struct client *client;
struct session *session; struct session *session;
struct window *window; struct window *window;
int pane; int pane;
struct cmd_find_state fs;
}; };
static void
notify_hook_formats(struct cmdq_state *state, struct session *s,
struct window *w, int pane)
{
if (s != NULL) {
cmdq_add_format(state, "hook_session", "$%u", s->id);
cmdq_add_format(state, "hook_session_name", "%s", s->name);
}
if (w != NULL) {
cmdq_add_format(state, "hook_window", "@%u", w->id);
cmdq_add_format(state, "hook_window_name", "%s", w->name);
}
if (pane != -1)
cmdq_add_format(state, "hook_pane", "%%%d", pane);
}
static void static void
notify_insert_hook(struct cmdq_item *item, struct notify_entry *ne) notify_insert_hook(struct cmdq_item *item, struct notify_entry *ne)
{ {
@ -58,8 +42,6 @@ notify_insert_hook(struct cmdq_item *item, struct notify_entry *ne)
struct options *oo; struct options *oo;
struct cmdq_item *new_item; struct cmdq_item *new_item;
struct cmdq_state *new_state; struct cmdq_state *new_state;
struct session *s = ne->session;
struct window *w = ne->window;
struct options_entry *o; struct options_entry *o;
struct options_array_item *a; struct options_array_item *a;
struct cmd_list *cmdlist; struct cmd_list *cmdlist;
@ -89,8 +71,7 @@ notify_insert_hook(struct cmdq_item *item, struct notify_entry *ne)
return; return;
new_state = cmdq_new_state(&fs, NULL, CMDQ_STATE_NOHOOKS); new_state = cmdq_new_state(&fs, NULL, CMDQ_STATE_NOHOOKS);
cmdq_add_format(new_state, "hook", "%s", ne->name); cmdq_add_formats(new_state, ne->formats);
notify_hook_formats(new_state, s, w, ne->pane);
a = options_array_first(o); a = options_array_first(o);
while (a != NULL) { while (a != NULL) {
@ -149,6 +130,7 @@ notify_callback(struct cmdq_item *item, void *data)
if (ne->fs.s != NULL) if (ne->fs.s != NULL)
session_remove_ref(ne->fs.s, __func__); session_remove_ref(ne->fs.s, __func__);
format_free(ne->formats);
free((void *)ne->name); free((void *)ne->name);
free(ne); free(ne);
@ -172,11 +154,23 @@ notify_add(const char *name, struct cmd_find_state *fs, struct client *c,
ne->client = c; ne->client = c;
ne->session = s; ne->session = s;
ne->window = w; ne->window = w;
ne->pane = (wp != NULL ? wp->id : -1);
ne->formats = format_create(NULL, NULL, 0, FORMAT_NOJOBS);
format_add(ne->formats, "hook", "%s", name);
if (c != NULL)
format_add(ne->formats, "hook_client", "%s", c->name);
if (s != NULL) {
format_add(ne->formats, "hook_session", "$%u", s->id);
format_add(ne->formats, "hook_session_name", "%s", s->name);
}
if (w != NULL) {
format_add(ne->formats, "hook_window", "@%u", w->id);
format_add(ne->formats, "hook_window_name", "%s", w->name);
}
if (wp != NULL) if (wp != NULL)
ne->pane = wp->id; format_add(ne->formats, "hook_pane", "%%%d", wp->id);
else format_log_debug(ne->formats, __func__);
ne->pane = -1;
if (c != NULL) if (c != NULL)
c->references++; c->references++;
@ -208,7 +202,12 @@ notify_hook(struct cmdq_item *item, const char *name)
ne.window = target->w; ne.window = target->w;
ne.pane = target->wp->id; ne.pane = target->wp->id;
ne.formats = format_create(NULL, NULL, 0, FORMAT_NOJOBS);
format_add(ne.formats, "hook", "%s", name);
format_log_debug(ne.formats, __func__);
notify_insert_hook(item, &ne); notify_insert_hook(item, &ne);
format_free(ne.formats);
} }
void void

1
tmux.1
View File

@ -4925,6 +4925,7 @@ The following variables are available, where appropriate:
.It Li "history_limit" Ta "" Ta "Maximum window history lines" .It Li "history_limit" Ta "" Ta "Maximum window history lines"
.It Li "history_size" Ta "" Ta "Size of history in lines" .It Li "history_size" Ta "" Ta "Size of history in lines"
.It Li "hook" Ta "" Ta "Name of running hook, if any" .It Li "hook" Ta "" Ta "Name of running hook, if any"
.It Li "hook_client" Ta "" Ta "Name of client where hook was run, if any"
.It Li "hook_pane" Ta "" Ta "ID of pane where hook was run, if any" .It Li "hook_pane" Ta "" Ta "ID of pane where hook was run, if any"
.It Li "hook_session" Ta "" Ta "ID of session where hook was run, if any" .It Li "hook_session" Ta "" Ta "ID of session where hook was run, if any"
.It Li "hook_session_name" Ta "" Ta "Name of session where hook was run, if any" .It Li "hook_session_name" Ta "" Ta "Name of session where hook was run, if any"

2
tmux.h
View File

@ -2023,6 +2023,7 @@ void printflike(3, 4) format_add(struct format_tree *, const char *,
void format_add_tv(struct format_tree *, const char *, void format_add_tv(struct format_tree *, const char *,
struct timeval *); struct timeval *);
void format_add_cb(struct format_tree *, const char *, format_cb); void format_add_cb(struct format_tree *, const char *, format_cb);
void format_log_debug(struct format_tree *, const char *);
void format_each(struct format_tree *, void (*)(const char *, void format_each(struct format_tree *, void (*)(const char *,
const char *, void *), void *); const char *, void *), void *);
char *format_expand_time(struct format_tree *, const char *); char *format_expand_time(struct format_tree *, const char *);
@ -2382,6 +2383,7 @@ struct cmdq_state *cmdq_copy_state(struct cmdq_state *);
void cmdq_free_state(struct cmdq_state *); void cmdq_free_state(struct cmdq_state *);
void printflike(3, 4) cmdq_add_format(struct cmdq_state *, const char *, void printflike(3, 4) cmdq_add_format(struct cmdq_state *, const char *,
const char *, ...); const char *, ...);
void cmdq_add_formats(struct cmdq_state *, struct format_tree *);
void cmdq_merge_formats(struct cmdq_item *, struct format_tree *); void cmdq_merge_formats(struct cmdq_item *, struct format_tree *);
struct cmdq_list *cmdq_new(void); struct cmdq_list *cmdq_new(void);
void cmdq_free(struct cmdq_list *); void cmdq_free(struct cmdq_list *);