JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
applied sumik's multihead patch
[dwm.git] / client.c
index 5912c77..773b8f8 100644 (file)
--- a/client.c
+++ b/client.c
@@ -3,7 +3,6 @@
  * See LICENSE file for license details.
  */
 #include "dwm.h"
-
 #include <stdlib.h>
 #include <string.h>
 #include <X11/Xatom.h>
@@ -17,9 +16,9 @@ resizetitle(Client *c)
        int i;
 
        c->tw = 0;
-       for(i = 0; i < TLast; i++)
+       for(i = 0; i < ntags; i++)
                if(c->tags[i])
-                       c->tw += textw(c->tags[i]);
+                       c->tw += textw(tags[i]);
        c->tw += textw(c->name);
        if(c->tw > c->w)
                c->tw = c->w + 2;
@@ -50,6 +49,8 @@ ban(Client *c)
 void
 focus(Client *c)
 {
+       if (!issel)
+               return;
        Client *old = sel;
        XEvent ev;
 
@@ -198,13 +199,6 @@ killclient(Arg *arg)
 }
 
 void
-lower(Client *c)
-{
-       XLowerWindow(dpy, c->title);
-       XLowerWindow(dpy, c->win);
-}
-
-void
 manage(Window w, XWindowAttributes *wa)
 {
        Client *c;
@@ -212,6 +206,7 @@ manage(Window w, XWindowAttributes *wa)
        XSetWindowAttributes twa;
 
        c = emallocz(sizeof(Client));
+       c->tags = emallocz(ntags * sizeof(Bool));
        c->win = w;
        c->x = c->tx = wa->x;
        c->y = c->ty = wa->y;
@@ -219,7 +214,7 @@ manage(Window w, XWindowAttributes *wa)
        c->h = wa->height;
        c->th = bh;
 
-       c->border = 1;
+       c->border = 0;
        setsize(c);
 
        if(c->h != sh && c->y < bh)
@@ -245,17 +240,36 @@ manage(Window w, XWindowAttributes *wa)
 
        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);
 
        settags(c);
        if(!c->isfloat)
                c->isfloat = trans
                        || (c->maxw && c->minw &&
-                               c->maxw == c->minw && c->maxh == c->minh)
-                       || (c->w == sw && c->h == sh);
+                               c->maxw == c->minw && c->maxh == c->minh);
        settitle(c);
        arrange(NULL);
 
@@ -271,7 +285,7 @@ resize(Client *c, Bool sizehints, Corner sticky)
 {
        int bottom = c->y + c->h;
        int right = c->x + c->w;
-       XConfigureEvent e;
+       /*XConfigureEvent e;*/
        XWindowChanges wc;
 
        if(sizehints) {
@@ -302,21 +316,11 @@ resize(Client *c, Bool sizehints, Corner sticky)
        wc.y = c->y;
        wc.width = c->w;
        wc.height = c->h;
-       wc.border_width = 1;
-       XConfigureWindow(dpy, c->win,
-                       CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc);
-
-       e.type = ConfigureNotify;
-       e.event = c->win;
-       e.window = c->win;
-       e.x = c->x;
-       e.y = c->y;
-       e.width = c->w;
-       e.height = c->h;
-       e.border_width = c->border;
-       e.above = None;
-       e.override_redirect = False;
-       XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&e);
+       if(c->w == sw && c->h == sh)
+               wc.border_width = 0;
+       else
+               wc.border_width = 1;
+       XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc);
        XSync(dpy, False);
 }
 
@@ -403,8 +407,8 @@ togglemax(Arg *arg)
                oh = sel->h;
                sel->x = sx;
                sel->y = sy + bh;
-               sel->w = sw - 2 * sel->border;
-               sel->h = sh - 2 * sel->border - bh;
+               sel->w = sw - 2;
+               sel->h = sh - 2 - bh;
 
                higher(sel);
                resize(sel, False, TopLeft);
@@ -441,6 +445,7 @@ unmanage(Client *c)
                if(!sel)
                        sel = clients;
        }
+       free(c->tags);
        free(c);
 
        XSync(dpy, False);
@@ -456,12 +461,14 @@ zoom(Arg *arg)
 {
        Client *c;
 
-       if(!sel)
+       if(!sel || (arrange != dotile) || sel->isfloat)
                return;
 
-       if(sel == getnext(clients) && sel->next)  {
+       if(sel == getnext(clients))  {
                if((c = getnext(sel->next)))
                        sel = c;
+               else
+                       return;
        }
 
        /* pop */