Tidy and fixes.

This commit is contained in:
Nicholas Marriott
2026-07-05 18:58:40 +01:00
parent 688529f128
commit 0f7d07c2ce
6 changed files with 95 additions and 67 deletions

View File

@@ -34,6 +34,8 @@ struct event_payload_item {
union {
char *string;
time_t time;
int number;
u_int unsigned_number;
struct client *client;
struct session *session;
struct window *window;
@@ -80,21 +82,20 @@ event_payload_free_value(struct event_payload_item *epi)
free(epi->string);
break;
case EVENT_PAYLOAD_CLIENT:
if (epi->client != NULL)
server_client_unref(epi->client);
server_client_unref(epi->client);
break;
case EVENT_PAYLOAD_SESSION:
if (epi->session != NULL)
session_remove_ref(epi->session, __func__);
session_remove_ref(epi->session, __func__);
break;
case EVENT_PAYLOAD_WINDOW:
if (epi->window != NULL)
window_remove_ref(epi->window, __func__);
window_remove_ref(epi->window, __func__);
break;
case EVENT_PAYLOAD_POINTER:
if (epi->pointer.free_cb != NULL)
epi->pointer.free_cb(epi->pointer.ptr);
break;
case EVENT_PAYLOAD_INT:
case EVENT_PAYLOAD_UINT:
case EVENT_PAYLOAD_TIME:
case EVENT_PAYLOAD_PANE:
case EVENT_PAYLOAD_WINLINK:
@@ -179,6 +180,30 @@ event_payload_set_time(struct event_payload *ep, const char *name,
event_payload_set_item(ep, name, epi);
}
/* Set a number item. */
void
event_payload_set_int(struct event_payload *ep, const char *name, int value)
{
struct event_payload_item *epi;
epi = xcalloc(1, sizeof *epi);
epi->type = EVENT_PAYLOAD_INT;
epi->number = value;
event_payload_set_item(ep, name, epi);
}
/* Set an unsigned number item. */
void
event_payload_set_uint(struct event_payload *ep, const char *name, u_int value)
{
struct event_payload_item *epi;
epi = xcalloc(1, sizeof *epi);
epi->type = EVENT_PAYLOAD_UINT;
epi->unsigned_number = value;
event_payload_set_item(ep, name, epi);
}
/* Set a client item. */
void
event_payload_set_client(struct event_payload *ep, const char *name,
@@ -186,8 +211,7 @@ event_payload_set_client(struct event_payload *ep, const char *name,
{
struct event_payload_item *epi;
if (c != NULL)
c->references++;
c->references++;
epi = xcalloc(1, sizeof *epi);
epi->type = EVENT_PAYLOAD_CLIENT;
@@ -202,8 +226,7 @@ event_payload_set_session(struct event_payload *ep, const char *name,
{
struct event_payload_item *epi;
if (s != NULL)
session_add_ref(s, __func__);
session_add_ref(s, __func__);
epi = xcalloc(1, sizeof *epi);
epi->type = EVENT_PAYLOAD_SESSION;
@@ -218,8 +241,7 @@ event_payload_set_window(struct event_payload *ep, const char *name,
{
struct event_payload_item *epi;
if (w != NULL)
window_add_ref(w, __func__);
window_add_ref(w, __func__);
epi = xcalloc(1, sizeof *epi);
epi->type = EVENT_PAYLOAD_WINDOW;
@@ -293,6 +315,12 @@ event_payload_add_item(struct event_payload_item *epi, struct evbuffer *evb)
case EVENT_PAYLOAD_TIME:
evbuffer_add_printf(evb, "%lld", (long long)epi->time);
break;
case EVENT_PAYLOAD_INT:
evbuffer_add_printf(evb, "%d", epi->number);
break;
case EVENT_PAYLOAD_UINT:
evbuffer_add_printf(evb, "%u", epi->unsigned_number);
break;
case EVENT_PAYLOAD_CLIENT:
if (epi->client != NULL)
evbuffer_add_printf(evb, "%s", epi->client->name);
@@ -423,6 +451,32 @@ event_payload_get_time(struct event_payload *ep, const char *name)
return (epi->time);
}
/* Get a number item. */
int
event_payload_get_int(struct event_payload *ep, const char *name, int *value)
{
struct event_payload_item *epi;
epi = event_payload_find(ep, name);
if (epi == NULL || epi->type != EVENT_PAYLOAD_INT)
return (-1);
*value = epi->number;
return (0);
}
/* Get an unsigned number item. */
int
event_payload_get_uint(struct event_payload *ep, const char *name, u_int *value)
{
struct event_payload_item *epi;
epi = event_payload_find(ep, name);
if (epi == NULL || epi->type != EVENT_PAYLOAD_UINT)
return (-1);
*value = epi->unsigned_number;
return (0);
}
/* Get a client item. */
struct client *
event_payload_get_client(struct event_payload *ep, const char *name)

View File

@@ -23,13 +23,6 @@
#include "tmux.h"
/* Event type metadata. */
struct events_type {
char *name;
RB_ENTRY(events_type) entry;
};
/* Event sink. */
struct events_sink {
char *name;
@@ -41,31 +34,12 @@ struct events_sink {
TAILQ_ENTRY(events_sink) entry;
};
static int
events_type_cmp(struct events_type *et1, struct events_type *et2)
{
return (strcmp(et1->name, et2->name));
}
RB_HEAD(events_types, events_type);
static struct events_types events_types = RB_INITIALIZER(events_types);
RB_GENERATE_STATIC(events_types, events_type, entry, events_type_cmp);
TAILQ_HEAD(events_sinks, events_sink);
static struct events_sinks events_sinks = TAILQ_HEAD_INITIALIZER(events_sinks);
static u_int events_dispatching;
static u_int events_generation;
/* Find an event type by name. */
static struct events_type *
events_find_type(const char *name)
{
struct events_type find;
find.name = (char *)name;
return (RB_FIND(events_types, &events_types, &find));
}
/* Free an event sink. */
static void
events_free_sink(struct events_sink *es)
@@ -87,21 +61,6 @@ events_free_dead(void)
}
}
/* Add an event type. */
int
events_add_event(const char *name)
{
struct events_type *et;
if ((et = events_find_type(name)) != NULL)
return (0);
et = xcalloc(1, sizeof *et);
et->name = xstrdup(name);
RB_INSERT(events_types, &events_types, et);
return (0);
}
/* Add an event sink. */
struct events_sink *
events_add_sink(const char *name, events_cb cb, void *data)
@@ -137,7 +96,8 @@ events_fire(const char *name, struct event_payload *ep)
struct events_sink *es;
u_int generation = events_generation;
event_payload_log(ep, "%s: %s: ", __func__, name);
if (log_get_level() != 0)
event_payload_log(ep, "%s: %s: ", __func__, name);
events_dispatching++;
TAILQ_FOREACH(es, &events_sinks, entry) {

24
hooks.c
View File

@@ -260,9 +260,6 @@ hooks_find_state(struct event_payload *ep, struct cmd_find_state *fs)
struct hook_monitor *hm;
wp = event_payload_get_pane(ep, "pane");
if (wp != NULL && cmd_find_from_pane(fs, wp, 0) == 0)
return;
wl = event_payload_get_winlink(ep, "winlink");
if (wl != NULL) {
if (wp != NULL && wp->window == wl->window) {
@@ -273,6 +270,9 @@ hooks_find_state(struct event_payload *ep, struct cmd_find_state *fs)
return;
}
if (wp != NULL && cmd_find_from_pane(fs, wp, 0) == 0)
return;
s = event_payload_get_session(ep, "session");
w = event_payload_get_window(ep, "window");
if (s != NULL && w != NULL &&
@@ -340,7 +340,7 @@ hooks_event_cb(const char *name, struct event_payload *ep,
}
/* Add a hook event sink. */
void
static void
hooks_add_event(const char *name)
{
struct hooks_event *he;
@@ -356,6 +356,18 @@ hooks_add_event(const char *name)
TAILQ_INSERT_TAIL(&hooks_events, he, entry);
}
/* Add hook event sinks for all built-in hooks. */
void
hooks_build_events(void)
{
const struct options_table_entry *oe;
for (oe = options_table; oe->name != NULL; oe++) {
if (oe->flags & OPTIONS_TABLE_IS_HOOK)
hooks_add_event(oe->name);
}
}
/* Run a hook immediately. */
void
hooks_run(struct cmdq_item *item, const char *name)
@@ -445,8 +457,7 @@ hooks_monitor_cb(struct monitor_change *change, void *data)
event_payload_set_session(ep, "session",
wl->session);
event_payload_set_window(ep, "window", wl->window);
event_payload_set_string(ep, "window_index", "%d",
wl->idx);
event_payload_set_int(ep, "window_index", wl->idx);
event_payload_set_winlink(ep, "winlink", wl);
}
if (wp != NULL) {
@@ -479,7 +490,6 @@ hooks_monitor_add(__unused struct cmdq_item *item, struct options *oo,
hm->id = id;
hm->format = xstrdup(format);
hm->set = monitor_create_session(s, hooks_monitor_cb, hm);
events_add_event(name);
hm->sink = events_add_sink(name, hooks_monitor_hook_cb, hm);
options_set_monitor_data(o, hm);
monitor_add(hm->set, name, type, id, format, 0);

View File

@@ -37,8 +37,6 @@ notify_callback(__unused struct cmdq_item *item, void *data)
log_debug("%s: %s", __func__, ne->name);
events_add_event(ne->name);
hooks_add_event(ne->name);
events_fire(ne->name, ne->payload);
ne->payload = NULL;
@@ -95,7 +93,7 @@ notify_winlink(const char *name, struct winlink *wl)
ep = event_payload_create();
event_payload_set_session(ep, "session", wl->session);
event_payload_set_window(ep, "window", wl->window);
event_payload_set_string(ep, "window_index", "%d", wl->idx);
event_payload_set_int(ep, "window_index", wl->idx);
event_payload_set_winlink(ep, "winlink", wl);
notify_add(name, ep);
}

View File

@@ -215,6 +215,7 @@ server_start(struct tmuxproc *client, uint64_t flags, struct event_base *base,
RB_INIT(&sessions);
key_bindings_init();
control_build_events();
hooks_build_events();
TAILQ_INIT(&message_log);
gettimeofday(&start_time, NULL);

11
tmux.h
View File

@@ -2346,6 +2346,8 @@ typedef void (*monitor_cb)(struct monitor_change *, void *);
enum event_payload_type {
EVENT_PAYLOAD_STRING,
EVENT_PAYLOAD_TIME,
EVENT_PAYLOAD_INT,
EVENT_PAYLOAD_UINT,
EVENT_PAYLOAD_CLIENT,
EVENT_PAYLOAD_SESSION,
EVENT_PAYLOAD_WINDOW,
@@ -2676,6 +2678,8 @@ char *event_payload_item_print(struct event_payload_item *);
void printflike(3, 4) event_payload_set_string(struct event_payload *,
const char *, const char *, ...);
void event_payload_set_time(struct event_payload *, const char *, time_t);
void event_payload_set_int(struct event_payload *, const char *, int);
void event_payload_set_uint(struct event_payload *, const char *, u_int);
void event_payload_set_client(struct event_payload *, const char *,
struct client *);
void event_payload_set_session(struct event_payload *, const char *,
@@ -2694,7 +2698,9 @@ struct event_payload_item *event_payload_first(struct event_payload *);
struct event_payload_item *event_payload_next(struct event_payload_item *);
const char *event_payload_item_name(struct event_payload_item *);
enum event_payload_type event_payload_item_type(struct event_payload_item *);
time_t event_payload_get_time(struct event_payload *, const char *);
time_t event_payload_get_time(struct event_payload *, const char *);
int event_payload_get_int(struct event_payload *, const char *, int *);
int event_payload_get_uint(struct event_payload *, const char *, u_int *);
struct client *event_payload_get_client(struct event_payload *, const char *);
struct session *event_payload_get_session(struct event_payload *, const char *);
struct window *event_payload_get_window(struct event_payload *, const char *);
@@ -2705,7 +2711,6 @@ void *event_payload_get_pointer(struct event_payload *, const char *);
/* events.c */
typedef void (*events_cb)(const char *, struct event_payload *, void *);
int events_add_event(const char *);
struct events_sink *events_add_sink(const char *, events_cb, void *);
void events_remove_sink(struct events_sink *);
void events_fire(const char *, struct event_payload *);
@@ -2718,7 +2723,7 @@ char *format_trim_left(const char *, u_int);
char *format_trim_right(const char *, u_int);
/* hooks.c */
void hooks_add_event(const char *);
void hooks_build_events(void);
void hooks_run(struct cmdq_item *, const char *);
void hooks_monitor_add(struct cmdq_item *, struct options *,
const char *, enum monitor_type, int, const char *,