...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

Reply via email to