Merge branch 'master' of ssh://git.code.sf.net/p/tmux/tmux-code

This commit is contained in:
Nicholas Marriott 2013-07-05 16:24:13 +01:00
commit e496a548d7
11 changed files with 53 additions and 10 deletions

View File

@ -157,14 +157,17 @@ int
cmdq_guard(struct cmd_q *cmdq, const char *guard)
{
struct client *c = cmdq->client;
int flags;
if (c == NULL)
return 0;
if (!(c->flags & CLIENT_CONTROL))
return 0;
evbuffer_add_printf(c->stdout_data, "%%%s %ld %u\n", guard,
(long) cmdq->time, cmdq->number);
flags = !!(cmdq->cmd->flags & CMD_CONTROL);
evbuffer_add_printf(c->stdout_data, "%%%s %ld %u %d\n", guard,
(long) cmdq->time, cmdq->number, flags);
server_push_stdout(c);
return 1;
}

View File

@ -21,6 +21,7 @@
#include <fcntl.h>
#include <stdlib.h>
#include <strings.h>
#include <stropts.h>
#include <unistd.h>

View File

@ -24,6 +24,7 @@
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
#include "tmux.h"

View File

@ -24,6 +24,7 @@
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
#include "tmux.h"

View File

@ -55,6 +55,7 @@ control_callback(struct client *c, int closed, unused void *data)
{
char *line, *cause;
struct cmd_list *cmdlist;
struct cmd *cmd;
if (closed)
c->flags |= CLIENT_EXIT;
@ -78,6 +79,8 @@ control_callback(struct client *c, int closed, unused void *data)
free(cause);
} else {
TAILQ_FOREACH(cmd, &cmdlist->list, qentry)
cmd->flags |= CMD_CONTROL;
cmdq_run(c->cmdq, cmdlist);
cmd_list_free(cmdlist);
}

View File

@ -1333,7 +1333,7 @@ input_csi_dispatch(struct input_ctx *ictx)
if (s->mode & MODE_FOCUSON)
break;
screen_write_mode_set(&ictx->ctx, MODE_FOCUSON);
wp->flags &= ~PANE_FOCUSED; /* force update if needed */
wp->flags |= PANE_FOCUSPUSH; /* force update */
break;
case 1005:
screen_write_mode_set(&ictx->ctx, MODE_MOUSE_UTF8);

View File

@ -75,6 +75,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

@ -2096,6 +2096,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

8
tmux.h
View File

@ -39,9 +39,6 @@
extern char *__progname;
extern char **environ;
/* Default global configuration file. */
#define TMUX_CONF "/etc/tmux.conf"
/* Default prompt history length. */
#define PROMPT_HISTORY 100
@ -937,6 +934,7 @@ struct window_pane {
#define PANE_DROP 0x2
#define PANE_FOCUSED 0x4
#define PANE_RESIZE 0x8
#define PANE_FOCUSPUSH 0x10
char *cmd;
char *shell;
@ -1228,6 +1226,7 @@ struct tty {
#define TTY_UTF8 0x8
#define TTY_STARTED 0x10
#define TTY_OPENED 0x20
#define TTY_FOCUS 0x40
int flags;
int term_flags;
@ -1379,6 +1378,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));