URI: 
       added an creatnotify event handler - dwm - dynamic window manager
  HTML git clone https://git.parazyd.org/dwm
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 83aa110c6fabbf5f5a14b698a6ca22072cb80629
   DIR parent 5a1a2edf0e584e660e16d2e01094851e0f9161e2
  HTML Author: Anselm R. Garbe <arg@suckless.org>
       Date:   Mon,  4 Jun 2007 11:50:48 +0200
       
       added an creatnotify event handler
       Diffstat:
         M client.c                            |      62 +++++++++++++++++++------------
         M dwm.h                               |       4 +++-
         M event.c                             |      14 ++++++++++++++
         M layout.c                            |      16 ----------------
       
       4 files changed, 56 insertions(+), 40 deletions(-)
       ---
   DIR diff --git a/client.c b/client.c
       @@ -97,6 +97,14 @@ attach(Client *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;
        
       @@ -299,6 +307,37 @@ togglefloating(const char *arg) {
        }
        
        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;
                XSizeHints size;
       @@ -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();
       -}
   DIR diff --git 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 */
   DIR diff --git a/event.c b/event.c
       @@ -225,6 +225,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;
                XDestroyWindowEvent *ev = &e->xdestroywindow;
       @@ -350,6 +363,7 @@ void (*handler[LASTEvent]) (XEvent *) = {
                [ButtonPress] = buttonpress,
                [ConfigureRequest] = configurerequest,
                [ConfigureNotify] = configurenotify,
       +        [CreateNotify] = createnotify,
                [DestroyNotify] = destroynotify,
                [EnterNotify] = enternotify,
                [LeaveNotify] = leavenotify,
   DIR diff --git a/layout.c b/layout.c
       @@ -12,22 +12,6 @@ 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;
                Client *c;