Ok the session_set_current_winlink idea is good so I have applied that
bit but renamed to session_set_current.

Here is an updated diff with a few changes:

- Spacing fixes. Looks like your mailer mangles spaces. Can you fix that
  or send the diffs as an attachment instead?
- Renamed window_pane_focus_notify to just window_pane_focus.
- Some other renaming and style nits.
- Send \033[I if needed when first enabled.
- Send \033[?1004l in tty.c if the terminal has XT flag.

Please take a look at the diff below and let me know if you spot any
errors before I commit it.

I was thinking about the external focus reporting and I think just
forwarding through the input will be fine. It will mean that the most
recent state is the current state. So if you have two terminals and you
enter them both and then exit one, you will lose focus. But most people
don't use two computers simulatenously so I think this will not be a
problem. So when the bits below are in if you could update your other
changes on top of them it would be great.



diff --git a/cmd-break-pane.c b/cmd-break-pane.c
index a4350fe..8e2a375 100644
--- a/cmd-break-pane.c
+++ b/cmd-break-pane.c
@@ -44,7 +44,7 @@ cmd_break_pane_exec(struct cmd *self, struct cmd_ctx *ctx)
        struct args             *args = self->args;
        struct winlink          *wl;
        struct session          *s;
-       struct window_pane      *wp;
+       struct window_pane      *wp, *out_wp, *in_wp;
        struct window           *w;
        char                    *name;
        char                    *cause;
@@ -63,6 +63,7 @@ cmd_break_pane_exec(struct cmd *self, struct cmd_ctx *ctx)
        }
 
        w = wl->window;
+       out_wp = w->active;
        TAILQ_REMOVE(&w->panes, wp, entry);
        if (wp == w->active) {
                w->active = w->last;
@@ -74,6 +75,12 @@ cmd_break_pane_exec(struct cmd *self, struct cmd_ctx *ctx)
                }
        } else if (wp == w->last)
                w->last = NULL;
+
+       if (args_has(self->args, 'd'))
+               in_wp = w->active;
+       else
+               in_wp = wp;
+
        layout_close_pane(wp);
 
        w = wp->window = window_create1(s->sx, s->sy);
@@ -89,6 +96,11 @@ cmd_break_pane_exec(struct cmd *self, struct cmd_ctx *ctx)
        if (!args_has(self->args, 'd'))
                session_select(s, wl->idx);
 
+       if (out_wp != in_wp) {
+               window_pane_focus(out_wp, 0);
+               window_pane_focus(in_wp, 1);
+       }
+
        server_redraw_session(s);
        server_status_session_group(s);
 
diff --git a/input.c b/input.c
index 4cf90ec..855ee8a 100644
--- a/input.c
+++ b/input.c
@@ -1260,6 +1260,9 @@ input_csi_dispatch(struct input_ctx *ictx)
                case 1003:
                        screen_write_mode_clear(&ictx->ctx, ALL_MOUSE_MODES);
                        break;
+               case 1004:
+                       screen_write_mode_clear(&ictx->ctx, MODE_FOCUSON);
+                       break;
                case 1005:
                        screen_write_mode_clear(&ictx->ctx, MODE_MOUSE_UTF8);
                        break;
@@ -1326,6 +1329,11 @@ input_csi_dispatch(struct input_ctx *ictx)
                        screen_write_mode_clear(&ictx->ctx, ALL_MOUSE_MODES);
                        screen_write_mode_set(&ictx->ctx, MODE_MOUSE_ANY);
                        break;
+               case 1004:
+                       screen_write_mode_set(&ictx->ctx, MODE_FOCUSON);
+                       if (s->mode & MODE_FOCUSED)
+                               bufferevent_write(wp->event, "\033[I", 3);
+                       break;
                case 1005:
                        screen_write_mode_set(&ictx->ctx, MODE_MOUSE_UTF8);
                        break;
diff --git a/session.c b/session.c
index 72e8fb0..c7a01fd 100644
--- a/session.c
+++ b/session.c
@@ -413,10 +413,16 @@ session_set_current(struct session *s, struct winlink *wl)
        if (wl == s->curw)
                return (1);
 
+       if (s->curw != NULL && s->curw->window != NULL)
+               window_pane_focus(s->curw->window->active, 0);
+
        winlink_stack_remove(&s->lastw, wl);
        winlink_stack_push(&s->lastw, s->curw);
        s->curw = wl;
        winlink_clear_flags(wl);
+
+       window_pane_focus(s->curw->window->active, 1);
+
        return (0);
 }
 
diff --git a/tmux.h b/tmux.h
index 18e692f..2322b5b 100644
--- a/tmux.h
+++ b/tmux.h
@@ -665,6 +665,8 @@ struct mode_key_table {
 #define MODE_MOUSE_UTF8 0x100
 #define MODE_MOUSE_SGR 0x200
 #define MODE_BRACKETPASTE 0x400
+#define MODE_FOCUSON 0x800
+#define MODE_FOCUSED 0x1000
 
 #define ALL_MOUSE_MODES (MODE_MOUSE_STANDARD|MODE_MOUSE_BUTTON|MODE_MOUSE_ANY)
 
@@ -2132,6 +2134,7 @@ void               window_pane_alternate_on(struct 
window_pane *,
                     struct grid_cell *, int);
 void            window_pane_alternate_off(struct window_pane *,
                     struct grid_cell *, int);
+void            window_pane_focus(struct window_pane *, int);
 int             window_pane_set_mode(
                     struct window_pane *, const struct window_mode *);
 void            window_pane_reset_mode(struct window_pane *);
diff --git a/tty.c b/tty.c
index 1abaea4..b5dcf6d 100644
--- a/tty.c
+++ b/tty.c
@@ -221,7 +221,7 @@ tty_start_tty(struct tty *tty)
                tty_puts(tty, "\033[?1000l\033[?1006l\033[?1005l");
 
        if (tty_term_has(tty->term, TTYC_XT))
-               tty_puts(tty, "\033[c\033[>4;1m");
+               tty_puts(tty, "\033[c\033[>4;1m\033[?1004l");
 
        tty->cx = UINT_MAX;
        tty->cy = UINT_MAX;
diff --git a/window.c b/window.c
index 77f06f8..457e3e1 100644
--- a/window.c
+++ b/window.c
@@ -390,8 +390,10 @@ window_set_active_pane(struct window *w, struct 
window_pane *wp)
                if (w->active == NULL)
                        w->active = TAILQ_LAST(&w->panes, window_panes);
                if (w->active == wp)
-                       return;
+                       break;
        }
+       window_pane_focus(w->last, 0);
+       window_pane_focus(wp, 1);
 }
 
 struct window_pane *
@@ -484,6 +486,8 @@ window_remove_pane(struct window *w, struct window_pane *wp)
 
        TAILQ_REMOVE(&w->panes, wp, entry);
        window_pane_destroy(wp);
+       if (w != NULL)
+               window_pane_focus(w->active, 1);
 }
 
 struct window_pane *
@@ -950,6 +954,30 @@ window_pane_alternate_off(struct window_pane *wp, struct 
grid_cell *gc,
        wp->flags |= PANE_REDRAW;
 }
 
+void
+window_pane_focus(struct window_pane *wp, int focused)
+{
+       int     already_focused;
+
+       if (wp == NULL)
+               return;
+
+       already_focused = (wp->screen->mode & MODE_FOCUSED);
+       if (focused && !already_focused) {
+               wp->screen->mode |= MODE_FOCUSED;
+
+               if (wp->screen->mode & MODE_FOCUSON)
+                       bufferevent_write(wp->event, "\033[I", 3);
+       }
+
+       if (!focused && already_focused) {
+               wp->screen->mode &= ~MODE_FOCUSED;
+
+               if (wp->screen->mode & MODE_FOCUSON)
+                       bufferevent_write(wp->event, "\033[O", 3);
+       }
+}
+
 int
 window_pane_set_mode(struct window_pane *wp, const struct window_mode *mode)
 {

------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_feb
_______________________________________________
tmux-users mailing list
tmux-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tmux-users

Reply via email to