dwm

dynamic window manager
git clone git://git.suckless.org/dwm
Log | Files | Refs | README | LICENSE

commit 26e134b8a7dae21a699822009674b3131de6e250
parent 005362043d8b0bbf856f301c231d4f10c519b8c4
Author: Anselm R. Garbe <garbeam@wmii.de>
Date:   Tue, 11 Jul 2006 13:21:57 +0200

added gridsel to gridwm

Diffstat:
MMakefile | 10++++++++--
Mconfig.h | 3+++
Mevent.c | 6++----
Agridsel.c | 47+++++++++++++++++++++++++++++++++++++++++++++++
Mmenu.c | 7-------
Mutil.c | 38++++++++++++++++++++++++++++++++++++++
Mutil.h | 1+
7 files changed, 99 insertions(+), 13 deletions(-)

diff --git a/Makefile b/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: @@ -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 diff --git a/config.h b/config.h @@ -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}, diff --git a/event.c b/event.c @@ -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 diff --git a/gridsel.c b/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; +} diff --git a/menu.c b/menu.c @@ -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] == '-') diff --git a/util.c b/util.c @@ -10,6 +10,7 @@ #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> +#include <X11/Xatom.h> #include "util.h" @@ -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; +} diff --git a/util.h b/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);