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.