diff options
-rw-r--r-- | client.c | 9 | ||||
-rw-r--r-- | server-client.c | 9 | ||||
-rw-r--r-- | tmux.h | 4 | ||||
-rw-r--r-- | tty.c | 39 |
4 files changed, 45 insertions, 16 deletions
@@ -1,4 +1,4 @@ -/* $Id: client.c,v 1.93 2010-06-06 00:25:47 tcunha Exp $ */ +/* $Id: client.c,v 1.94 2010-06-06 00:30:34 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -180,6 +180,13 @@ client_main(void) set_signals(client_signal); /* + * Send a resize message immediately in case the terminal size has + * changed between the identify message to the server and the MSG_READY + * telling us to move into the client code. + */ + client_write_server(MSG_RESIZE, NULL, 0); + + /* * imsg_read in the first client poll loop (before the terminal has * been initialised) may have read messages into the buffer after the * MSG_READY switched to here. Process anything outstanding now to diff --git a/server-client.c b/server-client.c index df72a818..f738e86e 100644 --- a/server-client.c +++ b/server-client.c @@ -1,4 +1,4 @@ -/* $Id: server-client.c,v 1.32 2010-05-22 21:56:04 micahcowan Exp $ */ +/* $Id: server-client.c,v 1.33 2010-06-06 00:30:34 tcunha Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> @@ -560,9 +560,10 @@ server_client_msg_dispatch(struct client *c) if (datalen != 0) fatalx("bad MSG_RESIZE size"); - tty_resize(&c->tty); - recalculate_sizes(); - server_redraw_client(c); + if (tty_resize(&c->tty)) { + recalculate_sizes(); + server_redraw_client(c); + } break; case MSG_EXITING: if (datalen != 0) @@ -1,4 +1,4 @@ -/* $Id: tmux.h,v 1.560 2010-06-06 00:23:44 tcunha Exp $ */ +/* $Id: tmux.h,v 1.561 2010-06-06 00:30:34 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -1354,7 +1354,7 @@ void tty_puts(struct tty *, const char *); void tty_putc(struct tty *, u_char); void tty_pututf8(struct tty *, const struct grid_utf8 *); void tty_init(struct tty *, int, char *); -void tty_resize(struct tty *); +int tty_resize(struct tty *); void tty_start_tty(struct tty *); void tty_stop_tty(struct tty *); void tty_set_title(struct tty *, const char *); @@ -1,4 +1,4 @@ -/* $Id: tty.c,v 1.191 2010-06-06 00:27:08 tcunha Exp $ */ +/* $Id: tty.c,v 1.192 2010-06-06 00:30:34 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -73,34 +73,55 @@ tty_init(struct tty *tty, int fd, char *term) tty->term_flags = 0; } -void +int tty_resize(struct tty *tty) { struct winsize ws; + u_int sx, sy; if (ioctl(tty->fd, TIOCGWINSZ, &ws) != -1) { - tty->sx = ws.ws_col; - tty->sy = ws.ws_row; + sx = ws.ws_col; + if (sx == 0) + sx = 80; + sy = ws.ws_row; + if (sy == 0) + sy = 24; + } else { + sx = 80; + sy = 24; } - if (tty->sx == 0) - tty->sx = 80; - if (tty->sy == 0) - tty->sy = 24; + if (sx == tty->sx && sy == tty->sy) + return (0); + tty->sx = sx; + tty->sy = sy; tty->cx = UINT_MAX; tty->cy = UINT_MAX; tty->rupper = UINT_MAX; tty->rlower = UINT_MAX; + + /* + * If the terminal has been started, reset the actual scroll region and + * cursor position, as this may not have happened. + */ + if (tty->flags & TTY_STARTED) { + tty_cursor(tty, 0, 0); + tty_region(tty, 0, tty->sy - 1); + } + + return (1); } int tty_open(struct tty *tty, const char *overrides, char **cause) { + char out[64]; int fd; if (debug_level > 3) { - fd = open("tmux.out", O_WRONLY|O_CREAT|O_TRUNC, 0644); + xsnprintf(out, sizeof out, "tmux-out-%ld.log", (long) getpid()); + fd = open(out, O_WRONLY|O_CREAT|O_TRUNC, 0644); if (fd != -1 && fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) fatal("fcntl failed"); tty->log_fd = fd; |