aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client.c9
-rw-r--r--server-client.c9
-rw-r--r--tmux.h4
-rw-r--r--tty.c39
4 files changed, 45 insertions, 16 deletions
diff --git a/client.c b/client.c
index a51b200c..54932d43 100644
--- a/client.c
+++ b/client.c
@@ -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)
diff --git a/tmux.h b/tmux.h
index c0d3298c..7f11a5d7 100644
--- a/tmux.h
+++ b/tmux.h
@@ -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 *);
diff --git a/tty.c b/tty.c
index 6c055d15..3814dde7 100644
--- a/tty.c
+++ b/tty.c
@@ -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;