+ update_name(c);
+
+ for(l=&clients; *l; l=&(*l)->next);
+ c->next = *l; /* *l == nil */
+ *l = c;
+ c->snext = stack;
+ stack = c;
+ XMapRaised(dpy, c->win);
+ XMapRaised(dpy, c->title);
+ XGrabButton(dpy, Button1, Mod1Mask, c->win, False, ButtonPressMask,
+ GrabModeAsync, GrabModeSync, None, None);
+ XGrabButton(dpy, Button2, Mod1Mask, c->win, False, ButtonPressMask,
+ GrabModeAsync, GrabModeSync, None, None);
+ XGrabButton(dpy, Button3, Mod1Mask, c->win, False, ButtonPressMask,
+ GrabModeAsync, GrabModeSync, None, None);
+ resize(c);
+ focus(c);
+}
+
+void
+gravitate(Client *c, Bool invert)
+{
+ int dx = 0, dy = 0;
+
+ switch(c->grav) {
+ case StaticGravity:
+ case NorthWestGravity:
+ case NorthGravity:
+ case NorthEastGravity:
+ dy = c->border;
+ break;
+ case EastGravity:
+ case CenterGravity:
+ case WestGravity:
+ dy = -(c->h / 2) + c->border;
+ break;
+ case SouthEastGravity:
+ case SouthGravity:
+ case SouthWestGravity:
+ dy = -c->h;
+ break;
+ default:
+ break;
+ }
+
+ switch (c->grav) {
+ case StaticGravity:
+ case NorthWestGravity:
+ case WestGravity:
+ case SouthWestGravity:
+ dx = c->border;
+ break;
+ case NorthGravity:
+ case CenterGravity:
+ case SouthGravity:
+ dx = -(c->w / 2) + c->border;
+ break;
+ case NorthEastGravity:
+ case EastGravity:
+ case SouthEastGravity:
+ dx = -(c->w + c->border);
+ break;
+ default:
+ break;
+ }
+
+ if(invert) {
+ dx = -dx;
+ dy = -dy;
+ }
+ c->x += dx;
+ c->y += dy;
+}
+
+void
+resize(Client *c)
+{
+ XConfigureEvent e;
+
+ resize_title(c);
+ XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h);
+ 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);
+ XFlush(dpy);
+}
+
+static int
+dummy_error_handler(Display *dpy, XErrorEvent *error)
+{
+ return 0;
+}
+
+void
+unmanage(Client *c)
+{
+ Client **l;
+
+ XGrabServer(dpy);
+ XSetErrorHandler(dummy_error_handler);
+
+ XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
+ XDestroyWindow(dpy, c->title);
+
+ for(l=&clients; *l && *l != c; l=&(*l)->next);
+ eassert(*l == c);
+ *l = c->next;
+ for(l=&stack; *l && *l != c; l=&(*l)->snext);
+ eassert(*l == c);
+ *l = c->snext;
+ free(c);
+