aewl

diff client.c @ 10:703255003abb

changed how manage client works
author Anselm R. Garbe <garbeam@wmii.de>
date Tue, 11 Jul 2006 13:02:22 +0200
parents d567f430a81d
children 5cc5e55a132d
line diff
     1.1 --- a/client.c	Tue Jul 11 12:52:57 2006 +0200
     1.2 +++ b/client.c	Tue Jul 11 13:02:22 2006 +0200
     1.3 @@ -3,6 +3,7 @@
     1.4   * See LICENSE file for license details.
     1.5   */
     1.6  
     1.7 +#include <stdlib.h>
     1.8  #include <string.h>
     1.9  #include <X11/Xatom.h>
    1.10  
    1.11 @@ -36,10 +37,10 @@
    1.12  	XFree(name.value);
    1.13  }
    1.14  
    1.15 -Client *
    1.16 -create_client(Window w, XWindowAttributes *wa)
    1.17 +void
    1.18 +manage(Window w, XWindowAttributes *wa)
    1.19  {
    1.20 -	Client *c;
    1.21 +	Client *c, **l;
    1.22  	XSetWindowAttributes twa;
    1.23  	long msize;
    1.24  
    1.25 @@ -68,24 +69,44 @@
    1.26  			DefaultDepth(dpy, screen), CopyFromParent,
    1.27  			DefaultVisual(dpy, screen),
    1.28  			CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa);
    1.29 -	XFlush(dpy);
    1.30  
    1.31 -#if 0
    1.32 -	for(t=&client, i=0; *t; t=&(*t)->next, i++);
    1.33 -	c->next = *t; /* *t == nil */
    1.34 -	*t = c;
    1.35 -#endif
    1.36 -	return c;
    1.37 -}
    1.38 -
    1.39 -void
    1.40 -manage(Client *c)
    1.41 -{
    1.42 +	for(l=&clients; *l; l=&(*l)->next);
    1.43 +	c->next = *l; /* *l == nil */
    1.44 +	*l = c;
    1.45  	XMapRaised(dpy, c->win);
    1.46  	XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
    1.47  	XFlush(dpy);
    1.48  }
    1.49  
    1.50 +static int
    1.51 +dummy_error_handler(Display *dpy, XErrorEvent *error)
    1.52 +{
    1.53 +	return 0;
    1.54 +}
    1.55 +
    1.56 +void
    1.57 +unmanage(Client *c)
    1.58 +{
    1.59 +	Client **l;
    1.60 +
    1.61 +	XGrabServer(dpy);
    1.62 +	XSetErrorHandler(dummy_error_handler);
    1.63 +
    1.64 +	XUnmapWindow(dpy, c->win);
    1.65 +	XDestroyWindow(dpy, c->title);
    1.66 +
    1.67 +	for(l=&clients; *l && *l != c; l=&(*l)->next);
    1.68 +	eassert(*l == c);
    1.69 +	*l = c->next;
    1.70 +	free(c);
    1.71 +
    1.72 +	XFlush(dpy);
    1.73 +	XSetErrorHandler(error_handler);
    1.74 +	XUngrabServer(dpy);
    1.75 +	/*flush_masked_events(EnterWindowMask); ? */
    1.76 +}
    1.77 +
    1.78 +
    1.79  Client *
    1.80  getclient(Window w)
    1.81  {