Great, applied to OpenBSD now, will be in GitHub next time it syncs up.
On Wed, May 03, 2017 at 04:51:29PM -0500, Joshua Brot wrote: > Ok. That's good enough for my purposes. > > > On May 3, 2017, at 16:20, Nicholas Marriott <[email protected]> > > wrote: > > > > They are unique in that you can only have one client with that name at a > > time, but (like the PID) they are not unique through the lifetime of the > > tmux process. > > > > > >> On Wed, May 03, 2017 at 12:56:04PM -0500, Joshua Brot wrote: > >> As long as the name is guaranteed to be unique, that shouldn't pose any > >> problems for me. > >> > >>> On May 3, 2017, at 04:54, Nicholas Marriott <[email protected]> > >>> wrote: > >>> > >>> 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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 [email protected]. > >>>>>>>>>> To post to this group, send an email to > >>>>>>>>>> [email protected]. > >>>>>>>>>> For more options, visit https://groups.google.com/d/optout. > >>>>>>>>> > >>>>>>> > >>>>>>>> From c830ea1e227b73888f51961eb7517deac2f93981 Mon Sep 17 00:00:00 > >>>>>>>> 2001 > >>>>>>>> From: Joshua Brot <[email protected]> > >>>>>>>> Date: Tue, 2 May 2017 20:12:16 -0500 > >>>>>>>> Subject: [PATCH] Added several features to command mode. > >>>>>>>> > >>>>>>>> Signed-off-by: Joshua Brot <[email protected]> > >>>>>>>> --- > >>>>>>>> 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 <[email protected]> > >>>>>> 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 <[email protected]> > >>>>>> --- > >>>>>> 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 <[email protected]> > >>>> 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 <[email protected]> > >>>> --- > >>>> 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 [email protected]. To post to this group, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
