JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
prepared merging layout.c and tag.c into screen.c
authorAnselm R. Garbe <garbeam@gmail.com>
Sun, 19 Aug 2007 08:40:07 +0000 (10:40 +0200)
committerAnselm R. Garbe <garbeam@gmail.com>
Sun, 19 Aug 2007 08:40:07 +0000 (10:40 +0200)
client.c
dwm.h
layout.c
main.c

index d11ef7f..d94c0ed 100644 (file)
--- a/client.c
+++ b/client.c
@@ -185,15 +185,8 @@ Bool
 loadprops(Client *c) {
        unsigned int i;
        Bool result = False;
-       XTextProperty name;
-
-       /* check if window has set a property */
-       name.nitems = 0;
-       XGetTextProperty(dpy, c->win, &name, dwmprops);
-       if(name.nitems && name.encoding == XA_STRING) {
-               strncpy(prop, (char *)name.value, sizeof prop - 1);
-               prop[sizeof prop - 1] = '\0';
-               XFree(name.value);
+
+       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;
@@ -424,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);
 }
diff --git a/dwm.h b/dwm.h
index 9dd764f..36a0266 100644 (file)
--- a/dwm.h
+++ b/dwm.h
@@ -39,7 +39,7 @@ enum { BarTop, BarBot, BarOff };                      /* bar position */
 enum { CurNormal, CurResize, CurMove, CurLast };       /* cursor */
 enum { ColBorder, ColFG, ColBG, ColLast };             /* color */
 enum { NetSupported, NetWMName, NetLast };             /* EWMH atoms */
-enum { WMProtocols, WMDelete, WMState, WMLast };       /* default atoms */
+enum { WMProtocols, WMDelete, WMName, WMState, WMLast };/* default atoms */
 
 typedef struct Client Client;
 struct Client {
@@ -131,6 +131,8 @@ void togglebar(const char *arg);    /* shows/hides the bar */
 void togglemax(const char *arg);       /* toggles maximization of floating client */
 
 /* main.c */
+Bool gettextprop(Window w, Atom atom,
+               char *text, unsigned int size); /* return text property, UTF-8 compliant */
 void updatebarpos(void);               /* updates the bar position */
 void quit(const char *arg);            /* quit dwm nicely */
 int xerror(Display *dsply, XErrorEvent *ee);   /* dwm's X error handler */
index 96e125a..2763d2c 100644 (file)
--- a/layout.c
+++ b/layout.c
@@ -98,7 +98,6 @@ void
 initlayouts(void) {
        unsigned int i, w;
 
-       /* TODO deserialize ltidx if present */
        nlayouts = sizeof layouts / sizeof layouts[0];
        for(blw = i = 0; i < nlayouts; i++) {
                w = textw(layouts[i].symbol);
@@ -110,21 +109,13 @@ initlayouts(void) {
 void
 loaddwmprops(void) {
        unsigned int i;
-       XTextProperty name;
-
-       /* check if window has set a property */
-       name.nitems = 0;
-       XGetTextProperty(dpy, root, &name, dwmprops);
-       if(name.nitems && name.encoding == XA_STRING) {
-               strncpy(prop, (char *)name.value, sizeof prop - 1);
-               prop[sizeof prop - 1] = '\0';
-               XFree(name.value);
+
+       if(gettextprop(root, dwmprops, prop, sizeof prop)) {
                for(i = 0; i < ntags && i < sizeof prop - 1 && prop[i] != '\0'; i++)
                        seltags[i] = prop[i] == '1';
                if(i < sizeof prop - 1 && prop[i] != '\0') {
-                       i = prop[i];
-                       if(i < nlayouts)
-                               ltidx = i;
+                       if(prop[i] < nlayouts)
+                               ltidx = prop[i];
                }
        }
 }
diff --git a/main.c b/main.c
index 7cc5ecf..9127d16 100644 (file)
--- a/main.c
+++ b/main.c
@@ -143,6 +143,7 @@ setup(void) {
        dwmprops = XInternAtom(dpy, "_DWM_PROPERTIES", False);
        wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False);
        wmatom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False);
+       wmatom[WMName] = XInternAtom(dpy, "WM_NAME", False);
        wmatom[WMState] = XInternAtom(dpy, "WM_STATE", False);
        netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False);
        netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False);
@@ -220,6 +221,33 @@ xerrorstart(Display *dsply, XErrorEvent *ee) {
 
 /* extern */
 
+Bool
+gettextprop(Window w, Atom atom, char *text, unsigned int size) {
+       char **list = NULL;
+       int n;
+       XTextProperty name;
+
+       if(!text || size == 0)
+               return False;
+       text[0] = '\0';
+       XGetTextProperty(dpy, w, &name, atom);
+       if(!name.nitems)
+               return False;
+       if(name.encoding == XA_STRING)
+               strncpy(text, (char *)name.value, size - 1);
+       else {
+               if(XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success
+               && n > 0 && *list)
+               {
+                       strncpy(text, *list, size - 1);
+                       XFreeStringList(list);
+               }
+       }
+       text[size - 1] = '\0';
+       XFree(name.value);
+       return True;
+}
+
 void
 quit(const char *arg) {
        readin = running = False;