Focus events can cause trouble if left on and they can't be turned off

during idle periods (like the other states are) because we'd miss
events. So add a server option to control them. Defaults to off.
This commit is contained in:
Nicholas Marriott 2013-06-23 13:10:46 +00:00
parent a41cd8d75b
commit 3977dba761
5 changed files with 41 additions and 4 deletions

View File

@ -76,6 +76,11 @@ const struct options_table_entry server_options_table[] = {
.default_num = 0 .default_num = 0
}, },
{ .name = "focus-events",
.type = OPTIONS_TABLE_FLAG,
.default_num = 0
},
{ .name = "quiet", { .name = "quiet",
.type = OPTIONS_TABLE_FLAG, .type = OPTIONS_TABLE_FLAG,
.default_num = 0 /* overridden in main() */ .default_num = 0 /* overridden in main() */

View File

@ -548,6 +548,15 @@ server_client_check_focus(struct window_pane *wp)
{ {
u_int i; u_int i;
struct client *c; struct client *c;
int push;
/* Are focus events off? */
if (!options_get_number(&global_options, "focus-events"))
return;
/* Do we need to push the focus state? */
push = wp->flags & PANE_FOCUSPUSH;
wp->flags &= ~PANE_FOCUSPUSH;
/* If we don't care about focus, forget it. */ /* If we don't care about focus, forget it. */
if (!(wp->base.mode & MODE_FOCUSON)) if (!(wp->base.mode & MODE_FOCUSON))
@ -580,13 +589,13 @@ server_client_check_focus(struct window_pane *wp)
} }
not_focused: not_focused:
if (wp->flags & PANE_FOCUSED) if (push || (wp->flags & PANE_FOCUSED))
bufferevent_write(wp->event, "\033[O", 3); bufferevent_write(wp->event, "\033[O", 3);
wp->flags &= ~PANE_FOCUSED; wp->flags &= ~PANE_FOCUSED;
return; return;
focused: focused:
if (!(wp->flags & PANE_FOCUSED)) if (push || !(wp->flags & PANE_FOCUSED))
bufferevent_write(wp->event, "\033[I", 3); bufferevent_write(wp->event, "\033[I", 3);
wp->flags |= PANE_FOCUSED; wp->flags |= PANE_FOCUSED;
} }

8
tmux.1
View File

@ -2092,6 +2092,14 @@ The default is 500 milliseconds.
.Op Ic on | off .Op Ic on | off
.Xc .Xc
If enabled, the server will exit when there are no attached clients. If enabled, the server will exit when there are no attached clients.
.It Xo Ic focus-events
.Op Ic on | off
.Xc
When enabled, focus events are requested from the terminal if supported and
passed through to applications running in
.Nm .
Attached clients should be detached and attached again after changing this
option.
.It Xo Ic quiet .It Xo Ic quiet
.Op Ic on | off .Op Ic on | off
.Xc .Xc

5
tmux.h
View File

@ -941,6 +941,7 @@ struct window_pane {
#define PANE_DROP 0x2 #define PANE_DROP 0x2
#define PANE_FOCUSED 0x4 #define PANE_FOCUSED 0x4
#define PANE_RESIZE 0x8 #define PANE_RESIZE 0x8
#define PANE_FOCUSPUSH 0x10
char *cmd; char *cmd;
char *shell; char *shell;
@ -1232,6 +1233,7 @@ struct tty {
#define TTY_UTF8 0x8 #define TTY_UTF8 0x8
#define TTY_STARTED 0x10 #define TTY_STARTED 0x10
#define TTY_OPENED 0x20 #define TTY_OPENED 0x20
#define TTY_FOCUS 0x40
int flags; int flags;
int term_flags; int term_flags;
@ -1383,6 +1385,9 @@ struct cmd {
char *file; char *file;
u_int line; u_int line;
#define CMD_CONTROL 0x1
int flags;
TAILQ_ENTRY(cmd) qentry; TAILQ_ENTRY(cmd) qentry;
}; };
struct cmd_list { struct cmd_list {

14
tty.c
View File

@ -219,8 +219,13 @@ tty_start_tty(struct tty *tty)
if (tty_term_has(tty->term, TTYC_KMOUS)) if (tty_term_has(tty->term, TTYC_KMOUS))
tty_puts(tty, "\033[?1000l\033[?1006l\033[?1005l"); tty_puts(tty, "\033[?1000l\033[?1006l\033[?1005l");
if (tty_term_has(tty->term, TTYC_XT)) if (tty_term_has(tty->term, TTYC_XT)) {
if (options_get_number(&global_options, "focus-events")) {
tty->flags |= TTY_FOCUS;
tty_puts(tty, "\033[?1004h");
}
tty_puts(tty, "\033[c\033[>4;1m\033[m"); tty_puts(tty, "\033[c\033[>4;1m\033[m");
}
tty->cx = UINT_MAX; tty->cx = UINT_MAX;
tty->cy = UINT_MAX; tty->cy = UINT_MAX;
@ -282,8 +287,13 @@ tty_stop_tty(struct tty *tty)
if (tty_term_has(tty->term, TTYC_KMOUS)) if (tty_term_has(tty->term, TTYC_KMOUS))
tty_raw(tty, "\033[?1000l\033[?1006l\033[?1005l"); tty_raw(tty, "\033[?1000l\033[?1006l\033[?1005l");
if (tty_term_has(tty->term, TTYC_XT)) if (tty_term_has(tty->term, TTYC_XT)) {
if (tty->flags & TTY_FOCUS) {
tty->flags &= ~TTY_FOCUS;
tty_puts(tty, "\033[?1004l");
}
tty_raw(tty, "\033[>4m\033[m"); tty_raw(tty, "\033[>4m\033[m");
}
tty_raw(tty, tty_term_string(tty->term, TTYC_RMCUP)); tty_raw(tty, tty_term_string(tty->term, TTYC_RMCUP));