added gridsel to gridwm
Anselm R. Garbe garbeam@wmii.de
Tue, 11 Jul 2006 13:21:57 +0200
M
Makefile
→
Makefile
@@ -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:@@ -33,6 +35,10 @@
gridwm: ${WMOBJ} @echo LD $@ @${CC} -o $@ ${WMOBJ} ${LDFLAGS} + +gridsel: ${SELOBJ} + @echo LD $@ + @${CC} -o $@ ${SELOBJ} ${LDFLAGS} clean: rm -f gridwm gridmenu *.o core
M
config.h
→
config.h
@@ -9,7 +9,10 @@ #define FGCOLOR "#ffaa00"
#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},
A
gridsel.c
@@ -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; +}
M
util.c
→
util.c
@@ -10,6 +10,7 @@ #include <string.h>
#include <sys/types.h> #include <sys/wait.h> #include <unistd.h> +#include <X11/Xatom.h> #include "util.h"@@ -147,3 +148,40 @@ buf[n - 1] = 0;
} 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; +}
M
util.h
→
util.h
@@ -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);