client.c
changeset 10 703255003abb
parent 9 d567f430a81d
child 13 5cc5e55a132d
--- a/client.c	Tue Jul 11 12:52:57 2006 +0200
+++ b/client.c	Tue Jul 11 13:02:22 2006 +0200
@@ -3,6 +3,7 @@
  * See LICENSE file for license details.
  */
 
+#include <stdlib.h>
 #include <string.h>
 #include <X11/Xatom.h>
 
@@ -36,10 +37,10 @@
 	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 @@
 			DefaultDepth(dpy, screen), CopyFromParent,
 			DefaultVisual(dpy, screen),
 			CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa);
-	XFlush(dpy);
 
-#if 0
-	for(t=&client, i=0; *t; t=&(*t)->next, i++);
-	c->next = *t; /* *t == nil */
-	*t = c;
-#endif
-	return c;
-}
-
-void
-manage(Client *c)
-{
+	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);
 }
 
+static int
+dummy_error_handler(Display *dpy, XErrorEvent *error)
+{
+	return 0;
+}
+
+void
+unmanage(Client *c)
+{
+	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)
 {