added gridsel to gridwm

This commit is contained in:
Anselm R. Garbe 2006-07-11 13:21:57 +02:00
parent 005362043d
commit 26e134b8a7
7 changed files with 99 additions and 13 deletions

View file

@ -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

View file

@ -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},

View file

@ -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

47
gridsel.c Normal file
View file

@ -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;
}

7
menu.c
View file

@ -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] == '-')

38
util.c
View file

@ -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;
}

1
util.h
View file

@ -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);