The branch, master has been updated
       via  bc2e4a36df2023a738c433779ba8f1e08b6951fe (commit)
      from  854e8ae04d15c16b688ba38119656aee134548dd (commit)

- Log -----------------------------------------------------------------
commit bc2e4a36df2023a738c433779ba8f1e08b6951fe
Author: Nicholas Marriott <n...@openbsd.org>
Commit: Nicholas Marriott <n...@openbsd.org>

    If timing between keys is less than (by default) 1 millisecond, assume
    the text is being pasted. assume-paste-time option changes the value (0
    disables). Based on a diff from Marcin Kulik.
---
 options-table.c |    7 +++++++
 server-client.c |   54 ++++++++++++++++++++++++++++++++++++++++--------------
 tmux.1          |    7 +++++++
 tmux.h          |    2 +-
 4 files changed, 55 insertions(+), 15 deletions(-)

diff --git a/options-table.c b/options-table.c
index d9bbe38..9baf683 100644
--- a/options-table.c
+++ b/options-table.c
@@ -91,6 +91,13 @@ const struct options_table_entry server_options_table[] = {
 
 /* Session options. */
 const struct options_table_entry session_options_table[] = {
+       { .name = "assume-paste-time",
+         .type = OPTIONS_TABLE_NUMBER,
+         .minimum = 0,
+         .maximum = INT_MAX,
+         .default_num = 1,
+       },
+
        { .name = "base-index",
          .type = OPTIONS_TABLE_NUMBER,
          .minimum = 0,
diff --git a/server-client.c b/server-client.c
index 3db11ec..a8d48c5 100644
--- a/server-client.c
+++ b/server-client.c
@@ -34,6 +34,7 @@ void  server_client_check_exit(struct client *);
 void   server_client_check_redraw(struct client *);
 void   server_client_set_title(struct client *);
 void   server_client_reset_state(struct client *);
+int    server_client_assume_paste(struct session *);
 
 int    server_client_msg_dispatch(struct client *);
 void   server_client_msg_command(struct client *, struct msg_command_data *);
@@ -325,6 +326,22 @@ server_client_check_mouse(struct client *c, struct 
window_pane *wp)
        window_pane_mouse(wp, c->session, m);
 }
 
+/* Is this fast enough to probably be a paste? */
+int
+server_client_assume_paste(struct session *s)
+{
+       struct timeval  tv;
+       u_int           t;
+
+       if ((t = options_get_number(&s->options, "assume-paste-time")) == 0)
+               return 0;
+
+       timersub(&s->activity_time, &s->last_activity_time, &tv);
+       if (tv.tv_sec == 0 && tv.tv_usec < t * 1000)
+               return 1;
+       return 0;
+}
+
 /* Handle data key input from client. */
 void
 server_client_handle_key(struct client *c, int key)
@@ -334,7 +351,7 @@ server_client_handle_key(struct client *c, int key)
        struct window_pane      *wp;
        struct timeval           tv;
        struct key_binding      *bd;
-       int                      xtimeout, isprefix;
+       int                      xtimeout, isprefix, ispaste;
 
        /* Check the client is good to accept input. */
        if ((c->flags & (CLIENT_DEAD|CLIENT_SUSPENDED)) != 0)
@@ -346,6 +363,9 @@ server_client_handle_key(struct client *c, int key)
        /* Update the activity timer. */
        if (gettimeofday(&c->activity_time, NULL) != 0)
                fatal("gettimeofday failed");
+
+       memcpy(&s->last_activity_time, &s->activity_time,
+           sizeof s->last_activity_time);
        memcpy(&s->activity_time, &c->activity_time, sizeof s->activity_time);
 
        w = c->session->curw->window;
@@ -382,25 +402,31 @@ server_client_handle_key(struct client *c, int key)
        }
 
        /* Is this a prefix key? */
-       if (key == options_get_number(&c->session->options, "prefix"))
+       if (key == options_get_number(&s->options, "prefix"))
                isprefix = 1;
-       else if (key == options_get_number(&c->session->options, "prefix2"))
+       else if (key == options_get_number(&s->options, "prefix2"))
                isprefix = 1;
        else
                isprefix = 0;
 
+       /* Treat prefix as a regular key when pasting is detected. */
+       ispaste = server_client_assume_paste(s);
+       if (ispaste)
+               isprefix = 0;
+
        /* No previous prefix key. */
        if (!(c->flags & CLIENT_PREFIX)) {
-               if (isprefix)
+               if (isprefix) {
                        c->flags |= CLIENT_PREFIX;
-               else {
-                       /* Try as a non-prefix key binding. */
-                       if ((bd = key_bindings_lookup(key)) == NULL) {
-                               if (!(c->flags & CLIENT_READONLY))
-                                       window_pane_key(wp, c->session, key);
-                       } else
-                               key_bindings_dispatch(bd, c);
+                       return;
                }
+
+               /* Try as a non-prefix key binding. */
+               if (ispaste || (bd = key_bindings_lookup(key)) == NULL) {
+                       if (!(c->flags & CLIENT_READONLY))
+                               window_pane_key(wp, s, key);
+               } else
+                       key_bindings_dispatch(bd, c);
                return;
        }
 
@@ -413,7 +439,7 @@ server_client_handle_key(struct client *c, int key)
                        if (isprefix)
                                c->flags |= CLIENT_PREFIX;
                        else if (!(c->flags & CLIENT_READONLY))
-                               window_pane_key(wp, c->session, key);
+                               window_pane_key(wp, s, key);
                }
                return;
        }
@@ -424,12 +450,12 @@ server_client_handle_key(struct client *c, int key)
                if (isprefix)
                        c->flags |= CLIENT_PREFIX;
                else if (!(c->flags & CLIENT_READONLY))
-                       window_pane_key(wp, c->session, key);
+                       window_pane_key(wp, s, key);
                return;
        }
 
        /* If this key can repeat, reset the repeat flags and timer. */
-       xtimeout = options_get_number(&c->session->options, "repeat-time");
+       xtimeout = options_get_number(&s->options, "repeat-time");
        if (xtimeout != 0 && bd->can_repeat) {
                c->flags |= CLIENT_PREFIX|CLIENT_REPEAT;
 
diff --git a/tmux.1 b/tmux.1
index 7abb8f8..975aa10 100644
--- a/tmux.1
+++ b/tmux.1
@@ -2044,6 +2044,13 @@ interactive menu when required.
 .Pp
 Available session options are:
 .Bl -tag -width Ds
+.It Ic assume-paste-time Ar milliseconds
+If keys are entered faster than one in
+.Ar milliseconds ,
+they are assumed to have been pasted rather than typed and
+.Nm
+key bindings are not processed.
+The default is one millisecond and zero disables.
 .It Ic base-index Ar index
 Set the base index from which an unused index should be searched when a new
 window is created.
diff --git a/tmux.h b/tmux.h
index c1fec02..f1a9e4d 100644
--- a/tmux.h
+++ b/tmux.h
@@ -1095,6 +1095,7 @@ struct session {
 
        struct timeval   creation_time;
        struct timeval   activity_time;
+       struct timeval   last_activity_time;
 
        u_int            sx;
        u_int            sy;
@@ -1707,7 +1708,6 @@ char              *paste_print(struct paste_buffer *, 
size_t);
 void            paste_send_pane(struct paste_buffer *, struct window_pane *,
                     const char *, int);
 
-
 /* clock.c */
 extern const char clock_table[14][5][5];
 void            clock_draw(struct screen_write_ctx *, int, int);


-----------------------------------------------------------------------

Summary of changes:
 options-table.c |    7 +++++++
 server-client.c |   54 ++++++++++++++++++++++++++++++++++++++++--------------
 tmux.1          |    7 +++++++
 tmux.h          |    2 +-
 4 files changed, 55 insertions(+), 15 deletions(-)


hooks/post-receive
-- 
tmux

------------------------------------------------------------------------------
Master SQL Server Development, Administration, T-SQL, SSAS, SSIS, SSRS
and more. Get SQL Server skills now (including 2012) with LearnDevNow -
200+ hours of step-by-step video tutorials by Microsoft MVPs and experts.
SALE $99.99 this month only - learn more at:
http://p.sf.net/sfu/learnmore_122512
_______________________________________________
tmux-cvs mailing list
tmux-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tmux-cvs

Reply via email to