JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
fixed misappearance of iconified windows on SIGKILL
[dwm.git] / client.c
index 22408f2..9f46a0e 100644 (file)
--- a/client.c
+++ b/client.c
@@ -7,6 +7,8 @@
 
 /* static */
 
+static char prop[128];
+
 static void
 attachstack(Client *c) {
        c->snext = stack;
@@ -179,8 +181,24 @@ killclient(const char *arg) {
                XKillClient(dpy, sel->win);
 }
 
+Bool
+getprops(Client *c) {
+       unsigned int i;
+       Bool result = False;
+
+       if(gettextprop(c->win, dwmprops, prop, sizeof prop)) {
+               for(i = 0; i < ntags && i < sizeof prop - 1 && prop[i] != '\0'; i++)
+                       if((c->tags[i] = prop[i] == '1'))
+                               result = True;
+               if(i < sizeof prop - 1 && prop[i] != '\0')
+                       c->isfloating = prop[i] == '1';
+       }
+       return result;
+}
+
 void
 manage(Window w, XWindowAttributes *wa) {
+       unsigned int i;
        Client *c, *t = NULL;
        Window trans;
        Status rettrans;
@@ -221,15 +239,18 @@ manage(Window w, XWindowAttributes *wa) {
        updatetitle(c);
        if((rettrans = XGetTransientForHint(dpy, w, &trans) == Success))
                for(t = clients; t && t->win != trans; t = t->next);
-       settags(c, t);
+       if(t)
+               for(i = 0; i < ntags; i++)
+                       c->tags[i] = t->tags[i];
+       if(!getprops(c))
+               applyrules(c);
        if(!c->isfloating)
                c->isfloating = (rettrans == Success) || c->isfixed;
+       setprops(c);
        attach(c);
        attachstack(c);
        XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); /* some windows require this */
-       setclientstate(c, IconicState);
-       c->isbanned = True;
-       focus(c);
+       ban(c);
        arrange();
 }
 
@@ -297,6 +318,19 @@ resize(Client *c, int x, int y, int w, int h, Bool sizehints) {
 }
 
 void
+setprops(Client *c) {
+       unsigned int i;
+
+       for(i = 0; i < ntags && i < sizeof prop - 1; i++)
+               prop[i] = c->tags[i] ? '1' : '0';
+       if(i < sizeof prop - 1)
+               prop[i++] = c->isfloating ? '1' : '0';
+       prop[i] = '\0';
+       XChangeProperty(dpy, c->win, dwmprops, XA_STRING, 8,
+                       PropModeReplace, (unsigned char *)prop, i);
+}
+
+void
 unban(Client *c) {
        if(!c->isbanned)
                return;
@@ -325,7 +359,8 @@ unmanage(Client *c, long state) {
        XSync(dpy, False);
        XSetErrorHandler(xerror);
        XUngrabServer(dpy);
-       arrange();
+       if(state != NormalState)
+               arrange();
 }
 
 void
@@ -382,27 +417,6 @@ updatesizehints(Client *c) {
 
 void
 updatetitle(Client *c) {
-       char **list = NULL;
-       int n;
-       XTextProperty name;
-
-       name.nitems = 0;
-       c->name[0] = 0;
-       XGetTextProperty(dpy, c->win, &name, netatom[NetWMName]);
-       if(!name.nitems)
-               XGetWMName(dpy, c->win, &name);
-       if(!name.nitems)
-               return;
-       if(name.encoding == XA_STRING)
-               strncpy(c->name, (char *)name.value, sizeof c->name - 1);
-       else {
-               if(XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success
-               && n > 0 && *list)
-               {
-                       strncpy(c->name, *list, sizeof c->name - 1);
-                       XFreeStringList(list);
-               }
-       }
-       c->name[sizeof c->name - 1] = '\0';
-       XFree(name.value);
+       if(!gettextprop(c->win, netatom[NetWMName], c->name, sizeof c->name))
+               gettextprop(c->win, wmatom[WMName], c->name, sizeof c->name);
 }