mirror of
https://github.com/tmux/tmux.git
synced 2024-12-24 18:38:48 +00:00
Notify when a paste buffer is deleted, GitHub issue 3302 from George
Nachman.
This commit is contained in:
parent
03149bf7f6
commit
7c2dcd7238
@ -234,3 +234,16 @@ control_notify_session_window_changed(struct session *s)
|
|||||||
s->curw->window->id);
|
s->curw->window->id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
control_notify_paste_buffer_changed(const char *name)
|
||||||
|
{
|
||||||
|
struct client *c;
|
||||||
|
|
||||||
|
TAILQ_FOREACH(c, &clients, entry) {
|
||||||
|
if (!CONTROL_SHOULD_NOTIFY_CLIENT(c))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
control_write(c, "%%paste-changed %s", name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
29
notify.c
29
notify.c
@ -33,6 +33,7 @@ struct notify_entry {
|
|||||||
struct session *session;
|
struct session *session;
|
||||||
struct window *window;
|
struct window *window;
|
||||||
int pane;
|
int pane;
|
||||||
|
const char *pbname;
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct cmdq_item *
|
static struct cmdq_item *
|
||||||
@ -150,6 +151,8 @@ notify_callback(struct cmdq_item *item, void *data)
|
|||||||
control_notify_session_closed(ne->session);
|
control_notify_session_closed(ne->session);
|
||||||
if (strcmp(ne->name, "session-window-changed") == 0)
|
if (strcmp(ne->name, "session-window-changed") == 0)
|
||||||
control_notify_session_window_changed(ne->session);
|
control_notify_session_window_changed(ne->session);
|
||||||
|
if (strcmp(ne->name, "paste-buffer-changed") == 0)
|
||||||
|
control_notify_paste_buffer_changed(ne->pbname);
|
||||||
|
|
||||||
notify_insert_hook(item, ne);
|
notify_insert_hook(item, ne);
|
||||||
|
|
||||||
@ -165,6 +168,7 @@ notify_callback(struct cmdq_item *item, void *data)
|
|||||||
|
|
||||||
format_free(ne->formats);
|
format_free(ne->formats);
|
||||||
free((void *)ne->name);
|
free((void *)ne->name);
|
||||||
|
free((void *)ne->pbname);
|
||||||
free(ne);
|
free(ne);
|
||||||
|
|
||||||
return (CMD_RETURN_NORMAL);
|
return (CMD_RETURN_NORMAL);
|
||||||
@ -172,7 +176,8 @@ notify_callback(struct cmdq_item *item, void *data)
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
notify_add(const char *name, struct cmd_find_state *fs, struct client *c,
|
notify_add(const char *name, struct cmd_find_state *fs, struct client *c,
|
||||||
struct session *s, struct window *w, struct window_pane *wp)
|
struct session *s, struct window *w, struct window_pane *wp,
|
||||||
|
const char *pbname)
|
||||||
{
|
{
|
||||||
struct notify_entry *ne;
|
struct notify_entry *ne;
|
||||||
struct cmdq_item *item;
|
struct cmdq_item *item;
|
||||||
@ -188,6 +193,7 @@ notify_add(const char *name, struct cmd_find_state *fs, struct client *c,
|
|||||||
ne->session = s;
|
ne->session = s;
|
||||||
ne->window = w;
|
ne->window = w;
|
||||||
ne->pane = (wp != NULL ? wp->id : -1);
|
ne->pane = (wp != NULL ? wp->id : -1);
|
||||||
|
ne->pbname = (pbname != NULL ? xstrdup(pbname) : NULL);
|
||||||
|
|
||||||
ne->formats = format_create(NULL, NULL, 0, FORMAT_NOJOBS);
|
ne->formats = format_create(NULL, NULL, 0, FORMAT_NOJOBS);
|
||||||
format_add(ne->formats, "hook", "%s", name);
|
format_add(ne->formats, "hook", "%s", name);
|
||||||
@ -249,7 +255,7 @@ notify_client(const char *name, struct client *c)
|
|||||||
struct cmd_find_state fs;
|
struct cmd_find_state fs;
|
||||||
|
|
||||||
cmd_find_from_client(&fs, c, 0);
|
cmd_find_from_client(&fs, c, 0);
|
||||||
notify_add(name, &fs, c, NULL, NULL, NULL);
|
notify_add(name, &fs, c, NULL, NULL, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -261,7 +267,7 @@ notify_session(const char *name, struct session *s)
|
|||||||
cmd_find_from_session(&fs, s, 0);
|
cmd_find_from_session(&fs, s, 0);
|
||||||
else
|
else
|
||||||
cmd_find_from_nothing(&fs, 0);
|
cmd_find_from_nothing(&fs, 0);
|
||||||
notify_add(name, &fs, NULL, s, NULL, NULL);
|
notify_add(name, &fs, NULL, s, NULL, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -270,7 +276,7 @@ notify_winlink(const char *name, struct winlink *wl)
|
|||||||
struct cmd_find_state fs;
|
struct cmd_find_state fs;
|
||||||
|
|
||||||
cmd_find_from_winlink(&fs, wl, 0);
|
cmd_find_from_winlink(&fs, wl, 0);
|
||||||
notify_add(name, &fs, NULL, wl->session, wl->window, NULL);
|
notify_add(name, &fs, NULL, wl->session, wl->window, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -279,7 +285,7 @@ notify_session_window(const char *name, struct session *s, struct window *w)
|
|||||||
struct cmd_find_state fs;
|
struct cmd_find_state fs;
|
||||||
|
|
||||||
cmd_find_from_session_window(&fs, s, w, 0);
|
cmd_find_from_session_window(&fs, s, w, 0);
|
||||||
notify_add(name, &fs, NULL, s, w, NULL);
|
notify_add(name, &fs, NULL, s, w, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -288,7 +294,7 @@ notify_window(const char *name, struct window *w)
|
|||||||
struct cmd_find_state fs;
|
struct cmd_find_state fs;
|
||||||
|
|
||||||
cmd_find_from_window(&fs, w, 0);
|
cmd_find_from_window(&fs, w, 0);
|
||||||
notify_add(name, &fs, NULL, NULL, w, NULL);
|
notify_add(name, &fs, NULL, NULL, w, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -297,5 +303,14 @@ notify_pane(const char *name, struct window_pane *wp)
|
|||||||
struct cmd_find_state fs;
|
struct cmd_find_state fs;
|
||||||
|
|
||||||
cmd_find_from_pane(&fs, wp, 0);
|
cmd_find_from_pane(&fs, wp, 0);
|
||||||
notify_add(name, &fs, NULL, NULL, NULL, wp);
|
notify_add(name, &fs, NULL, NULL, NULL, wp, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
notify_paste_buffer(const char *pbname)
|
||||||
|
{
|
||||||
|
struct cmd_find_state fs;
|
||||||
|
|
||||||
|
cmd_find_clear_state(&fs, 0);
|
||||||
|
notify_add("paste-buffer-changed", &fs, NULL, NULL, NULL, NULL, pbname);
|
||||||
}
|
}
|
||||||
|
11
paste.c
11
paste.c
@ -151,6 +151,8 @@ paste_get_name(const char *name)
|
|||||||
void
|
void
|
||||||
paste_free(struct paste_buffer *pb)
|
paste_free(struct paste_buffer *pb)
|
||||||
{
|
{
|
||||||
|
notify_paste_buffer(pb->name);
|
||||||
|
|
||||||
RB_REMOVE(paste_name_tree, &paste_by_name, pb);
|
RB_REMOVE(paste_name_tree, &paste_by_name, pb);
|
||||||
RB_REMOVE(paste_time_tree, &paste_by_time, pb);
|
RB_REMOVE(paste_time_tree, &paste_by_time, pb);
|
||||||
if (pb->automatic)
|
if (pb->automatic)
|
||||||
@ -207,6 +209,8 @@ paste_add(const char *prefix, char *data, size_t size)
|
|||||||
pb->order = paste_next_order++;
|
pb->order = paste_next_order++;
|
||||||
RB_INSERT(paste_name_tree, &paste_by_name, pb);
|
RB_INSERT(paste_name_tree, &paste_by_name, pb);
|
||||||
RB_INSERT(paste_time_tree, &paste_by_time, pb);
|
RB_INSERT(paste_time_tree, &paste_by_time, pb);
|
||||||
|
|
||||||
|
notify_paste_buffer(pb->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Rename a paste buffer. */
|
/* Rename a paste buffer. */
|
||||||
@ -254,6 +258,9 @@ paste_rename(const char *oldname, const char *newname, char **cause)
|
|||||||
|
|
||||||
RB_INSERT(paste_name_tree, &paste_by_name, pb);
|
RB_INSERT(paste_name_tree, &paste_by_name, pb);
|
||||||
|
|
||||||
|
notify_paste_buffer(oldname);
|
||||||
|
notify_paste_buffer(newname);
|
||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -302,6 +309,8 @@ paste_set(char *data, size_t size, const char *name, char **cause)
|
|||||||
RB_INSERT(paste_name_tree, &paste_by_name, pb);
|
RB_INSERT(paste_name_tree, &paste_by_name, pb);
|
||||||
RB_INSERT(paste_time_tree, &paste_by_time, pb);
|
RB_INSERT(paste_time_tree, &paste_by_time, pb);
|
||||||
|
|
||||||
|
notify_paste_buffer(name);
|
||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -312,6 +321,8 @@ paste_replace(struct paste_buffer *pb, char *data, size_t size)
|
|||||||
free(pb->data);
|
free(pb->data);
|
||||||
pb->data = data;
|
pb->data = data;
|
||||||
pb->size = size;
|
pb->size = size;
|
||||||
|
|
||||||
|
notify_paste_buffer(pb->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Convert start of buffer into a nice string. */
|
/* Convert start of buffer into a nice string. */
|
||||||
|
4
tmux.1
4
tmux.1
@ -6596,6 +6596,10 @@ escapes non-printable characters and backslash as octal \\xxx.
|
|||||||
The pane with ID
|
The pane with ID
|
||||||
.Ar pane-id
|
.Ar pane-id
|
||||||
has changed mode.
|
has changed mode.
|
||||||
|
.It Ic %paste-buffer-changed Ar name
|
||||||
|
Paste buffer
|
||||||
|
.Ar name
|
||||||
|
has been changed.
|
||||||
.It Ic %pause Ar pane-id
|
.It Ic %pause Ar pane-id
|
||||||
The pane has been paused (if the
|
The pane has been paused (if the
|
||||||
.Ar pause-after
|
.Ar pause-after
|
||||||
|
2
tmux.h
2
tmux.h
@ -2154,6 +2154,7 @@ void notify_winlink(const char *, struct winlink *);
|
|||||||
void notify_session_window(const char *, struct session *, struct window *);
|
void notify_session_window(const char *, struct session *, struct window *);
|
||||||
void notify_window(const char *, struct window *);
|
void notify_window(const char *, struct window *);
|
||||||
void notify_pane(const char *, struct window_pane *);
|
void notify_pane(const char *, struct window_pane *);
|
||||||
|
void notify_paste_buffer(const char *);
|
||||||
|
|
||||||
/* options.c */
|
/* options.c */
|
||||||
struct options *options_create(struct options *);
|
struct options *options_create(struct options *);
|
||||||
@ -3174,6 +3175,7 @@ void control_notify_session_renamed(struct session *);
|
|||||||
void control_notify_session_created(struct session *);
|
void control_notify_session_created(struct session *);
|
||||||
void control_notify_session_closed(struct session *);
|
void control_notify_session_closed(struct session *);
|
||||||
void control_notify_session_window_changed(struct session *);
|
void control_notify_session_window_changed(struct session *);
|
||||||
|
void control_notify_paste_buffer_changed(const char *);
|
||||||
|
|
||||||
/* session.c */
|
/* session.c */
|
||||||
extern struct sessions sessions;
|
extern struct sessions sessions;
|
||||||
|
Loading…
Reference in New Issue
Block a user