added an creatnotify event handler
authorAnselm R. Garbe <arg@suckless.org>
Mon, 4 Jun 2007 09:50:48 +0000 (11:50 +0200)
committerAnselm R. Garbe <arg@suckless.org>
Mon, 4 Jun 2007 09:50:48 +0000 (11:50 +0200)
client.c
dwm.h
event.c
layout.c

index 06bc9d8..68d10a7 100644 (file)
--- a/client.c
+++ b/client.c
@@ -96,6 +96,14 @@ attach(Client *c) {
        clients = c;
 }
 
+void
+ban(Client *c) {
+       if (c->isbanned)
+               return;
+       XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
+       c->isbanned = True;
+}
+
 void
 configure(Client *c) {
        XConfigureEvent ce;
@@ -298,6 +306,37 @@ togglefloating(const char *arg) {
        lt->arrange();
 }
 
+void
+unban(Client *c) {
+       if (!c->isbanned)
+               return;
+       XMoveWindow(dpy, c->win, c->x, c->y);
+       c->isbanned = False;
+}
+
+void
+unmanage(Client *c) {
+       XWindowChanges wc;
+
+       wc.border_width = c->oldborder;
+       /* The server grab construct avoids race conditions. */
+       XGrabServer(dpy);
+       XSetErrorHandler(xerrordummy);
+       XConfigureWindow(dpy, c->win, CWBorderWidth, &wc); /* restore border */
+       detach(c);
+       detachstack(c);
+       if(sel == c)
+               focus(NULL);
+       XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
+       setclientstate(c, WithdrawnState);
+       free(c->tags);
+       free(c);
+       XSync(dpy, False);
+       XSetErrorHandler(xerror);
+       XUngrabServer(dpy);
+       lt->arrange();
+}
+
 void
 updatesizehints(Client *c) {
        long msize;
@@ -376,26 +415,3 @@ updatetitle(Client *c) {
        c->name[sizeof c->name - 1] = '\0';
        XFree(name.value);
 }
-
-void
-unmanage(Client *c) {
-       XWindowChanges wc;
-
-       wc.border_width = c->oldborder;
-       /* The server grab construct avoids race conditions. */
-       XGrabServer(dpy);
-       XSetErrorHandler(xerrordummy);
-       XConfigureWindow(dpy, c->win, CWBorderWidth, &wc); /* restore border */
-       detach(c);
-       detachstack(c);
-       if(sel == c)
-               focus(NULL);
-       XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
-       setclientstate(c, WithdrawnState);
-       free(c->tags);
-       free(c);
-       XSync(dpy, False);
-       XSetErrorHandler(xerror);
-       XUngrabServer(dpy);
-       lt->arrange();
-}
diff --git a/dwm.h b/dwm.h
index bd190c6..999f027 100644 (file)
--- a/dwm.h
+++ b/dwm.h
@@ -96,6 +96,7 @@ extern Window root, barwin;
 
 /* client.c */
 void attach(Client *c);                        /* attaches c to global client list */
+void ban(Client *c);                   /* bans c */
 void configure(Client *c);             /* send synthetic configure event */
 void detach(Client *c);                        /* detaches c from global client list */
 void focus(Client *c);                 /* focus c if visible && !NULL, or focus top visible */
@@ -104,9 +105,10 @@ void manage(Window w, XWindowAttributes *wa);      /* manage new client */
 void resize(Client *c, int x, int y,
                int w, int h, Bool sizehints);  /* resize with given coordinates c*/
 void togglefloating(const char *arg);  /* toggles sel between floating/tiled state */
+void unban(Client *c);                 /* unbans c */
+void unmanage(Client *c);              /* destroy c */
 void updatesizehints(Client *c);       /* update the size hint variables of c */
 void updatetitle(Client *c);           /* update the name of c */
-void unmanage(Client *c);              /* destroy c */
 
 /* draw.c */
 void drawstatus(void);                 /* draw the bar */
diff --git a/event.c b/event.c
index ad4e271..949812f 100644 (file)
--- a/event.c
+++ b/event.c
@@ -224,6 +224,19 @@ configurenotify(XEvent *e) {
        }
 }
 
+static void
+createnotify(XEvent *e) {
+       static XWindowAttributes wa;
+       XCreateWindowEvent *ev = &e->xcreatewindow;
+
+       if(!XGetWindowAttributes(dpy, ev->window, &wa))
+               return;
+       if(wa.override_redirect)
+               return;
+       if(!getclient(ev->window) && (wa.map_state == IsViewable))
+               manage(ev->window, &wa);
+}
+
 static void
 destroynotify(XEvent *e) {
        Client *c;
@@ -350,6 +363,7 @@ void (*handler[LASTEvent]) (XEvent *) = {
        [ButtonPress] = buttonpress,
        [ConfigureRequest] = configurerequest,
        [ConfigureNotify] = configurenotify,
+       [CreateNotify] = createnotify,
        [DestroyNotify] = destroynotify,
        [EnterNotify] = enternotify,
        [LeaveNotify] = leavenotify,
index 0706c62..acf0a8e 100644 (file)
--- a/layout.c
+++ b/layout.c
@@ -11,22 +11,6 @@ static unsigned int nlayouts = 0;
 static unsigned int masterw = MASTERWIDTH;
 static unsigned int nmaster = NMASTER;
 
-static void
-ban(Client *c) {
-       if (c->isbanned)
-               return;
-       XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
-       c->isbanned = True;
-}
-
-static void
-unban(Client *c) {
-       if (!c->isbanned)
-               return;
-       XMoveWindow(dpy, c->win, c->x, c->y);
-       c->isbanned = False;
-}
-
 static void
 tile(void) {
        unsigned int i, n, nx, ny, nw, nh, mw, mh, tw, th;