t* dwm + patches
       
   URI git clone git://git.codevoid.de/dwm-sdk
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 26e134b8a7dae21a699822009674b3131de6e250
   DIR parent 005362043d8b0bbf856f301c231d4f10c519b8c4
   URI Author: Anselm R. Garbe <garbeam@wmii.de>
       Date:   Tue, 11 Jul 2006 13:21:57 +0200
       
       added gridsel to gridwm
       
       Diffstat:
         M Makefile                            |      10 ++++++++--
         M config.h                            |       3 +++
         M event.c                             |       6 ++----
         A gridsel.c                           |      47 +++++++++++++++++++++++++++++++
         M menu.c                              |       7 -------
         M util.c                              |      38 +++++++++++++++++++++++++++++++
         M util.h                              |       1 +
       
       7 files changed, 99 insertions(+), 13 deletions(-)
       ---
   DIR diff --git a/Makefile b/Makefile
       t@@ -7,10 +7,12 @@ WMSRC = bar.c client.c cmd.c draw.c event.c key.c util.c wm.c
        WMOBJ = ${WMSRC:.c=.o}
        MENSRC = menu.c draw.c util.c
        MENOBJ = ${MENSRC:.c=.o}
       +SELSRC = gridsel.c util.c
       +SELOBJ = ${SELSRC:.c=.o}
        MAN1 = gridwm.1 gridmenu.1
       -BIN = gridwm gridmenu     
       +BIN = gridwm gridmenu gridsel 
        
       -all: config gridwm gridmenu
       +all: config gridwm gridmenu gridsel
                @echo finished
        
        config:
       t@@ -34,6 +36,10 @@ gridwm: ${WMOBJ}
                @echo LD $@
                @${CC} -o $@ ${WMOBJ} ${LDFLAGS}
        
       +gridsel: ${SELOBJ}
       +        @echo LD $@
       +        @${CC} -o $@ ${SELOBJ} ${LDFLAGS}
       +
        clean:
                rm -f gridwm gridmenu *.o core
        
   DIR diff --git a/config.h b/config.h
       t@@ -9,7 +9,10 @@
        #define BORDERCOLOR        "#000000"
        #define STATUSCMD        "echo -n `date` `uptime | sed 's/.*://; s/,//g'`" \
                                                " `acpi | awk '{print $4}' | sed 's/,//'`"
       +#define PLCMD                "`ls -lL /bin /sbin /usr/bin /usr/local/bin 2>/dev/null | awk 'NF>2 && $1 ~ /^[^d].*x/ {print $NF}' | sort | uniq | gridmenu`"
       +
        #define KEYS                \
                { Mod1Mask, XK_Return, run, "xterm -u8 -bg black -fg white -fn '-*-terminus-medium-*-*-*-14-*-*-*-*-*-iso10646-*'" }, \
       +        { Mod1Mask, XK_p, run, PLCMD }, \
                { Mod1Mask | ShiftMask, XK_q, quit, NULL},
        
   DIR diff --git a/event.c b/event.c
       t@@ -81,13 +81,11 @@ configurerequest(XEvent *e)
        static void
        destroynotify(XEvent *e)
        {
       -#if 0
                Client *c;
                XDestroyWindowEvent *ev = &e->xdestroywindow;
        
       -        if((c = client_of_win(ev->window)))
       -                destroy_client(c);
       -#endif
       +        if((c = getclient(ev->window)))
       +                unmanage(c);
        }
        
        static void
   DIR diff --git a/gridsel.c b/gridsel.c
       t@@ -0,0 +1,47 @@
       +/*
       + * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
       + * See LICENSE file for license details.
       + */
       +
       +#include <stdlib.h>
       +#include <stdio.h>
       +#include <string.h>
       +
       +#include <util.h>
       +
       +static char version[] = "gridsel - " VERSION ", (C)opyright MMVI Anselm R. Garbe\n";
       +
       +static void
       +usage()
       +{
       +        fprintf(stderr, "%s\n", "usage: gridsel [-v]\n");
       +        exit(1);
       +}
       +
       +int
       +main(int argc, char **argv)
       +{
       +        unsigned char *data;
       +        unsigned long i, offset, len, remain;
       +
       +        /* command line args */
       +        if(argc > 1) {
       +                if(!strncmp(argv[1], "-v", 3)) {
       +                        fprintf(stdout, "%s", version);
       +                        exit(0);
       +                } else
       +                        usage();
       +        }
       +        len = offset = remain = 0;
       +        do {
       +                data = getselection(offset, &len, &remain);
       +                for(i = 0; i < len; i++)
       +                        putchar(data[i]);
       +                offset += len;
       +                free(data);
       +        }
       +        while(remain);
       +        if(offset)
       +                putchar('\n');
       +        return 0;
       +}
   DIR diff --git a/menu.c b/menu.c
       t@@ -356,13 +356,6 @@ main(int argc, char *argv[])
                char *maxname;
                XEvent ev;
        
       -        char buf[256];
       -
       -        pipe_spawn(buf, sizeof(buf), NULL, STATUSCMD);
       -        fputs(buf, stderr);
       -
       -        return 0;
       -
                /* command line args */
                for(i = 1; i < argc; i++) {
                        if (argv[i][0] == '-')
   DIR diff --git a/util.c b/util.c
       t@@ -10,6 +10,7 @@
        #include <sys/types.h>
        #include <sys/wait.h>
        #include <unistd.h>
       +#include <X11/Xatom.h>
        
        #include "util.h"
        
       t@@ -147,3 +148,40 @@ pipe_spawn(char *buf, unsigned int len, Display *dpy, const char *cmd)
                }
                wait(0);
        }
       +
       +
       +unsigned char *
       +getselection(unsigned long offset, unsigned long *len, unsigned long *remain)
       +{
       +        Display *dpy;
       +        Atom xa_clip_string;
       +        Window w;
       +        XEvent ev;
       +        Atom typeret;
       +        int format;
       +        unsigned char *data;
       +        unsigned char *result = NULL;
       +
       +        dpy = XOpenDisplay(0);
       +        if(!dpy)
       +                return NULL;
       +        xa_clip_string = XInternAtom(dpy, "_SEL_STRING", False);
       +        w = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 10, 10, 200, 200,
       +                        1, CopyFromParent, CopyFromParent);
       +        XConvertSelection(dpy, XA_PRIMARY, XA_STRING, xa_clip_string,
       +                        w, CurrentTime);
       +        XFlush(dpy);
       +        XNextEvent(dpy, &ev);
       +        if(ev.type == SelectionNotify && ev.xselection.property != None) {
       +                XGetWindowProperty(dpy, w, ev.xselection.property, offset, 4096L, False,
       +                                AnyPropertyType, &typeret, &format, len, remain, &data);
       +                if(*len) {
       +                        result = emalloc(sizeof(unsigned char) * *len);
       +                        memcpy(result, data, *len);
       +                }
       +                XDeleteProperty(dpy, w, ev.xselection.property);
       +        }
       +        XDestroyWindow(dpy, w);
       +        XCloseDisplay(dpy);
       +        return result;
       +}
   DIR diff --git a/util.h b/util.h
       t@@ -17,3 +17,4 @@ extern void failed_assert(char *a, char *file, int line);
        void pipe_spawn(char *buf, unsigned int len, Display *dpy, const char *cmd);
        extern void spawn(Display *dpy, const char *cmd);
        extern void swap(void **p1, void **p2);
       +unsigned char *getselection(unsigned long offset, unsigned long *len, unsigned long *remain);