diff --git a/src/barwin.h b/src/barwin.h index a9831f3..815f716 100644 --- a/src/barwin.h +++ b/src/barwin.h @@ -11,7 +11,7 @@ #define BARWIN_MASK \ (SubstructureRedirectMask | SubstructureNotifyMask \ | ButtonMask | MouseMask | ExposureMask | VisibilityChangeMask \ - | StructureNotifyMask | SubstructureRedirectMask) + | StructureNotifyMask) #define BARWIN_ENTERMASK (EnterWindowMask | LeaveWindowMask | FocusChangeMask) #define BARWIN_WINCW (CWOverrideRedirect | CWBackPixmap | CWEventMask) diff --git a/src/config.h b/src/config.h index e8daa22..0ba71a7 100644 --- a/src/config.h +++ b/src/config.h @@ -73,6 +73,7 @@ static const struct { char *name; void (*func)(Uicb cmd); } uicb_list[] = /* Mouse */ { "mouse_resize", uicb_mouse_resize }, { "mouse_move", uicb_mouse_move }, + { "mouse_swap", uicb_mouse_move }, { "mouse_tab", uicb_mouse_tab }, { NULL, NULL } diff --git a/src/infobar.h b/src/infobar.h index 3e8b546..ee95f3f 100644 --- a/src/infobar.h +++ b/src/infobar.h @@ -91,5 +91,4 @@ infobar_gb_name(const char *name) return SLIST_FIRST(&s->infobars); } - #endif /* INFOBAR_H */ diff --git a/src/mouse.c b/src/mouse.c index 0af12ff..0c4878c 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -5,6 +5,7 @@ #include "wmfs.h" #include "mouse.h" +#include "barwin.h" #include "client.h" #include "draw.h" @@ -68,17 +69,35 @@ mouse_resize(struct client *c) XUngrabServer(W->dpy); } +static struct tag* +mouse_drag_tag(struct client *c, Window w) +{ + struct barwin *b; + struct tag *t; + Window rw; + int d, u; + + XQueryPointer(W->dpy, w, &rw, &rw, &d, &d, &d, &d, (uint *)&u); + + SLIST_FOREACH(b, &W->h.barwin, next) + if(b->win == rw + && (t = (struct tag*)b->ptr) + && t != c->tag) + return t; + + return NULL; +} + #define _REV_SBORDER(c) draw_reversed_rect(W->root, &(c)->geo); void mouse_move(struct client *c, bool type) { struct client *c2 = NULL, *last = c; + struct tag *t; XEvent ev; Window w; int d, u; - XGrabServer(W->dpy); - if(c->flags & CLIENT_TABBED && !(c->flags & CLIENT_TABMASTER)) c = c->tabmaster; @@ -97,28 +116,36 @@ mouse_move(struct client *c, bool type) if(!(c2 = client_gb_frame(w))) c2 = client_gb_titlebar(w); - if(c2 && c2 != last) + if(c2) { - _REV_SBORDER(last); - _REV_SBORDER(c2); - last = c2; + if(c2 != last) + { + _REV_SBORDER(last); + _REV_SBORDER(c2); + last = c2; + } } + else + t = mouse_drag_tag(c, w); XSync(W->dpy, false); } while(ev.type != ButtonRelease); - if(c2 && c2 != c) + if(c2) { - _REV_SBORDER(c2); + if(c2 != c) + { + _REV_SBORDER(c2); - if(type) - client_swap2(c, c2); - else - _client_tab(c, c2); + if(type) + client_swap2(c, c2); + else + _client_tab(c, c2); + } } - - XUngrabServer(W->dpy); + else if(t) + tag_client(t, c); } void @@ -126,9 +153,8 @@ uicb_mouse_resize(Uicb cmd) { (void)cmd; - if(mouse_check_client(W->client)) - if(W->client) - mouse_resize(W->client); + if(W->client && mouse_check_client(W->client)) + mouse_resize(W->client); } void @@ -136,9 +162,8 @@ uicb_mouse_move(Uicb cmd) { (void)cmd; - if(mouse_check_client(W->client)) - if(W->client) - mouse_move(W->client, true); + if(W->client && mouse_check_client(W->client)) + mouse_move(W->client, true); } void @@ -146,7 +171,6 @@ uicb_mouse_tab(Uicb cmd) { (void)cmd; - if(mouse_check_client(W->client)) - if(W->client) - mouse_move(W->client, false); + if(W->client && mouse_check_client(W->client)) + mouse_move(W->client, false); } diff --git a/src/tag.c b/src/tag.c index 46ca92a..da7be78 100644 --- a/src/tag.c +++ b/src/tag.c @@ -84,6 +84,7 @@ tag_client(struct tag *t, struct client *c) c->prevtag = c->tag; c->tag = t; + c->screen = t->screen; client_update_props(c, CPROP_LOC);