aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Marriott <nicholas.marriott@gmail.com>2013-05-31 13:00:11 +0100
committerNicholas Marriott <nicholas.marriott@gmail.com>2013-05-31 13:00:11 +0100
commit2ee9c4df12429d4f6fb8f06a373fdd5c0347049c (patch)
tree1c241b4bcd2e637cbae11d7fb6b34840d9839ec7
parente6c77e7afbcee07ed6237f2a0f30e70f45ecf0ba (diff)
parent76cb088d16fd5aa47b54428368ef403cbbcf4f5a (diff)
downloadrtmux-2ee9c4df12429d4f6fb8f06a373fdd5c0347049c.tar.gz
rtmux-2ee9c4df12429d4f6fb8f06a373fdd5c0347049c.tar.bz2
rtmux-2ee9c4df12429d4f6fb8f06a373fdd5c0347049c.zip
Merge branch 'master' of ssh://git.code.sf.net/p/tmux/tmux-code
-rw-r--r--.gitignore1
-rw-r--r--Makefile.am22
-rw-r--r--TODO3
-rw-r--r--client.c4
-rw-r--r--clock.c15
-rw-r--r--cmd-choose-tree.c10
-rw-r--r--cmd-copy-mode.c8
-rw-r--r--cmd-queue.c2
-rw-r--r--cmd-source-file.c1
-rw-r--r--cmd-swap-pane.c8
-rw-r--r--cmd.c4
-rw-r--r--colour.c26
-rw-r--r--compat.h5
-rw-r--r--compat/cfmakeraw.c32
-rw-r--r--configure.ac16
-rw-r--r--examples/tmux.vim2
-rw-r--r--format.c6
-rw-r--r--input-keys.c2
-rw-r--r--job.c6
-rw-r--r--mdoc2man.awk370
-rw-r--r--options-table.c2
-rw-r--r--screen-write.c6
-rw-r--r--screen.c8
-rw-r--r--server-client.c22
-rw-r--r--server-fn.c1
-rw-r--r--server.c8
-rw-r--r--tmux.124
-rw-r--r--tmux.c20
-rw-r--r--tmux.h13
-rw-r--r--tty-term.c4
-rw-r--r--tty.c36
-rw-r--r--utf8.c1
-rw-r--r--window-choose.c14
33 files changed, 555 insertions, 147 deletions
diff --git a/.gitignore b/.gitignore
index c3906ada..3b400861 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,3 +15,4 @@ tmux
Makefile
Makefile.in
configure
+tmux.1
diff --git a/Makefile.am b/Makefile.am
index 2ce54b1a..84261d41 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -2,18 +2,18 @@
# Obvious program stuff.
bin_PROGRAMS = tmux
-dist_man1_MANS = tmux.1
+CLEANFILES = tmux.1.mdoc tmux.1.man
# Distribution tarball options.
EXTRA_DIST = \
CHANGES FAQ README TODO examples compat \
- array.h compat.h tmux.h osdep-*.c
+ array.h compat.h tmux.h osdep-*.c mdoc2man.awk tmux.1
dist-hook:
grep "^#found_debug=" configure
find $(distdir) -name .svn -type d|xargs rm -Rf
# Preprocessor flags.
-CPPFLAGS += @XOPEN_DEFINES@
+CPPFLAGS += @XOPEN_DEFINES@ -DTMUX_CONF="\"$(sysconfdir)/tmux.conf\""
# glibc as usual does things ass-backwards and hides useful things by default,
# so everyone has to add this.
@@ -231,6 +231,22 @@ endif
if NO_B64_NTOP
nodist_tmux_SOURCES += compat/b64_ntop.c
endif
+if NO_CFMAKERAW
+nodist_tmux_SOURCES += compat/cfmakeraw.c
+endif
+
+# Install tmux.1 in the right format.
+install-exec-hook:
+ if test x@MANFORMAT@ = xmdoc; then \
+ sed -e "s|@SYSCONFDIR@|$(sysconfdir)|g" $(srcdir)/tmux.1 \
+ >$(srcdir)/tmux.1.mdoc; \
+ else \
+ sed -e "s|@SYSCONFDIR@|$(sysconfdir)|g" $(srcdir)/tmux.1| \
+ $(AWK) -fmdoc2man.awk >$(srcdir)/tmux.1.man; \
+ fi
+ $(MKDIR_P) $(DESTDIR)$(mandir)/man1
+ $(INSTALL_DATA) $(srcdir)/tmux.1.@MANFORMAT@ \
+ $(DESTDIR)$(mandir)/man1/tmux.1
# Update SF web site.
upload-index.html: update-index.html
diff --git a/TODO b/TODO
index d3e3b46b..92b60a9a 100644
--- a/TODO
+++ b/TODO
@@ -47,7 +47,7 @@
- hooks!
- warts on current naming:
- * display-time but message-fg/bg/attr
+ * display-time but message-fg/bg/attr
* list-* vs show-*
* server-info
* split-window -> split-pane??
@@ -55,6 +55,7 @@
- way to keep a job running just read its last line of output for #()
- better UTF-8 support:
+ * #22T can split in the middle of UTF-8 characters!
* window names and titles
* message display
* prompt input
diff --git a/client.c b/client.c
index 91f47650..691ace31 100644
--- a/client.c
+++ b/client.c
@@ -78,8 +78,8 @@ client_get_lock(char *lockfile)
if ((lockfd = open(lockfile, O_WRONLY|O_CREAT, 0600)) == -1)
fatal("open failed");
- if (flock(lockfd, LOCK_EX|LOCK_NB) == -1 && errno == EWOULDBLOCK) {
- while (flock(lockfd, LOCK_EX) == -1 && errno == EINTR)
+ if (lockf(lockfd, F_TLOCK, 0) == -1 && errno == EAGAIN) {
+ while (lockf(lockfd, F_LOCK, 0) == -1 && errno == EINTR)
/* nothing */;
close(lockfd);
return (-1);
diff --git a/clock.c b/clock.c
index 49a883cf..ec742884 100644
--- a/clock.c
+++ b/clock.c
@@ -103,13 +103,20 @@ clock_draw(struct screen_write_ctx *ctx, int colour, int style)
struct grid_cell gc;
char tim[64], *ptr;
time_t t;
+ struct tm *tm;
u_int i, j, x, y, idx;
t = time(NULL);
- if (style == 0)
- strftime(tim, sizeof tim, "%l:%M %p", localtime(&t));
- else
- strftime(tim, sizeof tim, "%H:%M", localtime(&t));
+ tm = localtime(&t);
+ if (style == 0) {
+ strftime(tim, sizeof tim, "%l:%M ", localtime(&t));
+ if (tm->tm_hour >= 12)
+ strlcat(tim, "PM", sizeof tim);
+ else
+ strlcat(tim, "AM", sizeof tim);
+ } else
+ strftime(tim, sizeof tim, "%H:%M", tm);
+
screen_write_clearscreen(ctx);
diff --git a/cmd-choose-tree.c b/cmd-choose-tree.c
index e2d382b3..a9b6ffbc 100644
--- a/cmd-choose-tree.c
+++ b/cmd-choose-tree.c
@@ -89,10 +89,7 @@ cmd_choose_tree_exec(struct cmd *self, struct cmd_q *cmdq)
return (CMD_RETURN_ERROR);
}
- if ((s = c->session) == NULL)
- return (CMD_RETURN_ERROR);
-
- if ((wl = cmd_find_window(cmdq, args_get(args, 't'), NULL)) == NULL)
+ if ((wl = cmd_find_window(cmdq, args_get(args, 't'), &s)) == NULL)
return (CMD_RETURN_ERROR);
if (window_pane_set_mode(wl->window->active, &window_choose_mode) != 0)
@@ -231,9 +228,12 @@ windows_only:
free(final_win_template_last);
window_choose_ready(wl->window->active, cur_win, NULL);
+ window_choose_collapse_all(wl->window->active);
- if (args_has(args, 'u'))
+ if (args_has(args, 'u')) {
window_choose_expand_all(wl->window->active);
+ window_choose_set_current(wl->window->active, cur_win);
+ }
return (CMD_RETURN_NORMAL);
}
diff --git a/cmd-copy-mode.c b/cmd-copy-mode.c
index f014be83..40584a28 100644
--- a/cmd-copy-mode.c
+++ b/cmd-copy-mode.c
@@ -54,9 +54,11 @@ cmd_copy_mode_exec(struct cmd *self, struct cmd_q *cmdq)
if (cmd_find_pane(cmdq, args_get(args, 't'), NULL, &wp) == NULL)
return (CMD_RETURN_ERROR);
- if (window_pane_set_mode(wp, &window_copy_mode) != 0)
- return (CMD_RETURN_NORMAL);
- window_copy_init_from_pane(wp);
+ if (wp->mode != &window_copy_mode) {
+ if (window_pane_set_mode(wp, &window_copy_mode) != 0)
+ return (CMD_RETURN_NORMAL);
+ window_copy_init_from_pane(wp);
+ }
if (wp->mode == &window_copy_mode && args_has(self->args, 'u'))
window_copy_pageup(wp);
diff --git a/cmd-queue.c b/cmd-queue.c
index c5f75f40..671f1e95 100644
--- a/cmd-queue.c
+++ b/cmd-queue.c
@@ -158,7 +158,7 @@ cmdq_guard(struct cmd_q *cmdq, const char *guard)
{
struct client *c = cmdq->client;
- if (c == NULL || c->session == NULL)
+ if (c == NULL)
return 0;
if (!(c->flags & CLIENT_CONTROL))
return 0;
diff --git a/cmd-source-file.c b/cmd-source-file.c
index 827d4c00..45a3a39b 100644
--- a/cmd-source-file.c
+++ b/cmd-source-file.c
@@ -49,6 +49,7 @@ cmd_source_file_exec(struct cmd *self, struct cmd_q *cmdq)
char *cause;
cmdq1 = cmdq_new(NULL);
+ cmdq1->client = cmdq->client;
cmdq1->emptyfn = cmd_source_file_done;
cmdq1->data = cmdq;
diff --git a/cmd-swap-pane.c b/cmd-swap-pane.c
index d484f4e2..05317260 100644
--- a/cmd-swap-pane.c
+++ b/cmd-swap-pane.c
@@ -75,8 +75,12 @@ cmd_swap_pane_exec(struct cmd *self, struct cmd_q *cmdq)
src_wp = TAILQ_PREV(dst_wp, window_panes, entry);
if (src_wp == NULL)
src_wp = TAILQ_LAST(&dst_w->panes, window_panes);
- } else
- return (CMD_RETURN_NORMAL);
+ } else {
+ src_wl = cmd_find_pane(cmdq, NULL, NULL, &src_wp);
+ if (src_wl == NULL)
+ return (CMD_RETURN_ERROR);
+ src_w = src_wl->window;
+ }
} else {
src_wl = cmd_find_pane(cmdq, args_get(args, 's'), NULL, &src_wp);
if (src_wl == NULL)
diff --git a/cmd.c b/cmd.c
index eecac462..282fb112 100644
--- a/cmd.c
+++ b/cmd.c
@@ -294,8 +294,8 @@ cmd_print(struct cmd *cmd, char *buf, size_t len)
size_t off, used;
off = xsnprintf(buf, len, "%s ", cmd->entry->name);
- if (off < len) {
- used = args_print(cmd->args, buf + off, len - off);
+ if (off + 1 < len) {
+ used = args_print(cmd->args, buf + off, len - off - 1);
if (used == 0)
off--;
else
diff --git a/colour.c b/colour.c
index eef31a30..da1cb421 100644
--- a/colour.c
+++ b/colour.c
@@ -287,29 +287,3 @@ colour_256to16(u_char c)
return (table[c]);
}
-
-/* Convert 256 colour palette to 88. */
-u_char
-colour_256to88(u_char c)
-{
- static const u_char table[256] = {
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
- 16, 17, 17, 18, 18, 19, 20, 21, 21, 22, 22, 23, 20, 21, 21, 22,
- 22, 23, 24, 25, 25, 26, 26, 27, 24, 25, 25, 26, 26, 27, 28, 29,
- 29, 30, 30, 31, 32, 33, 33, 34, 34, 35, 36, 37, 37, 38, 38, 39,
- 36, 37, 37, 38, 38, 39, 40, 41, 41, 42, 42, 43, 40, 41, 41, 42,
- 42, 43, 44, 45, 45, 46, 46, 47, 32, 33, 33, 34, 34, 35, 36, 37,
- 37, 38, 38, 39, 36, 37, 37, 38, 38, 39, 40, 41, 41, 42, 42, 43,
- 40, 41, 41, 42, 42, 43, 44, 45, 45, 46, 46, 47, 48, 49, 49, 50,
- 50, 51, 52, 53, 53, 54, 54, 55, 52, 53, 53, 54, 54, 55, 56, 57,
- 57, 58, 58, 59, 56, 57, 57, 58, 58, 59, 60, 61, 61, 62, 62, 63,
- 48, 49, 49, 50, 50, 51, 52, 53, 53, 54, 54, 55, 52, 53, 53, 54,
- 54, 55, 56, 57, 57, 58, 58, 59, 56, 57, 57, 58, 58, 59, 60, 61,
- 61, 62, 62, 63, 64, 65, 65, 66, 66, 67, 68, 69, 69, 70, 70, 71,
- 68, 69, 69, 70, 70, 71, 72, 73, 73, 74, 74, 75, 72, 73, 73, 74,
- 74, 75, 76, 77, 77, 78, 78, 79, 0, 0, 80, 80, 80, 81, 81, 81,
- 82, 82, 82, 83, 83, 83, 84, 84, 84, 85, 85, 85, 86, 86, 86, 87
- };
-
- return (table[c]);
-}
diff --git a/compat.h b/compat.h
index 622006e1..d3973797 100644
--- a/compat.h
+++ b/compat.h
@@ -236,6 +236,11 @@ int setenv(const char *, const char *, int);
int unsetenv(const char *);
#endif
+#ifndef HAVE_CFMAKERAW
+/* cfmakeraw.c */
+void cfmakeraw(struct termios *tio);
+#endif
+
#ifdef HAVE_GETOPT
#include <getopt.h>
#else
diff --git a/compat/cfmakeraw.c b/compat/cfmakeraw.c
new file mode 100644
index 00000000..3f8dc7e5
--- /dev/null
+++ b/compat/cfmakeraw.c
@@ -0,0 +1,32 @@
+/* $Id$ */
+
+/*
+ * Copyright (c) 2013 Dagobert Michelsen
+ * Copyright (c) 2013 Nicholas Marriott <nicm@users.sourceforge.net>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
+ * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
+ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <string.h>
+
+#include "tmux.h"
+
+void
+cfmakeraw(struct termios *tio)
+{
+ tio->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
+ tio->c_oflag &= ~OPOST;
+ tio->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
+ tio->c_cflag &= ~(CSIZE|PARENB);
+ tio->c_cflag |= CS8;
+}
diff --git a/configure.ac b/configure.ac
index f00937f0..590b9db0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -18,6 +18,9 @@ AC_PROG_CC
AM_PROG_CC_C_O
AC_PROG_INSTALL
+# Default tmux.conf goes in /etc not ${prefix}/etc.
+test "$sysconfdir" = '${prefix}/etc' && sysconfdir=/etc
+
# Check for various headers. Alternatives included from compat.h.
AC_CHECK_HEADERS(
[ \
@@ -313,6 +316,13 @@ if test "x$found_strnvis" = xyes; then
fi
AM_CONDITIONAL(NO_VIS, [test "x$found_strnvis" = xno])
+# Look for cfmakeraw, compat/cfmakeraw.c used if missing.
+AC_CHECK_FUNC(cfmakeraw, found_cfmakeraw=yes, found_cfmakeraw=no)
+if test "x$found_cfmakeraw" = xyes; then
+ AC_DEFINE(HAVE_CFMAKERAW)
+fi
+AM_CONDITIONAL(NO_CFMAKERAW, [test "x$found_cfmakeraw" = xno])
+
# Look for getopt. glibc's getopt does not enforce argument order and the ways
# of making it do so are stupid, so just use our own instead.
AC_CHECK_FUNC(getopt, found_getopt=yes, found_getopt=no)
@@ -345,6 +355,7 @@ AC_CHECK_FUNCS(
dirfd \
setproctitle \
sysconf \
+ cfmakeraw \
]
)
@@ -416,6 +427,10 @@ else
AC_MSG_RESULT(no)
fi
+# Man page defaults to mdoc.
+MANFORMAT=mdoc
+AC_SUBST(MANFORMAT)
+
# Figure out the platform for osdep-*.c and forkpty-*.c.
AC_MSG_CHECKING(platform)
case "$host_os" in
@@ -455,6 +470,7 @@ case "$host_os" in
*solaris*)
AC_MSG_RESULT(sunos)
PLATFORM=sunos
+ MANFORMAT=man
;;
*hpux*)
AC_MSG_RESULT(hpux)
diff --git a/examples/tmux.vim b/examples/tmux.vim
index 076115c1..e85f8ff6 100644
--- a/examples/tmux.vim
+++ b/examples/tmux.vim
@@ -56,7 +56,7 @@ syn keyword tmuxCmds
\ list-buffers loadb load-buffer pasteb paste-buffer saveb save-buffer
\ setb set-buffer showb show-buffer
\ clock-mode if[-shell] lock[-server] run[-shell] server-info info
- \ choose-list
+ \ choose-list wait-for
syn keyword tmuxOptsSet
\ buffer-limit escape-time exit-unattached exit-unattached quiet
diff --git a/format.c b/format.c
index fa2dd0b2..7de819a9 100644
--- a/format.c
+++ b/format.c
@@ -288,7 +288,7 @@ format_session(struct format_tree *ft, struct session *s)
format_add(ft, "session_group", "%u", session_group_index(sg));
t = s->creation_time.tv_sec;
- format_add(ft, "session_created", "%ld", (long) t);
+ format_add(ft, "session_created", "%lld", (long long) t);
tim = ctime(&t);
*strchr(tim, '\n') = '\0';
format_add(ft, "session_created_string", "%s", tim);
@@ -314,13 +314,13 @@ format_client(struct format_tree *ft, struct client *c)
format_add(ft, "client_termname", "%s", c->tty.termname);
t = c->creation_time.tv_sec;
- format_add(ft, "client_created", "%ld", (long) t);
+ format_add(ft, "client_created", "%lld", (long long) t);
tim = ctime(&t);
*strchr(tim, '\n') = '\0';
format_add(ft, "client_created_string", "%s", tim);
t = c->activity_time.tv_sec;
- format_add(ft, "client_activity", "%ld", (long) t);
+ format_add(ft, "client_activity", "%lld", (long long) t);
tim = ctime(&t);
*strchr(tim, '\n') = '\0';
format_add(ft, "client_activity_string", "%s", tim);
diff --git a/input-keys.c b/input-keys.c
index faa7bd17..7582a638 100644
--- a/input-keys.c
+++ b/input-keys.c
@@ -226,7 +226,7 @@ input_mouse(struct window_pane *wp, struct session *s, struct mouse_event *m)
len += utf8_split2(m->x + 33, &buf[len]);
len += utf8_split2(m->y + 33, &buf[len]);
} else {
- if (m->xb > 223 || m->x >= 222 || m->y > 222)
+ if (m->xb > 223)
return;
len = xsnprintf(buf, sizeof buf, "\033[M");
buf[len++] = m->xb + 32;
diff --git a/job.c b/job.c
index 6a7286ae..b2c2251c 100644
--- a/job.c
+++ b/job.c
@@ -108,7 +108,7 @@ job_run(const char *cmd, struct session *s,
job->event = bufferevent_new(job->fd, NULL, job_write_callback,
job_callback, job);
- bufferevent_enable(job->event, EV_READ);
+ bufferevent_enable(job->event, EV_READ|EV_WRITE);
log_debug("run job %p: %s, pid %ld", job, job->cmd, (long) job->pid);
return (job);
@@ -143,8 +143,8 @@ job_write_callback(unused struct bufferevent *bufev, void *data)
struct job *job = data;
size_t len = EVBUFFER_LENGTH(EVBUFFER_OUTPUT(job->event));
- log_debug("job write %p: %s, pid %ld, output left %lu", job, job->cmd,
- (long) job->pid, (unsigned long) len);
+ log_debug("job write %p: %s, pid %ld, output left %zu", job, job->cmd,
+ (long) job->pid, len);
if (len == 0) {
shutdown(job->fd, SHUT_WR);
diff --git a/mdoc2man.awk b/mdoc2man.awk
new file mode 100644
index 00000000..80e8d5ff
--- /dev/null
+++ b/mdoc2man.awk
@@ -0,0 +1,370 @@
+#!/usr/bin/awk
+#
+# $Id: mdoc2man.awk,v 1.9 2009/10/24 00:52:42 dtucker Exp $
+#
+# Version history:
+# v4+ Adapted for OpenSSH Portable (see cvs Id and history)
+# v3, I put the program under a proper license
+# Dan Nelson <dnelson@allantgroup.com> added .An, .Aq and fixed a typo
+# v2, fixed to work on GNU awk --posix and MacOS X
+# v1, first attempt, didn't work on MacOS X
+#
+# Copyright (c) 2003 Peter Stuge <stuge-mdoc2man@cdy.org>
+#
+# Permission to use, copy, modify, and distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+
+BEGIN {
+ optlist=0
+ oldoptlist=0
+ nospace=0
+ synopsis=0
+ reference=0
+ block=0
+ ext=0
+ extopt=0
+ literal=0
+ prenl=0
+ breakw=0
+ line=""
+}
+
+function wtail() {
+ retval=""
+ while(w<nwords) {
+ if(length(retval))
+ retval=retval OFS
+ retval=retval words[++w]
+ }
+ return retval
+}
+
+function add(str) {
+ for(;prenl;prenl--)
+ line=line "\n"
+ line=line str
+}
+
+! /^\./ {
+ for(;prenl;prenl--)
+ print ""
+ print
+ if(literal)
+ print ".br"
+ next
+}
+
+/^\.\\"/ { next }
+
+{
+ option=0
+ parens=0
+ angles=0
+ sub("^\\.","")
+ nwords=split($0,words)
+ for(w=1;w<=nwords;w++) {
+ skip=0
+ if(match(words[w],"^Li|Pf$")) {
+ skip=1
+ } else if(match(words[w],"^Xo$")) {
+ skip=1
+ ext=1
+ if(length(line)&&!(match(line," $")||prenl))
+ add(OFS)
+ } else if(match(words[w],"^Xc$")) {
+ skip=1
+ ext=0
+ if(!extopt)
+ prenl++
+ w=nwords
+ } else if(match(words[w],"^Bd$")) {
+ skip=1
+ if(match(words[w+1],"-literal")) {
+ literal=1
+ prenl++
+ w=nwords
+ }
+ } else if(match(words[w],"^Ed$")) {
+ skip=1
+ literal=0
+ } else if(match(words[w],"^Ns$")) {
+ skip=1
+ if(!nospace)
+ nospace=1
+ sub(" $","",line)
+ } else if(match(words[w],"^No$")) {
+ skip=1
+ sub(" $","",line)
+ add(words[++w])
+ } else if(match(words[w],"^Dq$")) {
+ skip=1
+ add("``")
+ add(words[++w])
+ while(w<nwords&&!match(words[w+1],"^[\\.,]"))
+ add(OFS words[++w])
+ add("''")
+ if(!nospace&&match(words[w+1],"^[\\.,]"))
+ nospace=1
+ } else if(match(words[w],"^Sq|Ql$")) {
+ skip=1
+ add("`" words[++w] "'")
+ if(!nospace&&match(words[w+1],"^[\\.,]"))
+ nospace=1
+ } else if(match(words[w],"^Oo$")) {
+ skip=1
+ extopt=1
+ if(!nospace)
+ nospace=1
+ add("[")
+ } else if(match(words[w],"^Oc$")) {
+ skip=1
+ extopt=0
+ add("]")
+ }
+ if(!skip) {
+ if(!nospace&&length(line)&&!(match(line," $")||prenl))
+ add(OFS)
+ if(nospace==1)
+ nospace=0
+ }
+ if(match(words[w],"^Dd$")) {
+ if(match(words[w+1],"^\\$Mdocdate:")) {
+ w++;
+ if(match(words[w+4],"^\\$$")) {
+ words[w+4] = ""
+ }
+ }
+ date=wtail()
+ next
+ } else if(match(words[w],"^Dt$")) {
+ id=wtail()
+ next
+ } else if(match(words[w],"^Ux$")) {
+ add("UNIX")
+ skip=1
+ } else if(match(words[w],"^Ox$")) {
+ add("OpenBSD")
+ skip=1
+ } else if(match(words[w],"^Os$")) {
+ add(".TH " id " \"" date "\" \"" wtail() "\"")
+ } else if(match(words[w],"^Sh$")) {
+ add(".SH")
+ synopsis=match(words[w+1],"SYNOPSIS")
+ } else if(match(words[w],"^Xr$")) {
+ add("\\fB" words[++w] "\\fP(" words[++w] ")" words[++w])
+ } else if(match(words[w],"^Rs$")) {
+ split("",refauthors)
+ nrefauthors=0
+ reftitle=""
+ refissue=""
+ refdate=""
+ refopt=""
+ refreport=""
+ reference=1
+ next
+ } else if(match(words[w],"^Re$")) {
+ prenl++
+ for(i=nrefauthors-1;i>0;i--) {
+ add(refauthors[i])
+ if(i>1)
+ add(", ")
+ }
+ if(nrefauthors>1)
+ add(" and ")
+ if(nrefauthors>0)
+ add(refauthors[0] ", ")
+ add("\\fI" reftitle "\\fP")
+ if(length(refissue))
+ add(", " refissue)
+ if(length(refreport)) {
+ add(", " refreport)
+ }
+ if(length(refdate))
+ add(", " refdate)
+ if(length(refopt))
+ add(", " refopt)
+ add(".")
+ reference=0
+ } else if(reference) {
+ if(match(words[w],"^%A$")) { refauthors[nrefauthors++]=wtail() }
+ if(match(words[w],"^%T$")) {
+ reftitle=wtail()
+ sub("^\"","",reftitle)
+ sub("\"$","",reftitle)
+ }
+ if(match(words[w],"^%N$")) { refissue=wtail() }
+ if(match(words[w],"^%D$")) { refdate=wtail() }
+ if(match(words[w],"^%O$")) { refopt=wtail() }
+ if(match(words[w],"^%R$")) { refreport=wtail() }
+ } else if(match(words[w],"^Nm$")) {
+ if(synopsis) {
+ add(".br")
+ prenl++
+ }
+ n=words[++w]
+ if(!length(name))
+ name=n
+ if(!length(n))
+ n=name
+ add("\\fB" n "\\fP")
+ if(!nospace&&match(words[w+1],"^[\\.,]"))
+ nospace=1
+ } else if(match(words[w],"^Nd$")) {
+ add("\\- " wtail())
+ } else if(match(words[w],"^Fl$")) {
+ add("\\fB\\-" words[++w] "\\fP")
+ if(!nospace&&match(words[w+1],"^[\\.,]"))
+ nospace=1
+ } else if(match(words[w],"^Ar$")) {
+ add("\\fI")
+ if(w==nwords)
+ add("file ...\\fP")
+ else {
+ add(words[++w] "\\fP")
+ while(match(words[w+1],"^\\|$"))
+ add(OFS words[++w] " \\fI" words[++w] "\\fP")
+ }
+ if(!nospace&&match(words[w+1],"^[\\.,]"))
+ nospace=1
+ } else if(match(words[w],"^Cm$")) {
+ add("\\fB" words[++w] "\\fP")
+ while(w<nwords&&match(words[w+1],"^[\\.,:;)]"))
+ add(words[++w])
+ } else if(match(words[w],"^Op$")) {
+ option=1
+ if(!nospace)
+ nospace=1
+ add("[")
+ } else if(match(words[w],"^Pp$")) {
+ prenl++
+ } else if(match(words[w],"^An$")) {
+ prenl++
+ } else if(match(words[w],"^Ss$")) {
+ add(".SS")
+ } else if(match(words[w],"^Pa$")&&!option) {
+ add("\\fI")
+ w++
+ if(match(words[w],"^\\."))
+ add("\\&")
+ add(words[w] "\\fP")
+ while(w<nwords&&match(words[w+1],"^[\\.,:;)]"))
+ add(words[++w])
+ } else if(match(words[w],"^Dv$")) {
+ add(".BR")
+ } else if(match(words[w],"^Em|Ev$")) {
+ add(".IR")
+ } else if(match(words[w],"^Pq$")) {
+ add("(")
+ nospace=1
+ parens=1
+ } else if(match(words[w],"^Aq$")) {
+ add("<")
+ nospace=1
+ angles=1
+ } else if(match(words[w],"^S[xy]$")) {
+ add(".B " wtail())
+ } else if(match(words[w],"^Ic$")) {
+ plain=1
+ add("\\fB")
+ while(w<nwords) {
+ w++
+ if(match(words[w],"^Op$")) {
+ w++
+ add("[")
+ words[nwords]=words[nwords] "]"
+ }
+ if(match(words[w],"^Ar$")) {
+ add("\\fI" words[++w] "\\fP")
+ } else if(match(words[w],"^[\\.,]")) {
+ sub(" $","",line)
+ if(plain) {
+ add("\\fP")
+ plain=0
+ }
+ add(words[w])
+ } else {
+ if(!plain) {
+ add("\\fB")
+ plain=1
+ }
+ add(words[w])
+ }
+ if(!nospace)
+ add(OFS)
+ }
+ sub(" $","",line)
+ if(plain)
+ add("\\fP")
+ } else if(match(words[w],"^Bl$")) {
+ oldoptlist=optlist
+ if(match(words[w+1],"-bullet"))
+ optlist=1
+ else if(match(words[w+1],"-enum")) {
+ optlist=2
+ enum=0
+ } else if(match(words[w+1],"-tag"))
+ optlist=3
+ else if(match(words[w+1],"-item"))
+ optlist=4
+ else if(match(words[w+1],"-bullet"))
+ optlist=1
+ w=nwords
+ } else if(match(words[w],"^El$")) {
+ optlist=oldoptlist
+ } else if(match(words[w],"^Bk$")) {
+ if(match(words[w+1],"-words")) {
+ w++
+ breakw=1
+ }
+ } else if(match(words[w],"^Ek$")) {
+ breakw=0
+ } else if(match(words[w],"^It$")&&optlist) {
+ if(optlist==1)
+ add(".IP \\(bu")
+ else if(optlist==2)
+ add(".IP " ++enum ".")
+ else if(optlist==3) {
+ add(".TP")
+ prenl++
+ if(match(words[w+1],"^Pa$|^Ev$")) {
+ add(".B")
+ w++
+ }
+ } else if(optlist==4)
+ add(".IP")
+ } else if(match(words[w],"^Sm$")) {
+ if(match(words[w+1],"off"))
+ nospace=2
+ else if(match(words[w+1],"on"))
+ nospace=0
+ w++
+ } else if(!skip) {
+ add(words[w])
+ }
+ }
+ if(match(line,"^\\.[^a-zA-Z]"))
+ sub("^\\.","",line)
+ if(parens)
+ add(")")
+ if(angles)
+ add(">")
+ if(option)
+ add("]")
+ if(ext&&!extopt&&!match(line," $"))
+ add(OFS)
+ if(!ext&&!extopt&&length(line)) {
+ print line
+ prenl=0
+ line=""
+ }
+}
diff --git a/options-table.c b/options-table.c
index 76a61619..99a9cf5e 100644
--- a/options-table.c
+++ b/options-table.c
@@ -413,7 +413,7 @@ const struct options_table_entry session_options_table[] = {
{ .name = "terminal-overrides",
.type = OPTIONS_TABLE_STRING,
- .default_str = "*88col*:colors=88,*256col*:colors=256"
+ .default_str = "*256col*:colors=256"
",xterm*:XT:Ms=\\E]52;%p1%s;%p2%s\\007"
":Cc=\\E]12;%p1%s\\007:Cr=\\E]112\\007"
":Cs=\\E[%p1%d q:Csr=\\E[2 q,screen*:XT"
diff --git a/screen-write.c b/screen-write.c
index 3e836938..ae89293b 100644
--- a/screen-write.c
+++ b/screen-write.c
@@ -56,7 +56,7 @@ screen_write_reset(struct screen_write_ctx *ctx)
screen_reset_tabs(s);
screen_write_scrollregion(ctx, 0, screen_size_y(s) - 1);
- s->mode &= ~(MODE_INSERT|MODE_KCURSOR|MODE_KKEYPAD);
+ s->mode &= ~(MODE_INSERT|MODE_KCURSOR|MODE_KKEYPAD|MODE_FOCUSON);
s->mode &= ~(ALL_MOUSE_MODES|MODE_MOUSE_UTF8|MODE_MOUSE_SGR);
screen_write_clearscreen(ctx);
@@ -488,6 +488,8 @@ screen_write_cursorup(struct screen_write_ctx *ctx, u_int ny)
if (ny > s->cy - s->rupper)
ny = s->cy - s->rupper;
}
+ if (s->cx == screen_size_x(s))
+ s->cx--;
if (ny == 0)
return;
@@ -512,6 +514,8 @@ screen_write_cursordown(struct screen_write_ctx *ctx, u_int ny)
if (ny > s->rlower - s->cy)