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