From e216d5b8813ed4a1ac07ec8350c7021b7c44006f Mon Sep 17 00:00:00 2001 From: c Date: Sat, 25 Nov 2023 22:03:59 -0500 Subject: Initial commit by me. --- patches/dwm-actualfullscreen-20211013-cb3f58a.diff | 68 ++ patches/dwm-barpadding-20211020-a786211.diff | 118 ++++ patches/dwm-fullgaps-6.4-resetgaps.diff | 28 + patches/dwm-fullgaps-6.4.diff | 94 +++ patches/dwm-hide_vacant_tags-6.3.diff | 39 ++ patches/dwm-movestack-20211115-a786211.diff | 95 +++ patches/dwm-pango-20230520-e81f17d.diff | 703 +++++++++++++++++++++ patches/dwm-xresources-6.2.diff | 235 +++++++ 8 files changed, 1380 insertions(+) create mode 100644 patches/dwm-actualfullscreen-20211013-cb3f58a.diff create mode 100644 patches/dwm-barpadding-20211020-a786211.diff create mode 100644 patches/dwm-fullgaps-6.4-resetgaps.diff create mode 100644 patches/dwm-fullgaps-6.4.diff create mode 100644 patches/dwm-hide_vacant_tags-6.3.diff create mode 100644 patches/dwm-movestack-20211115-a786211.diff create mode 100644 patches/dwm-pango-20230520-e81f17d.diff create mode 100644 patches/dwm-xresources-6.2.diff (limited to 'patches') diff --git a/patches/dwm-actualfullscreen-20211013-cb3f58a.diff b/patches/dwm-actualfullscreen-20211013-cb3f58a.diff new file mode 100644 index 0000000..d3be230 --- /dev/null +++ b/patches/dwm-actualfullscreen-20211013-cb3f58a.diff @@ -0,0 +1,68 @@ +From eea13010ffc3983392857ee1e3804e3aa1064d7a Mon Sep 17 00:00:00 2001 +From: Soenke Lambert +Date: Wed, 13 Oct 2021 18:21:09 +0200 +Subject: [PATCH] Fullscreen current window with [Alt]+[Shift]+[f] + +This actually fullscreens a window, instead of just hiding the statusbar +and applying the monocle layout. +--- + config.def.h | 1 + + dwm.1 | 3 +++ + dwm.c | 8 ++++++++ + 3 files changed, 12 insertions(+) + +diff --git a/config.def.h b/config.def.h +index 1c0b587..8cd3204 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -78,6 +78,7 @@ static Key keys[] = { + { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, + { MODKEY, XK_space, setlayout, {0} }, + { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, ++ { MODKEY|ShiftMask, XK_f, togglefullscr, {0} }, + { MODKEY, XK_0, view, {.ui = ~0 } }, + { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, + { MODKEY, XK_comma, focusmon, {.i = -1 } }, +diff --git a/dwm.1 b/dwm.1 +index 13b3729..a368d05 100644 +--- a/dwm.1 ++++ b/dwm.1 +@@ -116,6 +116,9 @@ Zooms/cycles focused window to/from master area (tiled layouts only). + .B Mod1\-Shift\-c + Close focused window. + .TP ++.B Mod1\-Shift\-f ++Toggle fullscreen for focused window. ++.TP + .B Mod1\-Shift\-space + Toggle focused window between tiled and floating state. + .TP +diff --git a/dwm.c b/dwm.c +index 4465af1..c1b899a 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -211,6 +211,7 @@ static void tagmon(const Arg *arg); + static void tile(Monitor *); + static void togglebar(const Arg *arg); + static void togglefloating(const Arg *arg); ++static void togglefullscr(const Arg *arg); + static void toggletag(const Arg *arg); + static void toggleview(const Arg *arg); + static void unfocus(Client *c, int setfocus); +@@ -1719,6 +1720,13 @@ togglefloating(const Arg *arg) + arrange(selmon); + } + ++void ++togglefullscr(const Arg *arg) ++{ ++ if(selmon->sel) ++ setfullscreen(selmon->sel, !selmon->sel->isfullscreen); ++} ++ + void + toggletag(const Arg *arg) + { +-- +2.30.2 + diff --git a/patches/dwm-barpadding-20211020-a786211.diff b/patches/dwm-barpadding-20211020-a786211.diff new file mode 100644 index 0000000..7842181 --- /dev/null +++ b/patches/dwm-barpadding-20211020-a786211.diff @@ -0,0 +1,118 @@ +From a3cfb215f7f647d83d67e33df8f33a73e43bd65f Mon Sep 17 00:00:00 2001 +From: Bakkeby +Date: Wed, 20 Oct 2021 09:14:07 +0200 +Subject: [PATCH] barpadding: adds space between the statusbar and the edge of + the screen + +--- + config.def.h | 2 ++ + dwm.c | 25 +++++++++++++++---------- + 2 files changed, 17 insertions(+), 10 deletions(-) + +diff --git a/config.def.h b/config.def.h +index a2ac963..f0b739f 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -5,6 +5,8 @@ static const unsigned int borderpx = 1; /* 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 int vertpad = 10; /* vertical padding of bar */ ++static const int sidepad = 10; /* horizontal padding of bar */ + static const char *fonts[] = { "monospace:size=10" }; + static const char dmenufont[] = "monospace:size=10"; + static const char col_gray1[] = "#222222"; +diff --git a/dwm.c b/dwm.c +index 5e4d494..df6d0d7 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -242,6 +242,8 @@ static int screen; + static int sw, sh; /* X display screen geometry width, height */ + static int bh, blw = 0; /* bar geometry */ + static int lrpad; /* sum of left and right padding for text */ ++static int vp; /* vertical padding for bar */ ++static int sp; /* side padding for bar */ + static int (*xerrorxlib)(Display *, XErrorEvent *); + static unsigned int numlockmask = 0; + static void (*handler[LASTEvent]) (XEvent *) = { +@@ -568,7 +570,7 @@ configurenotify(XEvent *e) + for (c = m->clients; c; c = c->next) + if (c->isfullscreen) + resizeclient(c, m->mx, m->my, m->mw, m->mh); +- XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh); ++ XMoveResizeWindow(dpy, m->barwin, m->wx + sp, m->by + vp, m->ww - 2 * sp, bh); + } + focus(NULL); + arrange(NULL); +@@ -706,7 +708,7 @@ drawbar(Monitor *m) + if (m == selmon) { /* status is only drawn on selected monitor */ + drw_setscheme(drw, scheme[SchemeNorm]); + tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ +- drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0); ++ drw_text(drw, m->ww - tw - 2 * sp, 0, tw, bh, 0, stext, 0); + } + + for (c = m->clients; c; c = c->next) { +@@ -732,12 +734,12 @@ drawbar(Monitor *m) + if ((w = m->ww - tw - x) > bh) { + if (m->sel) { + drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); +- drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); ++ drw_text(drw, x, 0, w - 2 * sp, bh, lrpad / 2, m->sel->name, 0); + if (m->sel->isfloating) + drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0); + } else { + drw_setscheme(drw, scheme[SchemeNorm]); +- drw_rect(drw, x, 0, w, bh, 1, 1); ++ drw_rect(drw, x, 0, w - 2 * sp, bh, 1, 1); + } + } + drw_map(drw, m->barwin, 0, 0, m->ww, bh); +@@ -1547,7 +1549,10 @@ setup(void) + die("no fonts could be loaded."); + lrpad = drw->fonts->h; + bh = drw->fonts->h + 2; ++ sp = sidepad; ++ vp = (topbar == 1) ? vertpad : - vertpad; + updategeom(); ++ + /* init atoms */ + utf8string = XInternAtom(dpy, "UTF8_STRING", False); + wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False); +@@ -1704,7 +1709,7 @@ togglebar(const Arg *arg) + { + selmon->showbar = !selmon->showbar; + updatebarpos(selmon); +- XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); ++ XMoveResizeWindow(dpy, selmon->barwin, selmon->wx + sp, selmon->by + vp, selmon->ww - 2 * sp, bh); + arrange(selmon); + } + +@@ -1814,7 +1819,7 @@ updatebars(void) + for (m = mons; m; m = m->next) { + if (m->barwin) + continue; +- m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen), ++ m->barwin = XCreateWindow(dpy, root, m->wx + sp, m->by + vp, m->ww - 2 * sp, bh, 0, DefaultDepth(dpy, screen), + CopyFromParent, DefaultVisual(dpy, screen), + CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); + XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); +@@ -1829,11 +1834,11 @@ updatebarpos(Monitor *m) + m->wy = m->my; + m->wh = m->mh; + if (m->showbar) { +- m->wh -= bh; +- m->by = m->topbar ? m->wy : m->wy + m->wh; +- m->wy = m->topbar ? m->wy + bh : m->wy; ++ m->wh = m->wh - vertpad - bh; ++ m->by = m->topbar ? m->wy : m->wy + m->wh + vertpad; ++ m->wy = m->topbar ? m->wy + bh + vp : m->wy; + } else +- m->by = -bh; ++ m->by = -bh - vp; + } + + void +-- +2.33.0 + diff --git a/patches/dwm-fullgaps-6.4-resetgaps.diff b/patches/dwm-fullgaps-6.4-resetgaps.diff new file mode 100644 index 0000000..93e7443 --- /dev/null +++ b/patches/dwm-fullgaps-6.4-resetgaps.diff @@ -0,0 +1,28 @@ +*** dwm.c 2023-11-24 00:59:18.482039176 -0500 +--- dwm2.c 2023-11-24 01:00:11.708584155 -0500 +*************** static void setclientstate(Client *c, lo +*** 218,223 **** +--- 218,224 ---- + static void setfocus(Client *c); + static void setfullscreen(Client *c, int fullscreen); + static void setgaps(const Arg *arg); ++ static void resetgaps(const Arg *arg); + static void setlayout(const Arg *arg); + static void setmfact(const Arg *arg); + static void setup(void); +*************** setgaps(const Arg *arg) +*** 1541,1546 **** +--- 1542,1554 ---- + arrange(selmon); + } + ++ void ++ resetgaps(const Arg *arg) ++ { ++ selmon->gappx = gappx; ++ arrange(selmon); ++ } ++ + void + setlayout(const Arg *arg) + { diff --git a/patches/dwm-fullgaps-6.4.diff b/patches/dwm-fullgaps-6.4.diff new file mode 100644 index 0000000..dc52139 --- /dev/null +++ b/patches/dwm-fullgaps-6.4.diff @@ -0,0 +1,94 @@ +diff -up a/config.def.h b/config.def.h +--- a/config.def.h ++++ b/config.def.h +@@ -2,6 +2,7 @@ + + /* appearance */ + static const unsigned int borderpx = 1; /* border pixel of windows */ ++static const unsigned int gappx = 5; /* gaps between 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 */ +@@ -85,6 +86,9 @@ 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, XK_minus, setgaps, {.i = -1 } }, ++ { MODKEY, XK_equal, setgaps, {.i = +1 } }, ++ { MODKEY|ShiftMask, XK_equal, setgaps, {.i = 0 } }, + TAGKEYS( XK_1, 0) + TAGKEYS( XK_2, 1) + TAGKEYS( XK_3, 2) +diff -up a/dwm.c b/dwm.c +--- a/dwm.c 2023-04-30 ++++ b/dwm.c 2023-04-30 +@@ -119,6 +119,7 @@ struct Monitor { + int by; /* bar geometry */ + int mx, my, mw, mh; /* screen size */ + int wx, wy, ww, wh; /* window area */ ++ int gappx; /* gaps between windows */ + unsigned int seltags; + unsigned int sellt; + unsigned int tagset[2]; +@@ -200,6 +201,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); +@@ -641,6 +643,7 @@ createmon(void) + m->nmaster = nmaster; + m->showbar = showbar; + m->topbar = topbar; ++ m->gappx = gappx; + m->lt[0] = &layouts[0]; + m->lt[1] = &layouts[1 % LENGTH(layouts)]; + strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); +@@ -1508,6 +1511,16 @@ setfullscreen(Client *c, int fullscreen) + } + + void ++setgaps(const Arg *arg) ++{ ++ if ((arg->i == 0) || (selmon->gappx + arg->i < 0)) ++ selmon->gappx = 0; ++ else ++ selmon->gappx += arg->i; ++ arrange(selmon); ++} ++ ++void + setlayout(const Arg *arg) + { + if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) +@@ -1697,18 +1710,18 @@ tile(Monitor *m) + 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); ++ mw = m->ww - m->gappx; ++ for (i = 0, my = ty = m->gappx, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) ++ if (i < m->nmaster) { ++ h = (m->wh - my) / (MIN(n, m->nmaster) - i) - m->gappx; ++ resize(c, m->wx + m->gappx, m->wy + my, mw - (2*c->bw) - m->gappx, h - (2*c->bw), 0); ++ if (my + HEIGHT(c) + m->gappx < m->wh) ++ my += HEIGHT(c) + m->gappx; + } 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); ++ h = (m->wh - ty) / (n - i) - m->gappx; ++ resize(c, m->wx + mw + m->gappx, m->wy + ty, m->ww - mw - (2*c->bw) - 2*m->gappx, h - (2*c->bw), 0); ++ if (ty + HEIGHT(c) + m->gappx < m->wh) ++ ty += HEIGHT(c) + m->gappx; + } + } diff --git a/patches/dwm-hide_vacant_tags-6.3.diff b/patches/dwm-hide_vacant_tags-6.3.diff new file mode 100644 index 0000000..0ccc7fc --- /dev/null +++ b/patches/dwm-hide_vacant_tags-6.3.diff @@ -0,0 +1,39 @@ +diff --git a/dwm.c b/dwm.c +index a96f33c..f2da729 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -432,9 +432,15 @@ buttonpress(XEvent *e) + } + if (ev->window == selmon->barwin) { + i = x = 0; +- do ++ unsigned int occ = 0; ++ for(c = m->clients; c; c=c->next) ++ occ |= c->tags; ++ do { ++ /* Do not reserve space for vacant tags */ ++ if (!(occ & 1 << i || m->tagset[m->seltags] & 1 << i)) ++ continue; + x += TEXTW(tags[i]); +- while (ev->x >= x && ++i < LENGTH(tags)); ++ } while (ev->x >= x && ++i < LENGTH(tags)); + if (i < LENGTH(tags)) { + click = ClkTagBar; + arg.ui = 1 << i; +@@ -719,13 +725,12 @@ drawbar(Monitor *m) + } + x = 0; + for (i = 0; i < LENGTH(tags); i++) { ++ /* Do not draw vacant tags */ ++ if(!(occ & 1 << i || m->tagset[m->seltags] & 1 << i)) ++ continue; + w = TEXTW(tags[i]); + drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); + drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i); +- if (occ & 1 << i) +- drw_rect(drw, x + boxs, boxs, boxw, boxw, +- m == selmon && selmon->sel && selmon->sel->tags & 1 << i, +- urg & 1 << i); + x += w; + } + w = blw = TEXTW(m->ltsymbol); 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-pango-20230520-e81f17d.diff b/patches/dwm-pango-20230520-e81f17d.diff new file mode 100644 index 0000000..882dd8b --- /dev/null +++ b/patches/dwm-pango-20230520-e81f17d.diff @@ -0,0 +1,703 @@ +From 47099f4e65801269e7ec69bfd1f3c209b63da882 Mon Sep 17 00:00:00 2001 +From: Khalid Bin Walid +Date: Sat, 20 May 2023 20:38:49 +0900 +Subject: [PATCH 1/2] apply dwm-pango patch + +--- + config.def.h | 2 +- + config.mk | 4 +- + drw.c | 325 ++++++++++++++------------------------------------- + drw.h | 19 ++- + dwm.c | 28 ++--- + util.h | 4 + + 6 files changed, 117 insertions(+), 265 deletions(-) + +diff --git a/config.def.h b/config.def.h +index 9efa774..ef0e1b8 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -5,7 +5,7 @@ static const unsigned int borderpx = 1; /* 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 font[] = "monospace 10"; + static const char dmenufont[] = "monospace:size=10"; + static const char col_gray1[] = "#222222"; + static const char col_gray2[] = "#444444"; +diff --git a/config.mk b/config.mk +index ba64d3d..96c25af 100644 +--- a/config.mk ++++ b/config.mk +@@ -22,8 +22,8 @@ FREETYPEINC = /usr/include/freetype2 + #MANPREFIX = ${PREFIX}/man + + # includes and libs +-INCS = -I${X11INC} -I${FREETYPEINC} +-LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} ++INCS = -I${X11INC} -I${FREETYPEINC} `pkg-config --cflags xft pango pangoxft` ++LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} `pkg-config --libs xft pango pangoxft` + + # flags + CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} +diff --git a/drw.c b/drw.c +index a58a2b4..d7ebfd8 100644 +--- a/drw.c ++++ b/drw.c +@@ -4,62 +4,12 @@ + #include + #include + #include ++#include ++#include + + #include "drw.h" + #include "util.h" + +-#define UTF_INVALID 0xFFFD +-#define UTF_SIZ 4 +- +-static const unsigned char utfbyte[UTF_SIZ + 1] = {0x80, 0, 0xC0, 0xE0, 0xF0}; +-static const unsigned char utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8}; +-static const long utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000}; +-static const long utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF}; +- +-static long +-utf8decodebyte(const char c, size_t *i) +-{ +- for (*i = 0; *i < (UTF_SIZ + 1); ++(*i)) +- if (((unsigned char)c & utfmask[*i]) == utfbyte[*i]) +- return (unsigned char)c & ~utfmask[*i]; +- return 0; +-} +- +-static size_t +-utf8validate(long *u, size_t i) +-{ +- if (!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF)) +- *u = UTF_INVALID; +- for (i = 1; *u > utfmax[i]; ++i) +- ; +- return i; +-} +- +-static size_t +-utf8decode(const char *c, long *u, size_t clen) +-{ +- size_t i, j, len, type; +- long udecoded; +- +- *u = UTF_INVALID; +- if (!clen) +- return 0; +- udecoded = utf8decodebyte(c[0], &len); +- if (!BETWEEN(len, 1, UTF_SIZ)) +- return 1; +- for (i = 1, j = 1; i < clen && j < len; ++i, ++j) { +- udecoded = (udecoded << 6) | utf8decodebyte(c[i], &type); +- if (type) +- return j; +- } +- if (j < len) +- return 0; +- *u = udecoded; +- utf8validate(u, len); +- +- return len; +-} +- + Drw * + drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h) + { +@@ -95,50 +45,41 @@ drw_free(Drw *drw) + { + XFreePixmap(drw->dpy, drw->drawable); + XFreeGC(drw->dpy, drw->gc); +- drw_fontset_free(drw->fonts); ++ drw_font_free(drw->font); + free(drw); + } + + /* This function is an implementation detail. Library users should use +- * drw_fontset_create instead. ++ * drw_font_create instead. + */ + static Fnt * +-xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern) ++xfont_create(Drw *drw, const char *fontname) + { + Fnt *font; +- XftFont *xfont = NULL; +- FcPattern *pattern = NULL; +- +- if (fontname) { +- /* Using the pattern found at font->xfont->pattern does not yield the +- * same substitution results as using the pattern returned by +- * FcNameParse; using the latter results in the desired fallback +- * behaviour whereas the former just results in missing-character +- * rectangles being drawn, at least with some fonts. */ +- if (!(xfont = XftFontOpenName(drw->dpy, drw->screen, fontname))) { +- fprintf(stderr, "error, cannot load font from name: '%s'\n", fontname); +- return NULL; +- } +- if (!(pattern = FcNameParse((FcChar8 *) fontname))) { +- fprintf(stderr, "error, cannot parse font name to pattern: '%s'\n", fontname); +- XftFontClose(drw->dpy, xfont); +- return NULL; +- } +- } else if (fontpattern) { +- if (!(xfont = XftFontOpenPattern(drw->dpy, fontpattern))) { +- fprintf(stderr, "error, cannot load font from pattern.\n"); +- return NULL; +- } +- } else { ++ PangoFontMap *fontmap; ++ PangoContext *context; ++ PangoFontDescription *desc; ++ PangoFontMetrics *metrics; ++ ++ if (!fontname) { + die("no font specified."); + } + + font = ecalloc(1, sizeof(Fnt)); +- font->xfont = xfont; +- font->pattern = pattern; +- font->h = xfont->ascent + xfont->descent; + font->dpy = drw->dpy; + ++ fontmap = pango_xft_get_font_map(drw->dpy, drw->screen); ++ context = pango_font_map_create_context(fontmap); ++ desc = pango_font_description_from_string(fontname); ++ font->layout = pango_layout_new(context); ++ pango_layout_set_font_description(font->layout, desc); ++ ++ metrics = pango_context_get_metrics(context, desc, NULL); ++ font->h = pango_font_metrics_get_height(metrics) / PANGO_SCALE; ++ ++ pango_font_metrics_unref(metrics); ++ g_object_unref(context); ++ + return font; + } + +@@ -147,35 +88,28 @@ xfont_free(Fnt *font) + { + if (!font) + return; +- if (font->pattern) +- FcPatternDestroy(font->pattern); +- XftFontClose(font->dpy, font->xfont); ++ if (font->layout) ++ g_object_unref(font->layout); + free(font); + } + + Fnt* +-drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount) ++drw_font_create(Drw* drw, const char font[]) + { +- Fnt *cur, *ret = NULL; +- size_t i; ++ Fnt *fnt = NULL; + +- if (!drw || !fonts) ++ if (!drw || !font) + return NULL; + +- for (i = 1; i <= fontcount; i++) { +- if ((cur = xfont_create(drw, fonts[fontcount - i], NULL))) { +- cur->next = ret; +- ret = cur; +- } +- } +- return (drw->fonts = ret); ++ fnt = xfont_create(drw, font); ++ ++ return (drw->font = fnt); + } + + void +-drw_fontset_free(Fnt *font) ++drw_font_free(Fnt *font) + { + if (font) { +- drw_fontset_free(font->next); + xfont_free(font); + } + } +@@ -187,8 +121,8 @@ drw_clr_create(Drw *drw, Clr *dest, const char *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); + } + +@@ -209,13 +143,6 @@ drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) + return ret; + } + +-void +-drw_setfontset(Drw *drw, Fnt *set) +-{ +- if (drw) +- drw->fonts = set; +-} +- + void + drw_setscheme(Drw *drw, Clr *scm) + { +@@ -236,26 +163,16 @@ drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int + } + + int +-drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert) ++drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert, Bool markup) + { +- int i, ty, ellipsis_x = 0; +- unsigned int tmpw, ew, ellipsis_w = 0, ellipsis_len; ++ char buf[1024]; ++ int i, ty, th; ++ unsigned int ew, eh; + XftDraw *d = NULL; +- Fnt *usedfont, *curfont, *nextfont; +- int utf8strlen, utf8charlen, render = x || y || w || h; +- long utf8codepoint = 0; +- const char *utf8str; +- FcCharSet *fccharset; +- FcPattern *fcpattern; +- FcPattern *match; +- XftResult result; +- int charexists = 0, overflow = 0; +- /* keep track of a couple codepoints for which we have no match. */ +- enum { nomatches_len = 64 }; +- static struct { long codepoint[nomatches_len]; unsigned int idx; } nomatches; +- static unsigned int ellipsis_width = 0; +- +- if (!drw || (render && (!drw->scheme || !w)) || !text || !drw->fonts) ++ size_t len; ++ int render = x || y || w || h; ++ ++ if (!drw || (render && !drw->scheme) || !text || !drw->font) + return 0; + + if (!render) { +@@ -264,120 +181,47 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp + XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel); + XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); + d = XftDrawCreate(drw->dpy, drw->drawable, +- DefaultVisual(drw->dpy, drw->screen), +- DefaultColormap(drw->dpy, drw->screen)); ++ DefaultVisual(drw->dpy, drw->screen), ++ DefaultColormap(drw->dpy, drw->screen)); + x += lpad; + w -= lpad; + } + +- usedfont = drw->fonts; +- if (!ellipsis_width && render) +- ellipsis_width = drw_fontset_getwidth(drw, "..."); +- while (1) { +- ew = ellipsis_len = utf8strlen = 0; +- utf8str = text; +- nextfont = NULL; +- while (*text) { +- utf8charlen = utf8decode(text, &utf8codepoint, UTF_SIZ); +- for (curfont = drw->fonts; curfont; curfont = curfont->next) { +- charexists = charexists || XftCharExists(drw->dpy, curfont->xfont, utf8codepoint); +- if (charexists) { +- drw_font_getexts(curfont, text, utf8charlen, &tmpw, NULL); +- if (ew + ellipsis_width <= w) { +- /* keep track where the ellipsis still fits */ +- ellipsis_x = x + ew; +- ellipsis_w = w - ew; +- ellipsis_len = utf8strlen; +- } +- +- if (ew + tmpw > w) { +- overflow = 1; +- /* called from drw_fontset_getwidth_clamp(): +- * it wants the width AFTER the overflow +- */ +- if (!render) +- x += tmpw; +- else +- utf8strlen = ellipsis_len; +- } else if (curfont == usedfont) { +- utf8strlen += utf8charlen; +- text += utf8charlen; +- ew += tmpw; +- } else { +- nextfont = curfont; +- } +- break; +- } +- } ++ len = strlen(text); + +- if (overflow || !charexists || nextfont) +- break; +- else +- charexists = 0; ++ if (len) { ++ drw_font_getexts(drw->font, text, len, &ew, &eh, markup); ++ th = eh; ++ /* shorten text if necessary */ ++ for (len = MIN(len, sizeof(buf) - 1); len && ew > w; len--) { ++ drw_font_getexts(drw->font, text, len, &ew, &eh, markup); ++ if (eh > th) ++ th = eh; + } + +- if (utf8strlen) { ++ if (len) { ++ memcpy(buf, text, len); ++ buf[len] = '\0'; ++ if (len < strlen(text)) ++ for (i = len; i && i > len - 3; buf[--i] = '.') ++ ; /* NOP */ ++ + if (render) { +- ty = y + (h - usedfont->h) / 2 + usedfont->xfont->ascent; +- XftDrawStringUtf8(d, &drw->scheme[invert ? ColBg : ColFg], +- usedfont->xfont, x, ty, (XftChar8 *)utf8str, utf8strlen); ++ ty = y + (h - th) / 2; ++ if(markup) ++ pango_layout_set_markup(drw->font->layout, buf, len); ++ else ++ pango_layout_set_text(drw->font->layout, buf, len); ++ pango_xft_render_layout(d, &drw->scheme[invert ? ColBg : ColFg], ++ drw->font->layout, x * PANGO_SCALE, ty * PANGO_SCALE); ++ if(markup) /* clear markup attributes */ ++ pango_layout_set_attributes(drw->font->layout, NULL); + } + x += ew; + w -= ew; + } +- if (render && overflow) +- drw_text(drw, ellipsis_x, y, ellipsis_w, h, 0, "...", invert); +- +- if (!*text || overflow) { +- break; +- } else if (nextfont) { +- charexists = 0; +- usedfont = nextfont; +- } else { +- /* Regardless of whether or not a fallback font is found, the +- * character must be drawn. */ +- charexists = 1; +- +- for (i = 0; i < nomatches_len; ++i) { +- /* avoid calling XftFontMatch if we know we won't find a match */ +- if (utf8codepoint == nomatches.codepoint[i]) +- goto no_match; +- } +- +- fccharset = FcCharSetCreate(); +- FcCharSetAddChar(fccharset, utf8codepoint); +- +- if (!drw->fonts->pattern) { +- /* Refer to the comment in xfont_create for more information. */ +- die("the first font in the cache must be loaded from a font string."); +- } +- +- fcpattern = FcPatternDuplicate(drw->fonts->pattern); +- FcPatternAddCharSet(fcpattern, FC_CHARSET, fccharset); +- FcPatternAddBool(fcpattern, FC_SCALABLE, FcTrue); +- +- FcConfigSubstitute(NULL, fcpattern, FcMatchPattern); +- FcDefaultSubstitute(fcpattern); +- match = XftFontMatch(drw->dpy, drw->screen, fcpattern, &result); +- +- FcCharSetDestroy(fccharset); +- FcPatternDestroy(fcpattern); +- +- if (match) { +- usedfont = xfont_create(drw, NULL, match); +- if (usedfont && XftCharExists(drw->dpy, usedfont->xfont, utf8codepoint)) { +- for (curfont = drw->fonts; curfont->next; curfont = curfont->next) +- ; /* NOP */ +- curfont->next = usedfont; +- } else { +- xfont_free(usedfont); +- nomatches.codepoint[++nomatches.idx % nomatches_len] = utf8codepoint; +-no_match: +- usedfont = drw->fonts; +- } +- } +- } + } ++ + if (d) + XftDrawDestroy(d); + +@@ -395,35 +239,40 @@ drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h) + } + + unsigned int +-drw_fontset_getwidth(Drw *drw, const char *text) ++drw_font_getwidth(Drw *drw, const char *text, Bool markup) + { +- if (!drw || !drw->fonts || !text) ++ if (!drw || !drw->font || !text) + return 0; +- return drw_text(drw, 0, 0, 0, 0, 0, text, 0); ++ return drw_text(drw, 0, 0, 0, 0, 0, text, 0, markup); + } + + unsigned int +-drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n) ++drw_font_getwidth_clamp(Drw *drw, const char *text, unsigned int n, Bool markup) + { + unsigned int tmp = 0; +- if (drw && drw->fonts && text && n) +- tmp = drw_text(drw, 0, 0, 0, 0, 0, text, n); ++ if (drw && drw->font && text && n) ++ tmp = drw_text(drw, 0, 0, 0, 0, 0, text, n, markup); + return MIN(n, tmp); + } + + void +-drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h) ++drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h, Bool markup) + { +- XGlyphInfo ext; +- + if (!font || !text) + return; + +- XftTextExtentsUtf8(font->dpy, font->xfont, (XftChar8 *)text, len, &ext); ++ PangoRectangle r; ++ if(markup) ++ pango_layout_set_markup(font->layout, text, len); ++ else ++ pango_layout_set_text(font->layout, text, len); ++ pango_layout_get_extents(font->layout, 0, &r); ++ if(markup) /* clear markup attributes */ ++ pango_layout_set_attributes(font->layout, NULL); + if (w) +- *w = ext.xOff; ++ *w = r.width / PANGO_SCALE; + if (h) +- *h = font->h; ++ *h = r.height / PANGO_SCALE; + } + + Cur * +diff --git a/drw.h b/drw.h +index 6471431..9487c72 100644 +--- a/drw.h ++++ b/drw.h +@@ -7,9 +7,7 @@ typedef struct { + typedef struct Fnt { + Display *dpy; + unsigned int h; +- XftFont *xfont; +- FcPattern *pattern; +- struct Fnt *next; ++ PangoLayout *layout; + } Fnt; + + enum { ColFg, ColBg, ColBorder }; /* Clr scheme index */ +@@ -23,7 +21,7 @@ typedef struct { + Drawable drawable; + GC gc; + Clr *scheme; +- Fnt *fonts; ++ Fnt *font; + } Drw; + + /* Drawable abstraction */ +@@ -32,11 +30,11 @@ void drw_resize(Drw *drw, unsigned int w, unsigned int h); + void drw_free(Drw *drw); + + /* Fnt abstraction */ +-Fnt *drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount); +-void drw_fontset_free(Fnt* set); +-unsigned int drw_fontset_getwidth(Drw *drw, const char *text); +-unsigned int drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n); +-void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h); ++Fnt *drw_font_create(Drw* drw, const char font[]); ++void drw_font_free(Fnt* set); ++unsigned int drw_font_getwidth(Drw *drw, const char *text, Bool markup); ++unsigned int drw_font_getwidth_clamp(Drw *drw, const char *text, unsigned int n, Bool markup); ++void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h, Bool markup); + + /* Colorscheme abstraction */ + void drw_clr_create(Drw *drw, Clr *dest, const char *clrname); +@@ -47,12 +45,11 @@ Cur *drw_cur_create(Drw *drw, int shape); + void drw_cur_free(Drw *drw, Cur *cursor); + + /* Drawing context manipulation */ +-void drw_setfontset(Drw *drw, Fnt *set); + void drw_setscheme(Drw *drw, Clr *scm); + + /* Drawing functions */ + void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert); +-int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert); ++int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert, Bool markup); + + /* Map functions */ + void drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h); +diff --git a/dwm.c b/dwm.c +index f1d86b2..e535d73 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -40,6 +40,7 @@ + #include + #endif /* XINERAMA */ + #include ++#include + + #include "drw.h" + #include "util.h" +@@ -55,7 +56,8 @@ + #define WIDTH(X) ((X)->w + 2 * (X)->bw) + #define HEIGHT(X) ((X)->h + 2 * (X)->bw) + #define TAGMASK ((1 << LENGTH(tags)) - 1) +-#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) ++#define TEXTW(X) (drw_font_getwidth(drw, (X), False) + lrpad) ++#define TEXTWM(X) (drw_font_getwidth(drw, (X), True) + lrpad) + + /* enums */ + enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ +@@ -236,7 +238,7 @@ static void zoom(const Arg *arg); + + /* variables */ + static const char broken[] = "broken"; +-static char stext[256]; ++static char stext[512]; + static int screen; + static int sw, sh; /* X display screen geometry width, height */ + static int bh; /* bar height */ +@@ -441,7 +443,7 @@ buttonpress(XEvent *e) + arg.ui = 1 << i; + } else if (ev->x < x + TEXTW(selmon->ltsymbol)) + click = ClkLtSymbol; +- else if (ev->x > selmon->ww - (int)TEXTW(stext)) ++ else if (ev->x > selmon->ww - (int)TEXTWM(stext)) + click = ClkStatusText; + else + click = ClkWinTitle; +@@ -699,8 +701,8 @@ void + drawbar(Monitor *m) + { + int x, w, tw = 0; +- int boxs = drw->fonts->h / 9; +- int boxw = drw->fonts->h / 6 + 2; ++ int boxs = drw->font->h / 9; ++ int boxw = drw->font->h / 6 + 2; + unsigned int i, occ = 0, urg = 0; + Client *c; + +@@ -710,8 +712,8 @@ drawbar(Monitor *m) + /* draw status first so it can be overdrawn by tags later */ + if (m == selmon) { /* status is only drawn on selected monitor */ + drw_setscheme(drw, scheme[SchemeNorm]); +- tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ +- drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0); ++ tw = TEXTWM(stext) - lrpad + 2; /* 2px right padding */ ++ drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0, True); + } + + for (c = m->clients; c; c = c->next) { +@@ -723,7 +725,7 @@ drawbar(Monitor *m) + for (i = 0; i < LENGTH(tags); i++) { + w = TEXTW(tags[i]); + drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); +- drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i); ++ drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i, False); + if (occ & 1 << i) + drw_rect(drw, x + boxs, boxs, boxw, boxw, + m == selmon && selmon->sel && selmon->sel->tags & 1 << i, +@@ -732,12 +734,12 @@ drawbar(Monitor *m) + } + w = TEXTW(m->ltsymbol); + drw_setscheme(drw, scheme[SchemeNorm]); +- x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); ++ x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0, False); + + if ((w = m->ww - tw - x) > bh) { + if (m->sel) { + drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); +- drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); ++ drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0, False); + if (m->sel->isfloating) + drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0); + } else { +@@ -1559,10 +1561,10 @@ setup(void) + sh = DisplayHeight(dpy, screen); + root = RootWindow(dpy, screen); + drw = drw_create(dpy, screen, root, sw, sh); +- if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) ++ if (!drw_font_create(drw, font)) + die("no fonts could be loaded."); +- lrpad = drw->fonts->h; +- bh = drw->fonts->h + 2; ++ lrpad = drw->font->h; ++ bh = drw->font->h + 2; + updategeom(); + /* init atoms */ + utf8string = XInternAtom(dpy, "UTF8_STRING", False); +diff --git a/util.h b/util.h +index f633b51..531ab25 100644 +--- a/util.h ++++ b/util.h +@@ -1,7 +1,11 @@ + /* See LICENSE file for copyright and license details. */ + ++#ifndef MAX + #define MAX(A, B) ((A) > (B) ? (A) : (B)) ++#endif ++#ifndef MIN + #define MIN(A, B) ((A) < (B) ? (A) : (B)) ++#endif + #define BETWEEN(X, A, B) ((A) <= (X) && (X) <= (B)) + + void die(const char *fmt, ...); +-- +2.40.1 + + +From f54ad36bfe201c64f2f7b82c38c01e08a98fb485 Mon Sep 17 00:00:00 2001 +From: Khalid Bin Walid +Date: Sat, 20 May 2023 20:54:22 +0900 +Subject: [PATCH 2/2] revert unintentional space to tab conversion + +--- + drw.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drw.c b/drw.c +index d7ebfd8..908bb89 100644 +--- a/drw.c ++++ b/drw.c +@@ -121,8 +121,8 @@ drw_clr_create(Drw *drw, Clr *dest, const char *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); + } + +@@ -181,8 +181,8 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp + XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel); + XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); + d = XftDrawCreate(drw->dpy, drw->drawable, +- DefaultVisual(drw->dpy, drw->screen), +- DefaultColormap(drw->dpy, drw->screen)); ++ DefaultVisual(drw->dpy, drw->screen), ++ DefaultColormap(drw->dpy, drw->screen)); + x += lpad; + w -= lpad; + } +-- +2.40.1 + diff --git a/patches/dwm-xresources-6.2.diff b/patches/dwm-xresources-6.2.diff new file mode 100644 index 0000000..c1875c0 --- /dev/null +++ b/patches/dwm-xresources-6.2.diff @@ -0,0 +1,235 @@ +From 2832bd78a690606a48a7e1d370cd60fd92ee4988 Mon Sep 17 00:00:00 2001 +From: MLquest8 +Date: Fri, 12 Jun 2020 15:43:31 +0400 +Subject: [PATCH] handle various setting of various types from Xresources + +--- + config.def.h | 54 ++++++++++++++++++++++++++------------- + drw.c | 2 +- + drw.h | 2 +- + dwm.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 111 insertions(+), 19 deletions(-) + +diff --git a/config.def.h b/config.def.h +index 1c0b587..e69f288 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -1,21 +1,22 @@ + /* See LICENSE file for copyright and license details. */ + + /* appearance */ +-static const unsigned int borderpx = 1; /* 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 unsigned int borderpx = 1; /* border pixel of windows */ ++static unsigned int snap = 32; /* snap pixel */ ++static int showbar = 1; /* 0 means no bar */ ++static 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 *colors[][3] = { +- /* fg bg border */ +- [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, +- [SchemeSel] = { col_gray4, col_cyan, col_cyan }, ++static char normbgcolor[] = "#222222"; ++static char normbordercolor[] = "#444444"; ++static char normfgcolor[] = "#bbbbbb"; ++static char selfgcolor[] = "#eeeeee"; ++static char selbordercolor[] = "#005577"; ++static char selbgcolor[] = "#005577"; ++static char *colors[][3] = { ++ /* fg bg border */ ++ [SchemeNorm] = { normfgcolor, normbgcolor, normbordercolor }, ++ [SchemeSel] = { selfgcolor, selbgcolor, selbordercolor }, + }; + + /* tagging */ +@@ -32,9 +33,9 @@ static const Rule rules[] = { + }; + + /* layout(s) */ +-static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ +-static const int nmaster = 1; /* number of clients in master area */ +-static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ ++static float mfact = 0.55; /* factor of master area size [0.05..0.95] */ ++static int nmaster = 1; /* number of clients in master area */ ++static int resizehints = 1; /* 1 means respect size hints in tiled resizals */ + + static const Layout layouts[] = { + /* symbol arrange function */ +@@ -56,9 +57,28 @@ static const Layout layouts[] = { + + /* commands */ + 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 *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbordercolor, "-sf", selfgcolor, NULL }; + static const char *termcmd[] = { "st", NULL }; + ++/* ++ * Xresources preferences to load at startup ++ */ ++ResourcePref resources[] = { ++ { "normbgcolor", STRING, &normbgcolor }, ++ { "normbordercolor", STRING, &normbordercolor }, ++ { "normfgcolor", STRING, &normfgcolor }, ++ { "selbgcolor", STRING, &selbgcolor }, ++ { "selbordercolor", STRING, &selbordercolor }, ++ { "selfgcolor", STRING, &selfgcolor }, ++ { "borderpx", INTEGER, &borderpx }, ++ { "snap", INTEGER, &snap }, ++ { "showbar", INTEGER, &showbar }, ++ { "topbar", INTEGER, &topbar }, ++ { "nmaster", INTEGER, &nmaster }, ++ { "resizehints", INTEGER, &resizehints }, ++ { "mfact", FLOAT, &mfact }, ++}; ++ + static Key keys[] = { + /* modifier key function argument */ + { MODKEY, XK_p, spawn, {.v = dmenucmd } }, +diff --git a/drw.c b/drw.c +index 4cdbcbe..8f1059e 100644 +--- a/drw.c ++++ b/drw.c +@@ -208,7 +208,7 @@ drw_clr_create(Drw *drw, Clr *dest, const char *clrname) + /* Wrapper to create color schemes. The caller has to call free(3) on the + * returned color scheme when done using it. */ + Clr * +-drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) ++drw_scm_create(Drw *drw, char *clrnames[], size_t clrcount) + { + size_t i; + Clr *ret; +diff --git a/drw.h b/drw.h +index 4bcd5ad..42b04ce 100644 +--- a/drw.h ++++ b/drw.h +@@ -39,7 +39,7 @@ void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned in + + /* Colorscheme abstraction */ + void drw_clr_create(Drw *drw, Clr *dest, const char *clrname); +-Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount); ++Clr *drw_scm_create(Drw *drw, char *clrnames[], size_t clrcount); + + /* Cursor abstraction */ + Cur *drw_cur_create(Drw *drw, int shape); +diff --git a/dwm.c b/dwm.c +index 9fd0286..dc0d219 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -36,6 +36,7 @@ + #include + #include + #include ++#include + #ifdef XINERAMA + #include + #endif /* XINERAMA */ +@@ -141,6 +142,19 @@ typedef struct { + int monitor; + } Rule; + ++/* Xresources preferences */ ++enum resource_type { ++ STRING = 0, ++ INTEGER = 1, ++ FLOAT = 2 ++}; ++ ++typedef struct { ++ char *name; ++ enum resource_type type; ++ void *dst; ++} ResourcePref; ++ + /* function declarations */ + static void applyrules(Client *c); + static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact); +@@ -234,6 +248,8 @@ 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 load_xresources(void); ++static void resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst); + + /* variables */ + static const char broken[] = "broken"; +@@ -2127,6 +2143,60 @@ zoom(const Arg *arg) + pop(c); + } + ++void ++resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst) ++{ ++ char *sdst = NULL; ++ int *idst = NULL; ++ float *fdst = NULL; ++ ++ sdst = dst; ++ idst = dst; ++ fdst = dst; ++ ++ char fullname[256]; ++ char *type; ++ XrmValue ret; ++ ++ snprintf(fullname, sizeof(fullname), "%s.%s", "dwm", name); ++ fullname[sizeof(fullname) - 1] = '\0'; ++ ++ XrmGetResource(db, fullname, "*", &type, &ret); ++ if (!(ret.addr == NULL || strncmp("String", type, 64))) ++ { ++ switch (rtype) { ++ case STRING: ++ strcpy(sdst, ret.addr); ++ break; ++ case INTEGER: ++ *idst = strtoul(ret.addr, NULL, 10); ++ break; ++ case FLOAT: ++ *fdst = strtof(ret.addr, NULL); ++ break; ++ } ++ } ++} ++ ++void ++load_xresources(void) ++{ ++ Display *display; ++ char *resm; ++ XrmDatabase db; ++ ResourcePref *p; ++ ++ display = XOpenDisplay(NULL); ++ resm = XResourceManagerString(display); ++ if (!resm) ++ return; ++ ++ db = XrmGetStringDatabase(resm); ++ for (p = resources; p < resources + LENGTH(resources); p++) ++ resource_load(db, p->name, p->type, p->dst); ++ XCloseDisplay(display); ++} ++ + int + main(int argc, char *argv[]) + { +@@ -2139,6 +2209,8 @@ main(int argc, char *argv[]) + if (!(dpy = XOpenDisplay(NULL))) + die("dwm: cannot open display"); + checkotherwm(); ++ XrmInitialize(); ++ load_xresources(); + setup(); + #ifdef __OpenBSD__ + if (pledge("stdio rpath proc exec", NULL) == -1) +-- +2.26.2 + -- cgit v1.2.3