JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
applied Sanders focus_* patches, removed the unnecessary clean-prefix from the new...
[dwm.git] / client.c
index ecfd8f0..cb5334e 100644 (file)
--- a/client.c
+++ b/client.c
 /* static functions */
 
 static void
+grabbutton(Client *c, unsigned int button, unsigned int modifier)
+{
+       XGrabButton(dpy, button, modifier, c->win, False, BUTTONMASK,
+                       GrabModeAsync, GrabModeSync, None, None);
+       XGrabButton(dpy, button, modifier | LockMask, c->win, False, BUTTONMASK,
+                       GrabModeAsync, GrabModeSync, None, None);
+       XGrabButton(dpy, button, modifier | numlockmask, c->win, False, BUTTONMASK,
+                       GrabModeAsync, GrabModeSync, None, None);
+       XGrabButton(dpy, button, modifier | numlockmask | LockMask, c->win, False, BUTTONMASK,
+                       GrabModeAsync, GrabModeSync, None, None);
+}
+
+static void
 resizetitle(Client *c)
 {
        int i;
@@ -31,6 +44,15 @@ resizetitle(Client *c)
 
 }
 
+static void
+ungrabbutton(Client *c, unsigned int button, unsigned int modifier)
+{
+       XUngrabButton(dpy, button, modifier, c->win);
+       XUngrabButton(dpy, button, modifier | LockMask, c->win);
+       XUngrabButton(dpy, button, modifier | numlockmask, c->win);
+       XUngrabButton(dpy, button, modifier | numlockmask | LockMask, c->win);
+}
+
 static int
 xerrordummy(Display *dsply, XErrorEvent *ee)
 {
@@ -49,14 +71,18 @@ ban(Client *c)
 void
 focus(Client *c)
 {
-       if (!issel)
-               return;
        Client *old = sel;
-       XEvent ev;
 
+       if (!issel)
+               return;
+       if(sel && sel->ismax && sel != c)
+               togglemax(NULL);
        sel = c;
-       if(old && old != c)
+       if(old && old != c) {
+               grabbutton(old, AnyButton, 0);
                drawtitle(old);
+       }
+       ungrabbutton(c, AnyButton, 0);
        drawtitle(c);
        XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
 }
@@ -69,9 +95,6 @@ focusnext(Arg *arg)
        if(!sel)
                return;
 
-       if(sel->ismax)
-               togglemax(NULL);
-
        if(!(c = getnext(sel->next)))
                c = getnext(clients);
        if(c) {
@@ -88,9 +111,6 @@ focusprev(Arg *arg)
        if(!sel)
                return;
 
-       if(sel->ismax)
-               togglemax(NULL);
-
        if(!(c = getprev(sel->prev))) {
                for(c = clients; c && c->next; c = c->next);
                c = getprev(c);
@@ -192,7 +212,7 @@ killclient(Arg *arg)
 void
 manage(Window w, XWindowAttributes *wa)
 {
-       Client *c;
+       Client *c, *tc;
        Window trans;
        XSetWindowAttributes twa;
 
@@ -208,8 +228,14 @@ manage(Window w, XWindowAttributes *wa)
        c->border = 0;
        setsize(c);
 
+       if(c->x + c->w + 2 > sw)
+               c->x = sw - c->w - 2;
+       if(c->x < 0)
+               c->x = 0;
+       if(c->y + c->h + 2 > sh)
+               c->y = sh - c->h - 2;
        if(c->h != sh && c->y < bh)
-               c->y = c->ty = bh;
+               c->y = bh;
 
        c->proto = getproto(c->win);
        XSelectInput(dpy, c->win,
@@ -229,32 +255,9 @@ manage(Window w, XWindowAttributes *wa)
        c->next = clients;
        clients = c;
 
-       XGrabButton(dpy, Button1, MODKEY, c->win, False, BUTTONMASK,
-                       GrabModeAsync, GrabModeSync, None, None);
-       XGrabButton(dpy, Button1, MODKEY | LockMask, c->win, False, BUTTONMASK,
-                       GrabModeAsync, GrabModeSync, None, None);
-       XGrabButton(dpy, Button1, MODKEY | NUMLOCKMASK, c->win, False, BUTTONMASK,
-                       GrabModeAsync, GrabModeSync, None, None);
-       XGrabButton(dpy, Button1, MODKEY | NUMLOCKMASK | LockMask, c->win, False, BUTTONMASK,
-                       GrabModeAsync, GrabModeSync, None, None);
-
-       XGrabButton(dpy, Button2, MODKEY, c->win, False, BUTTONMASK,
-                       GrabModeAsync, GrabModeSync, None, None);
-       XGrabButton(dpy, Button2, MODKEY | LockMask, c->win, False, BUTTONMASK,
-                       GrabModeAsync, GrabModeSync, None, None);
-       XGrabButton(dpy, Button2, MODKEY | NUMLOCKMASK, c->win, False, BUTTONMASK,
-                       GrabModeAsync, GrabModeSync, None, None);
-       XGrabButton(dpy, Button2, MODKEY | NUMLOCKMASK | LockMask, c->win, False, BUTTONMASK,
-                       GrabModeAsync, GrabModeSync, None, None);
-
-       XGrabButton(dpy, Button3, MODKEY, c->win, False, BUTTONMASK,
-                       GrabModeAsync, GrabModeSync, None, None);
-       XGrabButton(dpy, Button3, MODKEY | LockMask, c->win, False, BUTTONMASK,
-                       GrabModeAsync, GrabModeSync, None, None);
-       XGrabButton(dpy, Button3, MODKEY | NUMLOCKMASK, c->win, False, BUTTONMASK,
-                       GrabModeAsync, GrabModeSync, None, None);
-       XGrabButton(dpy, Button3, MODKEY | NUMLOCKMASK | LockMask, c->win, False, BUTTONMASK,
-                       GrabModeAsync, GrabModeSync, None, None);
+       grabbutton(c, Button1, MODKEY);
+       grabbutton(c, Button2, MODKEY);
+       grabbutton(c, Button3, MODKEY);
 
        settags(c);
        if(!c->isfloat)
@@ -262,12 +265,13 @@ manage(Window w, XWindowAttributes *wa)
                        || (c->maxw && c->minw &&
                                c->maxw == c->minw && c->maxh == c->minh);
        settitle(c);
-
+       if(isvisible(c))
+               sel = c;
+       arrange(NULL);
        XMapWindow(dpy, c->win);
        XMapWindow(dpy, c->title);
        if(isvisible(c))
                focus(c);
-       arrange(NULL);
 }
 
 void
@@ -275,7 +279,6 @@ resize(Client *c, Bool sizehints, Corner sticky)
 {
        int bottom = c->y + c->h;
        int right = c->x + c->w;
-       /*XConfigureEvent e;*/
        XWindowChanges wc;
 
        if(sizehints) {
@@ -292,10 +295,6 @@ resize(Client *c, Bool sizehints, Corner sticky)
                if(c->maxh && c->h > c->maxh)
                        c->h = c->maxh;
        }
-       if(c->x > right) /* might happen on restart */
-               c->x = right - c->w;
-       if(c->y > bottom)
-               c->y = bottom - c->h;
        if(sticky == TopRight || sticky == BotRight)
                c->x = right - c->w;
        if(sticky == BotLeft || sticky == BotRight)