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
},
{ .name = "focus-events",
.type = OPTIONS_TABLE_FLAG,
.default_num = 0
},
{ .name = "quiet",
.type = OPTIONS_TABLE_FLAG,
.default_num = 0 /* overridden in main() */

View File

@ -548,6 +548,15 @@ server_client_check_focus(struct window_pane *wp)
{
u_int i;
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 (!(wp->base.mode & MODE_FOCUSON))
@ -580,13 +589,13 @@ server_client_check_focus(struct window_pane *wp)
}
not_focused:
if (wp->flags & PANE_FOCUSED)
if (push || (wp->flags & PANE_FOCUSED))
bufferevent_write(wp->event, "\033[O", 3);
wp->flags &= ~PANE_FOCUSED;
return;
focused:
if (!(wp->flags & PANE_FOCUSED))
if (push || !(wp->flags & PANE_FOCUSED))
bufferevent_write(wp->event, "\033[I", 3);
wp->flags |= PANE_FOCUSED;
}

8
tmux.1
View File

@ -2092,6 +2092,14 @@ The default is 500 milliseconds.
.Op Ic on | off
.Xc
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
.Op Ic on | off
.Xc

5
tmux.h
View File

@ -941,6 +941,7 @@ struct window_pane {
#define PANE_DROP 0x2
#define PANE_FOCUSED 0x4
#define PANE_RESIZE 0x8
#define PANE_FOCUSPUSH 0x10
char *cmd;
char *shell;
@ -1232,6 +1233,7 @@ struct tty {
#define TTY_UTF8 0x8
#define TTY_STARTED 0x10
#define TTY_OPENED 0x20
#define TTY_FOCUS 0x40
int flags;
int term_flags;
@ -1383,6 +1385,9 @@ struct cmd {
char *file;
u_int line;
#define CMD_CONTROL 0x1
int flags;
TAILQ_ENTRY(cmd) qentry;
};
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))
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->cx = UINT_MAX;
tty->cy = UINT_MAX;
@ -282,8 +287,13 @@ tty_stop_tty(struct tty *tty)
if (tty_term_has(tty->term, TTYC_KMOUS))
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, tty_term_string(tty->term, TTYC_RMCUP));