I see, so why do we want to disable it automatically in this case?
—
Sent from Mailbox for iPhone

On Thu, Feb 21, 2013 at 10:44 AM, Nicholas Marriott
<nicholas.marri...@gmail.com> wrote:

> XT is a terminfo flag which says the terminal "has some xterm features",
> tmux uses it as a guide to mean that we can try fancy stuff that works
> in xterm and may work elsewhere.
> We should probably use something else because not may terminfo entries
> actually have it (including the xterm terminfo itself).
> On Thu, Feb 21, 2013 at 10:12:40AM -0800, Aaron Jensen wrote:
>>    Inlline...
>>    On Thu, Feb 21, 2013 at 9:28 AM, Nicholas Marriott
>>    <[1]nicholas.marri...@gmail.com> wrote:
>> 
>>      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?
>> 
>>    Will do, sorry about that.
>> 
>>      - Renamed window_pane_focus_notify to just window_pane_focus.
>>      - Some other renaming and style nits.
>>      - Send \033[I if needed when first enabled.
>> 
>>    Interesting, if this is the expected behavior then this seems like a good
>>    change.
>>    *
>> 
>>      - Send \033[?1004l in tty.c if the terminal has XT flag.
>> 
>>    I did some googling but it's still not clear what this flag represents or
>>    why this is needed, could you explain please? I don't see this flag in my
>>    infocmp, so I'm guessing iterm2* does not have this so it won't affect me?
>>    *
>> 
>>      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.
>> 
>>    Are you talking about the focus filtering here? If so, the problem with
>>    the external focus is not* things getting out of sync, but reporting
>>    happening to panes that do not want it. It's a hack of sorts to work
>>    around the fact that the external terminal doesn't understand the
>>    different panes in your tmux session. In other words, I would enable focus
>>    reporting in my terminal (iterm) and tmux both in pane 1. Then if I switch
>>    to pane 2, and leave focus of iterm, iterm would send ^[[O, which I do not
>>    actually want in pane 2, so the idea is to have tmux, which does have
>>    knowledge of who wants those events, discard those if they're not
>>    appropriate.
>> 
>>    Some more comments inline...
>>    *
>> 
>>      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);
>>      + * * * }
>>      +
>> 
>>    I think there's still a bug here, but I haven't tested these changes yet
>>    (they look only cosmetic). The problem is that if you break-pane the pane
>>    you're on will get a focus out.
>>    *
>> 
>>      * * * * 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;
>> 
>>    If I remember correctly, wp->event is NULL in some cases (closing the last
>>    pane for example) which is why I added that check. It crashed on exit.
>>    *
>> 
>>      +
>>      + * * * 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)
>>      *{
>> 
>> References
>> 
>>    Visible links
>>    1. mailto:nicholas.marri...@gmail.com
------------------------------------------------------------------------------
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