The branch, master has been updated
via fab8ca07373ad4a50b1af8dabf3a2a55e1d9d190 (commit)
via 0e23ab4ccef2848a90b876db3c0e6a796422544c (commit)
via 92997b781a035626bef4e84fbcd7f2282f761a3c (commit)
via a131b82e95df990528371b1d9ca40ee2be264fc8 (commit)
via 1ac96200a7462597b137719b376f40ad0cd85216 (commit)
via b8b00aad5d3de0015367a6e23e800950ff7fc2df (commit)
via 8e4ae12b4d0559a827f740f60b11f386f27f89dd (commit)
via 2056a9ef9e91996c294b5db0a3d01ed415e95e56 (commit)
via c5253ad8f7236662d0186dec1080288eb2d38b72 (commit)
via 2b67907176805e3df5bd913174617d768277bfff (commit)
via f117c7d94a2abb0561540a1fe33dd729b1cb8b34 (commit)
via d1f939cede4a1eb7137feb892450e0e2b650cc6c (commit)
via 1aae53596dd1bd657d534c7a0392826cbff2265c (commit)
via 54782af61632846a48af35b33c056243fea7df8e (commit)
via 61605c68839efa51ba049b549e67e62d68616940 (commit)
via 8d0819bff16dbfbc61a97135742e1a0f1c144f77 (commit)
from fd3b7f357200b85a6f3d6e39bae676c7c70ba082 (commit)
- Log -----------------------------------------------------------------
commit fab8ca07373ad4a50b1af8dabf3a2a55e1d9d190
Author: Thomas Adam <[email protected]>
Commit: Thomas Adam <[email protected]>
SYNCING: Make a note about libutils
Don't forget that compat/* needs updating periodically as well.
---
SYNCING | 9 +++++++++
1 files changed, 9 insertions(+), 0 deletions(-)
diff --git a/SYNCING b/SYNCING
index eba2417..218685c 100644
--- a/SYNCING
+++ b/SYNCING
@@ -131,6 +131,15 @@ And if happy:
% git push origin master
+Keeping an eye on libutil in OpenBSD
+====================================
+
+A lot of the compat/ code in tmux comes from libutil, especially imsg.
+Sometimes the API can change, etc., which might cause interesting problems
+trying to run the portable version of tmux. It's worth checking
+periodically for any changes to libutil in OpenBSD and syncing those files
+to compat/ as and when appropriate.
+
Release tmux for next version
=============================
commit 0e23ab4ccef2848a90b876db3c0e6a796422544c
Author: Thomas Adam <[email protected]>
Commit: Thomas Adam <[email protected]>
Sync libutil from OpenBSD (imsg)
Changes in the imsg API need to be reflected here as tmux wasn't creating
any clients because of it.
---
compat/imsg-buffer.c | 38 +++++++++++---------
compat/imsg.c | 99 +++++++++++++++++++++++++++++++++++++++++---------
compat/imsg.h | 11 ++++--
3 files changed, 110 insertions(+), 38 deletions(-)
diff --git a/compat/imsg-buffer.c b/compat/imsg-buffer.c
index 2ddf0f7..2242e01 100644
--- a/compat/imsg-buffer.c
+++ b/compat/imsg-buffer.c
@@ -1,5 +1,5 @@
/* $Id$ */
-/* $OpenBSD: imsg-buffer.c,v 1.3 2010/05/26 13:56:07 nicm Exp $ */
+/* $OpenBSD: imsg-buffer.c,v 1.4 2014/06/30 00:25:17 deraadt Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <[email protected]>
@@ -17,17 +17,19 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-#include <sys/param.h>
+#include <sys/types.h>
+#include <sys/queue.h>
#include <sys/socket.h>
#include <sys/uio.h>
+#include <limits.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
-#include <strings.h>
#include <unistd.h>
#include "tmux.h"
+#include "imsg.h"
int ibuf_realloc(struct ibuf *, size_t);
void ibuf_enqueue(struct msgbuf *, struct ibuf *);
@@ -158,22 +160,23 @@ ibuf_write(struct msgbuf *msgbuf)
i++;
}
+again:
if ((n = writev(msgbuf->fd, iov, i)) == -1) {
- if (errno == EAGAIN || errno == ENOBUFS ||
- errno == EINTR) /* try later */
- return (0);
- else
- return (-1);
+ if (errno == EINTR)
+ goto again;
+ if (errno == ENOBUFS)
+ errno = EAGAIN;
+ return (-1);
}
if (n == 0) { /* connection closed */
errno = 0;
- return (-2);
+ return (0);
}
msgbuf_drain(msgbuf, n);
- return (0);
+ return (1);
}
void
@@ -257,17 +260,18 @@ msgbuf_write(struct msgbuf *msgbuf)
*(int *)CMSG_DATA(cmsg) = buf->fd;
}
+again:
if ((n = sendmsg(msgbuf->fd, &msg, 0)) == -1) {
- if (errno == EAGAIN || errno == ENOBUFS ||
- errno == EINTR) /* try later */
- return (0);
- else
- return (-1);
+ if (errno == EINTR)
+ goto again;
+ if (errno == ENOBUFS)
+ errno = EAGAIN;
+ return (-1);
}
if (n == 0) { /* connection closed */
errno = 0;
- return (-2);
+ return (0);
}
/*
@@ -281,7 +285,7 @@ msgbuf_write(struct msgbuf *msgbuf)
msgbuf_drain(msgbuf, n);
- return (0);
+ return (1);
}
void
diff --git a/compat/imsg.c b/compat/imsg.c
index c4dd191..c99cda1 100644
--- a/compat/imsg.c
+++ b/compat/imsg.c
@@ -1,5 +1,5 @@
/* $Id$ */
-/* $OpenBSD: imsg.c,v 1.3 2010/05/26 13:56:07 nicm Exp $ */
+/* $OpenBSD: imsg.c,v 1.6 2014/06/30 00:26:22 deraadt Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <[email protected]>
@@ -17,20 +17,55 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-#include <sys/param.h>
+#include <sys/types.h>
+#include <sys/queue.h>
#include <sys/socket.h>
#include <sys/uio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
-#include <strings.h>
#include <unistd.h>
#include "tmux.h"
+#include "imsg.h"
+
+int imsg_fd_overhead = 0;
int imsg_get_fd(struct imsgbuf *);
+int available_fds(unsigned int);
+
+/* TA: 2014-09-08: Note that the original code calls getdtablecount() which
is
+ * OpenBSD specific. Until such time that it's ported elsewhere from
+ * <unistd.h>, I've mimicked what OpenSMTPD are doing, by using available_fds()
+ * instead.
+ */
+
+int
+available_fds(unsigned int n)
+{
+ unsigned int i;
+ int ret, fds[256];
+
+ if (n > (sizeof(fds)/sizeof(fds[0])))
+ return (1);
+
+ ret = 0;
+ for (i = 0; i < n; i++) {
+ fds[i] = -1;
+ if ((fds[i] = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
+ ret = 1;
+ break;
+ }
+ }
+
+ for (i = 0; i < n && fds[i] >= 0; i++)
+ close(fds[i]);
+
+ return (ret);
+}
+
void
imsg_init(struct imsgbuf *ibuf, int fd)
{
@@ -49,10 +84,10 @@ imsg_read(struct imsgbuf *ibuf)
struct cmsghdr *cmsg;
union {
struct cmsghdr hdr;
- char buf[CMSG_SPACE(sizeof(int) * 16)];
+ char buf[CMSG_SPACE(sizeof(int) * 1)];
} cmsgbuf;
struct iovec iov;
- ssize_t n;
+ ssize_t n = -1;
int fd;
struct imsg_fd *ifd;
@@ -65,11 +100,23 @@ imsg_read(struct imsgbuf *ibuf)
msg.msg_control = &cmsgbuf.buf;
msg.msg_controllen = sizeof(cmsgbuf.buf);
+ if ((ifd = calloc(1, sizeof(struct imsg_fd))) == NULL)
+ return (-1);
+
+again:
+ if (available_fds(imsg_fd_overhead +
+ (CMSG_SPACE(sizeof(int))-CMSG_SPACE(0))/sizeof(int))) {
+ errno = EAGAIN;
+ free(ifd);
+ return (-1);
+ }
+
if ((n = recvmsg(ibuf->fd, &msg, 0)) == -1) {
- if (errno != EINTR && errno != EAGAIN) {
- return (-1);
- }
- return (-2);
+ if (errno == EMSGSIZE)
+ goto fail;
+ if (errno != EINTR && errno != EAGAIN)
+ goto fail;
+ goto again;
}
ibuf->r.wpos += n;
@@ -78,17 +125,33 @@ imsg_read(struct imsgbuf *ibuf)
cmsg = CMSG_NXTHDR(&msg, cmsg)) {
if (cmsg->cmsg_level == SOL_SOCKET &&
cmsg->cmsg_type == SCM_RIGHTS) {
- fd = (*(int *)CMSG_DATA(cmsg));
- if ((ifd = calloc(1, sizeof(struct imsg_fd))) == NULL) {
- close(fd);
- return (-1);
+ int i;
+ int j;
+
+ /*
+ * We only accept one file descriptor. Due to C
+ * padding rules, our control buffer might contain
+ * more than one fd, and we must close them.
+ */
+ j = ((char *)cmsg + cmsg->cmsg_len -
+ (char *)CMSG_DATA(cmsg)) / sizeof(int);
+ for (i = 0; i < j; i++) {
+ fd = ((int *)CMSG_DATA(cmsg))[i];
+ if (ifd != NULL) {
+ ifd->fd = fd;
+ TAILQ_INSERT_TAIL(&ibuf->fds, ifd,
+ entry);
+ ifd = NULL;
+ } else
+ close(fd);
}
- ifd->fd = fd;
- TAILQ_INSERT_TAIL(&ibuf->fds, ifd, entry);
}
/* we do not handle other ctl data level */
}
+fail:
+ if (ifd)
+ free(ifd);
return (n);
}
@@ -112,7 +175,7 @@ imsg_get(struct imsgbuf *ibuf, struct imsg *imsg)
return (0);
datalen = imsg->hdr.len - IMSG_HEADER_SIZE;
ibuf->r.rptr = ibuf->r.buf + IMSG_HEADER_SIZE;
- if ((imsg->data = malloc(datalen)) == NULL && datalen != 0)
+ if ((imsg->data = malloc(datalen)) == NULL)
return (-1);
if (imsg->hdr.flags & IMSGF_HASFD)
@@ -134,7 +197,7 @@ imsg_get(struct imsgbuf *ibuf, struct imsg *imsg)
int
imsg_compose(struct imsgbuf *ibuf, u_int32_t type, u_int32_t peerid,
- pid_t pid, int fd, void *data, u_int16_t datalen)
+ pid_t pid, int fd, const void *data, u_int16_t datalen)
{
struct ibuf *wbuf;
@@ -204,7 +267,7 @@ imsg_create(struct imsgbuf *ibuf, u_int32_t type, u_int32_t
peerid,
}
int
-imsg_add(struct ibuf *msg, void *data, u_int16_t datalen)
+imsg_add(struct ibuf *msg, const void *data, u_int16_t datalen)
{
if (datalen)
if (ibuf_add(msg, data, datalen) == -1) {
diff --git a/compat/imsg.h b/compat/imsg.h
index f8a78e2..49a2aeb 100644
--- a/compat/imsg.h
+++ b/compat/imsg.h
@@ -1,5 +1,5 @@
/* $Id$ */
-/* $OpenBSD: imsg.h,v 1.4 2010/05/26 13:56:07 nicm Exp $ */
+/* $OpenBSD: imsg.h,v 1.3 2013/12/26 17:32:33 eric Exp $ */
/*
* Copyright (c) 2006, 2007 Pierre-Yves Ritschard <[email protected]>
@@ -21,6 +21,9 @@
#include "tmux.h"
+#ifndef _IMSG_H_
+#define _IMSG_H_
+
#define IBUF_READ_SIZE 65535
#define IMSG_HEADER_SIZE sizeof(struct imsg_hdr)
#define MAX_IMSGSIZE 16384
@@ -98,13 +101,15 @@ void imsg_init(struct imsgbuf *, int);
ssize_t imsg_read(struct imsgbuf *);
ssize_t imsg_get(struct imsgbuf *, struct imsg *);
int imsg_compose(struct imsgbuf *, u_int32_t, u_int32_t, pid_t,
- int, void *, u_int16_t);
+ int, const void *, u_int16_t);
int imsg_composev(struct imsgbuf *, u_int32_t, u_int32_t, pid_t,
int, const struct iovec *, int);
struct ibuf *imsg_create(struct imsgbuf *, u_int32_t, u_int32_t, pid_t,
u_int16_t);
-int imsg_add(struct ibuf *, void *, u_int16_t);
+int imsg_add(struct ibuf *, const void *, u_int16_t);
void imsg_close(struct imsgbuf *, struct ibuf *);
void imsg_free(struct imsg *);
int imsg_flush(struct imsgbuf *);
void imsg_clear(struct imsgbuf *);
+
+#endif
commit 92997b781a035626bef4e84fbcd7f2282f761a3c
Author: Thomas Adam <[email protected]>
Commit: Thomas Adam <[email protected]>
Add compat/fparseln() for non-BSD systems
Linux and friends don't natively have fparseln() so add it to compat/ and
ensure autotools can pick it up.
---
Makefile.am | 3 +++
cfg.c | 1 -
compat.h | 4 ++++
configure.ac | 7 +++++++
4 files changed, 14 insertions(+), 1 deletions(-)
diff --git a/Makefile.am b/Makefile.am
index 5f622ac..9fcb45f 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -213,6 +213,9 @@ endif
if NO_FGETLN
nodist_tmux_SOURCES += compat/fgetln.c
endif
+if NO_FPARSELN
+nodist_tmux_SOURCES += compat/fparseln.c
+endif
if NO_GETOPT
nodist_tmux_SOURCES += compat/getopt.c
endif
diff --git a/cfg.c b/cfg.c
index 5a6d67e..0e0f55b 100644
--- a/cfg.c
+++ b/cfg.c
@@ -23,7 +23,6 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <util.h>
#include "tmux.h"
diff --git a/compat.h b/compat.h
index 65d6ec7..bf6e536 100644
--- a/compat.h
+++ b/compat.h
@@ -239,6 +239,10 @@ int vasprintf(char **, const char *,
va_list);
char *fgetln(FILE *, size_t *);
#endif
+#ifndef HAVE_FPARSELN
+char *fparseln(FILE *, size_t *, size_t *, const char *, int);
+#endif
+
#ifndef HAVE_SETENV
/* setenv.c */
int setenv(const char *, const char *, int);
diff --git a/configure.ac b/configure.ac
index a81ecc4..82533a3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -295,6 +295,13 @@ if test "x$found_fgetln" = xyes; then
fi
AM_CONDITIONAL(NO_FGETLN, [test "x$found_fgetln" = xno])
+# Look for fparseln, compat/fparseln.c used if missing.
+AC_CHECK_FUNC(fparseln, found_fparseln=yes, found_fparseln=no)
+if test "x$found_fparseln" = xyes; then
+ AC_DEFINE(HAVE_FPARSELN)
+fi
+AM_CONDITIONAL(NO_FPARSELN, [test "x$found_fparseln" = xno])
+
# Look for strcasestr, compat/strcasestr.c used if missing.
AC_CHECK_FUNC(strcasestr, found_strcasestr=yes, found_strcasestr=no)
if test "x$found_strcasestr" = xyes; then
commit a131b82e95df990528371b1d9ca40ee2be264fc8
Merge: fd3b7f3 1ac9620
Author: Thomas Adam <[email protected]>
Commit: Thomas Adam <[email protected]>
Merge branch 'obsd-master'
Conflicts:
client.c
cfg.c | 64 +++++++++-------------------------
client.c | 42 +++++++++++++++++-----
cmd.c | 11 ++++--
format.c | 2 -
input-keys.c | 31 ++++------------
input.c | 5 ---
key-string.c | 8 ----
osdep-openbsd.c | 2 +-
paste.c | 4 +-
server-client.c | 7 +++-
server.c | 1 +
tmux.h | 95 ++++++++++++++++++++++++++++++++++----------------
tty-keys.c | 104 ++++++++++++++++++++++++++++++++++---------------------
tty-term.c | 43 +++++++++++++++++++++++
tty.c | 8 +---
window.c | 3 --
xterm-keys.c | 8 ----
17 files changed, 249 insertions(+), 189 deletions(-)
diff --cc client.c
index 0c9f9cb,f5f5556..8e55640
--- a/client.c
+++ b/client.c
@@@ -233,7 -257,11 +257,7 @@@ client_main(int argc, char **argv, int
return (1);
}
- /* Initialise the client socket and start the server. */
- /* Set process title, log and signals now this is the client. */
- setproctitle("client (%s)", socket_path);
- logfile("client");
-
+ /* Initialize the client socket and start the server. */
fd = client_connect(socket_path, cmdflags & CMD_STARTSERVER);
if (fd == -1) {
fprintf(stderr, "failed to connect to server: %s\n",
diff --cc osdep-openbsd.c
index 9d88fb0,7ee076e..9e4df91
--- a/osdep-openbsd.c
+++ b/osdep-openbsd.c
@@@ -34,12 -33,10 +34,12 @@@
#define is_runnable(p) \
((p)->p_stat == SRUN || (p)->p_stat == SIDL || (p)->p_stat == SONPROC)
#define is_stopped(p) \
- ((p)->p_stat == SSTOP || (p)->p_stat == SZOMB || (p)->p_stat == SDEAD)
+ ((p)->p_stat == SSTOP || (p)->p_stat == SDEAD)
struct kinfo_proc *cmp_procs(struct kinfo_proc *, struct kinfo_proc *);
-char *get_proc_name(int, char *);
+char *osdep_get_name(int, char *);
+char *osdep_get_cwd(int);
+struct event_base *osdep_event_init(void);
struct kinfo_proc *
cmp_procs(struct kinfo_proc *p1, struct kinfo_proc *p2)
commit 1ac96200a7462597b137719b376f40ad0cd85216
Author: nicm <nicm>
Commit: nicm <nicm>
Remove support for the continuous reporting "any" mouse mode which never
really worked properly and is rarely used.
---
format.c | 2 --
input.c | 5 -----
server-client.c | 2 +-
tmux.h | 4 ++--
tty.c | 8 ++------
5 files changed, 5 insertions(+), 16 deletions(-)
diff --git a/format.c b/format.c
index e10f08c..400e432 100644
--- a/format.c
+++ b/format.c
@@ -601,8 +601,6 @@ format_window_pane(struct format_tree *ft, struct
window_pane *wp)
!!(wp->base.mode & MODE_MOUSE_STANDARD));
format_add(ft, "mouse_button_flag", "%d",
!!(wp->base.mode & MODE_MOUSE_BUTTON));
- format_add(ft, "mouse_any_flag", "%d",
- !!(wp->base.mode & MODE_MOUSE_ANY));
format_add(ft, "mouse_utf8_flag", "%d",
!!(wp->base.mode & MODE_MOUSE_UTF8));
diff --git a/input.c b/input.c
index 4c1e073..ac1db67 100644
--- a/input.c
+++ b/input.c
@@ -1374,7 +1374,6 @@ input_csi_dispatch_rm_private(struct input_ctx *ictx)
case 1000:
case 1001:
case 1002:
- case 1003:
screen_write_mode_clear(&ictx->ctx, ALL_MOUSE_MODES);
break;
case 1004:
@@ -1451,10 +1450,6 @@ input_csi_dispatch_sm_private(struct input_ctx *ictx)
screen_write_mode_clear(&ictx->ctx, ALL_MOUSE_MODES);
screen_write_mode_set(&ictx->ctx, MODE_MOUSE_BUTTON);
break;
- case 1003:
- screen_write_mode_clear(&ictx->ctx, ALL_MOUSE_MODES);
- screen_write_mode_set(&ictx->ctx, MODE_MOUSE_ANY);
- break;
case 1004:
if (ictx->ctx.s->mode & MODE_FOCUSON)
break;
diff --git a/server-client.c b/server-client.c
index 5616115..4c58170 100644
--- a/server-client.c
+++ b/server-client.c
@@ -647,7 +647,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;
/*
diff --git a/tmux.h b/tmux.h
index bbf4e9d..614b707 100644
--- a/tmux.h
+++ b/tmux.h
@@ -682,13 +682,13 @@ struct mode_key_table {
#define MODE_WRAP 0x10 /* whether lines wrap */
#define MODE_MOUSE_STANDARD 0x20
#define MODE_MOUSE_BUTTON 0x40
-#define MODE_MOUSE_ANY 0x80
+/* 0x80 unused */
#define MODE_MOUSE_UTF8 0x100
#define MODE_MOUSE_SGR 0x200
#define MODE_BRACKETPASTE 0x400
#define MODE_FOCUSON 0x800
-#define ALL_MOUSE_MODES (MODE_MOUSE_STANDARD|MODE_MOUSE_BUTTON|MODE_MOUSE_ANY)
+#define ALL_MOUSE_MODES (MODE_MOUSE_STANDARD|MODE_MOUSE_BUTTON)
/* A single UTF-8 character. */
struct utf8_data {
diff --git a/tty.c b/tty.c
index 3ae21ab..9f57c36 100644
--- a/tty.c
+++ b/tty.c
@@ -513,16 +513,12 @@ tty_update_mode(struct tty *tty, int mode, struct screen
*s)
tty_puts(tty, "\033[?1005l");
tty_puts(tty, "\033[?1006h");
- if (mode & MODE_MOUSE_ANY)
- tty_puts(tty, "\033[?1003h");
- else if (mode & MODE_MOUSE_BUTTON)
+ if (mode & MODE_MOUSE_BUTTON)
tty_puts(tty, "\033[?1002h");
else if (mode & MODE_MOUSE_STANDARD)
tty_puts(tty, "\033[?1000h");
} else {
- if (tty->mode & MODE_MOUSE_ANY)
- tty_puts(tty, "\033[?1003l");
- else if (tty->mode & MODE_MOUSE_BUTTON)
+ if (tty->mode & MODE_MOUSE_BUTTON)
tty_puts(tty, "\033[?1002l");
else if (tty->mode & MODE_MOUSE_STANDARD)
tty_puts(tty, "\033[?1000l");
commit b8b00aad5d3de0015367a6e23e800950ff7fc2df
Author: nicm <nicm>
Commit: nicm <nicm>
Revert the up/down wheel emulation for now, there will be a better way
to do this along later for those who want it.
---
input-keys.c | 15 ---------------
1 files changed, 0 insertions(+), 15 deletions(-)
diff --git a/input-keys.c b/input-keys.c
index c75e28d..7ce7193 100644
--- a/input-keys.c
+++ b/input-keys.c
@@ -205,21 +205,6 @@ input_mouse(struct window_pane *wp, struct session *s,
struct mouse_event *m)
char buf[40];
size_t len;
struct paste_buffer *pb;
- u_int i;
-
- /*
- * If the alternate screen is active and hasn't enabled the mouse, send
- * up and down key presses for the mouse wheel.
- */
- if (wp->saved_grid != NULL && !(wp->screen->mode & ALL_MOUSE_MODES)) {
- for (i = 0; i < m->scroll; i++) {
- if (m->wheel == MOUSE_WHEEL_UP)
- input_key(wp, KEYC_UP);
- else
- input_key(wp, KEYC_DOWN);
- }
- return;
- }
if (wp->screen->mode & ALL_MOUSE_MODES) {
/*
commit 8e4ae12b4d0559a827f740f60b11f386f27f89dd
Author: nicm <nicm>
Commit: nicm <nicm>
lockf is entirely useless and it was a mistake to change to it, go back
to using flock which actually works sensibly. Also always retry the lock
to fix a potential race, and add some extra logging.
---
client.c | 48 ++++++++++++++++++++++++++++++++++++------------
server.c | 1 +
2 files changed, 37 insertions(+), 12 deletions(-)
diff --git a/client.c b/client.c
index ab7847f..f5f5556 100644
--- a/client.c
+++ b/client.c
@@ -77,13 +77,18 @@ client_get_lock(char *lockfile)
if ((lockfd = open(lockfile, O_WRONLY|O_CREAT, 0600)) == -1)
fatal("open failed");
+ log_debug("lock file is %s", lockfile);
- if (lockf(lockfd, F_TLOCK, 0) == -1 && errno == EAGAIN) {
- while (lockf(lockfd, F_LOCK, 0) == -1 && errno == EINTR)
+ if (flock(lockfd, LOCK_EX|LOCK_NB) == -1) {
+ log_debug("flock failed: %s", strerror(errno));
+ if (errno != EAGAIN)
+ return (lockfd);
+ while (flock(lockfd, LOCK_EX) == -1 && errno == EINTR)
/* nothing */;
close(lockfd);
return (-1);
}
+ log_debug("flock succeeded");
return (lockfd);
}
@@ -94,8 +99,8 @@ client_connect(char *path, int start_server)
{
struct sockaddr_un sa;
size_t size;
- int fd, lockfd;
- char *lockfile;
+ int fd, lockfd = -1, locked = 0;
+ char *lockfile = NULL;
memset(&sa, 0, sizeof sa);
sa.sun_family = AF_UNIX;
@@ -104,29 +109,48 @@ client_connect(char *path, int start_server)
errno = ENAMETOOLONG;
return (-1);
}
+ log_debug("socket is %s", path);
retry:
if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
fatal("socket failed");
+ log_debug("trying connect");
if (connect(fd, (struct sockaddr *) &sa, SUN_LEN(&sa)) == -1) {
+ log_debug("connect failed: %s", strerror(errno));
if (errno != ECONNREFUSED && errno != ENOENT)
goto failed;
if (!start_server)
goto failed;
close(fd);
- xasprintf(&lockfile, "%s.lock", path);
- if ((lockfd = client_get_lock(lockfile)) == -1) {
- free(lockfile);
+ if (!locked) {
+ xasprintf(&lockfile, "%s.lock", path);
+ if ((lockfd = client_get_lock(lockfile)) == -1) {
+ log_debug("didn't get lock");
+ free(lockfile);
+ goto retry;
+ }
+ log_debug("got lock");
+
+ /*
+ * Always retry at least once, even if we got the lock,
+ * because another client could have taken the lock,
+ * started the server and released the lock between our
+ * connect() and flock().
+ */
+ locked = 1;
goto retry;
}
+
if (unlink(path) != 0 && errno != ENOENT) {
free(lockfile);
close(lockfd);
return (-1);
}
fd = server_start(lockfd, lockfile);
+ }
+ if (locked) {
free(lockfile);
close(lockfd);
}
@@ -233,7 +257,11 @@ client_main(int argc, char **argv, int flags)
return (1);
}
- /* Initialise the client socket and start the server. */
+ /* Set process title, log and signals now this is the client. */
+ setproctitle("client (%s)", socket_path);
+ logfile("client");
+
+ /* Initialize the client socket and start the server. */
fd = client_connect(socket_path, cmdflags & CMD_STARTSERVER);
if (fd == -1) {
fprintf(stderr, "failed to connect to server: %s\n",
@@ -241,10 +269,6 @@ client_main(int argc, char **argv, int flags)
return (1);
}
- /* Set process title, log and signals now this is the client. */
- setproctitle("client (%s)", socket_path);
- logfile("client");
-
/* Create imsg. */
imsg_init(&client_ibuf, fd);
event_set(&client_event, fd, EV_READ, client_callback, shell_cmd);
diff --git a/server.c b/server.c
index 7ddc6ec..2cab88f 100644
--- a/server.c
+++ b/server.c
@@ -111,6 +111,7 @@ server_start(int lockfd, char *lockfile)
/* The first client is special and gets a socketpair; create it. */
if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, pair) != 0)
fatal("socketpair failed");
+ log_debug("starting server");
switch (fork()) {
case -1:
commit 2056a9ef9e91996c294b5db0a3d01ed415e95e56
Author: nicm <nicm>
Commit: nicm <nicm>
Drop explicit support for F13-F20 and change to match the xterm terminfo
entry:
F13-F24 are S-F1 to S-F12
F25-F36 are C-F1 to C-F12
F37-F48 are C-S-F1 to C-S-F12
F49-F60 are M-F1 to M-F12
and F61-F63 are M-S-F1 to M-S-F3
This should be no difference for applications inside tmux, but means
that any key binding for F13 will need to be replaced by S-F1 and so on.
---
input-keys.c | 16 +++++-----
key-string.c | 8 -----
tmux.h | 91 ++++++++++++++++++++++++++++++++++++++++------------------
tty-keys.c | 89 ++++++++++++++++++++++++++++++++++++--------------------
tty-term.c | 43 +++++++++++++++++++++++++++
xterm-keys.c | 8 -----
6 files changed, 171 insertions(+), 84 deletions(-)
diff --git a/input-keys.c b/input-keys.c
index 24566df..c75e28d 100644
--- a/input-keys.c
+++ b/input-keys.c
@@ -57,14 +57,14 @@ const struct input_key_ent input_keys[] = {
{ KEYC_F10, "\033[21~", 0 },
{ KEYC_F11, "\033[23~", 0 },
{ KEYC_F12, "\033[24~", 0 },
- { KEYC_F13, "\033[25~", 0 },
- { KEYC_F14, "\033[26~", 0 },
- { KEYC_F15, "\033[28~", 0 },
- { KEYC_F16, "\033[29~", 0 },
- { KEYC_F17, "\033[31~", 0 },
- { KEYC_F18, "\033[32~", 0 },
- { KEYC_F19, "\033[33~", 0 },
- { KEYC_F20, "\033[34~", 0 },
+ { KEYC_F1|KEYC_SHIFT, "\033[25~", 0 },
+ { KEYC_F2|KEYC_SHIFT, "\033[26~", 0 },
+ { KEYC_F3|KEYC_SHIFT, "\033[28~", 0 },
+ { KEYC_F4|KEYC_SHIFT, "\033[29~", 0 },
+ { KEYC_F5|KEYC_SHIFT, "\033[31~", 0 },
+ { KEYC_F6|KEYC_SHIFT, "\033[32~", 0 },
+ { KEYC_F7|KEYC_SHIFT, "\033[33~", 0 },
+ { KEYC_F8|KEYC_SHIFT, "\033[34~", 0 },
{ KEYC_IC, "\033[2~", 0 },
{ KEYC_DC, "\033[3~", 0 },
{ KEYC_HOME, "\033[1~", 0 },
diff --git a/key-string.c b/key-string.c
index 7aba190..db96827 100644
--- a/key-string.c
+++ b/key-string.c
@@ -42,14 +42,6 @@ const struct {
{ "F10", KEYC_F10 },
{ "F11", KEYC_F11 },
{ "F12", KEYC_F12 },
- { "F13", KEYC_F13 },
- { "F14", KEYC_F14 },
- { "F15", KEYC_F15 },
- { "F16", KEYC_F16 },
- { "F17", KEYC_F17 },
- { "F18", KEYC_F18 },
- { "F19", KEYC_F19 },
- { "F20", KEYC_F20 },
{ "IC", KEYC_IC },
{ "DC", KEYC_DC },
{ "Home", KEYC_HOME },
diff --git a/tmux.h b/tmux.h
index 4f937f3..bbf4e9d 100644
--- a/tmux.h
+++ b/tmux.h
@@ -195,14 +195,6 @@ enum key_code {
KEYC_F10,
KEYC_F11,
KEYC_F12,
- KEYC_F13,
- KEYC_F14,
- KEYC_F15,
- KEYC_F16,
- KEYC_F17,
- KEYC_F18,
- KEYC_F19,
- KEYC_F20,
KEYC_IC,
KEYC_DC,
KEYC_HOME,
@@ -308,26 +300,69 @@ enum tty_code_code {
TTYC_KEND5,
TTYC_KEND6,
TTYC_KEND7,
- TTYC_KF1, /* key_f1, k1 */
- TTYC_KF10, /* key_f10, k; */
- TTYC_KF11, /* key_f11, F1 */
- TTYC_KF12, /* key_f12, F2 */
- TTYC_KF13, /* key_f13, F3 */
- TTYC_KF14, /* key_f14, F4 */
- TTYC_KF15, /* key_f15, F5 */
- TTYC_KF16, /* key_f16, F6 */
- TTYC_KF17, /* key_f17, F7 */
- TTYC_KF18, /* key_f18, F8 */
- TTYC_KF19, /* key_f19, F9 */
- TTYC_KF2, /* key_f2, k2 */
- TTYC_KF20, /* key_f20, F10 */
- TTYC_KF3, /* key_f3, k3 */
- TTYC_KF4, /* key_f4, k4 */
- TTYC_KF5, /* key_f5, k5 */
- TTYC_KF6, /* key_f6, k6 */
- TTYC_KF7, /* key_f7, k7 */
- TTYC_KF8, /* key_f8, k8 */
- TTYC_KF9, /* key_f9, k9 */
+ TTYC_KF1,
+ TTYC_KF10,
+ TTYC_KF11,
+ TTYC_KF12,
+ TTYC_KF13,
+ TTYC_KF14,
+ TTYC_KF15,
+ TTYC_KF16,
+ TTYC_KF17,
+ TTYC_KF18,
+ TTYC_KF19,
+ TTYC_KF2,
+ TTYC_KF20,
+ TTYC_KF21,
+ TTYC_KF22,
+ TTYC_KF23,
+ TTYC_KF24,
+ TTYC_KF25,
+ TTYC_KF26,
+ TTYC_KF27,
+ TTYC_KF28,
+ TTYC_KF29,
+ TTYC_KF3,
+ TTYC_KF30,
+ TTYC_KF31,
+ TTYC_KF32,
+ TTYC_KF33,
+ TTYC_KF34,
+ TTYC_KF35,
+ TTYC_KF36,
+ TTYC_KF37,
+ TTYC_KF38,
+ TTYC_KF39,
+ TTYC_KF4,
+ TTYC_KF40,
+ TTYC_KF41,
+ TTYC_KF42,
+ TTYC_KF43,
+ TTYC_KF44,
+ TTYC_KF45,
+ TTYC_KF46,
+ TTYC_KF47,
+ TTYC_KF48,
+ TTYC_KF49,
+ TTYC_KF5,
+ TTYC_KF50,
+ TTYC_KF51,
+ TTYC_KF52,
+ TTYC_KF53,
+ TTYC_KF54,
+ TTYC_KF55,
+ TTYC_KF56,
+ TTYC_KF57,
+ TTYC_KF58,
+ TTYC_KF59,
+ TTYC_KF6,
+ TTYC_KF60,
+ TTYC_KF61,
+ TTYC_KF62,
+ TTYC_KF63,
+ TTYC_KF7,
+ TTYC_KF8,
+ TTYC_KF9,
TTYC_KHOM2,
TTYC_KHOM3,
TTYC_KHOM4,
diff --git a/tty-keys.c b/tty-keys.c
index 932367e..967deca 100644
--- a/tty-keys.c
+++ b/tty-keys.c
@@ -113,14 +113,6 @@ const struct tty_default_key_raw tty_default_raw_keys[] = {
{ "\033[21^", KEYC_F10|KEYC_CTRL },
{ "\033[23^", KEYC_F11|KEYC_CTRL },
{ "\033[24^", KEYC_F12|KEYC_CTRL },
- { "\033[25^", KEYC_F13|KEYC_CTRL },
- { "\033[26^", KEYC_F14|KEYC_CTRL },
- { "\033[28^", KEYC_F15|KEYC_CTRL },
- { "\033[29^", KEYC_F16|KEYC_CTRL },
- { "\033[31^", KEYC_F17|KEYC_CTRL },
- { "\033[32^", KEYC_F18|KEYC_CTRL },
- { "\033[33^", KEYC_F19|KEYC_CTRL },
- { "\033[34^", KEYC_F20|KEYC_CTRL },
{ "\033[2^", KEYC_IC|KEYC_CTRL },
{ "\033[3^", KEYC_DC|KEYC_CTRL },
{ "\033[7^", KEYC_HOME|KEYC_CTRL },
@@ -140,14 +132,6 @@ const struct tty_default_key_raw tty_default_raw_keys[] = {
{ "\033[21$", KEYC_F10|KEYC_SHIFT },
{ "\033[23$", KEYC_F11|KEYC_SHIFT },
{ "\033[24$", KEYC_F12|KEYC_SHIFT },
- { "\033[25$", KEYC_F13|KEYC_SHIFT },
- { "\033[26$", KEYC_F14|KEYC_SHIFT },
- { "\033[28$", KEYC_F15|KEYC_SHIFT },
- { "\033[29$", KEYC_F16|KEYC_SHIFT },
- { "\033[31$", KEYC_F17|KEYC_SHIFT },
- { "\033[32$", KEYC_F18|KEYC_SHIFT },
- { "\033[33$", KEYC_F19|KEYC_SHIFT },
- { "\033[34$", KEYC_F20|KEYC_SHIFT },
{ "\033[2$", KEYC_IC|KEYC_SHIFT },
{ "\033[3$", KEYC_DC|KEYC_SHIFT },
{ "\033[7$", KEYC_HOME|KEYC_SHIFT },
@@ -167,14 +151,6 @@ const struct tty_default_key_raw tty_default_raw_keys[] = {
{ "\033[21@", KEYC_F10|KEYC_CTRL|KEYC_SHIFT },
{ "\033[23@", KEYC_F11|KEYC_CTRL|KEYC_SHIFT },
{ "\033[24@", KEYC_F12|KEYC_CTRL|KEYC_SHIFT },
- { "\033[25@", KEYC_F13|KEYC_CTRL|KEYC_SHIFT },
- { "\033[26@", KEYC_F14|KEYC_CTRL|KEYC_SHIFT },
- { "\033[28@", KEYC_F15|KEYC_CTRL|KEYC_SHIFT },
- { "\033[29@", KEYC_F16|KEYC_CTRL|KEYC_SHIFT },
- { "\033[31@", KEYC_F17|KEYC_CTRL|KEYC_SHIFT },
- { "\033[32@", KEYC_F18|KEYC_CTRL|KEYC_SHIFT },
- { "\033[33@", KEYC_F19|KEYC_CTRL|KEYC_SHIFT },
- { "\033[34@", KEYC_F20|KEYC_CTRL|KEYC_SHIFT },
{ "\033[2@", KEYC_IC|KEYC_CTRL|KEYC_SHIFT },
{ "\033[3@", KEYC_DC|KEYC_CTRL|KEYC_SHIFT },
{ "\033[7@", KEYC_HOME|KEYC_CTRL|KEYC_SHIFT },
@@ -206,14 +182,63 @@ const struct tty_default_key_code tty_default_code_keys[]
= {
{ TTYC_KF10, KEYC_F10 },
{ TTYC_KF11, KEYC_F11 },
{ TTYC_KF12, KEYC_F12 },
- { TTYC_KF13, KEYC_F13 },
- { TTYC_KF14, KEYC_F14 },
- { TTYC_KF15, KEYC_F15 },
- { TTYC_KF16, KEYC_F16 },
- { TTYC_KF17, KEYC_F17 },
- { TTYC_KF18, KEYC_F18 },
- { TTYC_KF19, KEYC_F19 },
- { TTYC_KF20, KEYC_F20 },
+
+ { TTYC_KF13, KEYC_F1|KEYC_SHIFT },
+ { TTYC_KF14, KEYC_F2|KEYC_SHIFT },
+ { TTYC_KF15, KEYC_F3|KEYC_SHIFT },
+ { TTYC_KF16, KEYC_F4|KEYC_SHIFT },
+ { TTYC_KF17, KEYC_F5|KEYC_SHIFT },
+ { TTYC_KF18, KEYC_F6|KEYC_SHIFT },
+ { TTYC_KF19, KEYC_F7|KEYC_SHIFT },
+ { TTYC_KF20, KEYC_F8|KEYC_SHIFT },
+ { TTYC_KF21, KEYC_F9|KEYC_SHIFT },
+ { TTYC_KF22, KEYC_F10|KEYC_SHIFT },
+ { TTYC_KF23, KEYC_F11|KEYC_SHIFT },
+ { TTYC_KF24, KEYC_F12|KEYC_SHIFT },
+
+ { TTYC_KF25, KEYC_F1|KEYC_CTRL },
+ { TTYC_KF26, KEYC_F2|KEYC_CTRL },
+ { TTYC_KF27, KEYC_F3|KEYC_CTRL },
+ { TTYC_KF28, KEYC_F4|KEYC_CTRL },
+ { TTYC_KF29, KEYC_F5|KEYC_CTRL },
+ { TTYC_KF30, KEYC_F6|KEYC_CTRL },
+ { TTYC_KF31, KEYC_F7|KEYC_CTRL },
+ { TTYC_KF32, KEYC_F8|KEYC_CTRL },
+ { TTYC_KF33, KEYC_F9|KEYC_CTRL },
+ { TTYC_KF34, KEYC_F10|KEYC_CTRL },
+ { TTYC_KF35, KEYC_F11|KEYC_CTRL },
+ { TTYC_KF36, KEYC_F12|KEYC_CTRL },
+
+ { TTYC_KF37, KEYC_F1|KEYC_SHIFT|KEYC_CTRL },
+ { TTYC_KF38, KEYC_F2|KEYC_SHIFT|KEYC_CTRL },
+ { TTYC_KF39, KEYC_F3|KEYC_SHIFT|KEYC_CTRL },
+ { TTYC_KF40, KEYC_F4|KEYC_SHIFT|KEYC_CTRL },
+ { TTYC_KF41, KEYC_F5|KEYC_SHIFT|KEYC_CTRL },
+ { TTYC_KF42, KEYC_F6|KEYC_SHIFT|KEYC_CTRL },
+ { TTYC_KF43, KEYC_F7|KEYC_SHIFT|KEYC_CTRL },
+ { TTYC_KF44, KEYC_F8|KEYC_SHIFT|KEYC_CTRL },
+ { TTYC_KF45, KEYC_F9|KEYC_SHIFT|KEYC_CTRL },
+ { TTYC_KF46, KEYC_F10|KEYC_SHIFT|KEYC_CTRL },
+ { TTYC_KF47, KEYC_F11|KEYC_SHIFT|KEYC_CTRL },
+ { TTYC_KF48, KEYC_F12|KEYC_SHIFT|KEYC_CTRL },
+
+ { TTYC_KF49, KEYC_F1|KEYC_ESCAPE },
+ { TTYC_KF50, KEYC_F2|KEYC_ESCAPE },
+ { TTYC_KF51, KEYC_F3|KEYC_ESCAPE },
+ { TTYC_KF52, KEYC_F4|KEYC_ESCAPE },
+ { TTYC_KF53, KEYC_F5|KEYC_ESCAPE },
+ { TTYC_KF54, KEYC_F6|KEYC_ESCAPE },
+ { TTYC_KF55, KEYC_F7|KEYC_ESCAPE },
+ { TTYC_KF56, KEYC_F8|KEYC_ESCAPE },
+ { TTYC_KF57, KEYC_F9|KEYC_ESCAPE },
+ { TTYC_KF58, KEYC_F10|KEYC_ESCAPE },
+ { TTYC_KF59, KEYC_F11|KEYC_ESCAPE },
+ { TTYC_KF60, KEYC_F12|KEYC_ESCAPE },
+
+ { TTYC_KF61, KEYC_F1|KEYC_ESCAPE|KEYC_SHIFT },
+ { TTYC_KF62, KEYC_F2|KEYC_ESCAPE|KEYC_SHIFT },
+ { TTYC_KF63, KEYC_F3|KEYC_ESCAPE|KEYC_SHIFT },
+
{ TTYC_KICH1, KEYC_IC },
{ TTYC_KDCH1, KEYC_DC },
{ TTYC_KHOME, KEYC_HOME },
diff --git a/tty-term.c b/tty-term.c
index bedf0cf..f866a2d 100644
--- a/tty-term.c
+++ b/tty-term.c
@@ -113,10 +113,53 @@ const struct tty_term_code_entry tty_term_codes[NTTYCODE]
= {
{ TTYC_KF19, TTYCODE_STRING, "kf19" },
{ TTYC_KF2, TTYCODE_STRING, "kf2" },
{ TTYC_KF20, TTYCODE_STRING, "kf20" },
+ { TTYC_KF21, TTYCODE_STRING, "kf21" },
+ { TTYC_KF22, TTYCODE_STRING, "kf22" },
+ { TTYC_KF23, TTYCODE_STRING, "kf23" },
+ { TTYC_KF24, TTYCODE_STRING, "kf24" },
+ { TTYC_KF25, TTYCODE_STRING, "kf25" },
+ { TTYC_KF26, TTYCODE_STRING, "kf26" },
+ { TTYC_KF27, TTYCODE_STRING, "kf27" },
+ { TTYC_KF28, TTYCODE_STRING, "kf28" },
+ { TTYC_KF29, TTYCODE_STRING, "kf29" },
{ TTYC_KF3, TTYCODE_STRING, "kf3" },
+ { TTYC_KF30, TTYCODE_STRING, "kf30" },
+ { TTYC_KF31, TTYCODE_STRING, "kf31" },
+ { TTYC_KF32, TTYCODE_STRING, "kf32" },
+ { TTYC_KF33, TTYCODE_STRING, "kf33" },
+ { TTYC_KF34, TTYCODE_STRING, "kf34" },
+ { TTYC_KF35, TTYCODE_STRING, "kf35" },
+ { TTYC_KF36, TTYCODE_STRING, "kf36" },
+ { TTYC_KF37, TTYCODE_STRING, "kf37" },
+ { TTYC_KF38, TTYCODE_STRING, "kf38" },
+ { TTYC_KF39, TTYCODE_STRING, "kf39" },
{ TTYC_KF4, TTYCODE_STRING, "kf4" },
+ { TTYC_KF40, TTYCODE_STRING, "kf40" },
+ { TTYC_KF41, TTYCODE_STRING, "kf41" },
+ { TTYC_KF42, TTYCODE_STRING, "kf42" },
+ { TTYC_KF43, TTYCODE_STRING, "kf43" },
+ { TTYC_KF44, TTYCODE_STRING, "kf44" },
+ { TTYC_KF45, TTYCODE_STRING, "kf45" },
+ { TTYC_KF46, TTYCODE_STRING, "kf46" },
+ { TTYC_KF47, TTYCODE_STRING, "kf47" },
+ { TTYC_KF48, TTYCODE_STRING, "kf48" },
+ { TTYC_KF49, TTYCODE_STRING, "kf49" },
{ TTYC_KF5, TTYCODE_STRING, "kf5" },
+ { TTYC_KF50, TTYCODE_STRING, "kf50" },
+ { TTYC_KF51, TTYCODE_STRING, "kf51" },
+ { TTYC_KF52, TTYCODE_STRING, "kf52" },
+ { TTYC_KF53, TTYCODE_STRING, "kf53" },
+ { TTYC_KF54, TTYCODE_STRING, "kf54" },
+ { TTYC_KF55, TTYCODE_STRING, "kf55" },
+ { TTYC_KF56, TTYCODE_STRING, "kf56" },
+ { TTYC_KF57, TTYCODE_STRING, "kf57" },
+ { TTYC_KF58, TTYCODE_STRING, "kf58" },
+ { TTYC_KF59, TTYCODE_STRING, "kf59" },
{ TTYC_KF6, TTYCODE_STRING, "kf6" },
+ { TTYC_KF60, TTYCODE_STRING, "kf60" },
+ { TTYC_KF61, TTYCODE_STRING, "kf61" },
+ { TTYC_KF62, TTYCODE_STRING, "kf62" },
+ { TTYC_KF63, TTYCODE_STRING, "kf63" },
{ TTYC_KF7, TTYCODE_STRING, "kf7" },
{ TTYC_KF8, TTYCODE_STRING, "kf8" },
{ TTYC_KF9, TTYCODE_STRING, "kf9" },
diff --git a/xterm-keys.c b/xterm-keys.c
index a013cbd..5ca75d8 100644
--- a/xterm-keys.c
+++ b/xterm-keys.c
@@ -69,14 +69,6 @@ const struct xterm_keys_entry xterm_keys_table[] = {
{ KEYC_F10, "\033[21;_~" },
{ KEYC_F11, "\033[23;_~" },
{ KEYC_F12, "\033[24;_~" },
- { KEYC_F13, "\033[25;_~" },
- { KEYC_F14, "\033[26;_~" },
- { KEYC_F15, "\033[28;_~" },
- { KEYC_F16, "\033[29;_~" },
- { KEYC_F17, "\033[31;_~" },
- { KEYC_F18, "\033[32;_~" },
- { KEYC_F19, "\033[33;_~" },
- { KEYC_F20, "\033[34;_~" },
{ KEYC_UP, "\033[1;_A" },
{ KEYC_DOWN, "\033[1;_B" },
{ KEYC_RIGHT, "\033[1;_C" },
commit c5253ad8f7236662d0186dec1080288eb2d38b72
Author: nicm <nicm>
Commit: nicm <nicm>
Show an error if cmd_find_session can't find the current session, like
the other functions.
---
cmd.c | 11 ++++++++---
1 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/cmd.c b/cmd.c
index d8e010c..185d39b 100644
--- a/cmd.c
+++ b/cmd.c
@@ -795,8 +795,11 @@ cmd_find_session(struct cmd_q *cmdq, const char *arg, int
prefer_unattached)
int ambiguous;
/* A NULL argument means the current session. */
- if (arg == NULL)
- return (cmd_current_session(cmdq, prefer_unattached));
+ if (arg == NULL) {
+ if ((s = cmd_current_session(cmdq, prefer_unattached)) == NULL)
+ cmdq_error(cmdq, "can't establish current session");
+ return (s);
+ }
/* Lookup as pane id or window id. */
if ((wp = cmd_lookup_paneid(arg)) != NULL)
@@ -813,7 +816,9 @@ cmd_find_session(struct cmd_q *cmdq, const char *arg, int
prefer_unattached)
/* An empty session name is the current session. */
if (*tmparg == '\0') {
free(tmparg);
- return (cmd_current_session(cmdq, prefer_unattached));
+ if ((s = cmd_current_session(cmdq, prefer_unattached)) == NULL)
+ cmdq_error(cmdq, "can't establish current session");
+ return (s);
}
/* Find the session, if any. */
commit 2b67907176805e3df5bd913174617d768277bfff
Author: krw <krw>
Commit: krw <krw>
An EOF is a good reason to close a connection.
ok nicm@
---
client.c | 2 +-
server-client.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/client.c b/client.c
index ec63fc0..ab7847f 100644
--- a/client.c
+++ b/client.c
@@ -469,7 +469,7 @@ client_callback(unused int fd, short events, void *data)
}
if (events & EV_WRITE) {
- if (msgbuf_write(&client_ibuf.w) < 0 && errno != EAGAIN)
+ if (msgbuf_write(&client_ibuf.w) <= 0 && errno != EAGAIN)
goto lost_server;
}
diff --git a/server-client.c b/server-client.c
index 1ef3f31..5616115 100644
--- a/server-client.c
+++ b/server-client.c
@@ -224,7 +224,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;
commit f117c7d94a2abb0561540a1fe33dd729b1cb8b34
Author: nicm <nicm>
Commit: nicm <nicm>
If a client is killed while suspended with ^Z so has gone through the
MSG_EXITED dance, don't try to resume it since a) it's pointless and b)
the tty structures have been cleaned up and tmux will crash.
---
server-client.c | 3 +++
1 files changed, 3 insertions(+), 0 deletions(-)
diff --git a/server-client.c b/server-client.c
index 0f4d39d..1ef3f31 100644
--- a/server-client.c
+++ b/server-client.c
@@ -875,6 +875,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)
commit d1f939cede4a1eb7137feb892450e0e2b650cc6c
Author: guenther <guenther>
Commit: guenther <guenther>
Track whether a process is a zombie or not yet fully built via flags
PS_{ZOMBIE,EMBRYO} on the process instead of peeking into the process's
thread data. This eliminates the need for the thread-level SDEAD state.
Change kvm_getprocs() (both the sysctl() and kvm backends) to report the
"most active" scheduler state for the process's threads.
tweaks kettenis@
feedback and ok matthew@
---
procname.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/procname.c b/procname.c
index 5d3bc30..7ee076e 100644
--- a/procname.c
+++ b/procname.c
@@ -33,7 +33,7 @@
#define is_runnable(p) \
((p)->p_stat == SRUN || (p)->p_stat == SIDL || (p)->p_stat == SONPROC)
#define is_stopped(p) \
- ((p)->p_stat == SSTOP || (p)->p_stat == SZOMB || (p)->p_stat == SDEAD)
+ ((p)->p_stat == SSTOP || (p)->p_stat == SDEAD)
struct kinfo_proc *cmp_procs(struct kinfo_proc *, struct kinfo_proc *);
char *get_proc_name(int, char *);
commit 1aae53596dd1bd657d534c7a0392826cbff2265c
Author: tobias <tobias>
Commit: tobias <tobias>
Handle escaped back slashes and missing new lines at end of line by using
fparseln instead of reimplementing it on our own.
with input by and ok nicm@
---
cfg.c | 64 +++++++++++++++++-----------------------------------------------
1 files changed, 17 insertions(+), 47 deletions(-)
diff --git a/cfg.c b/cfg.c
index 5d98dbe..7502cee 100644
--- a/cfg.c
+++ b/cfg.c
@@ -23,6 +23,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <util.h>
#include "tmux.h"
@@ -36,9 +37,10 @@ int
load_cfg(const char *path, struct cmd_q *cmdq, char **cause)
{
FILE *f;
- u_int n, found;
- char *buf, *copy, *line, *cause1, *msg;
- size_t len, oldlen;
+ char delim[3] = { '\\', '\\', '\0' };
+ u_int found;
+ size_t line = 0;
+ char *buf, *cause1, *msg, *p;
struct cmd_list *cmdlist;
log_debug("loading %s", path);
@@ -47,60 +49,30 @@ load_cfg(const char *path, struct cmd_q *cmdq, char **cause)
return (-1);
}
- n = found = 0;
- line = NULL;
- while ((buf = fgetln(f, &len))) {
- /* Trim \n. */
- if (buf[len - 1] == '\n')
- len--;
- log_debug("%s: %.*s", path, (int)len, buf);
-
- /* Current line is the continuation of the previous one. */
- if (line != NULL) {
- oldlen = strlen(line);
- line = xrealloc(line, 1, oldlen + len + 1);
- } else {
- oldlen = 0;
- line = xmalloc(len + 1);
- }
-
- /* Append current line to the previous. */
- memcpy(line + oldlen, buf, len);
- line[oldlen + len] = '\0';
- n++;
-
- /* Continuation: get next line? */
- len = strlen(line);
- if (len > 0 && line[len - 1] == '\\') {
- line[len - 1] = '\0';
-
- /* Ignore escaped backslash at EOL. */
- if (len > 1 && line[len - 2] != '\\')
- continue;
- }
- copy = line;
- line = NULL;
+ found = 0;
+ while ((buf = fparseln(f, NULL, &line, delim, 0))) {
+ log_debug("%s: %s", path, buf);
/* Skip empty lines. */
- buf = copy;
- while (isspace((u_char)*buf))
- buf++;
- if (*buf == '\0') {
- free(copy);
+ p = buf;
+ while (isspace((u_char) *p))
+ p++;
+ if (*p == '\0') {
+ free(buf);
continue;
}
/* Parse and run the command. */
- if (cmd_string_parse(buf, &cmdlist, path, n, &cause1) != 0) {
- free(copy);
+ if (cmd_string_parse(p, &cmdlist, path, line, &cause1) != 0) {
+ free(buf);
if (cause1 == NULL)
continue;
- xasprintf(&msg, "%s:%u: %s", path, n, cause1);
+ xasprintf(&msg, "%s:%zu: %s", path, line, cause1);
ARRAY_ADD(&cfg_causes, msg);
free(cause1);
continue;
}
- free(copy);
+ free(buf);
if (cmdlist == NULL)
continue;
@@ -108,8 +80,6 @@ load_cfg(const char *path, struct cmd_q *cmdq, char **cause)
cmd_list_free(cmdlist);
found++;
}
- if (line != NULL)
- free(line);
fclose(f);
return (found);
commit 54782af61632846a48af35b33c056243fea7df8e
Author: nicm <nicm>
Commit: nicm <nicm>
Allow keys and send-keys to invisible panes, from saggy-kun at users dot
sf dot net.
---
window.c | 3 ---
1 files changed, 0 insertions(+), 3 deletions(-)
diff --git a/window.c b/window.c
index d29ee2f..a0c53ca 100644
--- a/window.c
+++ b/window.c
@@ -1051,9 +1051,6 @@ window_pane_key(struct window_pane *wp, struct session
*sess, int key)
{
struct window_pane *wp2;
- if (!window_pane_visible(wp))
- return;
-
if (wp->mode != NULL) {
if (wp->mode->key != NULL)
wp->mode->key(wp, sess, key);
commit 61605c68839efa51ba049b549e67e62d68616940
Author: nicm <nicm>
Commit: nicm <nicm>
Count mouse clicks correctly, from Balazs Kezes.
---
tty-keys.c | 15 +++++++--------
1 files changed, 7 insertions(+), 8 deletions(-)
diff --git a/tty-keys.c b/tty-keys.c
index 02be49f..932367e 100644
--- a/tty-keys.c
+++ b/tty-keys.c
@@ -786,25 +786,24 @@ tty_keys_mouse(struct tty *tty, const char *buf, size_t
len, size_t *size)
m->button = 3;
} else if ((b & MOUSE_MASK_BUTTONS) == 3) {
- if (~m->event & MOUSE_EVENT_DRAG && x == m->x && y == m->y)
+ if (~m->event & MOUSE_EVENT_DRAG && x == m->sx && y == m->sy) {
m->event = MOUSE_EVENT_CLICK;
- else
+ m->clicks = (m->clicks + 1) % 3;
+ } else
m->event = MOUSE_EVENT_DRAG;
m->event |= MOUSE_EVENT_UP;
} else {
if (b & MOUSE_MASK_DRAG)
m->event = MOUSE_EVENT_DRAG;
else {
- if (m->event & MOUSE_EVENT_UP && x == m->x && y == m->y)
- m->clicks = (m->clicks + 1) % 3;
- else
- m->clicks = 0;
- m->sx = x;
- m->sy = y;
m->event = MOUSE_EVENT_DOWN;
+ if (x != m->sx || y != m->sy)
+ m->clicks = 0;
}
m->button = (b & MOUSE_MASK_BUTTONS);
}
+ m->sx = x;
+ m->sy = y;
return (0);
}
commit 8d0819bff16dbfbc61a97135742e1a0f1c144f77
Author: nicm <nicm>
Commit: nicm <nicm>
Comment style nits.
---
paste.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/paste.c b/paste.c
index 245cca3..08f4bab 100644
--- a/paste.c
+++ b/paste.c
@@ -69,7 +69,7 @@ paste_walk(struct paste_buffer *pb)
return (RB_NEXT(paste_time_tree, &paste_by_time, pb));
}
-/* Get the most recent automatic buffer */
+/* Get the most recent automatic buffer. */
struct paste_buffer *
paste_get_top(void)
{
@@ -81,7 +81,7 @@ paste_get_top(void)
return (pb);
}
-/* Free the most recent buffer */
+/* Free the most recent buffer. */
int
paste_free_top(void)
{
-----------------------------------------------------------------------
Summary of changes:
Makefile.am | 3 +
SYNCING | 9 ++++
cfg.c | 63 ++++++++----------------------
client.c | 42 ++++++++++++++++----
cmd.c | 11 ++++-
compat.h | 4 ++
compat/imsg-buffer.c | 38 ++++++++++--------
compat/imsg.c | 99 +++++++++++++++++++++++++++++++++++++++---------
compat/imsg.h | 11 ++++-
configure.ac | 7 +++
format.c | 2 -
input-keys.c | 31 ++++-----------
input.c | 5 --
key-string.c | 8 ----
osdep-openbsd.c | 2 +-
paste.c | 4 +-
server-client.c | 7 ++-
server.c | 1 +
tmux.h | 95 +++++++++++++++++++++++++++++++--------------
tty-keys.c | 104 ++++++++++++++++++++++++++++++-------------------
tty-term.c | 43 ++++++++++++++++++++
tty.c | 8 +---
window.c | 3 -
xterm-keys.c | 8 ----
24 files changed, 381 insertions(+), 227 deletions(-)
hooks/post-receive
--
tmux
------------------------------------------------------------------------------
_______________________________________________
tmux-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tmux-cvs