about summary refs log tree commit diff stats
path: root/client.c
diff options
context:
space:
mode:
Diffstat (limited to 'client.c')
-rw-r--r--client.c45
1 files changed, 33 insertions, 12 deletions
diff --git a/client.c b/client.c
index 62f4d98..8aca2e2 100644
--- a/client.c
+++ b/client.c
@@ -3,6 +3,7 @@
  * See LICENSE file for license details.
  */
 
+#include <stdlib.h>
 #include <string.h>
 #include <X11/Xatom.h>
 
@@ -36,10 +37,10 @@ update_client_name(Client *c)
 	XFree(name.value);
 }
 
-Client *
-create_client(Window w, XWindowAttributes *wa)
+void
+manage(Window w, XWindowAttributes *wa)
 {
-	Client *c;
+	Client *c, **l;
 	XSetWindowAttributes twa;
 	long msize;
 
@@ -68,24 +69,44 @@ create_client(Window w, XWindowAttributes *wa)
 			DefaultDepth(dpy, screen), CopyFromParent,
 			DefaultVisual(dpy, screen),
 			CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa);
+
+	for(l=&clients; *l; l=&(*l)->next);
+	c->next = *l; /* *l == nil */
+	*l = c;
+	XMapRaised(dpy, c->win);
+	XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
 	XFlush(dpy);
+}
 
-#if 0
-	for(t=&client, i=0; *t; t=&(*t)->next, i++);
-	c->next = *t; /* *t == nil */
-	*t = c;
-#endif
-	return c;
+static int
+dummy_error_handler(Display *dpy, XErrorEvent *error)
+{
+	return 0;
 }
 
 void
-manage(Client *c)
+unmanage(Client *c)
 {
-	XMapRaised(dpy, c->win);
-	XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
+	Client **l;
+
+	XGrabServer(dpy);
+	XSetErrorHandler(dummy_error_handler);
+
+	XUnmapWindow(dpy, c->win);
+	XDestroyWindow(dpy, c->title);
+
+	for(l=&clients; *l && *l != c; l=&(*l)->next);
+	eassert(*l == c);
+	*l = c->next;
+	free(c);
+
 	XFlush(dpy);
+	XSetErrorHandler(error_handler);
+	XUngrabServer(dpy);
+	/*flush_masked_events(EnterWindowMask); ? */
 }
 
+
 Client *
 getclient(Window w)
 {