On Tue, May 07, 2019 at 11:55:51AM +0100, Nicholas Marriott wrote:
> Hi
> 
> You have the right idea general idea of the problem. display-panes
> blocks the queue until it is finished, so the key press isn't processed
> until then, which is too late.
> 
> But your change defeats the purpose, the idea is that new key presses
> should be queued after the commands inserted by previous key presses,
> not before them.
> 
> Identify mode (display-panes) can just be treated specially I think.
> 
> Please try the diff below.
> 
> Thanks!
> 
> 
> Index: server-client.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/tmux/server-client.c,v
> retrieving revision 1.279
> diff -u -p -r1.279 server-client.c
> --- server-client.c   3 May 2019 20:44:24 -0000       1.279
> +++ server-client.c   7 May 2019 10:50:07 -0000
> @@ -986,7 +986,7 @@ server_client_assume_paste(struct sessio
>   * Handle data key input from client. This owns and can modify the key event 
> it
>   * is given and is responsible for freeing it.
>   */
> -enum cmd_retval
> +static enum cmd_retval
>  server_client_key_callback(struct cmdq_item *item, void *data)
>  {
>       struct client                   *c = item->client;
> @@ -1204,6 +1204,44 @@ forward_key:
>  out:
>       free(event);
>       return (CMD_RETURN_NORMAL);
> +}
> +
> +/* Handle a key event. */
> +int
> +server_client_handle_key(struct client *c, struct key_event *event)
> +{
> +     struct session          *s = c->session;
> +     struct window           *w;
> +     struct window_pane      *wp = NULL;
> +     struct cmdq_item        *item;
> +
> +     /* Check the client is good to accept input. */
> +     if (s == NULL || (c->flags & (CLIENT_DEAD|CLIENT_SUSPENDED)) != 0)
> +             return (0);
> +     w = s->curw->window;
> +
> +     /*
> +      * Key presses in identify mode are a special case. The queue might be
> +      * blocked so they need to processed immediately rather than queued.
> +      */
> +     if (c->flags & CLIENT_IDENTIFY) {
> +             if (c->flags & CLIENT_READONLY)
> +                     return (0);
> +             if (event->key >= '0' && event->key <= '9') {
> +                     window_unzoom(w);
> +                     wp = window_pane_at_index(w, event->key - '0');
> +             }
> +             server_client_clear_identify(c, wp);
> +             return (0);
> +     }
> +
> +     /*
> +      * Add the key to the queue so it happens after any commands queued by
> +      * previous keys.
> +      */
> +     item = cmdq_get_callback(server_client_key_callback, event);
> +     cmdq_append(c, item);
> +     return (1);
>  }
>  
>  /* Client functions that need to happen every loop. */
> Index: tmux.h
> ===================================================================
> RCS file: /cvs/src/usr.bin/tmux/tmux.h,v
> retrieving revision 1.888
> diff -u -p -r1.888 tmux.h
> --- tmux.h    7 May 2019 10:25:15 -0000       1.888
> +++ tmux.h    7 May 2019 10:50:09 -0000
> @@ -2012,7 +2012,7 @@ void     server_client_set_identify(struct 
>  void  server_client_set_key_table(struct client *, const char *);
>  const char *server_client_get_key_table(struct client *);
>  int   server_client_check_nested(struct client *);
> -enum cmd_retval server_client_key_callback(struct cmdq_item *, void *);
> +int   server_client_handle_key(struct client *, struct key_event *);
>  struct client *server_client_create(int);
>  int   server_client_open(struct client *, char **);
>  void  server_client_unref(struct client *);
> Index: tty-keys.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/tmux/tty-keys.c,v
> retrieving revision 1.112
> diff -u -p -r1.112 tty-keys.c
> --- tty-keys.c        3 May 2019 18:00:19 -0000       1.112
> +++ tty-keys.c        7 May 2019 10:50:09 -0000
> @@ -573,7 +573,6 @@ tty_keys_next(struct tty *tty)
>       cc_t                     bspace;
>       int                      delay, expired = 0, n;
>       key_code                 key;
> -     struct cmdq_item        *item;
>       struct mouse_event       m = { 0 };
>       struct key_event        *event;
>  
> @@ -732,9 +731,8 @@ complete_key:
>               event = xmalloc(sizeof *event);
>               event->key = key;
>               memcpy(&event->m, &m, sizeof event->m);
> -
> -             item = cmdq_get_callback(server_client_key_callback, event);
> -             cmdq_append(c, item);
> +             if (!server_client_handle_key(c, event))
> +                     free(event);
>       }
>  
>       return (1);

Works for me!
ok solene@

Reply via email to