diff options
Diffstat (limited to 'server-client.c')
-rw-r--r-- | server-client.c | 55 |
1 files changed, 38 insertions, 17 deletions
diff --git a/server-client.c b/server-client.c index 07ef5697..3ca99077 100644 --- a/server-client.c +++ b/server-client.c @@ -1,4 +1,4 @@ -/* $Id$ */ +/* $OpenBSD$ */ /* * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> @@ -113,21 +113,22 @@ server_client_create(int fd) /* Open client terminal if needed. */ int -server_client_open(struct client *c, struct session *s, char **cause) +server_client_open(struct client *c, char **cause) { - struct options *oo = s != NULL ? &s->options : &global_s_options; - char *overrides; - if (c->flags & CLIENT_CONTROL) return (0); + if (strcmp(c->ttyname, "/dev/tty") == 0) { + *cause = xstrdup("can't use /dev/tty"); + return (-1); + } + if (!(c->flags & CLIENT_TERMINAL)) { *cause = xstrdup("not a terminal"); return (-1); } - overrides = options_get_string(oo, "terminal-overrides"); - if (tty_open(&c->tty, overrides, cause) != 0) + if (tty_open(&c->tty, cause) != 0) return (-1); return (0); @@ -158,7 +159,7 @@ server_client_lost(struct client *c) evbuffer_free(c->stdin_data); evbuffer_free(c->stdout_data); if (c->stderr_data != c->stdout_data) - evbuffer_free (c->stderr_data); + evbuffer_free(c->stderr_data); status_free_jobs(&c->status_new); status_free_jobs(&c->status_old); @@ -222,7 +223,7 @@ server_client_callback(int fd, short events, void *data) return; if (fd == c->ibuf.fd) { - if (events & EV_WRITE && msgbuf_write(&c->ibuf.w) < 0 && + if (events & EV_WRITE && msgbuf_write(&c->ibuf.w) <= 0 && errno != EAGAIN) goto client_lost; @@ -327,6 +328,7 @@ server_client_check_mouse(struct client *c, struct window_pane *wp) if (options_get_number(oo, "mouse-select-pane") && (m->event == MOUSE_EVENT_DOWN || m->event == MOUSE_EVENT_WHEEL)) { window_set_active_at(wp->window, m->x, m->y); + server_status_window(wp->window); server_redraw_window_borders(wp->window); wp = wp->window->active; /* may have changed */ } @@ -540,8 +542,18 @@ server_client_check_resize(struct window_pane *wp) ws.ws_col = wp->sx; ws.ws_row = wp->sy; - if (ioctl(wp->fd, TIOCSWINSZ, &ws) == -1) + if (ioctl(wp->fd, TIOCSWINSZ, &ws) == -1) { +#ifdef __sun + /* + * Some versions of Solaris apparently can return an error when + * resizing; don't know why this happens, can't reproduce on + * other platforms and ignoring it doesn't seem to cause any + * issues. + */ + if (errno != EINVAL && errno != ENXIO) +#endif fatal("ioctl failed"); + } wp->flags &= ~PANE_RESIZE; } @@ -635,7 +647,7 @@ server_client_reset_state(struct client *c) if (!window_pane_visible(wp) || wp->yoff + s->cy >= c->tty.sy - status) tty_cursor(&c->tty, 0, 0); else { - o = status && options_get_number (oo, "status-position") == 0; + o = status && options_get_number(oo, "status-position") == 0; tty_cursor(&c->tty, wp->xoff + s->cx, o + wp->yoff + s->cy); } @@ -645,7 +657,7 @@ server_client_reset_state(struct client *c) */ mode = s->mode; if ((c->tty.mouse.flags & MOUSE_RESIZE_PANE) && - !(mode & (MODE_MOUSE_BUTTON|MODE_MOUSE_ANY))) + !(mode & MODE_MOUSE_BUTTON)) mode |= MODE_MOUSE_BUTTON; /* @@ -770,19 +782,25 @@ server_client_check_redraw(struct client *c) void server_client_set_title(struct client *c) { - struct session *s = c->session; - const char *template; - char *title; + struct session *s = c->session; + const char *template; + char *title; + struct format_tree *ft; template = options_get_string(&s->options, "set-titles-string"); - title = status_replace(c, NULL, NULL, NULL, template, time(NULL), 1); + ft = format_create(); + format_defaults(ft, c, NULL, NULL, NULL); + + title = format_expand_time(ft, template, time(NULL)); if (c->title == NULL || strcmp(title, c->title) != 0) { free(c->title); c->title = xstrdup(title); tty_set_title(&c->tty, c->title); } free(title); + + format_free(ft); } /* Dispatch message from client. */ @@ -873,6 +891,9 @@ server_client_msg_dispatch(struct client *c) break; c->flags &= ~CLIENT_SUSPENDED; + if (c->tty.fd == -1) /* exited in the meantime */ + break; + if (gettimeofday(&c->activity_time, NULL) != 0) fatal("gettimeofday"); if (c->session != NULL) @@ -909,7 +930,7 @@ server_client_msg_command(struct client *c, struct imsg *imsg) fatalx("bad MSG_COMMAND size"); memcpy(&data, imsg->data, sizeof data); - buf = (char*)imsg->data + sizeof data; + buf = (char *)imsg->data + sizeof data; len = imsg->hdr.len - IMSG_HEADER_SIZE - sizeof data; if (len > 0 && buf[len - 1] != '\0') fatalx("bad MSG_COMMAND string"); |