client.c
changeset 963 7416c26a14db
parent 957 e61ca30d9474
child 964 777a9d9ce70b
equal deleted inserted replaced
962:8d1df2c37229 963:7416c26a14db
     4 #include <string.h>
     4 #include <string.h>
     5 #include <X11/Xatom.h>
     5 #include <X11/Xatom.h>
     6 #include <X11/Xutil.h>
     6 #include <X11/Xutil.h>
     7 
     7 
     8 /* static */
     8 /* static */
       
     9 
       
    10 static char config[128];
     9 
    11 
    10 static void
    12 static void
    11 attachstack(Client *c) {
    13 attachstack(Client *c) {
    12 	c->snext = stack;
    14 	c->snext = stack;
    13 	stack = c;
    15 	stack = c;
   177 	}
   179 	}
   178 	else
   180 	else
   179 		XKillClient(dpy, sel->win);
   181 		XKillClient(dpy, sel->win);
   180 }
   182 }
   181 
   183 
       
   184 Bool
       
   185 loadconfig(Client *c) {
       
   186 	unsigned int i;
       
   187 	Bool result = False;
       
   188 	XTextProperty name;
       
   189 
       
   190 	/* check if window has set a property */
       
   191 	name.nitems = 0;
       
   192 	XGetTextProperty(dpy, c->win, &name, dwmconfig);
       
   193 	if(name.nitems && name.encoding == XA_STRING) {
       
   194 		strncpy(config, (char *)name.value, sizeof config - 1);
       
   195 		config[sizeof config - 1] = '\0';
       
   196 		XFree(name.value);
       
   197 		for(i = 0; i < ntags && i < sizeof config - 1 && config[i] != '\0'; i++)
       
   198 			if((c->tags[i] = config[i] == '1'))
       
   199 				result = True;
       
   200 		if(i < sizeof config - 1 && config[i] != '\0')
       
   201 			c->isfloating = config[i] == '1';
       
   202 	}
       
   203 	return result;
       
   204 }
       
   205 
   182 void
   206 void
   183 manage(Window w, XWindowAttributes *wa) {
   207 manage(Window w, XWindowAttributes *wa) {
       
   208 	unsigned int i;
   184 	Client *c, *t = NULL;
   209 	Client *c, *t = NULL;
   185 	Window trans;
   210 	Window trans;
   186 	Status rettrans;
   211 	Status rettrans;
   187 	XWindowChanges wc;
   212 	XWindowChanges wc;
   188 
   213 
   219 		StructureNotifyMask | PropertyChangeMask | EnterWindowMask);
   244 		StructureNotifyMask | PropertyChangeMask | EnterWindowMask);
   220 	grabbuttons(c, False);
   245 	grabbuttons(c, False);
   221 	updatetitle(c);
   246 	updatetitle(c);
   222 	if((rettrans = XGetTransientForHint(dpy, w, &trans) == Success))
   247 	if((rettrans = XGetTransientForHint(dpy, w, &trans) == Success))
   223 		for(t = clients; t && t->win != trans; t = t->next);
   248 		for(t = clients; t && t->win != trans; t = t->next);
   224 	settags(c, t);
   249 	if(t)
       
   250 		for(i = 0; i < ntags; i++)
       
   251 			c->tags[i] = t->tags[i];
       
   252 	if(!loadconfig(c))
       
   253 		applyrules(c);
   225 	if(!c->isfloating)
   254 	if(!c->isfloating)
   226 		c->isfloating = (rettrans == Success) || c->isfixed;
   255 		c->isfloating = (rettrans == Success) || c->isfixed;
       
   256 	saveconfig(c);
   227 	attach(c);
   257 	attach(c);
   228 	attachstack(c);
   258 	attachstack(c);
   229 	XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); /* some windows require this */
   259 	XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); /* some windows require this */
   230 	ban(c);
   260 	ban(c);
   231 	arrange();
   261 	arrange();
   293 		XSync(dpy, False);
   323 		XSync(dpy, False);
   294 	}
   324 	}
   295 }
   325 }
   296 
   326 
   297 void
   327 void
       
   328 saveconfig(Client *c) {
       
   329 	unsigned int i;
       
   330 
       
   331 	for(i = 0; i < ntags && i < sizeof config - 1; i++)
       
   332 		config[i] = c->tags[i] ? '1' : '0';
       
   333 	if(i < sizeof config - 1)
       
   334 		config[i++] = c->isfloating ? '1' : '0';
       
   335 	config[i] = '\0';
       
   336 	XChangeProperty(dpy, c->win, dwmconfig, XA_STRING, 8,
       
   337 			PropModeReplace, (unsigned char *)config, i);
       
   338 }
       
   339 
       
   340 void
   298 unban(Client *c) {
   341 unban(Client *c) {
   299 	if(!c->isbanned)
   342 	if(!c->isbanned)
   300 		return;
   343 		return;
   301 	XMapWindow(dpy, c->win);
   344 	XMapWindow(dpy, c->win);
   302 	setclientstate(c, NormalState);
   345 	setclientstate(c, NormalState);