From 23d00abb5aab56b0bb710491a47a82eda270ca49 Mon Sep 17 00:00:00 2001 From: Martin Duquesnoy Date: Tue, 10 Mar 2009 22:19:01 +0100 Subject: [PATCH] Client/Mouse: Add tile movement and so client_swap. --- src/client.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/mouse.c | 36 ++++++++++++++++++++----------- src/wmfs.h | 1 + 3 files changed, 85 insertions(+), 12 deletions(-) diff --git a/src/client.c b/src/client.c index 2ea3fe9..26ad260 100644 --- a/src/client.c +++ b/src/client.c @@ -629,6 +629,66 @@ client_size_hints(Client *c) return; } +/** Swap 2 clients + * \param a First client + * \param b Second client + */ +void +client_swap(Client *a, Client *b) +{ + Client *an, *bn, *ap, *bp; + + if(!a || !b) + return; + + ap = a->prev; + an = a->next; + bp = b->prev; + bn = b->next; + + if(a == b->next) + { + a->next = b; + b->prev = a; + + if((a->prev = bp)) + bp->next = a; + if((b->next = an)) + an->prev = b; + } + else if(b == a->next) + { + a->prev = b; + b->next = a; + + if((b->prev = ap)) + ap->next = b; + if((a->next = bn)) + bn->prev = a; + } + else + { + if((a->next = bn)) + a->next->prev = a; + if((a->prev = bp)) + a->prev->next = a; + if((b->prev = ap)) + b->prev->next = b; + if((b->next = an)) + b->next->prev = b; + } + + if(clients == a) + clients = b; + else if(clients == b) + clients = a; + + arrange(a->screen); + arrange(b->screen); + + return; +} + /** Raise a client * \param c Client pointer */ diff --git a/src/mouse.c b/src/mouse.c index 94ef026..a9ae84e 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -45,12 +45,12 @@ mouse_move(Client *c) int oscreen = c->screen; int dint; uint duint; - Window dw; + Window dw, sw; + Client *sclient; XRectangle geo = c->geo; XEvent ev; - if(c->max || c->tile || c->lmax - || c->state_fullscreen || c->state_dock) + if(c->max || c->lmax || c->state_fullscreen || c->state_dock) return; if(XGrabPointer(dpy, ROOT, False, MouseMask, GrabModeAsync, GrabModeAsync, @@ -65,18 +65,30 @@ mouse_move(Client *c) if(ev.type == MotionNotify) { - geo.x = (ocx + (ev.xmotion.x - mx)); - geo.y = (ocy + (ev.xmotion.y - my)); + /* To move the client in the tile grid */ + if(c->tile) + { + XQueryPointer(dpy, ROOT, &dw, &sw, &mx, &my, &dint, &dint, &duint); - - if(c->screen != oscreen) - arrange(c->screen); - - if(c->free || tags[c->screen][c->tag].layout.func == freelayout) - client_moveresize(c, geo, True); + if((sclient = client_gb_win(sw)) + || (sclient = client_gb_frame(sw)) + || (sclient = client_gb_titlebar(sw))) + client_swap(c, sclient); + } + /* To move a client normally, in freelayout */ else - break; + { + geo.x = (ocx + (ev.xmotion.x - mx)); + geo.y = (ocy + (ev.xmotion.y - my)); + if(c->screen != oscreen) + arrange(c->screen); + + if(c->free || tags[c->screen][c->tag].layout.func == freelayout) + client_moveresize(c, geo, True); + else + break; + } } else if(ev.type == MapRequest || ev.type == Expose diff --git a/src/wmfs.h b/src/wmfs.h index 5ce5812..f5cd168 100644 --- a/src/wmfs.h +++ b/src/wmfs.h @@ -140,6 +140,7 @@ void client_manage(Window w, XWindowAttributes *wa); void client_moveresize(Client *c, XRectangle geo, Bool r); void client_maximize(Client *c); void client_size_hints(Client *c); +void client_swap(Client *a, Client *b); void client_raise(Client *c); void client_unhide(Client *c); void client_unmanage(Client *c);