# HG changeset patch # User Anselm R. Garbe # Date 1152615742 -7200 # Node ID 703255003abb880874b932308cced56a73e08589 # Parent d567f430a81d78d1f646a3e3d87e429e20cc7100 changed how manage client works diff -r d567f430a81d -r 703255003abb client.c --- 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 #include #include @@ -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) { diff -r d567f430a81d -r 703255003abb event.c --- 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); } diff -r d567f430a81d -r 703255003abb wm.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 diff -r d567f430a81d -r 703255003abb wm.h --- 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);