downloaded patches
This commit is contained in:
parent
c026bd39eb
commit
ed9dce4ee8
|
@ -0,0 +1,12 @@
|
|||
diff -up dwm/dwm.c dwmmod/dwm.c
|
||||
--- dwm/dwm.c 2020-06-25 00:21:30.383692180 -0300
|
||||
+++ dwmmod/dwm.c 2020-06-25 00:20:35.643692330 -0300
|
||||
@@ -1057,6 +1057,8 @@ manage(Window w, XWindowAttributes *wa)
|
||||
updatewindowtype(c);
|
||||
updatesizehints(c);
|
||||
updatewmhints(c);
|
||||
+ c->x = c->mon->mx + (c->mon->mw - WIDTH(c)) / 2;
|
||||
+ c->y = c->mon->my + (c->mon->mh - HEIGHT(c)) / 2;
|
||||
XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask);
|
||||
grabbuttons(c, 0);
|
||||
if (!c->isfloating)
|
|
@ -0,0 +1,54 @@
|
|||
diff -up dwm-6.3/dwm.c dwm-6.3-attachbottom/dwm.c
|
||||
--- dwm-6.3/dwm.c 2022-01-07 12:42:18.000000000 +0100
|
||||
+++ dwm-6.3-attachbottom/dwm.c 2022-08-17 22:14:41.813809073 +0200
|
||||
@@ -147,6 +147,7 @@ static int applysizehints(Client *c, int
|
||||
static void arrange(Monitor *m);
|
||||
static void arrangemon(Monitor *m);
|
||||
static void attach(Client *c);
|
||||
+static void attachbottom(Client *c);
|
||||
static void attachstack(Client *c);
|
||||
static void buttonpress(XEvent *e);
|
||||
static void checkotherwm(void);
|
||||
@@ -408,6 +409,15 @@ attach(Client *c)
|
||||
}
|
||||
|
||||
void
|
||||
+attachbottom(Client *c)
|
||||
+{
|
||||
+ Client **tc;
|
||||
+ c->next = NULL;
|
||||
+ for (tc = &c->mon->clients; *tc; tc = &(*tc)->next);
|
||||
+ *tc = c;
|
||||
+}
|
||||
+
|
||||
+void
|
||||
attachstack(Client *c)
|
||||
{
|
||||
c->snext = c->mon->stack;
|
||||
@@ -1066,7 +1076,7 @@ manage(Window w, XWindowAttributes *wa)
|
||||
c->isfloating = c->oldstate = trans != None || c->isfixed;
|
||||
if (c->isfloating)
|
||||
XRaiseWindow(dpy, c->win);
|
||||
- attach(c);
|
||||
+ attachbottom(c);
|
||||
attachstack(c);
|
||||
XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend,
|
||||
(unsigned char *) &(c->win), 1);
|
||||
@@ -1421,7 +1431,7 @@ sendmon(Client *c, Monitor *m)
|
||||
detachstack(c);
|
||||
c->mon = m;
|
||||
c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */
|
||||
- attach(c);
|
||||
+ attachbottom(c);
|
||||
attachstack(c);
|
||||
focus(NULL);
|
||||
arrange(NULL);
|
||||
@@ -1903,7 +1913,7 @@ updategeom(void)
|
||||
m->clients = c->next;
|
||||
detachstack(c);
|
||||
c->mon = mons;
|
||||
- attach(c);
|
||||
+ attachbottom(c);
|
||||
attachstack(c);
|
||||
}
|
||||
if (m == selmon)
|
|
@ -0,0 +1,352 @@
|
|||
diff -pu dwm.git/config.def.h dwm.functionalgapspertag/config.def.h
|
||||
--- dwm.git/config.def.h 2021-02-27 21:17:53.862314811 -0600
|
||||
+++ dwm.functionalgapspertag/config.def.h 2021-03-01 15:40:07.312696974 -0600
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
/* appearance */
|
||||
static const unsigned int borderpx = 1; /* border pixel of windows */
|
||||
+static const int startwithgaps[] = { 0 }; /* 1 means gaps are used by default, this can be customized for each tag */
|
||||
+static const unsigned int gappx[] = { 10 }; /* default gap between windows in pixels, this can be customized for each tag */
|
||||
static const unsigned int snap = 32; /* snap pixel */
|
||||
static const int showbar = 1; /* 0 means no bar */
|
||||
static const int topbar = 1; /* 0 means bottom bar */
|
||||
@@ -84,6 +86,10 @@ static Key keys[] = {
|
||||
{ MODKEY, XK_period, focusmon, {.i = +1 } },
|
||||
{ MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } },
|
||||
{ MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } },
|
||||
+ { MODKEY, XK_minus, setgaps, {.i = -5 } },
|
||||
+ { MODKEY, XK_equal, setgaps, {.i = +5 } },
|
||||
+ { MODKEY|ShiftMask, XK_minus, setgaps, {.i = GAP_RESET } },
|
||||
+ { MODKEY|ShiftMask, XK_equal, setgaps, {.i = GAP_TOGGLE} },
|
||||
TAGKEYS( XK_1, 0)
|
||||
TAGKEYS( XK_2, 1)
|
||||
TAGKEYS( XK_3, 2)
|
||||
diff -pu dwm.git/dwm.c dwm.functionalgapspertag/dwm.c
|
||||
--- dwm.git/dwm.c 2021-02-27 21:17:53.862314811 -0600
|
||||
+++ dwm.functionalgapspertag/dwm.c 2021-03-01 17:10:10.402964866 -0600
|
||||
@@ -57,6 +57,9 @@
|
||||
#define TAGMASK ((1 << LENGTH(tags)) - 1)
|
||||
#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad)
|
||||
|
||||
+#define GAP_TOGGLE 100
|
||||
+#define GAP_RESET 0
|
||||
+
|
||||
/* enums */
|
||||
enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
|
||||
enum { SchemeNorm, SchemeSel }; /* color schemes */
|
||||
@@ -111,6 +114,8 @@ typedef struct {
|
||||
void (*arrange)(Monitor *);
|
||||
} Layout;
|
||||
|
||||
+typedef struct Pertag Pertag;
|
||||
+
|
||||
struct Monitor {
|
||||
char ltsymbol[16];
|
||||
float mfact;
|
||||
@@ -130,6 +135,7 @@ struct Monitor {
|
||||
Monitor *next;
|
||||
Window barwin;
|
||||
const Layout *lt[2];
|
||||
+ Pertag *pertag;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
@@ -200,6 +206,7 @@ static void sendmon(Client *c, Monitor *
|
||||
static void setclientstate(Client *c, long state);
|
||||
static void setfocus(Client *c);
|
||||
static void setfullscreen(Client *c, int fullscreen);
|
||||
+static void setgaps(const Arg *arg);
|
||||
static void setlayout(const Arg *arg);
|
||||
static void setmfact(const Arg *arg);
|
||||
static void setup(void);
|
||||
@@ -272,6 +279,18 @@ static Window root, wmcheckwin;
|
||||
/* configuration, allows nested code to access above variables */
|
||||
#include "config.h"
|
||||
|
||||
+struct Pertag {
|
||||
+ unsigned int curtag, prevtag; /* current and previous tag */
|
||||
+ int nmasters[LENGTH(tags) + 1]; /* number of windows in master area */
|
||||
+ float mfacts[LENGTH(tags) + 1]; /* mfacts per tag */
|
||||
+ unsigned int sellts[LENGTH(tags) + 1]; /* selected layouts */
|
||||
+ const Layout *ltidxs[LENGTH(tags) + 1][2]; /* matrix of tags and layouts indexes */
|
||||
+ int showbars[LENGTH(tags) + 1]; /* display bar for the current tag */
|
||||
+
|
||||
+ int drawwithgaps[LENGTH(tags) + 1]; /* gaps toggle for each tag */
|
||||
+ int gappx[LENGTH(tags) + 1]; /* gaps for each tag */
|
||||
+};
|
||||
+
|
||||
/* compile-time check if all tags fit into an unsigned int bit array. */
|
||||
struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
|
||||
|
||||
@@ -632,6 +651,7 @@ Monitor *
|
||||
createmon(void)
|
||||
{
|
||||
Monitor *m;
|
||||
+ unsigned int i;
|
||||
|
||||
m = ecalloc(1, sizeof(Monitor));
|
||||
m->tagset[0] = m->tagset[1] = 1;
|
||||
@@ -642,6 +662,26 @@ createmon(void)
|
||||
m->lt[0] = &layouts[0];
|
||||
m->lt[1] = &layouts[1 % LENGTH(layouts)];
|
||||
strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
|
||||
+ m->pertag = ecalloc(1, sizeof(Pertag));
|
||||
+ m->pertag->curtag = m->pertag->prevtag = 1;
|
||||
+
|
||||
+ for (i = 0; i <= LENGTH(tags); i++) {
|
||||
+ m->pertag->nmasters[i] = m->nmaster;
|
||||
+ m->pertag->mfacts[i] = m->mfact;
|
||||
+
|
||||
+ m->pertag->ltidxs[i][0] = m->lt[0];
|
||||
+ m->pertag->ltidxs[i][1] = m->lt[1];
|
||||
+ m->pertag->sellts[i] = m->sellt;
|
||||
+
|
||||
+ m->pertag->showbars[i] = m->showbar;
|
||||
+ if (i > 0) {
|
||||
+ m->pertag->drawwithgaps[i] = startwithgaps[(i - 1) % LENGTH(gappx)];
|
||||
+ m->pertag->gappx[i] = gappx[(i - 1) % LENGTH(gappx)];
|
||||
+ }
|
||||
+ }
|
||||
+ m->pertag->drawwithgaps[0] = startwithgaps[0];
|
||||
+ m->pertag->gappx[0] = gappx[0];
|
||||
+
|
||||
return m;
|
||||
}
|
||||
|
||||
@@ -797,6 +837,12 @@ focus(Client *c)
|
||||
attachstack(c);
|
||||
grabbuttons(c, 1);
|
||||
XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel);
|
||||
+ if (!selmon->pertag->drawwithgaps[selmon->pertag->curtag] && !c->isfloating) {
|
||||
+ XWindowChanges wc;
|
||||
+ wc.sibling = selmon->barwin;
|
||||
+ wc.stack_mode = Below;
|
||||
+ XConfigureWindow(dpy, c->win, CWSibling | CWStackMode, &wc);
|
||||
+ }
|
||||
setfocus(c);
|
||||
} else {
|
||||
XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
|
||||
@@ -967,7 +1013,7 @@ grabkeys(void)
|
||||
void
|
||||
incnmaster(const Arg *arg)
|
||||
{
|
||||
- selmon->nmaster = MAX(selmon->nmaster + arg->i, 0);
|
||||
+ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag] = MAX(selmon->nmaster + arg->i, 0);
|
||||
arrange(selmon);
|
||||
}
|
||||
|
||||
@@ -1113,7 +1159,10 @@ monocle(Monitor *m)
|
||||
if (n > 0) /* override layout symbol */
|
||||
snprintf(m->ltsymbol, sizeof m->ltsymbol, "[%d]", n);
|
||||
for (c = nexttiled(m->clients); c; c = nexttiled(c->next))
|
||||
- resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0);
|
||||
+ if (selmon->pertag->drawwithgaps[selmon->pertag->curtag])
|
||||
+ resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0);
|
||||
+ else
|
||||
+ resize(c, m->wx - c->bw, m->wy, m->ww, m->wh, False);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -1283,6 +1332,15 @@ resizeclient(Client *c, int x, int y, in
|
||||
c->oldw = c->w; c->w = wc.width = w;
|
||||
c->oldh = c->h; c->h = wc.height = h;
|
||||
wc.border_width = c->bw;
|
||||
+ if (!selmon->pertag->drawwithgaps[selmon->pertag->curtag] && /* this is the noborderfloatingfix patch, slightly modified so that it will work if, and only if, gaps are disabled. */
|
||||
+ (((nexttiled(c->mon->clients) == c && !nexttiled(c->next)) /* these two first lines are the only ones changed. if you are manually patching and have noborder installed already, just change these lines; or conversely, just remove this section if the noborder patch is not desired;) */
|
||||
+ || &monocle == c->mon->lt[c->mon->sellt]->arrange))
|
||||
+ && !c->isfullscreen && !c->isfloating
|
||||
+ && NULL != c->mon->lt[c->mon->sellt]->arrange) {
|
||||
+ c->w = wc.width += c->bw * 2;
|
||||
+ c->h = wc.height += c->bw * 2;
|
||||
+ wc.border_width = 0;
|
||||
+ }
|
||||
XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc);
|
||||
configure(c);
|
||||
XSync(dpy, False);
|
||||
@@ -1499,12 +1557,35 @@ setfullscreen(Client *c, int fullscreen)
|
||||
}
|
||||
|
||||
void
|
||||
+setgaps(const Arg *arg)
|
||||
+{
|
||||
+ switch(arg->i)
|
||||
+ {
|
||||
+ case GAP_TOGGLE:
|
||||
+ selmon->pertag->drawwithgaps[selmon->pertag->curtag] = !selmon->pertag->drawwithgaps[selmon->pertag->curtag];
|
||||
+ break;
|
||||
+ case GAP_RESET:
|
||||
+ if (selmon->pertag->curtag > 0)
|
||||
+ selmon->pertag->gappx[selmon->pertag->curtag] = gappx[selmon->pertag->curtag - 1 % LENGTH(gappx)];
|
||||
+ else
|
||||
+ selmon->pertag->gappx[0] = gappx[0];
|
||||
+ break;
|
||||
+ default:
|
||||
+ if (selmon->pertag->gappx[selmon->pertag->curtag] + arg->i < 0)
|
||||
+ selmon->pertag->gappx[selmon->pertag->curtag] = 0;
|
||||
+ else
|
||||
+ selmon->pertag->gappx[selmon->pertag->curtag] += arg->i;
|
||||
+ }
|
||||
+ arrange(selmon);
|
||||
+}
|
||||
+
|
||||
+void
|
||||
setlayout(const Arg *arg)
|
||||
{
|
||||
if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
|
||||
- selmon->sellt ^= 1;
|
||||
+ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag] ^= 1;
|
||||
if (arg && arg->v)
|
||||
- selmon->lt[selmon->sellt] = (Layout *)arg->v;
|
||||
+ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt] = (Layout *)arg->v;
|
||||
strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol);
|
||||
if (selmon->sel)
|
||||
arrange(selmon);
|
||||
@@ -1523,7 +1604,7 @@ setmfact(const Arg *arg)
|
||||
f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0;
|
||||
if (f < 0.05 || f > 0.95)
|
||||
return;
|
||||
- selmon->mfact = f;
|
||||
+ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag] = f;
|
||||
arrange(selmon);
|
||||
}
|
||||
|
||||
@@ -1680,29 +1761,48 @@ tile(Monitor *m)
|
||||
for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
|
||||
if (n == 0)
|
||||
return;
|
||||
-
|
||||
- if (n > m->nmaster)
|
||||
- mw = m->nmaster ? m->ww * m->mfact : 0;
|
||||
- else
|
||||
- mw = m->ww;
|
||||
- for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
|
||||
- if (i < m->nmaster) {
|
||||
- h = (m->wh - my) / (MIN(n, m->nmaster) - i);
|
||||
- resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0);
|
||||
- if (my + HEIGHT(c) < m->wh)
|
||||
- my += HEIGHT(c);
|
||||
- } else {
|
||||
- h = (m->wh - ty) / (n - i);
|
||||
- resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), 0);
|
||||
- if (ty + HEIGHT(c) < m->wh)
|
||||
- ty += HEIGHT(c);
|
||||
- }
|
||||
+ if (m->pertag->drawwithgaps[m->pertag->curtag]) { /* draw with fullgaps logic */
|
||||
+ if (n > m->nmaster)
|
||||
+ mw = m->nmaster ? m->ww * m->mfact : 0;
|
||||
+ else
|
||||
+ mw = m->ww - m->pertag->gappx[m->pertag->curtag];
|
||||
+ for (i = 0, my = ty = m->pertag->gappx[m->pertag->curtag], c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
|
||||
+ if (i < m->nmaster) {
|
||||
+ h = (m->wh - my) / (MIN(n, m->nmaster) - i) - m->pertag->gappx[m->pertag->curtag];
|
||||
+ resize(c, m->wx + m->pertag->gappx[m->pertag->curtag], m->wy + my, mw - (2*c->bw) - m->pertag->gappx[m->pertag->curtag], h - (2*c->bw), 0);
|
||||
+ if (my + HEIGHT(c) + m->pertag->gappx[m->pertag->curtag] < m->wh)
|
||||
+ my += HEIGHT(c) + m->pertag->gappx[m->pertag->curtag];
|
||||
+ } else {
|
||||
+ h = (m->wh - ty) / (n - i) - m->pertag->gappx[m->pertag->curtag];
|
||||
+ resize(c, m->wx + mw + m->pertag->gappx[m->pertag->curtag], m->wy + ty, m->ww - mw - (2*c->bw) - 2*m->pertag->gappx[m->pertag->curtag], h - (2*c->bw), 0);
|
||||
+ if (ty + HEIGHT(c) + m->pertag->gappx[m->pertag->curtag] < m->wh)
|
||||
+ ty += HEIGHT(c) + m->pertag->gappx[m->pertag->curtag];
|
||||
+ }
|
||||
+ } else { /* draw with singularborders logic */
|
||||
+ if (n > m->nmaster)
|
||||
+ mw = m->nmaster ? m->ww * m->mfact : 0;
|
||||
+ else
|
||||
+ mw = m->ww;
|
||||
+ for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
|
||||
+ if (i < m->nmaster) {
|
||||
+ h = (m->wh - my) / (MIN(n, m->nmaster) - i);
|
||||
+ if (n == 1)
|
||||
+ resize(c, m->wx - c->bw, m->wy, m->ww, m->wh, False);
|
||||
+ else
|
||||
+ resize(c, m->wx - c->bw, m->wy + my, mw - c->bw, h - c->bw, False);
|
||||
+ my += HEIGHT(c) - c->bw;
|
||||
+ } else {
|
||||
+ h = (m->wh - ty) / (n - i);
|
||||
+ resize(c, m->wx + mw - c->bw, m->wy + ty, m->ww - mw, h - c->bw, False);
|
||||
+ ty += HEIGHT(c) - c->bw;
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
|
||||
void
|
||||
togglebar(const Arg *arg)
|
||||
{
|
||||
- selmon->showbar = !selmon->showbar;
|
||||
+ selmon->showbar = selmon->pertag->showbars[selmon->pertag->curtag] = !selmon->showbar;
|
||||
updatebarpos(selmon);
|
||||
XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
|
||||
arrange(selmon);
|
||||
@@ -1741,9 +1841,33 @@ void
|
||||
toggleview(const Arg *arg)
|
||||
{
|
||||
unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK);
|
||||
+ int i;
|
||||
|
||||
if (newtagset) {
|
||||
selmon->tagset[selmon->seltags] = newtagset;
|
||||
+
|
||||
+ if (newtagset == ~0) {
|
||||
+ selmon->pertag->prevtag = selmon->pertag->curtag;
|
||||
+ selmon->pertag->curtag = 0;
|
||||
+ }
|
||||
+
|
||||
+ /* test if the user did not select the same tag */
|
||||
+ if (!(newtagset & 1 << (selmon->pertag->curtag - 1))) {
|
||||
+ selmon->pertag->prevtag = selmon->pertag->curtag;
|
||||
+ for (i = 0; !(newtagset & 1 << i); i++) ;
|
||||
+ selmon->pertag->curtag = i + 1;
|
||||
+ }
|
||||
+
|
||||
+ /* apply settings for this view */
|
||||
+ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag];
|
||||
+ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag];
|
||||
+ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag];
|
||||
+ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt];
|
||||
+ selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1];
|
||||
+
|
||||
+ if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag])
|
||||
+ togglebar(NULL);
|
||||
+
|
||||
focus(NULL);
|
||||
arrange(selmon);
|
||||
}
|
||||
@@ -2038,11 +2162,37 @@ updatewmhints(Client *c)
|
||||
void
|
||||
view(const Arg *arg)
|
||||
{
|
||||
+ int i;
|
||||
+ unsigned int tmptag;
|
||||
+
|
||||
if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags])
|
||||
return;
|
||||
selmon->seltags ^= 1; /* toggle sel tagset */
|
||||
- if (arg->ui & TAGMASK)
|
||||
+ if (arg->ui & TAGMASK) {
|
||||
selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
|
||||
+ selmon->pertag->prevtag = selmon->pertag->curtag;
|
||||
+
|
||||
+ if (arg->ui == ~0)
|
||||
+ selmon->pertag->curtag = 0;
|
||||
+ else {
|
||||
+ for (i = 0; !(arg->ui & 1 << i); i++) ;
|
||||
+ selmon->pertag->curtag = i + 1;
|
||||
+ }
|
||||
+ } else {
|
||||
+ tmptag = selmon->pertag->prevtag;
|
||||
+ selmon->pertag->prevtag = selmon->pertag->curtag;
|
||||
+ selmon->pertag->curtag = tmptag;
|
||||
+ }
|
||||
+
|
||||
+ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag];
|
||||
+ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag];
|
||||
+ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag];
|
||||
+ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt];
|
||||
+ selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1];
|
||||
+
|
||||
+ if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag])
|
||||
+ togglebar(NULL);
|
||||
+
|
||||
focus(NULL);
|
||||
arrange(selmon);
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
diff --git a/config.def.h b/config.def.h
|
||||
index 1c0b587..c5b14ba 100644
|
||||
--- a/config.def.h
|
||||
+++ b/config.def.h
|
||||
@@ -84,6 +84,7 @@ static Key keys[] = {
|
||||
{ MODKEY, XK_period, focusmon, {.i = +1 } },
|
||||
{ MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } },
|
||||
{ MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } },
|
||||
+ { MODKEY, XK_x, movecenter, {0} },
|
||||
TAGKEYS( XK_1, 0)
|
||||
TAGKEYS( XK_2, 1)
|
||||
TAGKEYS( XK_3, 2)
|
||||
diff --git a/dwm.c b/dwm.c
|
||||
index 4465af1..292c70e 100644
|
||||
--- a/dwm.c
|
||||
+++ b/dwm.c
|
||||
@@ -183,6 +183,7 @@ static void maprequest(XEvent *e);
|
||||
static void monocle(Monitor *m);
|
||||
static void motionnotify(XEvent *e);
|
||||
static void movemouse(const Arg *arg);
|
||||
+static void movecenter(const Arg *arg);
|
||||
static Client *nexttiled(Client *c);
|
||||
static void pop(Client *);
|
||||
static void propertynotify(XEvent *e);
|
||||
@@ -1192,6 +1193,14 @@ movemouse(const Arg *arg)
|
||||
}
|
||||
}
|
||||
|
||||
+void
|
||||
+movecenter(const Arg *arg)
|
||||
+{
|
||||
+ selmon->sel->x = selmon->sel->mon->mx + (selmon->sel->mon->mw - WIDTH(selmon->sel)) / 2;
|
||||
+ selmon->sel->y = selmon->sel->mon->my + (selmon->sel->mon->mh - HEIGHT(selmon->sel)) / 2;
|
||||
+ arrange(selmon);
|
||||
+}
|
||||
+
|
||||
Client *
|
||||
nexttiled(Client *c)
|
||||
{
|
|
@ -0,0 +1,95 @@
|
|||
From 9a4037dc0ef56f91c009317e78e9e3790dafbb58 Mon Sep 17 00:00:00 2001
|
||||
From: BrunoCooper17 <BrunoCooper17@outlook.com>
|
||||
Date: Mon, 15 Nov 2021 14:04:53 -0600
|
||||
Subject: [PATCH] MoveStack patch
|
||||
|
||||
This plugin allows you to move clients around in the stack and swap them
|
||||
with the master. It emulates the behavior off mod+shift+j and mod+shift+k
|
||||
in Xmonad. movestack(+1) will swap the client with the current focus with
|
||||
the next client. movestack(-1) will swap the client with the current focus
|
||||
with the previous client.
|
||||
---
|
||||
config.def.h | 3 +++
|
||||
movestack.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 51 insertions(+)
|
||||
create mode 100644 movestack.c
|
||||
|
||||
diff --git a/config.def.h b/config.def.h
|
||||
index a2ac963..33efa5b 100644
|
||||
--- a/config.def.h
|
||||
+++ b/config.def.h
|
||||
@@ -60,6 +60,7 @@ static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn()
|
||||
static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
|
||||
static const char *termcmd[] = { "st", NULL };
|
||||
|
||||
+#include "movestack.c"
|
||||
static Key keys[] = {
|
||||
/* modifier key function argument */
|
||||
{ MODKEY, XK_p, spawn, {.v = dmenucmd } },
|
||||
@@ -71,6 +72,8 @@ static Key keys[] = {
|
||||
{ MODKEY, XK_d, incnmaster, {.i = -1 } },
|
||||
{ MODKEY, XK_h, setmfact, {.f = -0.05} },
|
||||
{ MODKEY, XK_l, setmfact, {.f = +0.05} },
|
||||
+ { MODKEY|ShiftMask, XK_j, movestack, {.i = +1 } },
|
||||
+ { MODKEY|ShiftMask, XK_k, movestack, {.i = -1 } },
|
||||
{ MODKEY, XK_Return, zoom, {0} },
|
||||
{ MODKEY, XK_Tab, view, {0} },
|
||||
{ MODKEY|ShiftMask, XK_c, killclient, {0} },
|
||||
diff --git a/movestack.c b/movestack.c
|
||||
new file mode 100644
|
||||
index 0000000..520f4ae
|
||||
--- /dev/null
|
||||
+++ b/movestack.c
|
||||
@@ -0,0 +1,48 @@
|
||||
+void
|
||||
+movestack(const Arg *arg) {
|
||||
+ Client *c = NULL, *p = NULL, *pc = NULL, *i;
|
||||
+
|
||||
+ if(arg->i > 0) {
|
||||
+ /* find the client after selmon->sel */
|
||||
+ for(c = selmon->sel->next; c && (!ISVISIBLE(c) || c->isfloating); c = c->next);
|
||||
+ if(!c)
|
||||
+ for(c = selmon->clients; c && (!ISVISIBLE(c) || c->isfloating); c = c->next);
|
||||
+
|
||||
+ }
|
||||
+ else {
|
||||
+ /* find the client before selmon->sel */
|
||||
+ for(i = selmon->clients; i != selmon->sel; i = i->next)
|
||||
+ if(ISVISIBLE(i) && !i->isfloating)
|
||||
+ c = i;
|
||||
+ if(!c)
|
||||
+ for(; i; i = i->next)
|
||||
+ if(ISVISIBLE(i) && !i->isfloating)
|
||||
+ c = i;
|
||||
+ }
|
||||
+ /* find the client before selmon->sel and c */
|
||||
+ for(i = selmon->clients; i && (!p || !pc); i = i->next) {
|
||||
+ if(i->next == selmon->sel)
|
||||
+ p = i;
|
||||
+ if(i->next == c)
|
||||
+ pc = i;
|
||||
+ }
|
||||
+
|
||||
+ /* swap c and selmon->sel selmon->clients in the selmon->clients list */
|
||||
+ if(c && c != selmon->sel) {
|
||||
+ Client *temp = selmon->sel->next==c?selmon->sel:selmon->sel->next;
|
||||
+ selmon->sel->next = c->next==selmon->sel?c:c->next;
|
||||
+ c->next = temp;
|
||||
+
|
||||
+ if(p && p != c)
|
||||
+ p->next = c;
|
||||
+ if(pc && pc != selmon->sel)
|
||||
+ pc->next = selmon->sel;
|
||||
+
|
||||
+ if(selmon->sel == selmon->clients)
|
||||
+ selmon->clients = c;
|
||||
+ else if(c == selmon->clients)
|
||||
+ selmon->clients = selmon->sel;
|
||||
+
|
||||
+ arrange(selmon);
|
||||
+ }
|
||||
+}
|
||||
\ No newline at end of file
|
||||
--
|
||||
2.33.1
|
||||
|
|
@ -0,0 +1,198 @@
|
|||
From d57c8508c9f26be40667d402a2daaa2b27ae759f Mon Sep 17 00:00:00 2001
|
||||
From: explosion-mental <explosion0mental@gmail.com>
|
||||
Date: Wed, 11 Aug 2021 21:05:44 -0500
|
||||
Subject: [PATCH] shift-tools - shifttag, moves the current selected client to
|
||||
the adjacent tag - shifttagclients, moves the current selected client to the
|
||||
adjacent tag that has at least one client else acts as shifttag -
|
||||
shiftview, view adjacent tag - shiftviewclients, view the closes tag that has
|
||||
a client. If none acts as shiftview - shiftboth, shifttag and shiftview.
|
||||
Basically moves the window to the next/prev tag and follows it. -
|
||||
shiftswaptags, its a shift implementation on the swaptags function (see
|
||||
https://github.com/moizifty/DWM-Build/blob/65379c62640788881486401a0d8c79333751b02f/config.h#L48
|
||||
for more details), which in short 'swaps tags' (swaps all clients with
|
||||
the clients on the adjacent tag). A pretty useful example of this is
|
||||
chosing a tag empty and sending all your clients to that tag. - swapfunction
|
||||
is the 'helper' function for the shiftswaptags. remember that these functions
|
||||
**shift**, which means you can go from tag 1 to 9 or 9 to 1. Also remember
|
||||
that the default argument is 1 and you can change it.
|
||||
|
||||
---
|
||||
config.def.h | 9 ++++
|
||||
shift-tools.c | 135 ++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 144 insertions(+)
|
||||
create mode 100644 shift-tools.c
|
||||
|
||||
diff --git a/config.def.h b/config.def.h
|
||||
index 1c0b587..1390d17 100644
|
||||
--- a/config.def.h
|
||||
+++ b/config.def.h
|
||||
@@ -58,9 +58,14 @@ static const Layout layouts[] = {
|
||||
static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */
|
||||
static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
|
||||
static const char *termcmd[] = { "st", NULL };
|
||||
+#include "shift-tools.c"
|
||||
|
||||
static Key keys[] = {
|
||||
/* modifier key function argument */
|
||||
+ { MODKEY, XK_o, shiftviewclients, { .i = +1 } },
|
||||
+ { MODKEY|ShiftMask, XK_o, shiftview, { .i = +1 } },
|
||||
+ { MODKEY|ShiftMask, XK_i, shiftview, { .i = -1 } },
|
||||
+ { MODKEY, XK_i, shiftviewclients, { .i = -1 } },
|
||||
{ MODKEY, XK_p, spawn, {.v = dmenucmd } },
|
||||
{ MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } },
|
||||
{ MODKEY, XK_b, togglebar, {0} },
|
||||
@@ -69,6 +74,10 @@ static Key keys[] = {
|
||||
{ MODKEY, XK_i, incnmaster, {.i = +1 } },
|
||||
{ MODKEY, XK_d, incnmaster, {.i = -1 } },
|
||||
{ MODKEY, XK_h, setmfact, {.f = -0.05} },
|
||||
+ { MODKEY|ShiftMask, XK_h, shiftboth, { .i = -1 } },
|
||||
+ { MODKEY|ControlMask, XK_h, shiftswaptags, { .i = -1 } },
|
||||
+ { MODKEY|ControlMask, XK_l, shiftswaptags, { .i = +1 } },
|
||||
+ { MODKEY|ShiftMask, XK_l, shiftboth, { .i = +1 } },
|
||||
{ MODKEY, XK_l, setmfact, {.f = +0.05} },
|
||||
{ MODKEY, XK_Return, zoom, {0} },
|
||||
{ MODKEY, XK_Tab, view, {0} },
|
||||
diff --git a/shift-tools.c b/shift-tools.c
|
||||
new file mode 100644
|
||||
index 0000000..cf130c8
|
||||
--- /dev/null
|
||||
+++ b/shift-tools.c
|
||||
@@ -0,0 +1,135 @@
|
||||
+/* Sends a window to the next/prev tag */
|
||||
+void
|
||||
+shifttag(const Arg *arg)
|
||||
+{
|
||||
+ Arg shifted;
|
||||
+ shifted.ui = selmon->tagset[selmon->seltags];
|
||||
+
|
||||
+
|
||||
+ if (arg->i > 0) /* left circular shift */
|
||||
+ shifted.ui = ((shifted.ui << arg->i) | (shifted.ui >> (LENGTH(tags) - arg->i)));
|
||||
+ else /* right circular shift */
|
||||
+ shifted.ui = (shifted.ui >> (- arg->i) | shifted.ui << (LENGTH(tags) + arg->i));
|
||||
+ tag(&shifted);
|
||||
+}
|
||||
+/* Sends a window to the next/prev tag that has a client, else it moves it to the next/prev one. */
|
||||
+void
|
||||
+shifttagclients(const Arg *arg)
|
||||
+{
|
||||
+
|
||||
+ Arg shifted;
|
||||
+ Client *c;
|
||||
+ unsigned int tagmask = 0;
|
||||
+ shifted.ui = selmon->tagset[selmon->seltags];
|
||||
+
|
||||
+ for (c = selmon->clients; c; c = c->next)
|
||||
+ if (!(c->tags))
|
||||
+ tagmask = tagmask | c->tags;
|
||||
+
|
||||
+
|
||||
+ if (arg->i > 0) /* left circular shift */
|
||||
+ do {
|
||||
+ shifted.ui = (shifted.ui << arg->i)
|
||||
+ | (shifted.ui >> (LENGTH(tags) - arg->i));
|
||||
+ } while (tagmask && !(shifted.ui & tagmask));
|
||||
+ else /* right circular shift */
|
||||
+ do {
|
||||
+ shifted.ui = (shifted.ui >> (- arg->i)
|
||||
+ | shifted.ui << (LENGTH(tags) + arg->i));
|
||||
+ } while (tagmask && !(shifted.ui & tagmask));
|
||||
+ tag(&shifted);
|
||||
+}
|
||||
+/* Navigate to the next/prev tag */
|
||||
+void
|
||||
+shiftview(const Arg *arg)
|
||||
+{
|
||||
+ Arg shifted;
|
||||
+ shifted.ui = selmon->tagset[selmon->seltags];
|
||||
+
|
||||
+ if (arg->i > 0) /* left circular shift */
|
||||
+ shifted.ui = (shifted.ui << arg->i) | (shifted.ui >> (LENGTH(tags) - arg->i));
|
||||
+ else /* right circular shift */
|
||||
+ shifted.ui = (shifted.ui >> (- arg->i) | shifted.ui << (LENGTH(tags) + arg->i));
|
||||
+ view(&shifted);
|
||||
+}
|
||||
+/* Navigate to the next/prev tag that has a client, else moves it to the next/prev tag */
|
||||
+void
|
||||
+shiftviewclients(const Arg *arg)
|
||||
+{
|
||||
+ Arg shifted;
|
||||
+ Client *c;
|
||||
+ unsigned int tagmask = 0;
|
||||
+ shifted.ui = selmon->tagset[selmon->seltags];
|
||||
+
|
||||
+ for (c = selmon->clients; c; c = c->next)
|
||||
+ if (!(c->tags))
|
||||
+ tagmask = tagmask | c->tags;
|
||||
+
|
||||
+
|
||||
+ if (arg->i > 0) /* left circular shift */
|
||||
+ do {
|
||||
+ shifted.ui = (shifted.ui << arg->i)
|
||||
+ | (shifted.ui >> (LENGTH(tags) - arg->i));
|
||||
+ } while (tagmask && !(shifted.ui & tagmask));
|
||||
+ else /* right circular shift */
|
||||
+ do {
|
||||
+ shifted.ui = (shifted.ui >> (- arg->i)
|
||||
+ | shifted.ui << (LENGTH(tags) + arg->i));
|
||||
+ } while (tagmask && !(shifted.ui & tagmask));
|
||||
+ view(&shifted);
|
||||
+}
|
||||
+/* move the current active window to the next/prev tag and view it. More like following the window */
|
||||
+void
|
||||
+shiftboth(const Arg *arg)
|
||||
+{
|
||||
+ Arg shifted;
|
||||
+ shifted.ui = selmon->tagset[selmon->seltags];
|
||||
+
|
||||
+ if (arg->i > 0) /* left circular shift */
|
||||
+ shifted.ui = ((shifted.ui << arg->i) | (shifted.ui >> (LENGTH(tags) - arg->i)));
|
||||
+ else /* right circular shift */
|
||||
+ shifted.ui = ((shifted.ui >> (- arg->i) | shifted.ui << (LENGTH(tags) + arg->i)));
|
||||
+ tag(&shifted);
|
||||
+ view(&shifted);
|
||||
+}
|
||||
+//helper function for shiftswaptags.
|
||||
+//see: https://github.com/moizifty/DWM-Build/blob/65379c62640788881486401a0d8c79333751b02f/config.h#L48
|
||||
+void
|
||||
+swaptags(const Arg *arg)
|
||||
+{
|
||||
+ Client *c;
|
||||
+ unsigned int newtag = arg->ui & TAGMASK;
|
||||
+ unsigned int curtag = selmon->tagset[selmon->seltags];
|
||||
+
|
||||
+ if (newtag == curtag || !curtag || (curtag & (curtag-1)))
|
||||
+ return;
|
||||
+
|
||||
+ for (c = selmon->clients; c != NULL; c = c->next) {
|
||||
+ if ((c->tags & newtag) || (c->tags & curtag))
|
||||
+ c->tags ^= curtag ^ newtag;
|
||||
+
|
||||
+ if (!c->tags)
|
||||
+ c->tags = newtag;
|
||||
+ }
|
||||
+
|
||||
+ //move to the swaped tag
|
||||
+ //selmon->tagset[selmon->seltags] = newtag;
|
||||
+
|
||||
+ focus(NULL);
|
||||
+ arrange(selmon);
|
||||
+}
|
||||
+/* swaps "tags" (all the clients) with the next/prev tag. */
|
||||
+void
|
||||
+shiftswaptags(const Arg *arg)
|
||||
+{
|
||||
+ Arg shifted;
|
||||
+ shifted.ui = selmon->tagset[selmon->seltags];
|
||||
+
|
||||
+ if (arg->i > 0) /* left circular shift */
|
||||
+ shifted.ui = ((shifted.ui << arg->i) | (shifted.ui >> (LENGTH(tags) - arg->i)));
|
||||
+ else /* right circular shift */
|
||||
+ shifted.ui = ((shifted.ui >> (- arg->i) | shifted.ui << (LENGTH(tags) + arg->i)));
|
||||
+ swaptags(&shifted);
|
||||
+ // uncomment if you also want to "go" (view) the tag where the the clients are going
|
||||
+ //view(&shifted);
|
||||
+}
|
||||
--
|
||||
2.32.0
|
||||
|
Loading…
Reference in New Issue