mirror of
https://github.com/tmate-io/tmate.git
synced 2024-11-23 00:23:08 +01:00
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:
parent
a41cd8d75b
commit
3977dba761
@ -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() */
|
||||
|
@ -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
8
tmux.1
@ -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
5
tmux.h
@ -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
14
tty.c
@ -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));
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user