aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmd-choose-client.c6
-rw-r--r--cmd-find.c23
-rw-r--r--cmd-list-clients.c2
-rw-r--r--format.c4
-rw-r--r--screen-redraw.c2
-rw-r--r--server-client.c19
-rw-r--r--tmux.14
-rw-r--r--tmux.h2
-rw-r--r--tty.c46
9 files changed, 61 insertions, 47 deletions
diff --git a/cmd-choose-client.c b/cmd-choose-client.c
index 2a64da69..96a79534 100644
--- a/cmd-choose-client.c
+++ b/cmd-choose-client.c
@@ -28,7 +28,7 @@
*/
#define CHOOSE_CLIENT_TEMPLATE \
- "#{client_tty}: #{session_name} " \
+ "#{client_name}: #{session_name} " \
"[#{client_width}x#{client_height} #{client_termname}]" \
"#{?client_utf8, (utf8),}#{?client_readonly, (ro),} " \
"(last used #{t:client_activity})"
@@ -85,7 +85,7 @@ cmd_choose_client_exec(struct cmd *self, struct cmdq_item *item)
cur = idx = 0;
TAILQ_FOREACH(c1, &clients, entry) {
- if (c1->session == NULL || c1->tty.path == NULL)
+ if (c1->session == NULL)
continue;
if (c1 == item->client)
cur = idx;
@@ -97,7 +97,7 @@ cmd_choose_client_exec(struct cmd *self, struct cmdq_item *item)
format_add(cdata->ft, "line", "%u", idx);
format_defaults(cdata->ft, c1, NULL, NULL, NULL);
- cdata->command = cmd_template_replace(action, c1->tty.path, 1);
+ cdata->command = cmd_template_replace(action, c1->name, 1);
window_choose_add(wl->window->active, cdata);
diff --git a/cmd-find.c b/cmd-find.c
index 2f28a028..5c60f200 100644
--- a/cmd-find.c
+++ b/cmd-find.c
@@ -256,9 +256,9 @@ cmd_find_current_session_with_client(struct cmd_find_state *fs)
* sessions to those containing that pane (we still use the current
* window in the best session).
*/
- if (fs->item != NULL && fs->item->client->tty.path != NULL) {
+ if (fs->item != NULL) {
RB_FOREACH(wp, window_pane_tree, &all_window_panes) {
- if (strcmp(wp->tty, fs->item->client->tty.path) == 0)
+ if (strcmp(wp->tty, fs->item->client->ttyname) == 0)
break;
}
} else
@@ -1248,7 +1248,6 @@ cmd_find_client(struct cmdq_item *item, const char *target, int quiet)
struct client *c;
char *copy;
size_t size;
- const char *path;
/* A NULL argument means the current client. */
if (item != NULL && target == NULL) {
@@ -1265,20 +1264,20 @@ cmd_find_client(struct cmdq_item *item, const char *target, int quiet)
if (size != 0 && copy[size - 1] == ':')
copy[size - 1] = '\0';
- /* Check path of each client. */
+ /* Check name and path of each client. */
TAILQ_FOREACH(c, &clients, entry) {
- if (c->session == NULL || c->tty.path == NULL)
+ if (c->session == NULL)
continue;
- path = c->tty.path;
-
- /* Try for exact match. */
- if (strcmp(copy, path) == 0)
+ if (strcmp(copy, c->name) == 0)
break;
- /* Try without leading /dev. */
- if (strncmp(path, _PATH_DEV, (sizeof _PATH_DEV) - 1) != 0)
+ if (*c->ttyname == '\0')
+ continue;
+ if (strcmp(copy, c->ttyname) == 0)
+ break;
+ if (strncmp(c->ttyname, _PATH_DEV, (sizeof _PATH_DEV) - 1) != 0)
continue;
- if (strcmp(copy, path + (sizeof _PATH_DEV) - 1) == 0)
+ if (strcmp(copy, c->ttyname + (sizeof _PATH_DEV) - 1) == 0)
break;
}
diff --git a/cmd-list-clients.c b/cmd-list-clients.c
index faf39931..ca34bf25 100644
--- a/cmd-list-clients.c
+++ b/cmd-list-clients.c
@@ -29,7 +29,7 @@
*/
#define LIST_CLIENTS_TEMPLATE \
- "#{client_tty}: #{session_name} " \
+ "#{client_name}: #{session_name} " \
"[#{client_width}x#{client_height} #{client_termname}]" \
"#{?client_utf8, (utf8),} #{?client_readonly, (ro),}"
diff --git a/format.c b/format.c
index 7e78897f..5844a6ab 100644
--- a/format.c
+++ b/format.c
@@ -1139,11 +1139,11 @@ format_defaults_client(struct format_tree *ft, struct client *c)
if (ft->s == NULL)
ft->s = c->session;
+ format_add(ft, "client_name", "%s", c->name);
format_add(ft, "client_pid", "%ld", (long) c->pid);
format_add(ft, "client_height", "%u", tty->sy);
format_add(ft, "client_width", "%u", tty->sx);
- if (tty->path != NULL)
- format_add(ft, "client_tty", "%s", tty->path);
+ format_add(ft, "client_tty", "%s", c->ttyname);
format_add(ft, "client_control_mode", "%d",
!!(c->flags & CLIENT_CONTROL));
diff --git a/screen-redraw.c b/screen-redraw.c
index c2e39410..699a9191 100644
--- a/screen-redraw.c
+++ b/screen-redraw.c
@@ -423,7 +423,7 @@ screen_redraw_pane(struct client *c, struct window_pane *wp)
if (status_at_line(c) == 0)
yoff++;
- log_debug("%s: redraw pane %%%u (at %u,%u)", c->tty.path, wp->id,
+ log_debug("%s: redraw pane %%%u (at %u,%u)", c->name, wp->id,
wp->xoff, yoff);
for (i = 0; i < wp->sy; i++)
diff --git a/server-client.c b/server-client.c
index a2dc79c7..6be467af 100644
--- a/server-client.c
+++ b/server-client.c
@@ -99,15 +99,12 @@ server_client_check_nested(struct client *c)
struct environ_entry *envent;
struct window_pane *wp;
- if (c->tty.path == NULL)
- return (0);
-
envent = environ_find(c->environ, "TMUX");
if (envent == NULL || *envent->value == '\0')
return (0);
RB_FOREACH(wp, window_pane_tree, &all_window_panes) {
- if (strcmp(wp->tty, c->tty.path) == 0)
+ if (strcmp(wp->tty, c->ttyname) == 0)
return (1);
}
return (0);
@@ -322,8 +319,10 @@ server_client_free(__unused int fd, __unused short events, void *arg)
if (!TAILQ_EMPTY(&c->queue))
fatalx("queue not empty");
- if (c->references == 0)
+ if (c->references == 0) {
+ free((void *)c->name);
free(c);
+ }
}
/* Detach a client. */
@@ -1470,6 +1469,7 @@ server_client_dispatch_identify(struct client *c, struct imsg *imsg)
const char *data, *home;
size_t datalen;
int flags;
+ char *name;
if (c->flags & CLIENT_IDENTIFIED)
fatalx("out-of-order identify message");
@@ -1535,6 +1535,13 @@ server_client_dispatch_identify(struct client *c, struct imsg *imsg)
return;
c->flags |= CLIENT_IDENTIFIED;
+ if (*c->ttyname != '\0')
+ name = xstrdup(c->ttyname);
+ else
+ xasprintf(&name, "client-%ld", (long)c->pid);
+ c->name = name;
+ log_debug("client %p name is %s", c, c->name);
+
if (c->flags & CLIENT_CONTROL) {
c->stdin_callback = control_callback;
@@ -1685,7 +1692,7 @@ server_client_add_message(struct client *c, const char *fmt, ...)
xvasprintf(&s, fmt, ap);
va_end(ap);
- log_debug("%s: message %s", c->tty.path, s);
+ log_debug("message %s (client %p)", s, c);
msg = xcalloc(1, sizeof *msg);
msg->msg_time = time(NULL);
diff --git a/tmux.1 b/tmux.1
index 6d035573..07a31d7d 100644
--- a/tmux.1
+++ b/tmux.1
@@ -367,7 +367,8 @@ or
These specify the client, session, window or pane which a command should affect.
.Pp
.Ar target-client
-should be the name of the
+should be the name of the client,
+typically the
.Xr pty 4
file to which the client is connected, for example either of
.Pa /dev/ttyp1
@@ -3510,6 +3511,7 @@ The following variables are available, where appropriate:
.It Li "client_height" Ta "" Ta "Height of client"
.It Li "client_key_table" Ta "" Ta "Current key table"
.It Li "client_last_session" Ta "" Ta "Name of the client's last session"
+.It Li "client_name" Ta "" Ta "Name of client"
.It Li "client_pid" Ta "" Ta "PID of client process"
.It Li "client_prefix" Ta "" Ta "1 if prefix key has been pressed"
.It Li "client_readonly" Ta "" Ta "1 if client is readonly"
diff --git a/tmux.h b/tmux.h
index dab15b3a..509497bb 100644
--- a/tmux.h
+++ b/tmux.h
@@ -1021,7 +1021,6 @@ LIST_HEAD(tty_terms, tty_term);
struct tty {
struct client *client;
- char *path;
u_int sx;
u_int sy;
@@ -1285,6 +1284,7 @@ struct cmd_entry {
/* Client connection. */
struct client {
+ const char *name;
struct tmuxpeer *peer;
struct cmdq_list queue;
diff --git a/tty.c b/tty.c
index 8d54007b..04a673fc 100644
--- a/tty.c
+++ b/tty.c
@@ -94,8 +94,6 @@ tty_create_log(void)
int
tty_init(struct tty *tty, struct client *c, int fd, char *term)
{
- char *path;
-
if (!isatty(fd))
return (-1);
@@ -105,12 +103,10 @@ tty_init(struct tty *tty, struct client *c, int fd, char *term)
tty->term_name = xstrdup("unknown");
else
tty->term_name = xstrdup(term);
+
tty->fd = fd;
tty->client = c;
- if ((path = ttyname(fd)) == NULL)
- return (-1);
- tty->path = xstrdup(path);
tty->cstyle = 0;
tty->ccolour = xstrdup("");
@@ -125,8 +121,9 @@ tty_init(struct tty *tty, struct client *c, int fd, char *term)
int
tty_resize(struct tty *tty)
{
- struct winsize ws;
- u_int sx, sy;
+ struct client *c = tty->client;
+ struct winsize ws;
+ u_int sx, sy;
if (ioctl(tty->fd, TIOCGWINSZ, &ws) != -1) {
sx = ws.ws_col;
@@ -139,7 +136,8 @@ tty_resize(struct tty *tty)
sx = 80;
sy = 24;
}
- log_debug("%s: %s now %ux%u", __func__, tty->path, sx, sy);
+ log_debug("%s: %s now %ux%u", __func__, c->name, sx, sy);
+
if (!tty_set_size(tty, sx, sy))
return (0);
tty_invalidate(tty);
@@ -160,13 +158,14 @@ static void
tty_read_callback(__unused int fd, __unused short events, void *data)
{
struct tty *tty = data;
+ struct client *c = tty->client;
size_t size = EVBUFFER_LENGTH(tty->in);
int nread;
nread = evbuffer_read(tty->in, tty->fd, -1);
if (nread == -1)
return;
- log_debug("%s: read %d bytes (already %zu)", tty->path, nread, size);
+ log_debug("%s: read %d bytes (already %zu)", c->name, nread, size);
while (tty_keys_next(tty))
;
@@ -176,13 +175,14 @@ static void
tty_write_callback(__unused int fd, __unused short events, void *data)
{
struct tty *tty = data;
+ struct client *c = tty->client;
size_t size = EVBUFFER_LENGTH(tty->out);
int nwrite;
nwrite = evbuffer_write(tty->out, tty->fd);
if (nwrite == -1)
return;
- log_debug("%s: wrote %d bytes (of %zu)", tty->path, nwrite, size);
+ log_debug("%s: wrote %d bytes (of %zu)", c->name, nwrite, size);
if (EVBUFFER_LENGTH(tty->out) != 0)
event_add(&tty->event_out, NULL);
@@ -351,7 +351,6 @@ tty_free(struct tty *tty)
tty_close(tty);
free(tty->ccolour);
- free(tty->path);
free(tty->term_name);
}
@@ -424,8 +423,10 @@ tty_putcode_ptr2(struct tty *tty, enum tty_code_code code, const void *a,
static void
tty_add(struct tty *tty, const char *buf, size_t len)
{
+ struct client *c = tty->client;
+
evbuffer_add(tty->out, buf, len);
- log_debug("%s: %.*s", tty->path, (int)len, (const char *)buf);
+ log_debug("%s: %.*s", c->name, (int)len, (const char *)buf);
if (tty_log_fd != -1)
write(tty_log_fd, buf, len);
@@ -602,8 +603,17 @@ tty_emulate_repeat(struct tty *tty, enum tty_code_code code,
static void
tty_repeat_space(struct tty *tty, u_int n)
{
- while (n-- > 0)
- tty_putc(tty, ' ');
+ static char s[500];
+
+ if (*s != ' ')
+ memset(s, ' ', sizeof s);
+
+ while (n > sizeof s) {
+ tty_putn(tty, s, sizeof s, sizeof s);
+ n -= sizeof s;
+ }
+ if (n != 0)
+ tty_putn(tty, s, n, n);
}
/*
@@ -856,8 +866,6 @@ tty_cmd_deletecharacter(struct tty *tty, const struct tty_ctx *ctx)
void
tty_cmd_clearcharacter(struct tty *tty, const struct tty_ctx *ctx)
{
- u_int i;
-
tty_attributes(tty, &grid_default_cell, ctx->wp);
tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy);
@@ -865,10 +873,8 @@ tty_cmd_clearcharacter(struct tty *tty, const struct tty_ctx *ctx)
if (tty_term_has(tty->term, TTYC_ECH) &&
!tty_fake_bce(tty, ctx->wp, ctx->bg))
tty_putcode1(tty, TTYC_ECH, ctx->num);
- else {
- for (i = 0; i < ctx->num; i++)
- tty_putc(tty, ' ');
- }
+ else
+ tty_repeat_space(tty, ctx->num);
}
void