#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
+#include <X11/Xatom.h>
#include "util.h"
}
void
-spawn(Display *dpy, const char *shell, const char *cmd)
+spawn(Display *dpy, char *argv[])
{
- if(!cmd || !shell)
+ if(!argv || !argv[0])
return;
if(fork() == 0) {
if(fork() == 0) {
if(dpy)
close(ConnectionNumber(dpy));
- execl(shell, shell, "-c", cmd, (const char *)0);
- fprintf(stderr, "gridwm: execl %s", shell);
+ setsid();
+ execvp(argv[0], argv);
+ fprintf(stderr, "gridwm: execvp %s", argv[0]);
perror(" failed");
}
exit (0);
}
wait(0);
}
+
+void
+pipe_spawn(char *buf, unsigned int len, Display *dpy, char *argv[])
+{
+ unsigned int l, n;
+ int pfd[2];
+
+ if(!argv || !argv[0])
+ return;
+
+ if(pipe(pfd) == -1) {
+ perror("pipe");
+ exit(1);
+ }
+
+ if(fork() == 0) {
+ if(dpy)
+ close(ConnectionNumber(dpy));
+ setsid();
+ dup2(pfd[1], STDOUT_FILENO);
+ close(pfd[0]);
+ close(pfd[1]);
+ execvp(argv[0], argv);
+ fprintf(stderr, "gridwm: execvp %s", argv[0]);
+ perror(" failed");
+ }
+ else {
+ n = 0;
+ close(pfd[1]);
+ while(l > n) {
+ if((l = read(pfd[0], buf + n, len - n)) < 1)
+ break;
+ n += l;
+ }
+ close(pfd[0]);
+ 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;
+}