--- 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)
{
--- a/event.c Tue Jul 11 12:52:57 2006 +0200
+++ b/event.c Tue Jul 11 13:02:22 2006 +0200
@@ -159,12 +159,8 @@
return;
}
- /*if(!client_of_win(ev->window))*/
- /*manage(create_client(ev->window, &wa));*/
- XMapRaised(dpy, ev->window);
- XMoveResizeWindow(dpy, ev->window, rect.x, rect.y, rect.width, rect.height - barrect.height);
- XSetInputFocus(dpy, ev->window, RevertToPointerRoot, CurrentTime);
- XFlush(dpy);
+ if(!getclient(ev->window))
+ manage(ev->window, &wa);
}
static void
@@ -185,11 +181,9 @@
static void
unmapnotify(XEvent *e)
{
-#if 0
Client *c;
XUnmapEvent *ev = &e->xunmap;
- if((c = client_of_win(ev->window)))
- destroy_client(c);
-#endif
+ if((c = getclient(ev->window)))
+ unmanage(c);
}
--- a/wm.c Tue Jul 11 12:52:57 2006 +0200
+++ b/wm.c Tue Jul 11 13:02:22 2006 +0200
@@ -20,19 +20,18 @@
Cursor cursor[CurLast];
XRectangle rect, barrect;
Bool running = True;
-Client *clients = NULL;
char *bartext, tag[256];
int screen, sel_screen;
-/* draw structs */
Brush brush = {0};
+Client *clients = NULL;
enum { WM_PROTOCOL_DELWIN = 1 };
static Bool other_wm_running;
+static char version[] = "gridwm - " VERSION ", (C)opyright MMVI Anselm R. Garbe\n";
static int (*x_error_handler) (Display *, XErrorEvent *);
-static char version[] = "gridwm - " VERSION ", (C)opyright MMVI Anselm R. Garbe\n";
static void
usage()
@@ -56,7 +55,7 @@
if(wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1))
continue;
if(wa.map_state == IsViewable)
- manage(create_client(wins[i], &wa));
+ manage(wins[i], &wa);
}
}
if(wins)
@@ -69,7 +68,7 @@
* Other types of errors call Xlib's default error handler, which
* calls exit().
*/
-static int
+int
error_handler(Display *dpy, XErrorEvent *error)
{
if(error->error_code == BadWindow
--- a/wm.h Tue Jul 11 12:52:57 2006 +0200
+++ b/wm.h Tue Jul 11 13:02:22 2006 +0200
@@ -65,8 +65,8 @@
extern void quit(char *arg);
/* client.c */
-extern Client *create_client(Window w, XWindowAttributes *wa);
-extern void manage(Client *c);
+extern void manage(Window w, XWindowAttributes *wa);
+void unmanage(Client *c);
extern Client * getclient(Window w);
/* key.c */
@@ -74,3 +74,4 @@
extern void keypress(XEvent *e);
/* wm.c */
+extern int error_handler(Display *dpy, XErrorEvent *error);