summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorbakkeby <[email protected]>2019-09-06 23:25:32 +0200
committerbakkeby <[email protected]>2019-09-06 23:25:32 +0200
commit04a7b4de407480089e575b0047d6998ccc001791 (patch)
tree02fd846ce5245e81319f13bf80d7264dd324ef59
parentab6eb606576a6fa966145b2066e7e59e6e7903a0 (diff)
downloaddwm-flexipatch-04a7b4de407480089e575b0047d6998ccc001791.tar.gz
dwm-flexipatch-04a7b4de407480089e575b0047d6998ccc001791.zip
Adding attachabove, attachaside, attachbelow and attachbottom patches
-rw-r--r--README.md16
-rw-r--r--dwm.c13
-rw-r--r--patch/attachx.c41
-rw-r--r--patch/attachx.h1
-rw-r--r--patch/include.c4
-rw-r--r--patch/include.h4
-rw-r--r--patches.h24
7 files changed, 102 insertions, 1 deletions
diff --git a/README.md b/README.md
index 53fbb8e..da7ede7 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-This side project has a different take on dwm patching. It uses preprocessor directives to decide whether or not to include a patch during build time; essentially this means that this build, for better or worse, contains both the patched _and_ the original code. The aim being that you can select which patches to include and the build will contain that code and nothing more.
+This side project has a different take on dwm patching. It uses preprocessor directives to decide whether or not to include a patch during build time. Essentially this means that this build, for better or worse, contains both the patched _and_ the original code. The aim being that you can select which patches to include and the build will contain that code and nothing more.
For example to include the alpha patch then you would only need to flip this setting from 0 to 1 in [patches.h](https://github.com/bakkeby/dwm-flexipatch/blob/master/patches.h):
```c
@@ -11,6 +11,8 @@ Refer to [https://dwm.suckless.org/](https://dwm.suckless.org/) for details on t
### Changelog:
+2019-09-06 - Added attachabove, attachaside, attachbelow and attachbottom patches
+
2019-09-05 - Alpha, systray, togglefullscreen, tagallmon, tagmonfixfs, tagswapmon, pertag and zoomswap patches added
### Patches included:
@@ -18,6 +20,18 @@ Refer to [https://dwm.suckless.org/](https://dwm.suckless.org/) for details on t
- [alpha](https://dwm.suckless.org/patches/alpha/)
- adds transparency for the status bar
+ - [attachabove](https://dwm.suckless.org/patches/attachabove/)
+ - new windows are placed above selected client
+
+ - [attachaside](https://dwm.suckless.org/patches/attachaside/)
+ - new windows are placed on top of the stack
+
+ - [attachbelow](https://dwm.suckless.org/patches/attachbelow/)
+ - new windows are placed below selected client
+
+ - [attachbottom](https://dwm.suckless.org/patches/attachbottom/)
+ - new windows are placed at the bottom of the stack
+
- [pertag](https://dwm.suckless.org/patches/pertag/)
- adds nmaster, mfact, layouts and more per tag rather than per monitor
diff --git a/dwm.c b/dwm.c
index 0249199..2c379c2 100644
--- a/dwm.c
+++ b/dwm.c
@@ -50,7 +50,12 @@
#define CLEANMASK(mask) (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask))
#define INTERSECT(x,y,w,h,m) (MAX(0, MIN((x)+(w),(m)->wx+(m)->ww) - MAX((x),(m)->wx)) \
* MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy)))
+#if ATTACHASIDE_PATCH
+#define ISVISIBLEONTAG(C, T) ((C->tags & T))
+#define ISVISIBLE(C) ISVISIBLEONTAG(C, C->mon->tagset[C->mon->seltags])
+#else
#define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags]))
+#endif // ATTACHASIDE_PATCH
#define LENGTH(X) (sizeof X / sizeof X[0])
#define MOUSEMASK (BUTTONMASK|PointerMotionMask)
#define WIDTH(X) ((X)->w + 2 * (X)->bw)
@@ -1248,7 +1253,11 @@ manage(Window w, XWindowAttributes *wa)
c->isfloating = c->oldstate = trans != None || c->isfixed;
if (c->isfloating)
XRaiseWindow(dpy, c->win);
+ #if ATTACHABOVE_PATCH || ATTACHASIDE_PATCH || ATTACHBELOW_PATCH || ATTACHBOTTOM_PATCH
+ attachx(c);
+ #else
attach(c);
+ #endif
attachstack(c);
XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend,
(unsigned char *) &(c->win), 1);
@@ -1625,7 +1634,11 @@ sendmon(Client *c, Monitor *m)
detachstack(c);
c->mon = m;
c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */
+ #if ATTACHABOVE_PATCH || ATTACHASIDE_PATCH || ATTACHBELOW_PATCH || ATTACHBOTTOM_PATCH
+ attachx(c);
+ #else
attach(c);
+ #endif
attachstack(c);
focus(NULL);
arrange(NULL);
diff --git a/patch/attachx.c b/patch/attachx.c
new file mode 100644
index 0000000..1557510
--- /dev/null
+++ b/patch/attachx.c
@@ -0,0 +1,41 @@
+void
+attachx(Client *c)
+{
+ #if ATTACHABOVE_PATCH
+ Client *at;
+ if (!(c->mon->sel == NULL || c->mon->sel == c->mon->clients || c->mon->sel->isfloating)) {
+ for (at = c->mon->clients; at->next != c->mon->sel; at = at->next);
+ c->next = at->next;
+ at->next = c;
+ return;
+ }
+ #elif ATTACHASIDE_PATCH
+ Client *at;
+ unsigned int n;
+
+ for (at = c->mon->clients, n = 0; at; at = at->next)
+ if (!at->isfloating && ISVISIBLEONTAG(at, c->tags))
+ if (++n >= c->mon->nmaster)
+ break;
+
+ if (at && c->mon->nmaster) {
+ c->next = at->next;
+ at->next = c;
+ return;
+ }
+ #elif ATTACHBELOW_PATCH
+ if (!(c->mon->sel == NULL || c->mon->sel->isfloating)) {
+ c->next = c->mon->sel->next;
+ c->mon->sel->next = c;
+ return;
+ }
+ #elif ATTACHBOTTOM_PATCH
+ Client *at;
+ for (at = c->mon->clients; at && at->next; at = at->next);
+ if (at) {
+ at->next = c;
+ return;
+ }
+ #endif
+ attach(c); // master (default)
+} \ No newline at end of file
diff --git a/patch/attachx.h b/patch/attachx.h
new file mode 100644
index 0000000..46a8c39
--- /dev/null
+++ b/patch/attachx.h
@@ -0,0 +1 @@
+static void attachx(Client *c); \ No newline at end of file
diff --git a/patch/include.c b/patch/include.c
index 6308352..ebf5e3c 100644
--- a/patch/include.c
+++ b/patch/include.c
@@ -2,6 +2,10 @@
#include "alpha.c"
#endif
+#if ATTACHABOVE_PATCH || ATTACHASIDE_PATCH || ATTACHBELOW_PATCH || ATTACHBOTTOM_PATCH
+#include "attachx.c"
+#endif
+
#if PERTAG_PATCH
#include "pertag.c"
#endif
diff --git a/patch/include.h b/patch/include.h
index a0e7a4b..29785e1 100644
--- a/patch/include.h
+++ b/patch/include.h
@@ -2,6 +2,10 @@
#include "alpha.h"
#endif
+#if ATTACHABOVE_PATCH || ATTACHASIDE_PATCH || ATTACHBELOW_PATCH || ATTACHBOTTOM_PATCH
+#include "attachx.h"
+#endif
+
#if SYSTRAY_PATCH
#include "systray.h"
#endif
diff --git a/patches.h b/patches.h
index 7f75ff8..60e3801 100644
--- a/patches.h
+++ b/patches.h
@@ -12,6 +12,30 @@
*/
#define ALPHA_PATCH 0
+/* This patch adds new clients above the selected client, instead of always
+ * becoming the new master. This behaviour is known from Xmonad.
+ * This patch takes precedence over ATTACHASIDE_PATCH.
+ * https://dwm.suckless.org/patches/attachabove/
+ */
+#define ATTACHABOVE_PATCH 0
+
+/* This patch adds new clients on top of the stack.
+ * This patch takes precedence over ATTACHBELOW_PATCH.
+ * https://dwm.suckless.org/patches/attachaside/
+ */
+#define ATTACHASIDE_PATCH 0
+
+/* This patch adds new clients below the selected client.
+ * This patch takes precedence over ATTACHBOTTOM_PATCH.
+ * https://dwm.suckless.org/patches/attachbelow/
+ */
+#define ATTACHBELOW_PATCH 0
+
+/* This patch adds new clients at the bottom of the stack.
+ * https://dwm.suckless.org/patches/attachbottom/
+ */
+#define ATTACHBOTTOM_PATCH 0
+
/* The systray patch adds systray for the status bar.
* https://dwm.suckless.org/patches/systray/
*/