diff --git a/Makefile b/Makefile index 3e04149..5c84744 100644 --- a/Makefile +++ b/Makefile @@ -31,7 +31,6 @@ MODULES_SRC = \ DWM_SRC = \ src/dwm/handlers.c \ src/dwm/layouts.c \ - src/dwm/swallow.c \ src/dwm/xerror.c MODULES_HDR = $(MODULES_SRC:.c=.h) diff --git a/README.md b/README.md index 71363e8..467a0ec 100644 --- a/README.md +++ b/README.md @@ -42,4 +42,3 @@ different now. It also includes the following dwm patches: * [nmaxmaster](https://dwm.suckless.org/patches/nmaxmaster) * [resetnmaster](https://dwm.suckless.org/patches/resetnmaster) * [smartborders](https://dwm.suckless.org/patches/smartborders) -* [swallow](https://dwm.suckless.org/patches/swallow) diff --git a/config/3-defvars.mk b/config/3-defvars.mk index 50955cc..0e24820 100644 --- a/config/3-defvars.mk +++ b/config/3-defvars.mk @@ -1,7 +1,7 @@ CC = cc PKGCONFIG = pkg-config -PKGS += fontconfig freetype2 x11 x11-xcb xcb xcb-res xft +PKGS += fontconfig freetype2 x11 xft CFLAGS += `$(PKGCONFIG) --cflags $(PKGS)` LDFLAGS += `$(PKGCONFIG) --libs $(PKGS)` diff --git a/src/config.def.h b/src/config.def.h index 6046b65..714adff 100644 --- a/src/config.def.h +++ b/src/config.def.h @@ -21,9 +21,9 @@ static const Rule rules[] = { * WM_CLASS(STRING) = instance, class * WM_NAME(STRING) = title */ - /* class, instance, title, isfloating, isterminal, noswallow, monitor */ - { "alacritty", NULL, NULL, 0, 1, 0, -1 }, - { NULL, NULL, "Event Tester", 0, 0, 1, -1 }, // xev + /* class, instance, title, isfloating, monitor */ + { "alacritty", NULL, NULL, 0, -1 }, + { NULL, NULL, "Event Tester", 0, -1 }, // xev }; /* layout(s) */ diff --git a/src/dwm.c b/src/dwm.c index e29c452..590caa0 100644 --- a/src/dwm.c +++ b/src/dwm.c @@ -21,18 +21,11 @@ #include #include #include -#include -#include #ifdef ENABLE_XINERAMA #include #endif // ENABLE_XINERAMA -#ifdef __OpenBSD__ -#include -#include -#endif // __OpenBSD - // TODO: Include necessary headers in this header. #include "drw.h" @@ -92,11 +85,9 @@ struct Client { int oldx, oldy, oldw, oldh; int basew, baseh, incw, inch, maxw, maxh, minw, minh; int bw, oldbw; - int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen, isterminal, noswallow; - pid_t pid; + int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; Client *next; Client *snext; - Client *swallowing; Monitor *mon; Window win; }; @@ -133,8 +124,6 @@ typedef struct { const char *instance; const char *title; int isfloating; - int isterminal; - int noswallow; int monitor; } Rule; @@ -214,7 +203,6 @@ static void zoom(const Arg *arg); #include "dwm/handlers.h" #include "dwm/layouts.h" -#include "dwm/swallow.h" #include "dwm/xerror.h" /************* @@ -249,8 +237,6 @@ static Drw *drw; static Monitor *mons, *selmon; static Window root, wmcheckwin; -static xcb_connection_t *xcon; - /*************************************************************** * configuration, allows nested code to access above variables * ***************************************************************/ @@ -263,7 +249,6 @@ static xcb_connection_t *xcon; #include "dwm/handlers.c" #include "dwm/layouts.c" -#include "dwm/swallow.c" #include "dwm/xerror.c" int main(int argc, char *argv[]) @@ -284,10 +269,6 @@ int main(int argc, char *argv[]) die("polytreewm: cannot open display"); } - if (!(xcon = XGetXCBConnection(dpy))) { - die("polytreewm: cannot get xcb connection"); - } - checkotherwm(); if (!setup()) { @@ -295,7 +276,7 @@ int main(int argc, char *argv[]) } #ifdef __OpenBSD__ - if (pledge("stdio rpath proc exec ps", NULL) == -1) { + if (pledge("stdio rpath proc exec", NULL) == -1) { die("pledge"); } #endif /* __OpenBSD__ */ @@ -328,8 +309,6 @@ void applyrules(Client *c) && (!r->class || strstr(class, r->class)) && (!r->instance || strstr(instance, r->instance))) { - c->isterminal = r->isterminal; - c->noswallow = r->noswallow; c->isfloating = r->isfloating; for (m = mons; m && m->num != r->monitor; m = m->next); if (m) @@ -843,7 +822,6 @@ void manage(Window w, XWindowAttributes *wa) Client *const c = ecalloc(1, sizeof(Client)); c->win = w; - c->pid = winpid(w); c->x = c->oldx = wa->x; c->y = c->oldy = wa->y; c->w = c->oldw = wa->width; @@ -853,7 +831,6 @@ void manage(Window w, XWindowAttributes *wa) updatetitle(c); Window trans = None; - Client *term = NULL; { Client *t = NULL; @@ -863,7 +840,6 @@ void manage(Window w, XWindowAttributes *wa) } else { c->mon = selmon; applyrules(c); - term = termforwin(c); } } @@ -941,11 +917,7 @@ void manage(Window w, XWindowAttributes *wa) c->mon->sel = c; arrange(c->mon); - XMapWindow(dpy, c->win); - - if (term) swallow(term, c); - focus(NULL); } @@ -1574,20 +1546,6 @@ void unmanage(Client *c, int destroyed) Monitor *m = c->mon; XWindowChanges wc; - if (c->swallowing) { - unswallow(c); - return; - } - - Client *s = swallowingclient(c->win); - if (s) { - free(s->swallowing); - s->swallowing = NULL; - arrange(m); - focus(NULL); - return; - } - detach(c); detachstack(c); if (!destroyed) { @@ -1602,12 +1560,9 @@ void unmanage(Client *c, int destroyed) XUngrabServer(dpy); } free(c); - - if (!s) { - arrange(m); - focus(NULL); - updateclientlist(); - } + focus(NULL); + updateclientlist(); + arrange(m); } void updateclientlist() diff --git a/src/dwm/handlers.c b/src/dwm/handlers.c index 8f507ad..e71a9e7 100644 --- a/src/dwm/handlers.c +++ b/src/dwm/handlers.c @@ -140,8 +140,6 @@ void on_destroy_notify(XEvent *e) if ((c = wintoclient(ev->window))) { unmanage(c, 1); - } else if ((c = swallowingclient(ev->window))) { - unmanage(c->swallowing, 1); } } diff --git a/src/dwm/swallow.c b/src/dwm/swallow.c deleted file mode 100644 index 76a0756..0000000 --- a/src/dwm/swallow.c +++ /dev/null @@ -1,172 +0,0 @@ -#ifndef _DWM_SWALLOW_C -#define _DWM_SWALLOW_C - -pid_t getparentprocess(pid_t p) -{ - unsigned int v = 0; - -#ifdef __linux__ - FILE *f; - char buf[256]; - snprintf(buf, sizeof(buf) - 1, "/proc/%u/stat", (unsigned)p); - - if (!(f = fopen(buf, "r"))) - return 0; - - fscanf(f, "%*u %*s %*c %u", &v); - fclose(f); -#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; -} - -int isdescprocess(pid_t p, pid_t c) -{ - while (p != c && c != 0) - c = getparentprocess(c); - - return (int)c; -} - -void swallow(Client *p, Client *c) -{ - if (!settings_get_enable_swallowing()) return; - if (c->noswallow || c->isterminal) return; - if (!settings_get_swallow_floating() && c->isfloating) return; - - detach(c); - detachstack(c); - - setclientstate(c, WithdrawnState); - XUnmapWindow(dpy, p->win); - - p->swallowing = c; - c->mon = p->mon; - - Window w = p->win; - p->win = c->win; - c->win = w; - updatetitle(p); - XMoveResizeWindow(dpy, p->win, p->x, p->y, p->w, p->h); - arrange(p->mon); - configure(p); - updateclientlist(); -} - -Client *swallowingclient(Window w) -{ - Client *c; - Monitor *m; - - for (m = mons; m; m = m->next) { - for (c = m->clients; c; c = c->next) { - if (c->swallowing && c->swallowing->win == w) - return c; - } - } - - return NULL; -} - -Client *termforwin(const Client *w) -{ - Client *c; - Monitor *m; - - if (!w->pid || w->isterminal) - return NULL; - - for (m = mons; m; m = m->next) { - for (c = m->clients; c; c = c->next) { - if (c->isterminal && !c->swallowing && c->pid && isdescprocess(c->pid, w->pid)) - return c; - } - } - - return NULL; -} - -void unswallow(Client *c) -{ - c->win = c->swallowing->win; - - free(c->swallowing); - c->swallowing = NULL; - - /* unfullscreen the client */ - setfullscreen(c, 0); - updatetitle(c); - arrange(c->mon); - XMapWindow(dpy, c->win); - XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); - setclientstate(c, NormalState); - focus(NULL); - arrange(c->mon); -} - -pid_t 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; - - xcb_generic_error_t *e = NULL; - xcb_res_query_client_ids_cookie_t c = xcb_res_query_client_ids(xcon, 1, &spec); - xcb_res_query_client_ids_reply_t *r = xcb_res_query_client_ids_reply(xcon, c, &e); - - if (!r) - return (pid_t)0; - - xcb_res_client_id_value_iterator_t i = xcb_res_query_client_ids_ids_iterator(r); - for (; i.rem; xcb_res_client_id_value_next(&i)) { - spec = i.data->spec; - if (spec.mask & XCB_RES_CLIENT_ID_MASK_LOCAL_CLIENT_PID) { - uint32_t *t = xcb_res_client_id_value_value(i.data); - result = *t; - break; - } - } - - free(r); - - 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", 0), 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; -} - -#endif // _DWM_SWALLOW_C diff --git a/src/dwm/swallow.h b/src/dwm/swallow.h deleted file mode 100644 index ddd9ca8..0000000 --- a/src/dwm/swallow.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef _DWM_SWALLOW_H -#define _DWM_SWALLOW_H - -static pid_t getparentprocess(pid_t p); -static int isdescprocess(pid_t p, pid_t c); -static void swallow(Client *p, Client *c); -static Client *swallowingclient(Window w); -static Client *termforwin(const Client *c); -static void unswallow(Client *c); -static pid_t winpid(Window w); - -#endif // _DWM_SWALLOW_H