dwm-attachdirection-6.2.diff (5911B)
1 From faa0d3a06229906b8cd30cdeb4360ee9608f74bd Mon Sep 17 00:00:00 2001 2 From: MLquest8 <miskuzius@gmail.com> 3 Date: Thu, 18 Jun 2020 15:14:56 +0400 4 Subject: [PATCH] attachdirection updated. Added attachtop option(5) that 5 attaches the newest client below the last master/on top of the stack. 6 7 --- 8 config.def.h | 1 + 9 dwm.c | 146 +++++++++++++++++++++++++++++++++++++++++++++++++-- 10 2 files changed, 143 insertions(+), 4 deletions(-) 11 12 diff --git a/config.def.h b/config.def.h 13 index 1c0b587..d7c089b 100644 14 --- a/config.def.h 15 +++ b/config.def.h 16 @@ -35,6 +35,7 @@ static const Rule rules[] = { 17 static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ 18 static const int nmaster = 1; /* number of clients in master area */ 19 static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ 20 +static const int attachdirection = 0; /* 0 default, 1 above, 2 aside, 3 below, 4 bottom, 5 top */ 21 22 static const Layout layouts[] = { 23 /* symbol arrange function */ 24 diff --git a/dwm.c b/dwm.c 25 index 9fd0286..2c1b143 100644 26 --- a/dwm.c 27 +++ b/dwm.c 28 @@ -49,7 +49,8 @@ 29 #define CLEANMASK(mask) (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask)) 30 #define INTERSECT(x,y,w,h,m) (MAX(0, MIN((x)+(w),(m)->wx+(m)->ww) - MAX((x),(m)->wx)) \ 31 * MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy))) 32 -#define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags])) 33 +#define ISVISIBLEONTAG(C, T) ((C->tags & T)) 34 +#define ISVISIBLE(C) ISVISIBLEONTAG(C, C->mon->tagset[C->mon->seltags]) 35 #define LENGTH(X) (sizeof X / sizeof X[0]) 36 #define MOUSEMASK (BUTTONMASK|PointerMotionMask) 37 #define WIDTH(X) ((X)->w + 2 * (X)->bw) 38 @@ -147,6 +148,11 @@ static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interac 39 static void arrange(Monitor *m); 40 static void arrangemon(Monitor *m); 41 static void attach(Client *c); 42 +static void attachabove(Client *c); 43 +static void attachaside(Client *c); 44 +static void attachbelow(Client *c); 45 +static void attachbottom(Client *c); 46 +static void attachtop(Client *c); 47 static void attachstack(Client *c); 48 static void buttonpress(XEvent *e); 49 static void checkotherwm(void); 50 @@ -184,6 +190,7 @@ static void maprequest(XEvent *e); 51 static void monocle(Monitor *m); 52 static void motionnotify(XEvent *e); 53 static void movemouse(const Arg *arg); 54 +static Client *nexttagged(Client *c); 55 static Client *nexttiled(Client *c); 56 static void pop(Client *); 57 static void propertynotify(XEvent *e); 58 @@ -407,6 +414,73 @@ attach(Client *c) 59 c->mon->clients = c; 60 } 61 62 +void 63 +attachabove(Client *c) 64 +{ 65 + if (c->mon->sel == NULL || c->mon->sel == c->mon->clients || c->mon->sel->isfloating) { 66 + attach(c); 67 + return; 68 + } 69 + 70 + Client *at; 71 + for (at = c->mon->clients; at->next != c->mon->sel; at = at->next); 72 + c->next = at->next; 73 + at->next = c; 74 +} 75 + 76 +void 77 +attachaside(Client *c) { 78 + Client *at = nexttagged(c); 79 + if(!at) { 80 + attach(c); 81 + return; 82 + } 83 + c->next = at->next; 84 + at->next = c; 85 +} 86 + 87 +void 88 +attachbelow(Client *c) 89 +{ 90 + if(c->mon->sel == NULL || c->mon->sel == c || c->mon->sel->isfloating) { 91 + attach(c); 92 + return; 93 + } 94 + c->next = c->mon->sel->next; 95 + c->mon->sel->next = c; 96 +} 97 + 98 +void 99 +attachbottom(Client *c) 100 +{ 101 + Client *below = c->mon->clients; 102 + for (; below && below->next; below = below->next); 103 + c->next = NULL; 104 + if (below) 105 + below->next = c; 106 + else 107 + c->mon->clients = c; 108 +} 109 + 110 +void 111 +attachtop(Client *c) 112 +{ 113 + int n; 114 + Monitor *m = selmon; 115 + Client *below; 116 + 117 + for (n = 1, below = c->mon->clients; 118 + below && below->next && (below->isfloating || !ISVISIBLEONTAG(below, c->tags) || n != m->nmaster); 119 + n = below->isfloating || !ISVISIBLEONTAG(below, c->tags) ? n + 0 : n + 1, below = below->next); 120 + c->next = NULL; 121 + if (below) { 122 + c->next = below->next; 123 + below->next = c; 124 + } 125 + else 126 + c->mon->clients = c; 127 +} 128 + 129 void 130 attachstack(Client *c) 131 { 132 @@ -1063,7 +1137,25 @@ manage(Window w, XWindowAttributes *wa) 133 c->isfloating = c->oldstate = trans != None || c->isfixed; 134 if (c->isfloating) 135 XRaiseWindow(dpy, c->win); 136 - attach(c); 137 + switch(attachdirection){ 138 + case 1: 139 + attachabove(c); 140 + break; 141 + case 2: 142 + attachaside(c); 143 + break; 144 + case 3: 145 + attachbelow(c); 146 + break; 147 + case 4: 148 + attachbottom(c); 149 + break; 150 + case 5: 151 + attachtop(c); 152 + break; 153 + default: 154 + attach(c); 155 + } 156 attachstack(c); 157 XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend, 158 (unsigned char *) &(c->win), 1); 159 @@ -1193,6 +1285,16 @@ movemouse(const Arg *arg) 160 } 161 } 162 163 +Client * 164 +nexttagged(Client *c) { 165 + Client *walked = c->mon->clients; 166 + for(; 167 + walked && (walked->isfloating || !ISVISIBLEONTAG(walked, c->tags)); 168 + walked = walked->next 169 + ); 170 + return walked; 171 +} 172 + 173 Client * 174 nexttiled(Client *c) 175 { 176 @@ -1418,7 +1520,25 @@ sendmon(Client *c, Monitor *m) 177 detachstack(c); 178 c->mon = m; 179 c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */ 180 - attach(c); 181 + switch(attachdirection){ 182 + case 1: 183 + attachabove(c); 184 + break; 185 + case 2: 186 + attachaside(c); 187 + break; 188 + case 3: 189 + attachbelow(c); 190 + break; 191 + case 4: 192 + attachbottom(c); 193 + break; 194 + case 5: 195 + attachtop(c); 196 + break; 197 + default: 198 + attach(c); 199 + } 200 attachstack(c); 201 focus(NULL); 202 arrange(NULL); 203 @@ -1900,7 +2020,25 @@ updategeom(void) 204 m->clients = c->next; 205 detachstack(c); 206 c->mon = mons; 207 - attach(c); 208 + switch(attachdirection){ 209 + case 1: 210 + attachabove(c); 211 + break; 212 + case 2: 213 + attachaside(c); 214 + break; 215 + case 3: 216 + attachbelow(c); 217 + break; 218 + case 4: 219 + attachbottom(c); 220 + break; 221 + case 5: 222 + attachtop(c); 223 + break; 224 + default: 225 + attach(c); 226 + } 227 attachstack(c); 228 } 229 if (m == selmon) 230 -- 231 2.26.2 232