Looks good, but I think we should use c->name for %%client-session-changed not the PID. Does that change anything for your use?
On Wed, May 03, 2017 at 02:22:24AM -0500, Joshua Brot wrote: > No problem. > > On 5/3/17, Nicholas Marriott <nicholas.marri...@gmail.com> wrote: > > Can you send me everything together please? > > > > > > On Wed, May 03, 2017 at 01:14:09AM -0500, Joshua Brot wrote: > >> I've now implemented the client-session-changed control mode hook per > >> our discussion. Furthermore, I discovered that client-session-changed > >> was not being sent during the switch client command which explains why > >> it was not firing enough earlier. My patch corrects this behavior. I > >> then proceeded to grep the entire source for "session = " and can say > >> with relative confidence that at every other place where the session > >> gets changed, the client-session-changed notification is properly > >> sent. > >> > >> I've attached a separate patch from last time. Let me know if you'd > >> prefer to have one patch with both changes. Also let me know if > >> there's anything else that needs changing in the patch. All together, > >> with these two patches I'm very satisfied with the data provided by > >> control mode and I believe I should be able to complete my project as > >> planned. :) > >> > >> Thanks, > >> Joshua > >> > >> On 5/2/17, Nicholas Marriott <nicholas.marri...@gmail.com> wrote: > >> > I think all sessions windows panes is OK, at the moment only input is > >> > filtered by the control client's session (because it is high volume). > >> > > >> > pane-mode-changed it would be nice if it showed the mode but TBH it is > >> > probably not worth the trouble if doing ls/lsp/whatever is fine (can > >> > add > >> > a format to show the name of the mode if needed). > >> > > >> > For client-session-changed I suggest splitting it into > >> > %%session-changed > >> > (for this client's session like now) and %%client-session-changed (for > >> > another client's session). You'll need to loop over all clients and > >> > choose which one to use, like it does for window-renamed etc. > >> > > >> > > >> > > >> > > >> > On Tue, May 02, 2017 at 08:37:16PM -0500, Joshua Brot wrote: > >> >> Thanks for the pointers. Based off of what you said, I've created a > >> >> patch which implements the features I mentioned. Two things I'm not > >> >> sure about: 1) it seems like the control mode client will receive > >> >> these notifications for all sessions/windows/panes, as opposed to > >> >> notifications for the current session only. Should I revise the patch > >> >> to add in filtes for this? 2) For the pane-mode-changed notification, > >> >> it looks like I only get the pane-id which means the notification > >> >> doesn't report much and I'll probably have to perform a list-panes > >> >> query in response to get more information. Neither of these issues > >> >> seem very problematic, though, so perhaps its best to just leave the > >> >> patch as it is. > >> >> > >> >> With regards to the client_session_changed callback, what I'd like is > >> >> to have a notification for when any client changes sessions (not just > >> >> the one running Control Mode). I thought that client_session_changed > >> >> was called every time a client changed sessions, but in testing this > >> >> appears not to be the case (I'm not even quite sure when it does get > >> >> called). Should this be a new control mode notification like the ones > >> >> I just implemented, or should this be handled in a different way? > >> >> > >> >> Thanks, > >> >> Joshua > >> >> > >> >> On 5/2/17, Nicholas Marriott <nicholas.marri...@gmail.com> wrote: > >> >> > Hi > >> >> > > >> >> > What have you got so far? > >> >> > > >> >> > Control mode should already get updated for client-session-changed, > >> >> > if > >> >> > you look at notify.c:notify_callback there is already a check that > >> >> > passes it into control_notify_client_session_changed. > >> >> > > >> >> > For new ones you will need to add a notify_add call somewhere and > >> >> > then > >> >> > add a control-notify.c function and a check in notify_callback, for > >> >> > active pane it'll probably need a notify_add call in > >> >> > window.c:window_set_active_pane. > >> >> > > >> >> > Mode changes you can do in window_pane_set_mode and > >> >> > window_pane_reset_mode. > >> >> > > >> >> > > >> >> > On Tue, May 02, 2017 at 02:27:57AM -0500, Joshua Brot wrote: > >> >> >> Hi! > >> >> >> > >> >> >> I???m currently in the process of writing a Wayland Compositor with > >> >> >> the > >> >> >> goal of using tmux as a tiling window manager. Basically, the > >> >> >> compositor > >> >> >> provides an interface similar to the TTY with tmux running. When > >> >> >> the > >> >> >> user > >> >> >> launches a visual application, the compositor will then overlay it > >> >> >> on > >> >> >> the > >> >> >> pane from which it was launched. My current strategy for > >> >> >> implementing > >> >> >> this > >> >> >> is to launch an internal tmux client in control mode to every > >> >> >> session > >> >> >> on > >> >> >> the server in order to track what actions the client is taking and > >> >> >> respond > >> >> >> accordingly. > >> >> >> > >> >> >> In its current state, tmux???s control mode looks like it provides > >> >> >> almost > >> >> >> enough capabilities to make this project work. The biggest thing it > >> >> >> is > >> >> >> missing are notifications for when the user switches active panes > >> >> >> within a > >> >> >> window and when the user switches active windows in a session. It > >> >> >> would > >> >> >> also be nice to have a notification for when the user switches into > >> >> >> and > >> >> >> out of copy mode, but this isn???t essential. Finally, it would be > >> >> >> nice > >> >> >> to > >> >> >> get notifications on the ???client-session-changed??? hook, but > >> >> >> since > >> >> >> there is a hook already I can very easily work around this. > >> >> >> > >> >> >> I have begun to look through tmux???s source in order to implement > >> >> >> these > >> >> >> features myself, but I haven???t made much progress yet as the > >> >> >> project > >> >> >> is > >> >> >> quite large and I???m not familiar enough with all of the use cases > >> >> >> needed > >> >> >> to make these notifications always work. Any advice on how to > >> >> >> implement > >> >> >> these features would be much appreciated (or if someone is willing > >> >> >> to > >> >> >> implement the features themself, that would be great too :). > >> >> >> Finally, > >> >> >> any > >> >> >> feedback on my general strategy would be appreciated as I???m not > >> >> >> entirely > >> >> >> sure if I???m going about this in a reasonable way. > >> >> >> > >> >> >> Thanks! > >> >> >> ???Joshua Brot > >> >> >> > >> >> >> -- > >> >> >> You received this message because you are subscribed to the Google > >> >> >> Groups > >> >> >> "tmux-users" group. > >> >> >> To unsubscribe from this group and stop receiving emails from it, > >> >> >> send > >> >> >> an > >> >> >> email to tmux-users+unsubscr...@googlegroups.com. > >> >> >> To post to this group, send an email to > >> >> >> tmux-users@googlegroups.com. > >> >> >> For more options, visit https://groups.google.com/d/optout. > >> >> > > >> > > >> >> From c830ea1e227b73888f51961eb7517deac2f93981 Mon Sep 17 00:00:00 2001 > >> >> From: Joshua Brot <jb...@umich.edu> > >> >> Date: Tue, 2 May 2017 20:12:16 -0500 > >> >> Subject: [PATCH] Added several features to command mode. > >> >> > >> >> Signed-off-by: Joshua Brot <jb...@umich.edu> > >> >> --- > >> >> control-notify.c | 41 +++++++++++++++++++++++++++++++++++++++++ > >> >> notify.c | 6 ++++++ > >> >> session.c | 1 + > >> >> tmux.1 | 14 ++++++++++++++ > >> >> tmux.h | 3 +++ > >> >> window.c | 13 +++++++++++-- > >> >> 6 files changed, 76 insertions(+), 2 deletions(-) > >> >> > >> >> diff --git a/control-notify.c b/control-notify.c > >> >> index 230bce61..056e1992 100644 > >> >> --- a/control-notify.c > >> >> +++ b/control-notify.c > >> >> @@ -60,6 +60,19 @@ control_notify_input(struct client *c, struct > >> >> window_pane *wp, > >> >> } > >> >> > >> >> void > >> >> +control_notify_pane_mode_changed(int pane) > >> >> +{ > >> >> + struct client *c; > >> >> + > >> >> + TAILQ_FOREACH(c, &clients, entry) { > >> >> + if (!CONTROL_SHOULD_NOTIFY_CLIENT(c)) > >> >> + continue; > >> >> + > >> >> + control_write(c, "%%pane-mode-changed %%%u", pane); > >> >> + } > >> >> +} > >> >> + > >> >> +void > >> >> control_notify_window_layout_changed(struct window *w) > >> >> { > >> >> struct client *c; > >> >> @@ -97,6 +110,20 @@ control_notify_window_layout_changed(struct window > >> >> *w) > >> >> } > >> >> > >> >> void > >> >> +control_notify_window_pane_changed(struct window *w) > >> >> +{ > >> >> + struct client *c; > >> >> + > >> >> + TAILQ_FOREACH(c, &clients, entry) { > >> >> + if (!CONTROL_SHOULD_NOTIFY_CLIENT(c)) > >> >> + continue; > >> >> + > >> >> + control_write(c, "%%window-pane-changed @%u %%%u", > >> >> + w->id, w->active->id); > >> >> + } > >> >> +} > >> >> + > >> >> +void > >> >> control_notify_window_unlinked(__unused struct session *s, struct > >> >> window > >> >> *w) > >> >> { > >> >> struct client *c; > >> >> @@ -203,3 +230,17 @@ control_notify_session_closed(__unused struct > >> >> session > >> >> *s) > >> >> control_write(c, "%%sessions-changed"); > >> >> } > >> >> } > >> >> + > >> >> +void > >> >> +control_notify_session_window_changed(struct session *s) > >> >> +{ > >> >> + struct client *c; > >> >> + > >> >> + TAILQ_FOREACH(c, &clients, entry) { > >> >> + if (!CONTROL_SHOULD_NOTIFY_CLIENT(c)) > >> >> + continue; > >> >> + > >> >> + control_write(c, "%%session-window-changed $%u @%u", > >> >> + s->id, s->curw->window->id); > >> >> + } > >> >> +} > >> >> diff --git a/notify.c b/notify.c > >> >> index 0241fa60..31284127 100644 > >> >> --- a/notify.c > >> >> +++ b/notify.c > >> >> @@ -78,8 +78,12 @@ notify_callback(struct cmdq_item *item, void *data) > >> >> > >> >> log_debug("%s: %s", __func__, ne->name); > >> >> > >> >> + if (strcmp(ne->name, "pane-mode-changed") == 0) > >> >> + control_notify_pane_mode_changed(ne->pane); > >> >> if (strcmp(ne->name, "window-layout-changed") == 0) > >> >> control_notify_window_layout_changed(ne->window); > >> >> + if (strcmp(ne->name, "window-pane-changed") == 0) > >> >> + control_notify_window_pane_changed(ne->window); > >> >> if (strcmp(ne->name, "window-unlinked") == 0) > >> >> control_notify_window_unlinked(ne->session, ne->window); > >> >> if (strcmp(ne->name, "window-linked") == 0) > >> >> @@ -94,6 +98,8 @@ notify_callback(struct cmdq_item *item, void *data) > >> >> control_notify_session_created(ne->session); > >> >> if (strcmp(ne->name, "session-closed") == 0) > >> >> control_notify_session_closed(ne->session); > >> >> + if (strcmp(ne->name, "session-window-changed") == 0) > >> >> + control_notify_session_window_changed(ne->session); > >> >> > >> >> notify_hook(item, ne); > >> >> > >> >> diff --git a/session.c b/session.c > >> >> index b52b0274..b9f30428 100644 > >> >> --- a/session.c > >> >> +++ b/session.c > >> >> @@ -552,6 +552,7 @@ session_set_current(struct session *s, struct > >> >> winlink > >> >> *wl) > >> >> s->curw = wl; > >> >> winlink_clear_flags(wl); > >> >> window_update_activity(wl->window); > >> >> + notify_session("session-window-changed", s); > >> >> return (0); > >> >> } > >> >> > >> >> diff --git a/tmux.1 b/tmux.1 > >> >> index cb069e5e..12bd3509 100644 > >> >> --- a/tmux.1 > >> >> +++ b/tmux.1 > >> >> @@ -4258,6 +4258,10 @@ and the window flags are > >> >> A window pane produced output. > >> >> .Ar value > >> >> escapes non-printable characters and backslash as octal \\xxx. > >> >> +.It Ic %pane-mode-changed Ar pane-id > >> >> +The pane with ID > >> >> +.Ar pane-id > >> >> +has changed mode. > >> >> .It Ic %session-changed Ar session-id Ar name > >> >> The client is now attached to the session with ID > >> >> .Ar session-id , > >> >> @@ -4266,6 +4270,11 @@ which is named > >> >> .It Ic %session-renamed Ar name > >> >> The current session was renamed to > >> >> .Ar name . > >> >> +.It Ic %session-window-changed Ar session-id Ar window-id > >> >> +The session with ID > >> >> +.Ar session-id > >> >> +changed its active window to the window with ID > >> >> +.Ar window-id . > >> >> .It Ic %sessions-changed > >> >> A session was created or destroyed. > >> >> .It Ic %unlinked-window-add Ar window-id > >> >> @@ -4280,6 +4289,11 @@ was linked to the current session. > >> >> The window with ID > >> >> .Ar window-id > >> >> closed. > >> >> +.It Ic %window-pane-changed Ar window-id Ar pane-id > >> >> +The active pane in the window with ID > >> >> +.Ar window-id > >> >> +changed to the pane with ID > >> >> +.Ar pane-id . > >> >> .It Ic %window-renamed Ar window-id Ar name > >> >> The window with ID > >> >> .Ar window-id > >> >> diff --git a/tmux.h b/tmux.h > >> >> index 417145f1..1139d6ba 100644 > >> >> --- a/tmux.h > >> >> +++ b/tmux.h > >> >> @@ -2211,7 +2211,9 @@ void control_write_buffer(struct client *, > >> >> struct > >> >> evbuffer *); > >> >> /* control-notify.c */ > >> >> void control_notify_input(struct client *, struct window_pane *, > >> >> struct evbuffer *); > >> >> +void control_notify_pane_mode_changed(int pane); > >> >> void control_notify_window_layout_changed(struct window *); > >> >> +void control_notify_window_pane_changed(struct window *); > >> >> void control_notify_window_unlinked(struct session *, struct window > >> >> *); > >> >> void control_notify_window_linked(struct session *, struct window *); > >> >> void control_notify_window_renamed(struct window *); > >> >> @@ -2219,6 +2221,7 @@ > >> >> void control_notify_client_session_changed(struct > >> >> client *); > >> >> void control_notify_session_renamed(struct session *); > >> >> void control_notify_session_created(struct session *); > >> >> void control_notify_session_closed(struct session *); > >> >> +void control_notify_session_window_changed(struct session *s); > >> >> > >> >> /* session.c */ > >> >> extern struct sessions sessions; > >> >> diff --git a/window.c b/window.c > >> >> index ed73050e..92742685 100644 > >> >> --- a/window.c > >> >> +++ b/window.c > >> >> @@ -355,6 +355,8 @@ window_create_spawn(const char *name, int argc, > >> >> char > >> >> **argv, const char *path, > >> >> } else > >> >> w->name = default_window_name(w); > >> >> > >> >> + notify_window("window-pane-changed", w); > >> >> + > >> >> return (w); > >> >> } > >> >> > >> >> @@ -441,11 +443,14 @@ window_set_active_pane(struct window *w, struct > >> >> window_pane *wp) > >> >> w->active = TAILQ_PREV(w->active, window_panes, entry); > >> >> if (w->active == NULL) > >> >> w->active = TAILQ_LAST(&w->panes, window_panes); > >> >> - if (w->active == wp) > >> >> + if (w->active == wp) { > >> >> + notify_window("window-pane-changed", w); > >> >> return (1); > >> >> + } > >> >> } > >> >> w->active->active_point = next_active_point++; > >> >> w->active->flags |= PANE_CHANGED; > >> >> + notify_window("window-pane-changed", w); > >> >> return (1); > >> >> } > >> >> > >> >> @@ -621,8 +626,10 @@ window_lost_pane(struct window *w, struct > >> >> window_pane > >> >> *wp) > >> >> if (w->active == NULL) > >> >> w->active = TAILQ_NEXT(wp, entry); > >> >> } > >> >> - if (w->active != NULL) > >> >> + if (w->active != NULL) { > >> >> w->active->flags |= PANE_CHANGED; > >> >> + notify_window("window-pane-changed", w); > >> >> + } > >> >> } else if (wp == w->last) > >> >> w->last = NULL; > >> >> } > >> >> @@ -1196,6 +1203,7 @@ window_pane_set_mode(struct window_pane *wp, > >> >> const > >> >> struct window_mode *mode) > >> >> wp->flags |= (PANE_REDRAW|PANE_CHANGED); > >> >> > >> >> server_status_window(wp->window); > >> >> + notify_pane("pane-mode-changed", wp); > >> >> return (0); > >> >> } > >> >> > >> >> @@ -1215,6 +1223,7 @@ window_pane_reset_mode(struct window_pane *wp) > >> >> wp->flags |= (PANE_REDRAW|PANE_CHANGED); > >> >> > >> >> server_status_window(wp->window); > >> >> + notify_pane("pane-mode-changed", wp); > >> >> } > >> >> > >> >> void > >> >> -- > >> >> 2.12.2 > >> >> > >> > > >> > > > > >> From 4584ea34afd15a75d2480173d2bdceab1bc2df0a Mon Sep 17 00:00:00 2001 > >> From: Joshua Brot <jb...@umich.edu> > >> Date: Wed, 3 May 2017 01:03:56 -0500 > >> Subject: [PATCH] Added missing call to client-session-change and expanded > >> Control Mode notification. > >> > >> Signed-off-by: Joshua Brot <jb...@umich.edu> > >> --- > >> cmd-switch-client.c | 1 + > >> control-notify.c | 19 +++++++++++++++---- > >> tmux.1 | 7 +++++++ > >> 3 files changed, 23 insertions(+), 4 deletions(-) > >> > >> diff --git a/cmd-switch-client.c b/cmd-switch-client.c > >> index 2bc1e10c..a24f0276 100644 > >> --- a/cmd-switch-client.c > >> +++ b/cmd-switch-client.c > >> @@ -129,6 +129,7 @@ cmd_switch_client_exec(struct cmd *self, struct > >> cmdq_item *item) > >> if (~item->shared->flags & CMDQ_SHARED_REPEAT) > >> server_client_set_key_table(c, NULL); > >> status_timer_start(c); > >> + notify_client("client-session-changed", c); > >> session_update_activity(s, NULL); > >> gettimeofday(&s->last_attached_time, NULL); > >> > >> diff --git a/control-notify.c b/control-notify.c > >> index 056e1992..af431892 100644 > >> --- a/control-notify.c > >> +++ b/control-notify.c > >> @@ -181,15 +181,26 @@ control_notify_window_renamed(struct window *w) > >> } > >> > >> void > >> -control_notify_client_session_changed(struct client *c) > >> +control_notify_client_session_changed(struct client *cc) > >> { > >> + struct client *c; > >> struct session *s; > >> > >> - if (!CONTROL_SHOULD_NOTIFY_CLIENT(c) || c->session == NULL) > >> + if (cc->session == NULL) > >> return; > >> - s = c->session; > >> + s = cc->session; > >> > >> - control_write(c, "%%session-changed $%u %s", s->id, s->name); > >> + TAILQ_FOREACH(c, &clients, entry) { > >> + if (!CONTROL_SHOULD_NOTIFY_CLIENT(c) || c->session == NULL) > >> + continue; > >> + > >> + if (cc == c) { > >> + control_write(c, "%%session-changed $%u %s", s->id, > >> s->name); > >> + } else { > >> + control_write(c, "%%client-session-changed %u $%u %s", > >> + cc->pid, s->id, s->name); > >> + } > >> + } > >> } > >> > >> void > >> diff --git a/tmux.1 b/tmux.1 > >> index 12bd3509..9b8215e5 100644 > >> --- a/tmux.1 > >> +++ b/tmux.1 > >> @@ -4236,6 +4236,13 @@ A notification will never occur inside an output > >> block. > >> .Pp > >> The following notifications are defined: > >> .Bl -tag -width Ds > >> +.It Ic %client-session-changed Ar client-pid Ar session-id Ar name > >> +The client with pid > >> +.Ar client-pid > >> +is now attached to the session with ID > >> +.Ar session-id , > >> +which is named > >> +.Ar name . > >> .It Ic %exit Op Ar reason > >> The > >> .Nm > >> -- > >> 2.12.2 > >> > > > > > From 3e8c7bdcadb03e0cf90edfd80a27f6db1fd83cd8 Mon Sep 17 00:00:00 2001 > From: Pamelloes <pamell...@gmail.com> > Date: Wed, 3 May 2017 02:18:14 -0500 > Subject: [PATCH] Added several features to control mode. Also added missing > call to client-session-change. > > Signed-off-by: Joshua Brot <jb...@umich.edu> > --- > cmd-switch-client.c | 1 + > control-notify.c | 60 > +++++++++++++++++++++++++++++++++++++++++++++++++---- > notify.c | 6 ++++++ > session.c | 1 + > tmux.1 | 21 +++++++++++++++++++ > tmux.h | 3 +++ > window.c | 13 ++++++++++-- > 7 files changed, 99 insertions(+), 6 deletions(-) > > diff --git a/cmd-switch-client.c b/cmd-switch-client.c > index 2bc1e10c..a24f0276 100644 > --- a/cmd-switch-client.c > +++ b/cmd-switch-client.c > @@ -129,6 +129,7 @@ cmd_switch_client_exec(struct cmd *self, struct cmdq_item > *item) > if (~item->shared->flags & CMDQ_SHARED_REPEAT) > server_client_set_key_table(c, NULL); > status_timer_start(c); > + notify_client("client-session-changed", c); > session_update_activity(s, NULL); > gettimeofday(&s->last_attached_time, NULL); > > diff --git a/control-notify.c b/control-notify.c > index 230bce61..af431892 100644 > --- a/control-notify.c > +++ b/control-notify.c > @@ -60,6 +60,19 @@ control_notify_input(struct client *c, struct window_pane > *wp, > } > > void > +control_notify_pane_mode_changed(int pane) > +{ > + struct client *c; > + > + TAILQ_FOREACH(c, &clients, entry) { > + if (!CONTROL_SHOULD_NOTIFY_CLIENT(c)) > + continue; > + > + control_write(c, "%%pane-mode-changed %%%u", pane); > + } > +} > + > +void > control_notify_window_layout_changed(struct window *w) > { > struct client *c; > @@ -97,6 +110,20 @@ control_notify_window_layout_changed(struct window *w) > } > > void > +control_notify_window_pane_changed(struct window *w) > +{ > + struct client *c; > + > + TAILQ_FOREACH(c, &clients, entry) { > + if (!CONTROL_SHOULD_NOTIFY_CLIENT(c)) > + continue; > + > + control_write(c, "%%window-pane-changed @%u %%%u", > + w->id, w->active->id); > + } > +} > + > +void > control_notify_window_unlinked(__unused struct session *s, struct window *w) > { > struct client *c; > @@ -154,15 +181,26 @@ control_notify_window_renamed(struct window *w) > } > > void > -control_notify_client_session_changed(struct client *c) > +control_notify_client_session_changed(struct client *cc) > { > + struct client *c; > struct session *s; > > - if (!CONTROL_SHOULD_NOTIFY_CLIENT(c) || c->session == NULL) > + if (cc->session == NULL) > return; > - s = c->session; > + s = cc->session; > + > + TAILQ_FOREACH(c, &clients, entry) { > + if (!CONTROL_SHOULD_NOTIFY_CLIENT(c) || c->session == NULL) > + continue; > > - control_write(c, "%%session-changed $%u %s", s->id, s->name); > + if (cc == c) { > + control_write(c, "%%session-changed $%u %s", s->id, > s->name); > + } else { > + control_write(c, "%%client-session-changed %u $%u %s", > + cc->pid, s->id, s->name); > + } > + } > } > > void > @@ -203,3 +241,17 @@ control_notify_session_closed(__unused struct session *s) > control_write(c, "%%sessions-changed"); > } > } > + > +void > +control_notify_session_window_changed(struct session *s) > +{ > + struct client *c; > + > + TAILQ_FOREACH(c, &clients, entry) { > + if (!CONTROL_SHOULD_NOTIFY_CLIENT(c)) > + continue; > + > + control_write(c, "%%session-window-changed $%u @%u", > + s->id, s->curw->window->id); > + } > +} > diff --git a/notify.c b/notify.c > index 0241fa60..31284127 100644 > --- a/notify.c > +++ b/notify.c > @@ -78,8 +78,12 @@ notify_callback(struct cmdq_item *item, void *data) > > log_debug("%s: %s", __func__, ne->name); > > + if (strcmp(ne->name, "pane-mode-changed") == 0) > + control_notify_pane_mode_changed(ne->pane); > if (strcmp(ne->name, "window-layout-changed") == 0) > control_notify_window_layout_changed(ne->window); > + if (strcmp(ne->name, "window-pane-changed") == 0) > + control_notify_window_pane_changed(ne->window); > if (strcmp(ne->name, "window-unlinked") == 0) > control_notify_window_unlinked(ne->session, ne->window); > if (strcmp(ne->name, "window-linked") == 0) > @@ -94,6 +98,8 @@ notify_callback(struct cmdq_item *item, void *data) > control_notify_session_created(ne->session); > if (strcmp(ne->name, "session-closed") == 0) > control_notify_session_closed(ne->session); > + if (strcmp(ne->name, "session-window-changed") == 0) > + control_notify_session_window_changed(ne->session); > > notify_hook(item, ne); > > diff --git a/session.c b/session.c > index b52b0274..b9f30428 100644 > --- a/session.c > +++ b/session.c > @@ -552,6 +552,7 @@ session_set_current(struct session *s, struct winlink *wl) > s->curw = wl; > winlink_clear_flags(wl); > window_update_activity(wl->window); > + notify_session("session-window-changed", s); > return (0); > } > > diff --git a/tmux.1 b/tmux.1 > index cb069e5e..9b8215e5 100644 > --- a/tmux.1 > +++ b/tmux.1 > @@ -4236,6 +4236,13 @@ A notification will never occur inside an output block. > .Pp > The following notifications are defined: > .Bl -tag -width Ds > +.It Ic %client-session-changed Ar client-pid Ar session-id Ar name > +The client with pid > +.Ar client-pid > +is now attached to the session with ID > +.Ar session-id , > +which is named > +.Ar name . > .It Ic %exit Op Ar reason > The > .Nm > @@ -4258,6 +4265,10 @@ and the window flags are > A window pane produced output. > .Ar value > escapes non-printable characters and backslash as octal \\xxx. > +.It Ic %pane-mode-changed Ar pane-id > +The pane with ID > +.Ar pane-id > +has changed mode. > .It Ic %session-changed Ar session-id Ar name > The client is now attached to the session with ID > .Ar session-id , > @@ -4266,6 +4277,11 @@ which is named > .It Ic %session-renamed Ar name > The current session was renamed to > .Ar name . > +.It Ic %session-window-changed Ar session-id Ar window-id > +The session with ID > +.Ar session-id > +changed its active window to the window with ID > +.Ar window-id . > .It Ic %sessions-changed > A session was created or destroyed. > .It Ic %unlinked-window-add Ar window-id > @@ -4280,6 +4296,11 @@ was linked to the current session. > The window with ID > .Ar window-id > closed. > +.It Ic %window-pane-changed Ar window-id Ar pane-id > +The active pane in the window with ID > +.Ar window-id > +changed to the pane with ID > +.Ar pane-id . > .It Ic %window-renamed Ar window-id Ar name > The window with ID > .Ar window-id > diff --git a/tmux.h b/tmux.h > index 417145f1..1139d6ba 100644 > --- a/tmux.h > +++ b/tmux.h > @@ -2211,7 +2211,9 @@ void control_write_buffer(struct client *, struct > evbuffer *); > /* control-notify.c */ > void control_notify_input(struct client *, struct window_pane *, > struct evbuffer *); > +void control_notify_pane_mode_changed(int pane); > void control_notify_window_layout_changed(struct window *); > +void control_notify_window_pane_changed(struct window *); > void control_notify_window_unlinked(struct session *, struct window *); > void control_notify_window_linked(struct session *, struct window *); > void control_notify_window_renamed(struct window *); > @@ -2219,6 +2221,7 @@ void control_notify_client_session_changed(struct > client *); > void control_notify_session_renamed(struct session *); > void control_notify_session_created(struct session *); > void control_notify_session_closed(struct session *); > +void control_notify_session_window_changed(struct session *s); > > /* session.c */ > extern struct sessions sessions; > diff --git a/window.c b/window.c > index ed73050e..92742685 100644 > --- a/window.c > +++ b/window.c > @@ -355,6 +355,8 @@ window_create_spawn(const char *name, int argc, char > **argv, const char *path, > } else > w->name = default_window_name(w); > > + notify_window("window-pane-changed", w); > + > return (w); > } > > @@ -441,11 +443,14 @@ window_set_active_pane(struct window *w, struct > window_pane *wp) > w->active = TAILQ_PREV(w->active, window_panes, entry); > if (w->active == NULL) > w->active = TAILQ_LAST(&w->panes, window_panes); > - if (w->active == wp) > + if (w->active == wp) { > + notify_window("window-pane-changed", w); > return (1); > + } > } > w->active->active_point = next_active_point++; > w->active->flags |= PANE_CHANGED; > + notify_window("window-pane-changed", w); > return (1); > } > > @@ -621,8 +626,10 @@ window_lost_pane(struct window *w, struct window_pane > *wp) > if (w->active == NULL) > w->active = TAILQ_NEXT(wp, entry); > } > - if (w->active != NULL) > + if (w->active != NULL) { > w->active->flags |= PANE_CHANGED; > + notify_window("window-pane-changed", w); > + } > } else if (wp == w->last) > w->last = NULL; > } > @@ -1196,6 +1203,7 @@ window_pane_set_mode(struct window_pane *wp, const > struct window_mode *mode) > wp->flags |= (PANE_REDRAW|PANE_CHANGED); > > server_status_window(wp->window); > + notify_pane("pane-mode-changed", wp); > return (0); > } > > @@ -1215,6 +1223,7 @@ window_pane_reset_mode(struct window_pane *wp) > wp->flags |= (PANE_REDRAW|PANE_CHANGED); > > server_status_window(wp->window); > + notify_pane("pane-mode-changed", wp); > } > > void > -- > 2.12.2 > -- You received this message because you are subscribed to the Google Groups "tmux-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to tmux-users+unsubscr...@googlegroups.com. To post to this group, send an email to tmux-users@googlegroups.com. For more options, visit https://groups.google.com/d/optout.