X-Git-Url: https://git.xinqibao.xyz/dwm.git/blobdiff_plain/26e134b8a7dae21a699822009674b3131de6e250..b1701adf75297747c52e0c3ed2c314cd10129907:/util.c diff --git a/util.c b/util.c index 052d535..3f41b3c 100644 --- a/util.c +++ b/util.c @@ -10,12 +10,9 @@ #include #include #include -#include #include "util.h" -static char *shell = NULL; - void error(char *errstr, ...) { va_list ap; @@ -85,21 +82,17 @@ swap(void **p1, void **p2) } void -spawn(Display *dpy, const char *cmd) +spawn(Display *dpy, char *argv[]) { - if(!shell && !(shell = getenv("SHELL"))) - shell = "/bin/sh"; - - if(!cmd) + if(!argv || !argv[0]) return; if(fork() == 0) { if(fork() == 0) { if(dpy) close(ConnectionNumber(dpy)); setsid(); - fprintf(stderr, "gridwm: execlp %s %s -c %s", shell, shell, cmd); - execlp(shell, shell, "-c", cmd, NULL); - fprintf(stderr, "gridwm: execlp %s", cmd); + execvp(argv[0], argv); + fprintf(stderr, "gridwm: execvp %s", argv[0]); perror(" failed"); } exit (0); @@ -108,15 +101,12 @@ spawn(Display *dpy, const char *cmd) } void -pipe_spawn(char *buf, unsigned int len, Display *dpy, const char *cmd) +pipe_spawn(char *buf, unsigned int len, Display *dpy, char *argv[]) { unsigned int l, n; int pfd[2]; - if(!shell && !(shell = getenv("SHELL"))) - shell = "/bin/sh"; - - if(!cmd) + if(!argv || !argv[0]) return; if(pipe(pfd) == -1) { @@ -131,57 +121,21 @@ pipe_spawn(char *buf, unsigned int len, Display *dpy, const char *cmd) dup2(pfd[1], STDOUT_FILENO); close(pfd[0]); close(pfd[1]); - execlp(shell, shell, "-c", cmd, NULL); - fprintf(stderr, "gridwm: execlp %s", cmd); + execvp(argv[0], argv); + fprintf(stderr, "gridwm: execvp %s", argv[0]); perror(" failed"); } else { - n = 0; + l = n = 0; close(pfd[1]); - while(l > n) { + while(n < len) { if((l = read(pfd[0], buf + n, len - n)) < 1) break; n += l; } + while(l > n); close(pfd[0]); - buf[n - 1] = 0; + buf[n < len ? n : len - 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; -}