From ed9dce4ee8c9a59114b806329c7e7653829d84b2 Mon Sep 17 00:00:00 2001 From: joelchrono12 Date: Thu, 12 Jan 2023 20:19:57 -0600 Subject: [PATCH 01/12] downloaded patches --- .../dwm-alwayscenter-20200625-f04cac6.diff | 12 + patches/dwm-attachbottom-6.3.diff | 54 +++ patches/dwm-functionalgaps+pertag-6.2.diff | 352 ++++++++++++++++++ patches/dwm-movecenter-6.2.diff | 39 ++ patches/dwm-movestack-20211115-a786211.diff | 95 +++++ patches/dwm-shif-tools-6.2.diff | 198 ++++++++++ 6 files changed, 750 insertions(+) create mode 100644 patches/dwm-alwayscenter-20200625-f04cac6.diff create mode 100644 patches/dwm-attachbottom-6.3.diff create mode 100644 patches/dwm-functionalgaps+pertag-6.2.diff create mode 100644 patches/dwm-movecenter-6.2.diff create mode 100644 patches/dwm-movestack-20211115-a786211.diff create mode 100644 patches/dwm-shif-tools-6.2.diff diff --git a/patches/dwm-alwayscenter-20200625-f04cac6.diff b/patches/dwm-alwayscenter-20200625-f04cac6.diff new file mode 100644 index 0000000..03ea9ef --- /dev/null +++ b/patches/dwm-alwayscenter-20200625-f04cac6.diff @@ -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) diff --git a/patches/dwm-attachbottom-6.3.diff b/patches/dwm-attachbottom-6.3.diff new file mode 100644 index 0000000..c3955f9 --- /dev/null +++ b/patches/dwm-attachbottom-6.3.diff @@ -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) diff --git a/patches/dwm-functionalgaps+pertag-6.2.diff b/patches/dwm-functionalgaps+pertag-6.2.diff new file mode 100644 index 0000000..c7e1c60 --- /dev/null +++ b/patches/dwm-functionalgaps+pertag-6.2.diff @@ -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); + } diff --git a/patches/dwm-movecenter-6.2.diff b/patches/dwm-movecenter-6.2.diff new file mode 100644 index 0000000..4be852f --- /dev/null +++ b/patches/dwm-movecenter-6.2.diff @@ -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) + { diff --git a/patches/dwm-movestack-20211115-a786211.diff b/patches/dwm-movestack-20211115-a786211.diff new file mode 100644 index 0000000..134abb8 --- /dev/null +++ b/patches/dwm-movestack-20211115-a786211.diff @@ -0,0 +1,95 @@ +From 9a4037dc0ef56f91c009317e78e9e3790dafbb58 Mon Sep 17 00:00:00 2001 +From: BrunoCooper17 +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 + diff --git a/patches/dwm-shif-tools-6.2.diff b/patches/dwm-shif-tools-6.2.diff new file mode 100644 index 0000000..4535342 --- /dev/null +++ b/patches/dwm-shif-tools-6.2.diff @@ -0,0 +1,198 @@ +From d57c8508c9f26be40667d402a2daaa2b27ae759f Mon Sep 17 00:00:00 2001 +From: explosion-mental +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 + From 84492b3d48ccd31cca9ac6bd98de48d8a7c5e2cb Mon Sep 17 00:00:00 2001 From: joelchrono12 Date: Thu, 12 Jan 2023 20:26:34 -0600 Subject: [PATCH 02/12] shift-tools patch applied --- patches/dwm-shif-tools-6.2.diff | 31 -------- shift-tools.c | 135 ++++++++++++++++++++++++++++++++ 2 files changed, 135 insertions(+), 31 deletions(-) create mode 100644 shift-tools.c diff --git a/patches/dwm-shif-tools-6.2.diff b/patches/dwm-shif-tools-6.2.diff index 4535342..a3aea18 100644 --- a/patches/dwm-shif-tools-6.2.diff +++ b/patches/dwm-shif-tools-6.2.diff @@ -17,41 +17,10 @@ Subject: [PATCH] shift-tools - shifttag, moves the current selected client to 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 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); +} From 3ed493821ddb11b93e8dd8b9e8f0b28853727d06 Mon Sep 17 00:00:00 2001 From: joelchrono12 Date: Thu, 12 Jan 2023 20:27:06 -0600 Subject: [PATCH 03/12] applied alwayscenter --- dwm.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dwm.c b/dwm.c index e5efb6a..02f3353 100644 --- a/dwm.c +++ b/dwm.c @@ -1059,6 +1059,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) From 4fe4baf386360774a5a3ec3c28a502bd4bbb3e6a Mon Sep 17 00:00:00 2001 From: joelchrono12 Date: Thu, 12 Jan 2023 20:48:28 -0600 Subject: [PATCH 04/12] applied config --- config.def.h | 90 ++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 66 insertions(+), 24 deletions(-) diff --git a/config.def.h b/config.def.h index 061ad66..f24349f 100644 --- a/config.def.h +++ b/config.def.h @@ -1,17 +1,19 @@ /* See LICENSE file for copyright and license details. */ /* appearance */ -static const unsigned int borderpx = 1; /* border pixel of windows */ +static const int startwithgaps[] = { 1 }; /* 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 borderpx = 2; /* border pixel of windows */ 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 */ -static const char *fonts[] = { "monospace:size=10" }; -static const char dmenufont[] = "monospace:size=10"; -static const char col_gray1[] = "#222222"; -static const char col_gray2[] = "#444444"; -static const char col_gray3[] = "#bbbbbb"; -static const char col_gray4[] = "#eeeeee"; -static const char col_cyan[] = "#005577"; +static const char *fonts[] = { "mononoki Nerd Font:size=12" }; +static const char dmenufont[] = "mononoki Nerd Font:size=12"; +static const char col_gray1[] = "#2e3440"; +static const char col_gray2[] = "#434c5e"; +static const char col_gray3[] = "#d8dee9"; +static const char col_gray4[] = "#eceff4"; +static const char col_cyan[] = "#bf616a"; static const char *colors[][3] = { /* fg bg border */ [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, @@ -19,16 +21,19 @@ static const char *colors[][3] = { }; /* tagging */ -static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; +static const char *tags[] = { "www", "{}", "[/]", "(~)", "|V|", ">_" }; static const Rule rules[] = { /* xprop(1): * WM_CLASS(STRING) = instance, class * WM_NAME(STRING) = title */ - /* class instance title tags mask isfloating monitor */ - { "Gimp", NULL, NULL, 0, 1, -1 }, - { "Firefox", NULL, NULL, 1 << 8, 0, -1 }, + /* class instance title tags mask isfloating monitor */ + { "Gimp", NULL, NULL, 0, 1, -1 }, + { "Alacritty", "pulsemixer", NULL, 0, 1, -1 }, + { "Pavucontrol",NULL, NULL, 0, 1, -1 }, + { "Nitrogen", NULL, NULL, 0, 1, -1 }, + { "Firefox", NULL, NULL, 1 << 8, 0, -1 }, }; /* layout(s) */ @@ -45,7 +50,8 @@ static const Layout layouts[] = { }; /* key definitions */ -#define MODKEY Mod1Mask +#define MODKEY Mod4Mask +#define ALTKEY Mod1Mask #define TAGKEYS(KEY,TAG) \ { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \ @@ -56,27 +62,52 @@ static const Layout layouts[] = { #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } /* commands */ -static const char *dmenucmd[] = { "dmenu_run", "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; -static const char *termcmd[] = { "st", NULL }; +static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ +static const char *dmenucmd[] = { "rofi","-show", "drun", NULL }; +static const char *rofirun[] = { "rofi","-show", "run", NULL }; +static const char *termcmd[] = { "alacritty", NULL }; +static const char *rofipass[] = { "rofi-pass", NULL }; +static const char *browser[] = { "firefox", NULL }; +static const char *screenshot[] = { "flameshot","gui", NULL }; +static const char *files[] = { "thunar", NULL }; +static const char *qpost[] = { "qpost", NULL }; +static const char *pulsemixer[] = { "alacritty","--class","pulsemixer","-e","pulsemixer",NULL }; +static const char *brightup[] = { "brightnessctl", "set", "+15", NULL }; +static const char *brightdown[] = { "brightnessctl", "set", "15-", NULL }; + +#include "shift-tools.c" +#include "movestack.c" +#include "X11/XF86keysym.h" static const Key keys[] = { /* modifier key function argument */ { MODKEY, XK_p, spawn, {.v = dmenucmd } }, - { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, + { MODKEY, XK_r, spawn, {.v = rofirun } }, + { MODKEY, XK_Return, spawn, {.v = termcmd } }, + //{ MODKEY|ShiftMask, XK_o, shiftview, { .i = +1 } }, + //{ MODKEY|ShiftMask, XK_i, shiftview, { .i = -1 } }, + { MODKEY, XK_Right, shiftview, { .i = +1 } }, + { MODKEY, XK_Left, shiftview, { .i = -1 } }, { MODKEY, XK_b, togglebar, {0} }, { MODKEY, XK_j, focusstack, {.i = +1 } }, { MODKEY, XK_k, focusstack, {.i = -1 } }, - { MODKEY, XK_i, incnmaster, {.i = +1 } }, - { MODKEY, XK_d, incnmaster, {.i = -1 } }, + { MODKEY|ShiftMask, XK_j, movestack, {.i = +1 } }, + { MODKEY|ShiftMask, XK_k, movestack, {.i = -1 } }, + //{ MODKEY, XK_i, incnmaster, {.i = +1 } }, + //{ MODKEY, XK_d, incnmaster, {.i = -1 } }, { MODKEY, XK_h, setmfact, {.f = -0.05} }, { MODKEY, XK_l, setmfact, {.f = +0.05} }, - { MODKEY, XK_Return, zoom, {0} }, + { MODKEY|ShiftMask, XK_Return, zoom, {0} }, { MODKEY, XK_Tab, view, {0} }, - { MODKEY|ShiftMask, XK_c, killclient, {0} }, + { MODKEY, XK_q, killclient, {0} }, { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, { MODKEY, XK_space, setlayout, {0} }, + { MODKEY|ShiftMask, XK_Left, shiftboth, { .i = -1 } }, + { MODKEY|ControlMask, XK_Left, shiftswaptags, { .i = -1 } }, + { MODKEY|ControlMask, XK_Right, shiftswaptags, { .i = +1 } }, + { MODKEY|ShiftMask, XK_Right, shiftboth, { .i = +1 } }, { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, { MODKEY, XK_0, view, {.ui = ~0 } }, { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, @@ -84,15 +115,27 @@ static const Key keys[] = { { MODKEY, XK_period, focusmon, {.i = +1 } }, { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, + { MODKEY|ShiftMask, XK_h, setgaps, {.i = -5 } }, + { MODKEY|ShiftMask, XK_l, setgaps, {.i = +5 } }, + { MODKEY|ShiftMask, XK_minus, setgaps, {.i = GAP_RESET } }, + { MODKEY|ShiftMask, XK_equal, setgaps, {.i = GAP_TOGGLE} }, + { MODKEY, XK_s, movecenter, {0} }, + // CUSTOM USER PROGRAMS + { MODKEY|ALTKEY, XK_k, spawn, {.v = rofipass } }, + { MODKEY|ALTKEY, XK_b, spawn, {.v = browser } }, + { MODKEY|ALTKEY, XK_f, spawn, {.v = files } }, + { MODKEY|ALTKEY, XK_p, spawn, {.v = qpost } }, + { MODKEY|ALTKEY, XK_v, spawn, {.v = pulsemixer } }, + { MODKEY|ShiftMask, XK_s, spawn, {.v = screenshot } }, + { 0 , XF86XK_MonBrightnessUp, spawn, {.v = brightup} }, + { 0 , XF86XK_MonBrightnessDown, spawn, {.v = brightdown} }, + TAGKEYS( XK_1, 0) TAGKEYS( XK_2, 1) TAGKEYS( XK_3, 2) TAGKEYS( XK_4, 3) TAGKEYS( XK_5, 4) TAGKEYS( XK_6, 5) - TAGKEYS( XK_7, 6) - TAGKEYS( XK_8, 7) - TAGKEYS( XK_9, 8) { MODKEY|ShiftMask, XK_q, quit, {0} }, }; @@ -112,4 +155,3 @@ static const Button buttons[] = { { ClkTagBar, MODKEY, Button1, tag, {0} }, { ClkTagBar, MODKEY, Button3, toggletag, {0} }, }; - From 6630f8e193608f8671d2e8317e6153efb62953ec Mon Sep 17 00:00:00 2001 From: joelchrono12 Date: Thu, 12 Jan 2023 20:53:41 -0600 Subject: [PATCH 05/12] applied movestack --- movestack.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 movestack.c 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 From ed255587633162814ebfca7549f983b941770fdd Mon Sep 17 00:00:00 2001 From: joelchrono12 Date: Thu, 12 Jan 2023 21:23:20 -0600 Subject: [PATCH 06/12] working setup --- config.def.h | 30 +++++++++--------- config.h | 90 ++++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 81 insertions(+), 39 deletions(-) diff --git a/config.def.h b/config.def.h index f24349f..ec586e5 100644 --- a/config.def.h +++ b/config.def.h @@ -76,8 +76,8 @@ static const char *brightup[] = { "brightnessctl", "set", "+15", NULL }; static const char *brightdown[] = { "brightnessctl", "set", "15-", NULL }; -#include "shift-tools.c" -#include "movestack.c" +//#include "shift-tools.c" +//#include "movestack.c" #include "X11/XF86keysym.h" static const Key keys[] = { /* modifier key function argument */ @@ -86,13 +86,13 @@ static const Key keys[] = { { MODKEY, XK_Return, spawn, {.v = termcmd } }, //{ MODKEY|ShiftMask, XK_o, shiftview, { .i = +1 } }, //{ MODKEY|ShiftMask, XK_i, shiftview, { .i = -1 } }, - { MODKEY, XK_Right, shiftview, { .i = +1 } }, - { MODKEY, XK_Left, shiftview, { .i = -1 } }, + //{ MODKEY, XK_Right, shiftview, { .i = +1 } }, + //{ MODKEY, XK_Left, shiftview, { .i = -1 } }, { MODKEY, XK_b, togglebar, {0} }, { MODKEY, XK_j, focusstack, {.i = +1 } }, { MODKEY, XK_k, focusstack, {.i = -1 } }, - { MODKEY|ShiftMask, XK_j, movestack, {.i = +1 } }, - { MODKEY|ShiftMask, XK_k, movestack, {.i = -1 } }, + //{ MODKEY|ShiftMask, XK_j, movestack, {.i = +1 } }, + //{ MODKEY|ShiftMask, XK_k, movestack, {.i = -1 } }, //{ MODKEY, XK_i, incnmaster, {.i = +1 } }, //{ MODKEY, XK_d, incnmaster, {.i = -1 } }, { MODKEY, XK_h, setmfact, {.f = -0.05} }, @@ -104,10 +104,10 @@ static const Key keys[] = { { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, { MODKEY, XK_space, setlayout, {0} }, - { MODKEY|ShiftMask, XK_Left, shiftboth, { .i = -1 } }, - { MODKEY|ControlMask, XK_Left, shiftswaptags, { .i = -1 } }, - { MODKEY|ControlMask, XK_Right, shiftswaptags, { .i = +1 } }, - { MODKEY|ShiftMask, XK_Right, shiftboth, { .i = +1 } }, + //{ MODKEY|ShiftMask, XK_Left, shiftboth, { .i = -1 } }, + //{ MODKEY|ControlMask, XK_Left, shiftswaptags, { .i = -1 } }, + //{ MODKEY|ControlMask, XK_Right, shiftswaptags, { .i = +1 } }, + //{ MODKEY|ShiftMask, XK_Right, shiftboth, { .i = +1 } }, { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, { MODKEY, XK_0, view, {.ui = ~0 } }, { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, @@ -115,11 +115,11 @@ static const Key keys[] = { { MODKEY, XK_period, focusmon, {.i = +1 } }, { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, - { MODKEY|ShiftMask, XK_h, setgaps, {.i = -5 } }, - { MODKEY|ShiftMask, XK_l, setgaps, {.i = +5 } }, - { MODKEY|ShiftMask, XK_minus, setgaps, {.i = GAP_RESET } }, - { MODKEY|ShiftMask, XK_equal, setgaps, {.i = GAP_TOGGLE} }, - { MODKEY, XK_s, movecenter, {0} }, + //{ MODKEY|ShiftMask, XK_h, setgaps, {.i = -5 } }, + //{ MODKEY|ShiftMask, XK_l, setgaps, {.i = +5 } }, + //{ MODKEY|ShiftMask, XK_minus, setgaps, {.i = GAP_RESET } }, + //{ MODKEY|ShiftMask, XK_equal, setgaps, {.i = GAP_TOGGLE} }, + //{ MODKEY, XK_s, movecenter, {0} }, // CUSTOM USER PROGRAMS { MODKEY|ALTKEY, XK_k, spawn, {.v = rofipass } }, { MODKEY|ALTKEY, XK_b, spawn, {.v = browser } }, diff --git a/config.h b/config.h index 061ad66..ec586e5 100644 --- a/config.h +++ b/config.h @@ -1,17 +1,19 @@ /* See LICENSE file for copyright and license details. */ /* appearance */ -static const unsigned int borderpx = 1; /* border pixel of windows */ +static const int startwithgaps[] = { 1 }; /* 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 borderpx = 2; /* border pixel of windows */ 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 */ -static const char *fonts[] = { "monospace:size=10" }; -static const char dmenufont[] = "monospace:size=10"; -static const char col_gray1[] = "#222222"; -static const char col_gray2[] = "#444444"; -static const char col_gray3[] = "#bbbbbb"; -static const char col_gray4[] = "#eeeeee"; -static const char col_cyan[] = "#005577"; +static const char *fonts[] = { "mononoki Nerd Font:size=12" }; +static const char dmenufont[] = "mononoki Nerd Font:size=12"; +static const char col_gray1[] = "#2e3440"; +static const char col_gray2[] = "#434c5e"; +static const char col_gray3[] = "#d8dee9"; +static const char col_gray4[] = "#eceff4"; +static const char col_cyan[] = "#bf616a"; static const char *colors[][3] = { /* fg bg border */ [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, @@ -19,16 +21,19 @@ static const char *colors[][3] = { }; /* tagging */ -static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; +static const char *tags[] = { "www", "{}", "[/]", "(~)", "|V|", ">_" }; static const Rule rules[] = { /* xprop(1): * WM_CLASS(STRING) = instance, class * WM_NAME(STRING) = title */ - /* class instance title tags mask isfloating monitor */ - { "Gimp", NULL, NULL, 0, 1, -1 }, - { "Firefox", NULL, NULL, 1 << 8, 0, -1 }, + /* class instance title tags mask isfloating monitor */ + { "Gimp", NULL, NULL, 0, 1, -1 }, + { "Alacritty", "pulsemixer", NULL, 0, 1, -1 }, + { "Pavucontrol",NULL, NULL, 0, 1, -1 }, + { "Nitrogen", NULL, NULL, 0, 1, -1 }, + { "Firefox", NULL, NULL, 1 << 8, 0, -1 }, }; /* layout(s) */ @@ -45,7 +50,8 @@ static const Layout layouts[] = { }; /* key definitions */ -#define MODKEY Mod1Mask +#define MODKEY Mod4Mask +#define ALTKEY Mod1Mask #define TAGKEYS(KEY,TAG) \ { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \ @@ -56,27 +62,52 @@ static const Layout layouts[] = { #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } /* commands */ -static const char *dmenucmd[] = { "dmenu_run", "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; -static const char *termcmd[] = { "st", NULL }; +static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ +static const char *dmenucmd[] = { "rofi","-show", "drun", NULL }; +static const char *rofirun[] = { "rofi","-show", "run", NULL }; +static const char *termcmd[] = { "alacritty", NULL }; +static const char *rofipass[] = { "rofi-pass", NULL }; +static const char *browser[] = { "firefox", NULL }; +static const char *screenshot[] = { "flameshot","gui", NULL }; +static const char *files[] = { "thunar", NULL }; +static const char *qpost[] = { "qpost", NULL }; +static const char *pulsemixer[] = { "alacritty","--class","pulsemixer","-e","pulsemixer",NULL }; +static const char *brightup[] = { "brightnessctl", "set", "+15", NULL }; +static const char *brightdown[] = { "brightnessctl", "set", "15-", NULL }; + +//#include "shift-tools.c" +//#include "movestack.c" +#include "X11/XF86keysym.h" static const Key keys[] = { /* modifier key function argument */ { MODKEY, XK_p, spawn, {.v = dmenucmd } }, - { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, + { MODKEY, XK_r, spawn, {.v = rofirun } }, + { MODKEY, XK_Return, spawn, {.v = termcmd } }, + //{ MODKEY|ShiftMask, XK_o, shiftview, { .i = +1 } }, + //{ MODKEY|ShiftMask, XK_i, shiftview, { .i = -1 } }, + //{ MODKEY, XK_Right, shiftview, { .i = +1 } }, + //{ MODKEY, XK_Left, shiftview, { .i = -1 } }, { MODKEY, XK_b, togglebar, {0} }, { MODKEY, XK_j, focusstack, {.i = +1 } }, { MODKEY, XK_k, focusstack, {.i = -1 } }, - { MODKEY, XK_i, incnmaster, {.i = +1 } }, - { MODKEY, XK_d, incnmaster, {.i = -1 } }, + //{ MODKEY|ShiftMask, XK_j, movestack, {.i = +1 } }, + //{ MODKEY|ShiftMask, XK_k, movestack, {.i = -1 } }, + //{ MODKEY, XK_i, incnmaster, {.i = +1 } }, + //{ MODKEY, XK_d, incnmaster, {.i = -1 } }, { MODKEY, XK_h, setmfact, {.f = -0.05} }, { MODKEY, XK_l, setmfact, {.f = +0.05} }, - { MODKEY, XK_Return, zoom, {0} }, + { MODKEY|ShiftMask, XK_Return, zoom, {0} }, { MODKEY, XK_Tab, view, {0} }, - { MODKEY|ShiftMask, XK_c, killclient, {0} }, + { MODKEY, XK_q, killclient, {0} }, { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, { MODKEY, XK_space, setlayout, {0} }, + //{ MODKEY|ShiftMask, XK_Left, shiftboth, { .i = -1 } }, + //{ MODKEY|ControlMask, XK_Left, shiftswaptags, { .i = -1 } }, + //{ MODKEY|ControlMask, XK_Right, shiftswaptags, { .i = +1 } }, + //{ MODKEY|ShiftMask, XK_Right, shiftboth, { .i = +1 } }, { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, { MODKEY, XK_0, view, {.ui = ~0 } }, { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, @@ -84,15 +115,27 @@ static const Key keys[] = { { MODKEY, XK_period, focusmon, {.i = +1 } }, { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, + //{ MODKEY|ShiftMask, XK_h, setgaps, {.i = -5 } }, + //{ MODKEY|ShiftMask, XK_l, setgaps, {.i = +5 } }, + //{ MODKEY|ShiftMask, XK_minus, setgaps, {.i = GAP_RESET } }, + //{ MODKEY|ShiftMask, XK_equal, setgaps, {.i = GAP_TOGGLE} }, + //{ MODKEY, XK_s, movecenter, {0} }, + // CUSTOM USER PROGRAMS + { MODKEY|ALTKEY, XK_k, spawn, {.v = rofipass } }, + { MODKEY|ALTKEY, XK_b, spawn, {.v = browser } }, + { MODKEY|ALTKEY, XK_f, spawn, {.v = files } }, + { MODKEY|ALTKEY, XK_p, spawn, {.v = qpost } }, + { MODKEY|ALTKEY, XK_v, spawn, {.v = pulsemixer } }, + { MODKEY|ShiftMask, XK_s, spawn, {.v = screenshot } }, + { 0 , XF86XK_MonBrightnessUp, spawn, {.v = brightup} }, + { 0 , XF86XK_MonBrightnessDown, spawn, {.v = brightdown} }, + TAGKEYS( XK_1, 0) TAGKEYS( XK_2, 1) TAGKEYS( XK_3, 2) TAGKEYS( XK_4, 3) TAGKEYS( XK_5, 4) TAGKEYS( XK_6, 5) - TAGKEYS( XK_7, 6) - TAGKEYS( XK_8, 7) - TAGKEYS( XK_9, 8) { MODKEY|ShiftMask, XK_q, quit, {0} }, }; @@ -112,4 +155,3 @@ static const Button buttons[] = { { ClkTagBar, MODKEY, Button1, tag, {0} }, { ClkTagBar, MODKEY, Button3, toggletag, {0} }, }; - From 19e92dbc6967e42a90736564574524e846f09759 Mon Sep 17 00:00:00 2001 From: joelchrono12 Date: Thu, 12 Jan 2023 21:27:20 -0600 Subject: [PATCH 07/12] working config, can swap windows now --- config.def.h | 10 +++++----- config.h | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/config.def.h b/config.def.h index ec586e5..52b5299 100644 --- a/config.def.h +++ b/config.def.h @@ -77,7 +77,7 @@ static const char *brightdown[] = { "brightnessctl", "set", "15-", NULL }; //#include "shift-tools.c" -//#include "movestack.c" +#include "movestack.c" #include "X11/XF86keysym.h" static const Key keys[] = { /* modifier key function argument */ @@ -91,10 +91,10 @@ static const Key keys[] = { { MODKEY, XK_b, togglebar, {0} }, { MODKEY, XK_j, focusstack, {.i = +1 } }, { MODKEY, XK_k, focusstack, {.i = -1 } }, - //{ MODKEY|ShiftMask, XK_j, movestack, {.i = +1 } }, - //{ MODKEY|ShiftMask, XK_k, movestack, {.i = -1 } }, - //{ MODKEY, XK_i, incnmaster, {.i = +1 } }, - //{ MODKEY, XK_d, incnmaster, {.i = -1 } }, + { MODKEY|ShiftMask, XK_j, movestack, {.i = +1 } }, + { MODKEY|ShiftMask, XK_k, movestack, {.i = -1 } }, + { MODKEY, XK_i, incnmaster, {.i = +1 } }, + { MODKEY, XK_d, incnmaster, {.i = -1 } }, { MODKEY, XK_h, setmfact, {.f = -0.05} }, { MODKEY, XK_l, setmfact, {.f = +0.05} }, { MODKEY|ShiftMask, XK_Return, zoom, {0} }, diff --git a/config.h b/config.h index ec586e5..52b5299 100644 --- a/config.h +++ b/config.h @@ -77,7 +77,7 @@ static const char *brightdown[] = { "brightnessctl", "set", "15-", NULL }; //#include "shift-tools.c" -//#include "movestack.c" +#include "movestack.c" #include "X11/XF86keysym.h" static const Key keys[] = { /* modifier key function argument */ @@ -91,10 +91,10 @@ static const Key keys[] = { { MODKEY, XK_b, togglebar, {0} }, { MODKEY, XK_j, focusstack, {.i = +1 } }, { MODKEY, XK_k, focusstack, {.i = -1 } }, - //{ MODKEY|ShiftMask, XK_j, movestack, {.i = +1 } }, - //{ MODKEY|ShiftMask, XK_k, movestack, {.i = -1 } }, - //{ MODKEY, XK_i, incnmaster, {.i = +1 } }, - //{ MODKEY, XK_d, incnmaster, {.i = -1 } }, + { MODKEY|ShiftMask, XK_j, movestack, {.i = +1 } }, + { MODKEY|ShiftMask, XK_k, movestack, {.i = -1 } }, + { MODKEY, XK_i, incnmaster, {.i = +1 } }, + { MODKEY, XK_d, incnmaster, {.i = -1 } }, { MODKEY, XK_h, setmfact, {.f = -0.05} }, { MODKEY, XK_l, setmfact, {.f = +0.05} }, { MODKEY|ShiftMask, XK_Return, zoom, {0} }, From 09e3a4932492f910018ada4f3ab2647db3e038b6 Mon Sep 17 00:00:00 2001 From: joelchrono12 Date: Thu, 12 Jan 2023 21:31:08 -0600 Subject: [PATCH 08/12] working configs, can move between tags now --- config.def.h | 16 ++++++++-------- config.h | 16 ++++++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/config.def.h b/config.def.h index 52b5299..28d53e8 100644 --- a/config.def.h +++ b/config.def.h @@ -76,7 +76,7 @@ static const char *brightup[] = { "brightnessctl", "set", "+15", NULL }; static const char *brightdown[] = { "brightnessctl", "set", "15-", NULL }; -//#include "shift-tools.c" +#include "shift-tools.c" #include "movestack.c" #include "X11/XF86keysym.h" static const Key keys[] = { @@ -84,10 +84,10 @@ static const Key keys[] = { { MODKEY, XK_p, spawn, {.v = dmenucmd } }, { MODKEY, XK_r, spawn, {.v = rofirun } }, { MODKEY, XK_Return, spawn, {.v = termcmd } }, - //{ MODKEY|ShiftMask, XK_o, shiftview, { .i = +1 } }, - //{ MODKEY|ShiftMask, XK_i, shiftview, { .i = -1 } }, - //{ MODKEY, XK_Right, shiftview, { .i = +1 } }, - //{ MODKEY, XK_Left, shiftview, { .i = -1 } }, + { MODKEY|ShiftMask, XK_o, shiftview, { .i = +1 } }, + { MODKEY|ShiftMask, XK_i, shiftview, { .i = -1 } }, + { MODKEY, XK_Right, shiftview, { .i = +1 } }, + { MODKEY, XK_Left, shiftview, { .i = -1 } }, { MODKEY, XK_b, togglebar, {0} }, { MODKEY, XK_j, focusstack, {.i = +1 } }, { MODKEY, XK_k, focusstack, {.i = -1 } }, @@ -104,10 +104,10 @@ static const Key keys[] = { { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, { MODKEY, XK_space, setlayout, {0} }, - //{ MODKEY|ShiftMask, XK_Left, shiftboth, { .i = -1 } }, + { MODKEY|ShiftMask, XK_Left, shiftboth, { .i = -1 } }, //{ MODKEY|ControlMask, XK_Left, shiftswaptags, { .i = -1 } }, - //{ MODKEY|ControlMask, XK_Right, shiftswaptags, { .i = +1 } }, - //{ MODKEY|ShiftMask, XK_Right, shiftboth, { .i = +1 } }, + //{ MODKEY|ControlMask, XK_Right, shiftswaptags, { .i = +1 } }, + { MODKEY|ShiftMask, XK_Right, shiftboth, { .i = +1 } }, { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, { MODKEY, XK_0, view, {.ui = ~0 } }, { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, diff --git a/config.h b/config.h index 52b5299..28d53e8 100644 --- a/config.h +++ b/config.h @@ -76,7 +76,7 @@ static const char *brightup[] = { "brightnessctl", "set", "+15", NULL }; static const char *brightdown[] = { "brightnessctl", "set", "15-", NULL }; -//#include "shift-tools.c" +#include "shift-tools.c" #include "movestack.c" #include "X11/XF86keysym.h" static const Key keys[] = { @@ -84,10 +84,10 @@ static const Key keys[] = { { MODKEY, XK_p, spawn, {.v = dmenucmd } }, { MODKEY, XK_r, spawn, {.v = rofirun } }, { MODKEY, XK_Return, spawn, {.v = termcmd } }, - //{ MODKEY|ShiftMask, XK_o, shiftview, { .i = +1 } }, - //{ MODKEY|ShiftMask, XK_i, shiftview, { .i = -1 } }, - //{ MODKEY, XK_Right, shiftview, { .i = +1 } }, - //{ MODKEY, XK_Left, shiftview, { .i = -1 } }, + { MODKEY|ShiftMask, XK_o, shiftview, { .i = +1 } }, + { MODKEY|ShiftMask, XK_i, shiftview, { .i = -1 } }, + { MODKEY, XK_Right, shiftview, { .i = +1 } }, + { MODKEY, XK_Left, shiftview, { .i = -1 } }, { MODKEY, XK_b, togglebar, {0} }, { MODKEY, XK_j, focusstack, {.i = +1 } }, { MODKEY, XK_k, focusstack, {.i = -1 } }, @@ -104,10 +104,10 @@ static const Key keys[] = { { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, { MODKEY, XK_space, setlayout, {0} }, - //{ MODKEY|ShiftMask, XK_Left, shiftboth, { .i = -1 } }, + { MODKEY|ShiftMask, XK_Left, shiftboth, { .i = -1 } }, //{ MODKEY|ControlMask, XK_Left, shiftswaptags, { .i = -1 } }, - //{ MODKEY|ControlMask, XK_Right, shiftswaptags, { .i = +1 } }, - //{ MODKEY|ShiftMask, XK_Right, shiftboth, { .i = +1 } }, + //{ MODKEY|ControlMask, XK_Right, shiftswaptags, { .i = +1 } }, + { MODKEY|ShiftMask, XK_Right, shiftboth, { .i = +1 } }, { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, { MODKEY, XK_0, view, {.ui = ~0 } }, { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, From 5109f8d340a1ee0645172f948839bc73290ae57a Mon Sep 17 00:00:00 2001 From: joelchrono12 Date: Thu, 12 Jan 2023 21:39:34 -0600 Subject: [PATCH 09/12] attachbottom working? --- dwm.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/dwm.c b/dwm.c index e5efb6a..67aa606 100644 --- a/dwm.c +++ b/dwm.c @@ -147,6 +147,7 @@ static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interac 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); @@ -409,6 +410,15 @@ attach(Client *c) c->mon->clients = 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) { @@ -1065,7 +1075,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); @@ -1204,7 +1214,7 @@ void pop(Client *c) { detach(c); - attach(c); + attachbottom(c); focus(c); arrange(c->mon); } @@ -1418,7 +1428,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); @@ -1897,7 +1907,7 @@ updategeom(void) m->clients = c->next; detachstack(c); c->mon = mons; - attach(c); + attachbottom(c); attachstack(c); } if (m == selmon) From 4b0a0136a55b5dfd7854ca5bf8d809f891d1f001 Mon Sep 17 00:00:00 2001 From: joelchrono12 Date: Thu, 12 Jan 2023 21:44:10 -0600 Subject: [PATCH 10/12] fix transparent borders --- drw.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/drw.c b/drw.c index a58a2b4..39db67f 100644 --- a/drw.c +++ b/drw.c @@ -180,16 +180,17 @@ drw_fontset_free(Fnt *font) } } -void + void drw_clr_create(Drw *drw, Clr *dest, const char *clrname) { if (!drw || !dest || !clrname) return; if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen), - DefaultColormap(drw->dpy, drw->screen), - clrname, dest)) + DefaultColormap(drw->dpy, drw->screen), + clrname, dest)) die("error, cannot allocate color '%s'", clrname); + dest->pixel |= 0xff << 24; } /* Wrapper to create color schemes. The caller has to call free(3) on the From 25c997fdc8a4ee34580ae0ff0814928634898ae7 Mon Sep 17 00:00:00 2001 From: joelchrono12 Date: Thu, 12 Jan 2023 22:00:57 -0600 Subject: [PATCH 11/12] autostart --- config.def.h | 5 ++ dwm.c | 58 +++++++++++++- patches/dwm-cool-autostart-6.2.diff | 116 ++++++++++++++++++++++++++++ 3 files changed, 178 insertions(+), 1 deletion(-) create mode 100644 patches/dwm-cool-autostart-6.2.diff diff --git a/config.def.h b/config.def.h index 061ad66..62f99d9 100644 --- a/config.def.h +++ b/config.def.h @@ -18,6 +18,11 @@ static const char *colors[][3] = { [SchemeSel] = { col_gray4, col_cyan, col_cyan }, }; +static const char *const autostart[] = { + "st", NULL, + NULL /* terminate */ +}; + /* tagging */ static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; diff --git a/dwm.c b/dwm.c index e5efb6a..3feb813 100644 --- a/dwm.c +++ b/dwm.c @@ -234,6 +234,7 @@ static int xerror(Display *dpy, XErrorEvent *ee); static int xerrordummy(Display *dpy, XErrorEvent *ee); static int xerrorstart(Display *dpy, XErrorEvent *ee); static void zoom(const Arg *arg); +static void autostart_exec(void); /* variables */ static const char broken[] = "broken"; @@ -275,6 +276,34 @@ static Window root, wmcheckwin; /* compile-time check if all tags fit into an unsigned int bit array. */ struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; +/* dwm will keep pid's of processes from autostart array and kill them at quit */ +static pid_t *autostart_pids; +static size_t autostart_len; + +/* execute command from autostart array */ +static void +autostart_exec() { + const char *const *p; + size_t i = 0; + + /* count entries */ + for (p = autostart; *p; autostart_len++, p++) + while (*++p); + + autostart_pids = malloc(autostart_len * sizeof(pid_t)); + for (p = autostart; *p; i++, p++) { + if ((autostart_pids[i] = fork()) == 0) { + setsid(); + execvp(*p, (char *const *)p); + fprintf(stderr, "dwm: execvp %s\n", *p); + perror(" failed"); + _exit(EXIT_FAILURE); + } + /* skip arguments */ + while (*++p); + } +} + /* function implementations */ void applyrules(Client *c) @@ -1249,6 +1278,16 @@ propertynotify(XEvent *e) void quit(const Arg *arg) { + size_t i; + + /* kill child processes */ + for (i = 0; i < autostart_len; i++) { + if (0 < autostart_pids[i]) { + kill(autostart_pids[i], SIGTERM); + waitpid(autostart_pids[i], NULL, 0); + } + } + running = 0; } @@ -1631,9 +1670,25 @@ showhide(Client *c) void sigchld(int unused) { + pid_t pid; + if (signal(SIGCHLD, sigchld) == SIG_ERR) die("can't install SIGCHLD handler:"); - while (0 < waitpid(-1, NULL, WNOHANG)); + while (0 < (pid = waitpid(-1, NULL, WNOHANG))) { + pid_t *p, *lim; + + if (!(p = autostart_pids)) + continue; + lim = &p[autostart_len]; + + for (; p < lim; p++) { + if (*p == pid) { + *p = -1; + break; + } + } + + } } void @@ -2134,6 +2189,7 @@ main(int argc, char *argv[]) if (!(dpy = XOpenDisplay(NULL))) die("dwm: cannot open display"); checkotherwm(); + autostart_exec(); setup(); #ifdef __OpenBSD__ if (pledge("stdio rpath proc exec", NULL) == -1) diff --git a/patches/dwm-cool-autostart-6.2.diff b/patches/dwm-cool-autostart-6.2.diff new file mode 100644 index 0000000..84a93ea --- /dev/null +++ b/patches/dwm-cool-autostart-6.2.diff @@ -0,0 +1,116 @@ +diff --git a/config.def.h b/config.def.h +index 1c0b587..ed056a4 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -18,6 +18,11 @@ static const char *colors[][3] = { + [SchemeSel] = { col_gray4, col_cyan, col_cyan }, + }; + ++static const char *const autostart[] = { ++ "st", NULL, ++ NULL /* terminate */ ++}; ++ + /* tagging */ + static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; + +diff --git a/dwm.c b/dwm.c +index 9fd0286..1facd56 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -234,6 +234,7 @@ static int xerror(Display *dpy, XErrorEvent *ee); + static int xerrordummy(Display *dpy, XErrorEvent *ee); + static int xerrorstart(Display *dpy, XErrorEvent *ee); + static void zoom(const Arg *arg); ++static void autostart_exec(void); + + /* variables */ + static const char broken[] = "broken"; +@@ -275,6 +276,34 @@ static Window root, wmcheckwin; + /* compile-time check if all tags fit into an unsigned int bit array. */ + struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; + ++/* dwm will keep pid's of processes from autostart array and kill them at quit */ ++static pid_t *autostart_pids; ++static size_t autostart_len; ++ ++/* execute command from autostart array */ ++static void ++autostart_exec() { ++ const char *const *p; ++ size_t i = 0; ++ ++ /* count entries */ ++ for (p = autostart; *p; autostart_len++, p++) ++ while (*++p); ++ ++ autostart_pids = malloc(autostart_len * sizeof(pid_t)); ++ for (p = autostart; *p; i++, p++) { ++ if ((autostart_pids[i] = fork()) == 0) { ++ setsid(); ++ execvp(*p, (char *const *)p); ++ fprintf(stderr, "dwm: execvp %s\n", *p); ++ perror(" failed"); ++ _exit(EXIT_FAILURE); ++ } ++ /* skip arguments */ ++ while (*++p); ++ } ++} ++ + /* function implementations */ + void + applyrules(Client *c) +@@ -1249,6 +1278,16 @@ propertynotify(XEvent *e) + void + quit(const Arg *arg) + { ++ size_t i; ++ ++ /* kill child processes */ ++ for (i = 0; i < autostart_len; i++) { ++ if (0 < autostart_pids[i]) { ++ kill(autostart_pids[i], SIGTERM); ++ waitpid(autostart_pids[i], NULL, 0); ++ } ++ } ++ + running = 0; + } + +@@ -1632,9 +1671,25 @@ showhide(Client *c) + void + sigchld(int unused) + { ++ pid_t pid; ++ + if (signal(SIGCHLD, sigchld) == SIG_ERR) + die("can't install SIGCHLD handler:"); +- while (0 < waitpid(-1, NULL, WNOHANG)); ++ while (0 < (pid = waitpid(-1, NULL, WNOHANG))) { ++ pid_t *p, *lim; ++ ++ if (!(p = autostart_pids)) ++ continue; ++ lim = &p[autostart_len]; ++ ++ for (; p < lim; p++) { ++ if (*p == pid) { ++ *p = -1; ++ break; ++ } ++ } ++ ++ } + } + + void +@@ -2139,6 +2194,7 @@ main(int argc, char *argv[]) + if (!(dpy = XOpenDisplay(NULL))) + die("dwm: cannot open display"); + checkotherwm(); ++ autostart_exec(); + setup(); + #ifdef __OpenBSD__ + if (pledge("stdio rpath proc exec", NULL) == -1) + From 37ae89952a0b81c4c6a3de870257cb52332cd925 Mon Sep 17 00:00:00 2001 From: joelchrono12 Date: Thu, 12 Jan 2023 22:07:50 -0600 Subject: [PATCH 12/12] autostart programs --- config.def.h | 7 ++++++- config.h | 7 +++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/config.def.h b/config.def.h index b6d3158..59fcdc9 100644 --- a/config.def.h +++ b/config.def.h @@ -21,7 +21,12 @@ static const char *colors[][3] = { }; static const char *const autostart[] = { - "st", NULL, + "aslstatus", NULL, + "alacritty", NULL, + "picom", NULL, + "aw-qt", NULL, + "setxkbmap","-layout","latam", NULL, + "nm-applet", NULL, NULL /* terminate */ }; diff --git a/config.h b/config.h index 28d53e8..dabe96d 100644 --- a/config.h +++ b/config.h @@ -20,6 +20,13 @@ static const char *colors[][3] = { [SchemeSel] = { col_gray4, col_cyan, col_cyan }, }; +static const char *const autostart[] = { + "aslstatus", NULL, + "alacritty", NULL, + "nm-applet", NULL, + NULL /* terminate */ +}; + /* tagging */ static const char *tags[] = { "www", "{}", "[/]", "(~)", "|V|", ">_" };