reverse list - lsw - lists window titles of X clients to stdout
 (HTM) git clone git://git.suckless.org/lsw
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 0ae7a4520d111c776a2dc1136f7a4c6fcebb056d
 (DIR) parent 4d98d964ba18e713967c9f1e046540b254071da8
 (HTM) Author: Connor Lane Smith <cls@lubutu.com>
       Date:   Sat, 18 Jun 2011 18:47:03 +0100
       
       reverse list
       Diffstat:
         M lsw.c                               |      32 +++++++++++++++----------------
       
       1 file changed, 15 insertions(+), 17 deletions(-)
       ---
 (DIR) diff --git a/lsw.c b/lsw.c
       @@ -5,8 +5,8 @@
        #include <X11/Xlib.h>
        #include <X11/Xutil.h>
        
       -static void getname(Window win, char *buf, size_t size);
       -static void lsw(Window win);
       +static const char *getname(Window);
       +static void lsw(Window);
        
        static Atom netwmname;
        static Display *dpy;
       @@ -32,37 +32,35 @@ main(int argc, char *argv[]) {
        
        void
        lsw(Window win) {
       -        char buf[BUFSIZ];
       -        unsigned int i, n;
       -        Window *wins, dw;
       +        unsigned int n;
       +        Window *wins, *w, dw;
                XWindowAttributes wa;
        
                if(!XQueryTree(dpy, win, &dw, &dw, &wins, &n))
                        return;
       -        for(i = 0; i < n; i++)
       -                if(XGetWindowAttributes(dpy, wins[i], &wa)
       -                && !wa.override_redirect && wa.map_state == IsViewable) {
       -                        getname(wins[i], buf, sizeof buf);
       -                        printf("0x%07lx %s\n", wins[i], buf);
       -                }
       +        for(w = &wins[n-1]; w >= &wins[0]; w--)
       +                if(XGetWindowAttributes(dpy, *w, &wa)
       +                && !wa.override_redirect && wa.map_state == IsViewable)
       +                        printf("0x%07lx %s\n", *w, getname(*w));
                XFree(wins);
        }
        
       -void
       -getname(Window win, char *buf, size_t size) {
       +const char *
       +getname(Window win) {
       +        static char buf[BUFSIZ];
                char **list;
                int n;
                XTextProperty prop;
        
       -        buf[0] = '\0';
                if(!XGetTextProperty(dpy, win, &prop, netwmname) || prop.nitems == 0)
                        if(!XGetWMName(dpy, win, &prop) || prop.nitems == 0)
       -                        return;
       +                        return "";
                if(!XmbTextPropertyToTextList(dpy, &prop, &list, &n) && n > 0) {
       -                strncpy(buf, list[0], size);
       +                strncpy(buf, list[0], sizeof buf);
                        XFreeStringList(list);
                }
                else
       -                strncpy(buf, (char *)prop.value, size);
       +                strncpy(buf, (char *)prop.value, sizeof buf);
                XFree(prop.value);
       +        return buf;
        }