summaryrefslogtreecommitdiff
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)
{