Hi

Thanks.

Some minor nits:

- I think the big bit added to server_client_handle_key would be better
  in a separate function.

- return should have brackets - return (-1) not return -1.



On Sun, Jul 03, 2011 at 03:58:31AM +0200, marcel partap wrote:
> ...With this, a double click on the status line (any part not
> belonging to the window list) creates a new window.
> Tricky stuff. Now i know much more about tmux debugging ^^
> As i couldn't find a way to receive mouse button AND modifier,
> window closing on CTRL+double click is yet missing.
> #n8/regards/marcel

> --- work/tmux/server-client.c.orig    2011-07-02 05:41:16.745038555 +0200
> +++ work/tmux/server-client.c 2011-07-03 03:36:07.999608557 +0200
> @@ -64,6 +64,8 @@
>       if (gettimeofday(&c->creation_time, NULL) != 0)
>               fatal("gettimeofday failed");
>       memcpy(&c->activity_time, &c->creation_time, sizeof c->activity_time);
> +     memcpy(&c->dblclick_start, &c->creation_time, sizeof c->dblclick_start);
> +     c->dblclick_start.tv_usec -= DBLCLICK_USEC;
>  
>       c->stdin_event = NULL;
>       c->stdout_event = NULL;
> @@ -267,12 +269,15 @@
>       struct session          *s;
>       struct window           *w;
>       struct window_pane      *wp;
> +     struct winlink          *wl;
>       struct options          *oo;
> +     struct cmd_ctx           ctx;
>       struct timeval           tv;
>       struct key_binding      *bd;
>       struct keylist          *keylist;
> -     int                      xtimeout, isprefix;
> +     int                      xtimeout, isprefix, winidx, diff_usec;
>       u_int                    i;
> +     char                    *cause;
>  
>       /* Check the client is good to accept input. */
>       if ((c->flags & (CLIENT_DEAD|CLIENT_SUSPENDED)) != 0)
> @@ -332,8 +337,29 @@
>                   options_get_number(oo, "status")) {
>                       if (mouse->b == MOUSE_UP &&
>                           c->last_mouse.b != MOUSE_UP) {
> -                             status_set_window_at(c, mouse->x);
> -                             return;
> +                             winidx = status_find_window_at(s, mouse->x);
> +                             if (winidx != -1 && session_select(s, winidx) 
> != -1) {
> +                                     server_redraw_session(s);
> +                                     return;
> +                             }
> +                             /* Measure time since last click and update 
> start time. */
> +                             gettimeofday(&tv, NULL);
> +                             diff_usec = tv.tv_usec - 
> c->dblclick_start.tv_usec;
> +                             diff_usec += (tv.tv_sec - 
> c->dblclick_start.tv_sec) * 1000000;
> +                             memcpy(&c->dblclick_start, &tv, sizeof 
> c->dblclick_start);
> +                             /* Check for double click within DBLCLICK_USEC 
> time. */
> +                             if (diff_usec <= DBLCLICK_USEC) {
> +                                     wl = session_new(s, NULL, "", c->cwd, 
> -1, &cause);
> +                                     if (wl == NULL) {
> +                                             memset(&ctx, 0, sizeof ctx);
> +                                             ctx.cmdclient = c;
> +                                             server_client_msg_error(&ctx, 
> "%s", cause);
> +                                             xfree(cause);
> +                                     }
> +                                     else {
> +                                             session_select(s, wl->idx);
> +                                     }
> +                             }
>                       }
>                       if (mouse->b & MOUSE_45) {
>                               if ((mouse->b & MOUSE_BUTTON) == MOUSE_1) {
> --- work/tmux/tmux.h.orig     2011-07-02 05:41:16.749038497 +0200
> +++ work/tmux/tmux.h  2011-07-03 02:05:17.122512753 +0200
> @@ -1188,6 +1188,8 @@
>       struct session  *last_session;
>  
>       struct mouse_event last_mouse;
> +     struct timeval     dblclick_start;
> +#define DBLCLICK_USEC 350000
>  
>       int              references;
>  };
> @@ -1694,7 +1696,7 @@
>  RB_PROTOTYPE(status_out_tree, status_out, entry, status_out_cmp);
>  void  status_free_jobs(struct status_out_tree *);
>  void  status_update_jobs(struct client *);
> -void  status_set_window_at(struct client *, u_int);
> +int   status_find_window_at(struct session *, u_int);
>  int   status_redraw(struct client *);
>  char *status_replace(struct client *, struct session *,
>            struct winlink *, struct window_pane *, const char *, time_t, int);
> --- work/tmux/status.c.orig   2011-07-02 05:41:16.747038527 +0200
> +++ work/tmux/status.c        2011-07-03 03:35:07.862500610 +0200
> @@ -120,21 +120,19 @@
>       return (right);
>  }
>  
> -/* Set window at window list position. */
> -void
> -status_set_window_at(struct client *c, u_int x)
> +/* Find window at window list coordinate. */
> +int
> +status_find_window_at(struct session *s, u_int x)
>  {
> -     struct session  *s = c->session;
>       struct winlink  *wl;
>  
>       x += s->wlmouse;
>       RB_FOREACH(wl, winlinks, &s->windows) {
> -             if (x < wl->status_width &&
> -                     session_select(s, wl->idx) == 0) {
> -                     server_redraw_session(s);
> -             }
> +             if (x < wl->status_width)
> +                     return wl->idx;
>               x -= wl->status_width + 1;
>       }
> +     return -1;
>  }
>  
>  /* Draw status for client on the last lines of given context. */

> ------------------------------------------------------------------------------
> All of the data generated in your IT infrastructure is seriously valuable.
> Why? It contains a definitive record of application performance, security 
> threats, fraudulent activity, and more. Splunk takes this data and makes 
> sense of it. IT sense. And common sense.
> http://p.sf.net/sfu/splunk-d2d-c2

> _______________________________________________
> tmux-users mailing list
> tmux-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/tmux-users


------------------------------------------------------------------------------
All of the data generated in your IT infrastructure is seriously valuable.
Why? It contains a definitive record of application performance, security 
threats, fraudulent activity, and more. Splunk takes this data and makes 
sense of it. IT sense. And common sense.
http://p.sf.net/sfu/splunk-d2d-c2
_______________________________________________
tmux-users mailing list
tmux-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tmux-users

Reply via email to