mirror of
https://github.com/tmux/tmux.git
synced 2024-11-16 09:28:51 +00: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
|
.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() */
|
||||||
|
@ -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
8
tmux.1
@ -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
5
tmux.h
@ -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
14
tty.c
@ -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));
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user