mirror of
https://github.com/tmux/tmux.git
synced 2026-08-03 14:08:59 +00:00
Tidy and fixes.
This commit is contained in:
@@ -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)
|
||||
|
||||
44
events.c
44
events.c
@@ -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
24
hooks.c
@@ -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);
|
||||
|
||||
4
notify.c
4
notify.c
@@ -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);
|
||||
}
|
||||
|
||||
1
server.c
1
server.c
@@ -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
11
tmux.h
@@ -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 *,
|
||||
|
||||
Reference in New Issue
Block a user