diff options
| author | bakkeby <[email protected]> | 2020-09-11 17:21:38 +0200 |
|---|---|---|
| committer | bakkeby <[email protected]> | 2020-09-11 17:21:38 +0200 |
| commit | dc9e57a6b6e9495a53c65b9402593ab81ef510a7 (patch) | |
| tree | 0faf7144ff36359e63dd9dd6ecc544c1728bb129 /patch/swallow.c | |
| parent | 4a35cd2704678656f74c066816feb7e045720efb (diff) | |
| download | dwm-flexipatch-dc9e57a6b6e9495a53c65b9402593ab81ef510a7.tar.gz dwm-flexipatch-dc9e57a6b6e9495a53c65b9402593ab81ef510a7.zip | |
swallow: upgrading to latest version with OpenBSD support
Diffstat (limited to 'patch/swallow.c')
| -rw-r--r-- | patch/swallow.c | 45 |
1 files changed, 36 insertions, 9 deletions
diff --git a/patch/swallow.c b/patch/swallow.c index 30b213a..397c0e8 100644 --- a/patch/swallow.c +++ b/patch/swallow.c @@ -1,5 +1,9 @@ #include <X11/Xlib-xcb.h> #include <xcb/res.h> +#ifdef __OpenBSD__ +#include <sys/sysctl.h> +#include <kvm.h> +#endif /* __OpenBSD__ */ static int scanner; static xcb_connection_t *xcon; @@ -64,6 +68,7 @@ winpid(Window w) { pid_t result = 0; + #ifdef __linux__ xcb_res_client_id_spec_t spec = {0}; spec.client = w; spec.mask = XCB_RES_CLIENT_ID_MASK_LOCAL_CLIENT_PID; @@ -89,6 +94,23 @@ winpid(Window w) if (result == (pid_t)-1) result = 0; + + #endif /* __linux__ */ + #ifdef __OpenBSD__ + Atom type; + int format; + unsigned long len, bytes; + unsigned char *prop; + pid_t ret; + + if (XGetWindowProperty(dpy, w, XInternAtom(dpy, "_NET_WM_PID", 1), 0, 1, False, AnyPropertyType, &type, &format, &len, &bytes, &prop) != Success || !prop) + return 0; + + ret = *(pid_t*)prop; + XFree(prop); + result = ret; + #endif /* __OpenBSD__ */ + return result; } @@ -97,7 +119,7 @@ getparentprocess(pid_t p) { unsigned int v = 0; -#if defined(__linux__) +#ifdef __linux__ FILE *f; char buf[256]; snprintf(buf, sizeof(buf) - 1, "/proc/%u/stat", (unsigned)p); @@ -108,14 +130,19 @@ getparentprocess(pid_t p) if (fscanf(f, "%*u %*s %*c %u", (unsigned *)&v) != 1) v = (pid_t)0; fclose(f); -#elif defined(__FreeBSD__) - struct kinfo_proc *proc = kinfo_getproc(p); - if (!proc) - return (pid_t)0; - - v = proc->ki_ppid; - free(proc); -#endif +#endif /* __linux__ */ +#ifdef __OpenBSD__ + int n; + kvm_t *kd; + struct kinfo_proc *kp; + + kd = kvm_openfiles(NULL, NULL, NULL, KVM_NO_FILES, NULL); + if (!kd) + return 0; + + kp = kvm_getprocs(kd, KERN_PROC_PID, p, sizeof(*kp), &n); + v = kp->p_ppid; +#endif /* __OpenBSD__ */ return (pid_t)v; } |
