Ok. That's good enough for my purposes.

> On May 3, 2017, at 16:20, Nicholas Marriott <nicholas.marri...@gmail.com> 
> 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 <nicholas.marri...@gmail.com> 
>>> 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 <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.

Reply via email to