diff options
-rw-r--r-- | client.c | 62 | ||||
-rw-r--r-- | dwm.h | 4 | ||||
-rw-r--r-- | event.c | 14 | ||||
-rw-r--r-- | layout.c | 16 |
4 files changed, 56 insertions, 40 deletions
@@ -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(); -} @@ -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 */ @@ -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, @@ -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; |