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 <tho...@xteddy.org>
Commit: Thomas Adam <tho...@xteddy.org>

    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 <tho...@xteddy.org>
Commit: Thomas Adam <tho...@xteddy.org>

    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 <henn...@openbsd.org>
@@ -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 <henn...@openbsd.org>
@@ -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 <p...@openbsd.org>
@@ -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 <tho...@xteddy.org>
Commit: Thomas Adam <tho...@xteddy.org>

    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 <tho...@xteddy.org>
Commit: Thomas Adam <tho...@xteddy.org>

    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
tmux-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tmux-cvs

Reply via email to