From ab3f787725dc78cb9ae73c47d40e00be0a6b2159 Mon Sep 17 00:00:00 2001 From: Bryson Steck Date: Fri, 8 Oct 2021 12:41:04 -0600 Subject: [PATCH 01/12] initial commit --- config.def.h | 1 + config.h | 124 +++++++++++++++++++++++++++++++++++++++++++++ drw.o | Bin 0 -> 10584 bytes dwm | Bin 0 -> 61992 bytes dwm.c | 36 ++++++++++--- dwm.o | Bin 0 -> 57536 bytes uselessgap.diff | 81 ++++++++++++++++++++++++++++++ util.o | Bin 0 -> 2256 bytes xfce-plugins.diff | 125 ++++++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 361 insertions(+), 6 deletions(-) create mode 100644 config.h create mode 100644 drw.o create mode 100755 dwm create mode 100644 dwm.o create mode 100644 uselessgap.diff create mode 100644 util.o create mode 100644 xfce-plugins.diff diff --git a/config.def.h b/config.def.h index a2ac963..08cfbd4 100644 --- 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 = 6; /* 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 */ diff --git a/config.h b/config.h new file mode 100644 index 0000000..f251033 --- /dev/null +++ b/config.h @@ -0,0 +1,124 @@ +/* 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 const char *fonts[] = { "JetBrains Mono:size=12" }; +static const char dmenufont[] = "JetBrains Mono:size=12"; +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 col_nord0[] = "#2e3440"; +static const char col_nord1[] = "#3b4252"; +static const char col_nord2[] = "#434c5e"; +static const char col_nord3[] = "#4c566a"; +static const char col_nord4[] = "#d8dee9"; +static const char col_nord10[] = "#5e81ac"; +static const unsigned int gappx = 6; + +static const char *colors[][3] = { + /* fg bg border */ + [SchemeNorm] = { col_nord4, col_nord0, col_nord0 }, + [SchemeSel] = { col_nord4, col_nord10, col_nord1 }, +}; + +/* tagging */ +static const char *tags[] = { "1", "2", "3", "4" }; + +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 }, +}; + +/* 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 const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */ + +static const Layout layouts[] = { + /* symbol arrange function */ + { "[]=", tile }, /* first entry is default */ + { "><>", NULL }, /* no layout function means floating behavior */ + { "[M]", monocle }, +}; + +/* key definitions */ +#define MODKEY Mod1Mask +#define TAGKEYS(KEY,TAG) \ + { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ + { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \ + { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \ + { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} }, + +/* helper for spawning shell commands in the pre dwm-5.0 fashion */ +#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } + +/* 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 *termcmd[] = { "alacritty", NULL }; + +static Key keys[] = { + /* modifier key function argument */ + { MODKEY, XK_p, spawn, {.v = dmenucmd } }, + { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, + { 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, XK_h, setmfact, {.f = -0.05} }, + { MODKEY, XK_l, setmfact, {.f = +0.05} }, + { MODKEY, XK_Return, zoom, {0} }, + { MODKEY, XK_Tab, view, {0} }, + { MODKEY|ShiftMask, XK_c, 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_space, togglefloating, {0} }, + { MODKEY, XK_0, view, {.ui = ~0 } }, + { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, + { MODKEY, XK_comma, focusmon, {.i = -1 } }, + { MODKEY, XK_period, focusmon, {.i = +1 } }, + { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, + { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, + 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} }, +}; + +/* button definitions */ +/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ +static Button buttons[] = { + /* click event mask button function argument */ + { ClkLtSymbol, 0, Button1, setlayout, {0} }, + { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, + { ClkWinTitle, 0, Button2, zoom, {0} }, + { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, + { ClkClientWin, MODKEY, Button1, movemouse, {0} }, + { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, + { ClkClientWin, MODKEY, Button3, resizemouse, {0} }, + { ClkTagBar, 0, Button1, view, {0} }, + { ClkTagBar, 0, Button3, toggleview, {0} }, + { ClkTagBar, MODKEY, Button1, tag, {0} }, + { ClkTagBar, MODKEY, Button3, toggletag, {0} }, +}; + diff --git a/drw.o b/drw.o new file mode 100644 index 0000000000000000000000000000000000000000..57700fd5a8de8afefcb924e12f501da0236c1fb7 GIT binary patch literal 10584 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 Sxae1Y^}|8pg}DN`tou(Nm`$<( literal 0 HcmV?d00001 diff --git a/dwm.c b/dwm.c index 5e4d494..496e52b 100644 --- a/dwm.c +++ b/dwm.c @@ -52,8 +52,8 @@ #define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags])) #define LENGTH(X) (sizeof X / sizeof X[0]) #define MOUSEMASK (BUTTONMASK|PointerMotionMask) -#define WIDTH(X) ((X)->w + 2 * (X)->bw) -#define HEIGHT(X) ((X)->h + 2 * (X)->bw) +#define WIDTH(X) ((X)->w + 2 * (X)->bw + gappx) +#define HEIGHT(X) ((X)->h + 2 * (X)->bw + gappx) #define TAGMASK ((1 << LENGTH(tags)) - 1) #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) @@ -1277,12 +1277,36 @@ void resizeclient(Client *c, int x, int y, int w, int h) { XWindowChanges wc; + unsigned int n; + unsigned int gapoffset; + unsigned int gapincr; + Client *nbc; - c->oldx = c->x; c->x = wc.x = x; - c->oldy = c->y; c->y = wc.y = y; - c->oldw = c->w; c->w = wc.width = w; - c->oldh = c->h; c->h = wc.height = h; wc.border_width = c->bw; + + /* Get number of clients for the selected monitor */ + for (n = 0, nbc = nexttiled(selmon->clients); nbc; nbc = nexttiled(nbc->next), n++); + + /* Do nothing if layout is floating */ + if (c->isfloating || selmon->lt[selmon->sellt]->arrange == NULL) { + gapincr = gapoffset = 0; + } else { + /* Remove border and gap if layout is monocle or only one client */ + if (selmon->lt[selmon->sellt]->arrange == monocle || n == 1) { + gapoffset = 0; + gapincr = -2 * borderpx; + wc.border_width = 0; + } else { + gapoffset = gappx; + gapincr = 2 * gappx; + } + } + + c->oldx = c->x; c->x = wc.x = x + gapoffset; + c->oldy = c->y; c->y = wc.y = y + gapoffset; + c->oldw = c->w; c->w = wc.width = w - gapincr; + c->oldh = c->h; c->h = wc.height = h - gapincr; + XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); configure(c); XSync(dpy, False); diff --git a/dwm.o b/dwm.o new file mode 100644 index 0000000000000000000000000000000000000000..07a31cd0726acbd34b27fa962bf5cfaa17b4207c GIT binary patch literal 57536 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 literal 0 HcmV?d00001 diff --git a/uselessgap.diff b/uselessgap.diff new file mode 100644 index 0000000..d9cacbe --- /dev/null +++ b/uselessgap.diff @@ -0,0 +1,81 @@ +From 58a5ece9406ca6c90dc362617c065e4aac19417f Mon Sep 17 00:00:00 2001 +From: Cyril Cressent +Date: Wed, 3 Jul 2019 21:33:45 -0700 +Subject: [PATCH] Port the uselessgap patch to 6.2 + +--- + config.def.h | 1 + + dwm.c | 36 ++++++++++++++++++++++++++++++------ + 2 files changed, 31 insertions(+), 6 deletions(-) + +diff --git a/config.def.h b/config.def.h +index 1c0b587..b11471d 100644 +--- 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 = 6; /* 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 */ +diff --git a/dwm.c b/dwm.c +index 4465af1..4545e05 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -52,8 +52,8 @@ + #define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags])) + #define LENGTH(X) (sizeof X / sizeof X[0]) + #define MOUSEMASK (BUTTONMASK|PointerMotionMask) +-#define WIDTH(X) ((X)->w + 2 * (X)->bw) +-#define HEIGHT(X) ((X)->h + 2 * (X)->bw) ++#define WIDTH(X) ((X)->w + 2 * (X)->bw + gappx) ++#define HEIGHT(X) ((X)->h + 2 * (X)->bw + gappx) + #define TAGMASK ((1 << LENGTH(tags)) - 1) + #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) + +@@ -1276,12 +1276,36 @@ void + resizeclient(Client *c, int x, int y, int w, int h) + { + XWindowChanges wc; ++ unsigned int n; ++ unsigned int gapoffset; ++ unsigned int gapincr; ++ Client *nbc; + +- c->oldx = c->x; c->x = wc.x = x; +- c->oldy = c->y; c->y = wc.y = y; +- c->oldw = c->w; c->w = wc.width = w; +- c->oldh = c->h; c->h = wc.height = h; + wc.border_width = c->bw; ++ ++ /* Get number of clients for the selected monitor */ ++ for (n = 0, nbc = nexttiled(selmon->clients); nbc; nbc = nexttiled(nbc->next), n++); ++ ++ /* Do nothing if layout is floating */ ++ if (c->isfloating || selmon->lt[selmon->sellt]->arrange == NULL) { ++ gapincr = gapoffset = 0; ++ } else { ++ /* Remove border and gap if layout is monocle or only one client */ ++ if (selmon->lt[selmon->sellt]->arrange == monocle || n == 1) { ++ gapoffset = 0; ++ gapincr = -2 * borderpx; ++ wc.border_width = 0; ++ } else { ++ gapoffset = gappx; ++ gapincr = 2 * gappx; ++ } ++ } ++ ++ c->oldx = c->x; c->x = wc.x = x + gapoffset; ++ c->oldy = c->y; c->y = wc.y = y + gapoffset; ++ c->oldw = c->w; c->w = wc.width = w - gapincr; ++ c->oldh = c->h; c->h = wc.height = h - gapincr; ++ + XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); + configure(c); + XSync(dpy, False); +-- +2.22.0 + diff --git a/util.o b/util.o new file mode 100644 index 0000000000000000000000000000000000000000..3b48c2f667e0d2c6574012f800ee0078a6ec0b61 GIT binary patch literal 2256 zcmbuAO-vI(6vy8dl!~RTzyX7Y9#%sW+)xuEsY(hISal->YD6xzl&v)O%k9>Hnurk( zP1A&f2M-=Ncro!{qDK=NJ$U8lNj#e10S_JwCiT7D8JKL^i@s#?-u&MG&CJfs?mnK- zCS8&Q+$0!*!ycyqu_K3Z#0n$eg)W#=EBoq`AKwtE6;mEoD{(oZRy0}FDp5J6VKl#9 zH^aVQRKD#CYI4yRd@iq{+!uT)Z&?17ylMG2@>|Qlm+O}QAaA2zQmgH!2QW}^z=2R* ztzO0s_P(mMb$O2^`qWxn_N%q1JoGs#``w7q_YSdi;5!Deb`jL-d5X+IwX#DCc3TOx ziqYDmwnn(zvlYO+MMDkC?RIW;aGA@L9d=QES$UEU@q?mCR-fsW8CQ_;@%l zFm?S#Fc1nUA%)fg?brg?Xge_lE|BWP_?}Cwe+(H}ukAp3FbmR(U+VXCxHnMThx`=F z{U$%^^*?o8_3p9UFw31}xtm@$Bh4Mn-wr<;&9ZF=t2@lvqY0OSrMl2}3wmp9$WCDM zGmYrzIht{$1;5aOkF?;?7W`TZ9z#y+=j*oi57|r$J(SH%R!M=PjSs<6Mu(EQq#Fh# zrnKp?Q7th&IXO2GPsB&Zw21`VPZy0$-b|y)$m)4W7t3Y}idaxEKwrt2pxf66$~YgH z3mfh7pN4I(38K-R>A=SMJA!CV{YM*HdO9<%{~~a@Yn<;0oNhhmy8;*WzXX0<(C-VJ z?gSsFgI#o5XPdx1jMH;bMJHF zOGz^c%3`Smicz2r$?+uxB~{4f^gK%P1yfh>6+K%rlc~F`eW@w=PUa^AHZ_jildHUBCOxd_KBw*UFgRI?O%ion14Z=jpk+rbXFAduL8Y?WM{Au zXL3T8%{nJy+=&N~)0qESAHrH1^BgwO`22jmJjdtfK7t8~t&c4ip$txn zFj1Q00ueUR-a>vBHNJ=BuaS-;8Z>H8#_vp$Q-X6L_25RK1I=TGl3 zujl9AY;LNf{|Z@*c@M@kq_dvJbe=sTh%h)$9l_Xe2Za6;&FZ(=`X3%B?Z8?87wdl# AdH?_b literal 0 HcmV?d00001 diff --git a/xfce-plugins.diff b/xfce-plugins.diff new file mode 100644 index 0000000..c789daf --- /dev/null +++ b/xfce-plugins.diff @@ -0,0 +1,125 @@ +From 4e33fe0d465fb24f6b42d4a1fb63d4d7902f1986 Mon Sep 17 00:00:00 2001 +From: Gunther Klessinger +Date: Thu, 1 Jul 2021 09:19:07 +0200 +Subject: [PATCH] Supporting xfce4-panel in dwm + +We treat the panel as special window which +- never has borders +- never has focus +- always has y=0 +- is never shown as active window in the indicators +- is shown on all tags (via config rule) +- is ignored on focusstack (MOD+j, MOD+k) + +Which window? "xfce4-panel" - configurable in config.h +--- + config.def.h | 2 ++ + dwm.c | 28 +++++++++++++++++++++------- + 2 files changed, 23 insertions(+), 7 deletions(-) + +diff --git a/config.def.h b/config.def.h +index 1c0b587..3b9e7d6 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -3,6 +3,7 @@ + /* appearance */ + static const unsigned int borderpx = 1; /* border pixel of windows */ + static const unsigned int snap = 32; /* snap pixel */ ++static const char panel[][20] = { "xfce4-panel", "Xfce4-panel" }; /* name & cls of panel win */ + 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" }; + + + /* layout(s) */ +diff --git a/dwm.c b/dwm.c +index b0b3466..956d402 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -175,6 +175,7 @@ static long getstate(Window w); + static int gettextprop(Window w, Atom atom, char *text, unsigned int size); + static void grabbuttons(Client *c, int focused); + static void grabkeys(void); ++static int ispanel(Client *c); + static void incnmaster(const Arg *arg); + static void keypress(XEvent *e); + static void killclient(const Arg *arg); +@@ -710,6 +711,8 @@ drawbar(Monitor *m) + } + + for (c = m->clients; c; c = c->next) { ++ // prevent showing the panel as active application: ++ if (ispanel(c)) continue; + occ |= c->tags; + if (c->isurgent) + urg |= c->tags; +@@ -793,11 +796,14 @@ focus(Client *c) + selmon = c->mon; + if (c->isurgent) + seturgent(c, 0); +- detachstack(c); +- attachstack(c); +- grabbuttons(c, 1); +- XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel); +- setfocus(c); ++ // prevents the panel getting focus when tag switching: ++ if (!ispanel(c)) { ++ detachstack(c); ++ attachstack(c); ++ grabbuttons(c, 1); ++ XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel); ++ setfocus(c); ++ } + } else { + XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); + XDeleteProperty(dpy, root, netatom[NetActiveWindow]); +@@ -853,6 +859,7 @@ focusstack(const Arg *arg) + if (c) { + focus(c); + restack(selmon); ++ if (ispanel(c)) focusstack(arg); + } + } + +@@ -964,6 +971,11 @@ grabkeys(void) + } + } + ++int ++ispanel(Client *c) { ++ return !strcmp(c->name, panel[0]); ++} ++ + void + incnmaster(const Arg *arg) + { +@@ -1049,7 +1061,8 @@ manage(Window w, XWindowAttributes *wa) + c->y = MAX(c->y, ((c->mon->by == c->mon->my) && (c->x + (c->w / 2) >= c->mon->wx) + && (c->x + (c->w / 2) < c->mon->wx + c->mon->ww)) ? bh : c->mon->my); + c->bw = borderpx; +- ++ // no border - even when active ++ if (ispanel(c)) c->bw = c->oldbw = 0; + wc.border_width = c->bw; + XConfigureWindow(dpy, w, CWBorderWidth, &wc); + XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColBorder].pixel); +@@ -1283,6 +1296,7 @@ resizeclient(Client *c, int x, int y, int w, int h) + c->oldw = c->w; c->w = wc.width = w; + c->oldh = c->h; c->h = wc.height = h; + wc.border_width = c->bw; ++ if (ispanel(c)) c->y = c->oldy = c->bw = wc.y = wc.border_width = 0; + XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); + configure(c); + XSync(dpy, False); +@@ -1991,7 +2005,7 @@ void + updatestatus(void) + { + if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) +- strcpy(stext, "dwm-"VERSION); ++ strcpy(stext, " "); // no shining of dwm version thru panel, when transparent + drawbar(selmon); + } + +-- +2.31.1 + From b01b3c639a8c5bd698028b799a69d97eeaadfd6c Mon Sep 17 00:00:00 2001 From: Bryson Steck Date: Wed, 20 Oct 2021 13:07:48 -0600 Subject: [PATCH 02/12] added gitignore, changed theme --- README | 2 + config.h | 11 ++-- dwm | Bin 61992 -> 62096 bytes dwm.o | Bin 57536 -> 57800 bytes uselessgap.diff | 81 ------------------------------ xfce-plugins.diff | 125 ---------------------------------------------- 6 files changed, 10 insertions(+), 209 deletions(-) delete mode 100644 uselessgap.diff delete mode 100644 xfce-plugins.diff diff --git a/README b/README index 95d4fd0..df95be6 100644 --- a/README +++ b/README @@ -1,3 +1,5 @@ +This build of dwm by Bryson Steck is incredibly simple, nothing is visually overhauled. + dwm - dynamic window manager ============================ dwm is an extremely fast, small, and dynamic window manager for X. diff --git a/config.h b/config.h index f251033..73c4f2a 100644 --- a/config.h +++ b/config.h @@ -7,6 +7,7 @@ static const int showbar = 1; /* 0 means no bar */ static const int topbar = 1; /* 0 means bottom bar */ static const char *fonts[] = { "JetBrains Mono:size=12" }; static const char dmenufont[] = "JetBrains Mono:size=12"; +static const char black[] = "#000000"; static const char col_gray1[] = "#222222"; static const char col_gray2[] = "#444444"; static const char col_gray3[] = "#bbbbbb"; @@ -22,8 +23,8 @@ static const unsigned int gappx = 6; static const char *colors[][3] = { /* fg bg border */ - [SchemeNorm] = { col_nord4, col_nord0, col_nord0 }, - [SchemeSel] = { col_nord4, col_nord10, col_nord1 }, + [SchemeNorm] = { col_nord4, col_gray1, col_gray1 }, + [SchemeSel] = { col_nord4, col_gray2, col_gray1 }, }; /* tagging */ @@ -35,7 +36,7 @@ static const Rule rules[] = { * WM_NAME(STRING) = title */ /* class instance title tags mask isfloating monitor */ - { "Gimp", NULL, NULL, 0, 1, -1 }, + { "zoom", NULL, NULL, 0, 1, -1 }, { "Firefox", NULL, NULL, 1 << 8, 0, -1 }, }; @@ -67,6 +68,8 @@ 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[] = { "alacritty", NULL }; +static const char *brightnessup[] = { "brightness-up", NULL }; +static const char *brightnessdown[] = { "brightness-down", NULL }; static Key keys[] = { /* modifier key function argument */ @@ -93,6 +96,8 @@ 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_F4, spawn, {.v = brightnessup } }, + { MODKEY, XK_F3, spawn, {.v = brightnessdown } }, TAGKEYS( XK_1, 0) TAGKEYS( XK_2, 1) TAGKEYS( XK_3, 2) diff --git a/dwm b/dwm index 6a8ec1d4b7115dce1ffb4fed882c16a92f5a9819..62c1b44e802a5d336b8aeb2b742e268d2edde92e 100755 GIT binary patch delta 10576 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 wrbv8#!+r|+AH?}RSO5S3 delta 10377 zcmZ{K30PHC_x{;OZi0$jRJvRQ0YQcw0D*u{NJx@Pf`U_s0~n~_hzLqr0TIdVMxjd+ z%>m2-%T%QL)HG2n#VH(0DN8NOOKM4j((rYD@80L!GM@kcJP+&Ld#!h`J+HmbJyd<$ zrS3+TssNU=B5=EdSCAwguNAGc9Mas>Od2J!pl()YHP_OIUSRi}3s$Mwzmd$c(uW-g z&%AeY)ti4b6xbEoU2VK{Xyw9&^<55jHE2g2$s zxk)u=8a6vUZ_jp-w`&mFOR25~_CDph1{n{K$_zNDqP^zeFx7)|oSMOD);L9-IHww% zjrW<{c$&KP{Y<`gn!fHk1i6M@?h|E)l}lAmDRi!%!I*dA-|jOsYZWn116lj&|K_)F zKDm189c&yuO$WyW%|AXvpecHQQzbZc4{%zDb1px?(UZ5Af$Y5=^wSPbBs8|VsstzJ z0Zt2XPW1yEJza;N6Ay4ws2-Y*2RK!N6X5+%T`hu>292#QJ=J;}sNw-m3N3_Y-vgW~ z!LfSli(gGrN3ikqzelo6o1AN%^p%?4+DX4g)8Fl+Z)sBfc68FOQ~9zak+ZMC*= zwso?R;`$p>1GH7_+R3_EtIVsD-b>>Lbkc9r_`y`~V{ne_WPOVk_BTv-)yigevUX@? zb2{nmHGbazM_<%Q-$5ZhhLF3Ow~9_yN%L0KNq>e?eT!x6v-7?~y03h>YH#qluJWnX zbRoiry-xQdd>r#%m!t!HvzpAhe&iqN9TyKx$UW=eKNZDP88h5PlB`GmhqNW;5!KQg zmJr2y7#1j9pfqJIzlM1-nLjq`T3;t~WZy?ltd=CR<6ao!&AROXYlQ=9Vw_ePeiH39 znUAB+eXHqgWZ%d)KsQ-pBQ3G^X5B>4%Nk{~ZUQei&4Zg_O2G&@kFqaLf-;M@&Jr`1 zyrT@o<87uqnBemw^41`g5oxn+S8a{l#(RL$?lxPZYTL3{{QMwt~N>iII7Q+YG9WuXf?|H`P|eZGZeOdjBWZ*@y9B zN_9D0e?l)N;Re?isd~N^t$Uy^#!#N-hA`D|jT@?A_>gbM!`P#IQqFU2#%SSYBhm-D zaD8R??3LWy1V%My496;gzh@s{WC}(Xlf`2(XLxXid4#>G(&JH{|IHN(#OfB#%Y_ey zCZsv!dp)w?^^-DLdu`o5|uLgFTypz5-XQ$rcOz6*2Trfl9YuP!0}AX%g1es%gp2)l zD1r*|krgG~CF`Z%_>jA_Km}qH2h<1BXc`{vW*EU0=GFs}N!aZKEyjcLqJ14Mui(0v z_7$`t+S_55nmfLNjzq{=P6b!wwyDfzLH#jUT2I)4HjkU&MKc=%_r zXg=YVa;2cFb*~eO-U<1_R5|!_K`;1{xAT3TR+_9QdjQM+=u-F{=CocAhFMF6lV$eS zB9REs75bQ$0oG5|3Kk=sXx)l2gtL5PQ1|3tMcvsv*DS)zhdjnueN=rC^cdU?0>b+N ztcj|#p)`4Tj>EZ1*ei7>E9vxbfBRaI3tvZn3?IhkQABJ2i>J)kI<|@&;s&u<^k`f- z3u%}e7uvn&r=?g<@s&LcCX3^_QhFyTpM{fGayav+iOKbBHQA5$V4mbR`bpM<7LM*M zcNEi0qx<)|f$eHtaD%tHun7IQSWE{-Z)JlibIdk2pSq^3mhV1C8&j6CMdX&6Er0bK zm881M2cb({#rjj|*h032c8v98FE%uf-6i*Pc}9}5O%}TW0eqUwnB0&?Q{{MHJyug| z5v`t(%3h+I6GB)v87KB|>r zEIRfTz~ZtG#VopAi)m+?*N{D`Wi1D@ZXLjC<)PTDdll(@eBy3-TEF5`XV#U`?`a8a z7(G5I+u^$cl*rOG6w>ZVUX#i}R`O!eKZ1U?gmWWhwq(6`i4SVbCeAH87K}}gFo7Y~ zZQvS<-WvV|CoJNlz7#6!>ML3vqh$}}3<^k3W!-6Mdf*f17NJYnxjHKnSjWx6N3gZa z_o9-cTx6u{irTSmlQ z_!hQqJpaAV_%ajfa74yw^--tyQ7Wv(8qlUF7Tq2w^Y|HW5%U>yF<+9_-v2Gm z`}>gdabuIPlfB~2<9*%ZQc&-5Iy>2end$aqUsgcQQ-YI6fNnB>b%?vLe*J@@bkTKi zl_e$+V7Bu$>u!s@j^|C5VCyI=ulfRVvw7w4`iZc_bS$J-r}&MpK`zexkyGU^xHOe5 z%S0*NsfEJlyMTf@=y{aKS|puT9TmN~bd$Tx&|J1Di!$Lg4O#eKi>5qB_ES@y{1YYO z&22om#&{uZ%|NlVbUt12mJyLWrpH?xKZ6AXC68BrEMW4~xG8Z{ zPgFjR+s`*O+MG{)bIAFt8QQ6#6?vWx=Y+Fr`ZXt+JxL>SM|$4MmZWm!`Cdtu$McfQ z8w-PyEV`@E-SWdi`z)L4a_73|Aa5$aQ{ZH>JeOl75zpu4-MVeE3{Ixt+2Q_6IKlE? zbsRBp7(_I)w)sBoak=f zK8>t5vUAB{Zhw|YgXV^@J~Vx9Sf8uYB`Lja3~tG|$8@B^!HfCZ9Egy;CvmWX6wjSaVt9uO@lcgw=pS;hb>hK{bU}g9DVP7~0C12ttSrcDb zF>|jfidA<)c$p794p4t?vFJ>~P0S<#v6&{z9zJ^3)~+h~aT+z>_*ej}>1|&h!HqQ@`&rhS%^J7O> zfN8Qc@H)`Me33&c#mo9S+Jm``Ku?AVbRy6bQ|Lbcb0_c z!tNnoMCn|Raa!GEcF`kY);$Di?S5TR94ZzBKx*Fq@5~VT%W_K{S1_0Yml7Vy~2+pAt*)${`f0jQQa+ILJH9 z9mKT4VqJ9*Y4eZPogau7&$q3|g1{H!BQupRKy0ElC{$VUtEDMtx$I^$(46d8Ts-1V^eZq?E&f~7xqk`@% ztCxRBrJ83S!*2>#pEdAb7M>l>94X>CFE*ed?YTmxU!H=dT9)@v_j~;q`ttcl?Mugq zHsfe04rkGnT08`WN{VA$cH%Wrow~n+_5RWHX|XTsLcbS#vJvD~GJqvhY>5Xm(6o|) z(7#;rm`|T%{)&fqWd0tJa0&KwOg&WAKi?IvKK;vLa_LryAIqX%r9V06CE-SEF=Zx~ zHy8BB5ay7}3!(C$BwAM9k8)lZ?0tU}Z-y9UaX0119C#g2PsEbiH;UeWA%?A`UtS1g z3#eb&8}bKF(g$U4F(;b&VsdC}q9n1S%E_@^%Jp!PWInH);P=$_-C{Zqz|7zDFqE(D z6q>q3`tHS0x5?aKZYnTh&EpblorU!-R?g!TT0T<#!-NJV4EWyk@5asMn_)GS`_U~) z2}a+yo9JeF6vK}sFHMtwO=u{6$(zaNN79z%L*xS^>EiN0h6T9Xl}#f<#di6tcxtSO zmTThauZpqEwIS6!v>Vk@gk3`Jyga%>LnC~`XGDff&yswyBeQ4Bh?0ClpAH)uK2-7< zIwLeJELidh4h|2Gh>(0{h)42yT09i7YEtpeHxy-67fHIkSy7JlktFxG73EpvUC{S~ zzzM(>V9h&<(gVx>EHD7LV3(rg0Z#&JfP*l4SAZs92e1g(M<+=wz%XF^9z~f891Sc1 zrU6&!q+*HH!|_8HG+-p~ATS5m_`afC2DSq`fWiM&6kptQ#sK4iWxzCG8*nbrZ66#1 z2LM+AHv#tmzXBcu_S_GDKxg1>-~gbVeKCFsK_b>(l70iG0W%LM3T~m&0bmvI25=8> z8KT$;;Aw=tUx0sos3=|zl2pkpq$j$q_~KLM`*58^Cy?IuY#aYkkW1DX}( zPv8?k*W&Jyz+Rs!ihWN>nglF%M`9@w(ZGwqDZs!>XaMkC zU?XtQWegp#7T5vQwPMPgB*`D>1)L9z1pW`01}ynpQ3`iU=Fa4 z9&6)@QmjNGk@Y3!5O@s8f1zTy51j@MxrQSLI2VXd6Veu-E3h1A-FVCHk3cH2>0+Qr{U4gSY2Y4I!B5(>_U*m7A-mWM?*!5C;S9Ai+ z!Cx5u@NJ>m-zBvUbs@)}Nc`pD?>U-UJq%~b+UmY+BfVFh!0yxks)O(zGG))Gv4rI?Nt88z+yY>TTkwD zB(Htk$D(>wwM&x|u?w>UbO}gf8R(ofmW~p~E^Ck1J#tbY|$5 za?Plo`Z8Ijp!JR}H=!FYSgOBl@On||`rd>k-hjj6+x4EtYhdCkC75zrPkTP9!H8A;$zy{jZbmU13>csZ8wRo#Duw)v z-r3-3 zpskxc*;V>z(?IqOwQq`GE)-Z3%4XBl8Xs0qrAT|wdq_u8E7I-cSnKZ+h5+Knn}>%F z@e~A?k(5{)!HTG~HbM6R>}?dX)|I}k4Pt5Jvf1;YF&`^RZ$@Wp4V1chgo})ee}ZtJ zu9<^aAmOxQvnP9$nj!P3ZS!zePJwUwu-laUrhz5Vj5j?4YZ0rmwQ_t`cVe2_q3f^d z`1m$Lr_ehnGlV{R)3e_Ogtanm$GBtWO8H9RW8Vj%$?g=%TmHiyqnIuJ9x~!wv_^bM zUi|lhUIk)*D&69VM$~TcVO8|emQeO1{kCNw#&N*bQ2aVKX=`8OW1lF>W4!#+J@pe& znm48faW0!Gw;I@sv~}w+7D(42)5&9-4@Nm|nYI9K^>^ z?kBCMeuCyF7~$$A^4M-Lz6I+oZk6}+)F=0}_d+rg*5@dByAOMV7H*#`+qcr$?L%2V zVs$>Oga*_NWJf5q&cLovZryT>YkOS=^Pb83t)@!?Y&E7p}cKnlV`n!MePqyjr z_2Zvxm%g`4ZphhJXGg(@^wVwM4sG8GZQlm9Z-G+qDz!rXb%8$tTK@0PeOli3IZv=@#_X@43^>oY>?@={m&Q=s;d@~WTFj~k(HJC02u_-ia|F{Db#Z2uHito4l|_PM z5psiI?$Uh5$E%bAjd@6LJ{9shm%5+9^rCvXH8S_{e+AZGKSjE8jMe1=kdD3 zMyalBR}{xIPFqQp8klzdWhmc*V{gT1xj++)AjeVWgz(Df8Y%u-@R`q|%)Mna(c``4{GKI_& z@);pt7V>o=w+netNc>|J_}7HI$EDE$FQVdq**cB3o))$ma0TNsP{?etKO*QHG$Vy( zJeS4{c;GEhtWewbn>LbJf`hRFf0^$s=KFjP}+`*2+~58^c4zBe_t2grL4(f93- UITU@a7Hg)EpCVWs<^JUVf8Sj=jLQt5(0{uWfFgUenO(R}%JH z0?=PHCwW~%L%lK4v&IG|ymn)IX-Tpgx&z*_i7--TQ+vlYjlMn^@8W}nCP zOj8Gs->yH-HBlq_r@`mX2CF|^U&1T+VD#wCwi2TC+M9kWZ1Sg*dg$G6pP~K zC8BGE5Op`8n<~Vyz8&J!-Nv(9$8>Y!b;xbd^dQfQ$wko~@KSd#&+ZU1@4KL#y6MBlx|QoYB;5f8jhdd$-D8rQ2|nsR$lYHhcN%mw zYGf{i8r|eEh*MUgQiZHTUIlNHM%r+D3-UE2Aon3ZMIJ+*LVkz5ioA)ujdVbFvqrLz z4^9{XwAcd+oJ~%>a;Lw3ZWIp_JpqWbb2V0Y9_wz@?gm$NUZY8UZ3C5S7 zSyRX$oc*GjTsQKLS6HaG@#Jn=38`lmsl|3!dgdZsqzn4objMiHmqpXC@vNJTjvP8W zQ1{^!^Ob!bUo^HVE6Q5>6DxBdL073R>e~`@Rxeg;bNMpIVfEn|6to?N&^b+yB&3-8 z4tHY^r>+xU!2f6Sq5Zt3mrJh52Ea?*pyZCv%d!#471AaFF zvH?h=ZcuW^=VjT5tURTN3oGw3t3^;f!oH#%x{@lqy`% z6V6Cw6?1q+7j%a;7!5m6oyXO~&=}SVjwYm8rkK0E2|Alsd>f5Gl%_@{*F`H>i`_%N z$x{|aMQjE$K?f2`RgU5qBa+Qb#Eg|vu97C>Iat(WoR%)t@Nw~`(IVrY!GNjY>! zH2oQI{!+~g5T$OlxDJx*0}|E9N<)uso}emQVei0KWCQpH3rQ7p4tiAQC(u7wl-5;h z<}&%g)7!XEgW{n~d)XP&xdgtULi%;wIpk4uqR>B7Wbdjlt*0ROav_PqlFJ^|RtbAA z7paa)=%?M}O8gYgA9krZm9TWUNG+#6?b3pO*GMni9&DES(n;<)Z&)(%XBiEmN65juy#dsu&J%qwSL5=Q?xp0 zI~6SqO?~~NW9k}V!_Km`-hr~ITM)EbHHo-QtZh?aQ*<9>A}S8H_q;h*@9u&7JLf#l zbKiS&KhDkI*{mO9S&;%+8XhRTm&4j2`?=p)yP7rQ`Yd={;WGuAHZ-fH{9q67FZrb2pfB|&l!d2M+?Vn&A-C^OD8QgJjgca9q;Vw3~e?V1OS$JQ#A%pu^ z=-UnYze4Xc=w^uGu_l}O`I)8f4Xy){=qkd!YjAUcweTm1)5i(k7AIRkqm?*XLQXyL zCd4omrg1B=gZK&Y5bvJ9n)r}t2FE6aO()JI&LPetzD-<4tRprNHxoZ5 z?k655enmV*j1%z=VEr^vg4kw-*@=0?GU5W_Qer)E9dQS-i+G6GOZ<*_iFlp(8}S}7 z%?XuTf^0H`w~AfqIp1C>Ekw2U1bmlSxU%T&WSW(qDn%S0%%43%efcxI0- zV}~TxIjPH3Lll)ex=e&J&dd5bJQGCa+4*!`R$!|xQw?>f9Mxqaz%$o%nFM7lSM+si zt|(BBigwP`kcUd6E)xNs>Aqrb(lQBgW3?+el(}q@_Nn8#1GgvIf+IeVnr`NoADhLX zPZhcy!f~a|X>g|r*R9j}r>2sZ!d9Tu`O&jQ-mBAjUi-k7>vW#a5&6oD4xYFf`r@{Q zK|^k)$W`lfUe}EqZ_9K#uRBZRS3)wb;PY6Nz$YMX16#tzBEWEV2WPM2tOsH^b0%!C zK4F`!{jJchT0qpHgCI2hB`8XISRvFU74|B$COxiVk!%!EE$M?;QgQi(d(_}oK^omR zgnQE9zNzM2ZJQ+T*$GE(o@2|QX~f4WAUfigyH&U~QZcDLklEv;6$(e^S`+6o(;zgB z`dB4INBy!h0k=jgtnS*3wH#)T`S60&jrpzJLNkFQI2}%ny -Date: Wed, 3 Jul 2019 21:33:45 -0700 -Subject: [PATCH] Port the uselessgap patch to 6.2 - ---- - config.def.h | 1 + - dwm.c | 36 ++++++++++++++++++++++++++++++------ - 2 files changed, 31 insertions(+), 6 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 1c0b587..b11471d 100644 ---- 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 = 6; /* 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 */ -diff --git a/dwm.c b/dwm.c -index 4465af1..4545e05 100644 ---- a/dwm.c -+++ b/dwm.c -@@ -52,8 +52,8 @@ - #define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags])) - #define LENGTH(X) (sizeof X / sizeof X[0]) - #define MOUSEMASK (BUTTONMASK|PointerMotionMask) --#define WIDTH(X) ((X)->w + 2 * (X)->bw) --#define HEIGHT(X) ((X)->h + 2 * (X)->bw) -+#define WIDTH(X) ((X)->w + 2 * (X)->bw + gappx) -+#define HEIGHT(X) ((X)->h + 2 * (X)->bw + gappx) - #define TAGMASK ((1 << LENGTH(tags)) - 1) - #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) - -@@ -1276,12 +1276,36 @@ void - resizeclient(Client *c, int x, int y, int w, int h) - { - XWindowChanges wc; -+ unsigned int n; -+ unsigned int gapoffset; -+ unsigned int gapincr; -+ Client *nbc; - -- c->oldx = c->x; c->x = wc.x = x; -- c->oldy = c->y; c->y = wc.y = y; -- c->oldw = c->w; c->w = wc.width = w; -- c->oldh = c->h; c->h = wc.height = h; - wc.border_width = c->bw; -+ -+ /* Get number of clients for the selected monitor */ -+ for (n = 0, nbc = nexttiled(selmon->clients); nbc; nbc = nexttiled(nbc->next), n++); -+ -+ /* Do nothing if layout is floating */ -+ if (c->isfloating || selmon->lt[selmon->sellt]->arrange == NULL) { -+ gapincr = gapoffset = 0; -+ } else { -+ /* Remove border and gap if layout is monocle or only one client */ -+ if (selmon->lt[selmon->sellt]->arrange == monocle || n == 1) { -+ gapoffset = 0; -+ gapincr = -2 * borderpx; -+ wc.border_width = 0; -+ } else { -+ gapoffset = gappx; -+ gapincr = 2 * gappx; -+ } -+ } -+ -+ c->oldx = c->x; c->x = wc.x = x + gapoffset; -+ c->oldy = c->y; c->y = wc.y = y + gapoffset; -+ c->oldw = c->w; c->w = wc.width = w - gapincr; -+ c->oldh = c->h; c->h = wc.height = h - gapincr; -+ - XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); - configure(c); - XSync(dpy, False); --- -2.22.0 - diff --git a/xfce-plugins.diff b/xfce-plugins.diff deleted file mode 100644 index c789daf..0000000 --- a/xfce-plugins.diff +++ /dev/null @@ -1,125 +0,0 @@ -From 4e33fe0d465fb24f6b42d4a1fb63d4d7902f1986 Mon Sep 17 00:00:00 2001 -From: Gunther Klessinger -Date: Thu, 1 Jul 2021 09:19:07 +0200 -Subject: [PATCH] Supporting xfce4-panel in dwm - -We treat the panel as special window which -- never has borders -- never has focus -- always has y=0 -- is never shown as active window in the indicators -- is shown on all tags (via config rule) -- is ignored on focusstack (MOD+j, MOD+k) - -Which window? "xfce4-panel" - configurable in config.h ---- - config.def.h | 2 ++ - dwm.c | 28 +++++++++++++++++++++------- - 2 files changed, 23 insertions(+), 7 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 1c0b587..3b9e7d6 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -3,6 +3,7 @@ - /* appearance */ - static const unsigned int borderpx = 1; /* border pixel of windows */ - static const unsigned int snap = 32; /* snap pixel */ -+static const char panel[][20] = { "xfce4-panel", "Xfce4-panel" }; /* name & cls of panel win */ - 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" }; - - - /* layout(s) */ -diff --git a/dwm.c b/dwm.c -index b0b3466..956d402 100644 ---- a/dwm.c -+++ b/dwm.c -@@ -175,6 +175,7 @@ static long getstate(Window w); - static int gettextprop(Window w, Atom atom, char *text, unsigned int size); - static void grabbuttons(Client *c, int focused); - static void grabkeys(void); -+static int ispanel(Client *c); - static void incnmaster(const Arg *arg); - static void keypress(XEvent *e); - static void killclient(const Arg *arg); -@@ -710,6 +711,8 @@ drawbar(Monitor *m) - } - - for (c = m->clients; c; c = c->next) { -+ // prevent showing the panel as active application: -+ if (ispanel(c)) continue; - occ |= c->tags; - if (c->isurgent) - urg |= c->tags; -@@ -793,11 +796,14 @@ focus(Client *c) - selmon = c->mon; - if (c->isurgent) - seturgent(c, 0); -- detachstack(c); -- attachstack(c); -- grabbuttons(c, 1); -- XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel); -- setfocus(c); -+ // prevents the panel getting focus when tag switching: -+ if (!ispanel(c)) { -+ detachstack(c); -+ attachstack(c); -+ grabbuttons(c, 1); -+ XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel); -+ setfocus(c); -+ } - } else { - XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); - XDeleteProperty(dpy, root, netatom[NetActiveWindow]); -@@ -853,6 +859,7 @@ focusstack(const Arg *arg) - if (c) { - focus(c); - restack(selmon); -+ if (ispanel(c)) focusstack(arg); - } - } - -@@ -964,6 +971,11 @@ grabkeys(void) - } - } - -+int -+ispanel(Client *c) { -+ return !strcmp(c->name, panel[0]); -+} -+ - void - incnmaster(const Arg *arg) - { -@@ -1049,7 +1061,8 @@ manage(Window w, XWindowAttributes *wa) - c->y = MAX(c->y, ((c->mon->by == c->mon->my) && (c->x + (c->w / 2) >= c->mon->wx) - && (c->x + (c->w / 2) < c->mon->wx + c->mon->ww)) ? bh : c->mon->my); - c->bw = borderpx; -- -+ // no border - even when active -+ if (ispanel(c)) c->bw = c->oldbw = 0; - wc.border_width = c->bw; - XConfigureWindow(dpy, w, CWBorderWidth, &wc); - XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColBorder].pixel); -@@ -1283,6 +1296,7 @@ resizeclient(Client *c, int x, int y, int w, int h) - c->oldw = c->w; c->w = wc.width = w; - c->oldh = c->h; c->h = wc.height = h; - wc.border_width = c->bw; -+ if (ispanel(c)) c->y = c->oldy = c->bw = wc.y = wc.border_width = 0; - XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); - configure(c); - XSync(dpy, False); -@@ -1991,7 +2005,7 @@ void - updatestatus(void) - { - if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) -- strcpy(stext, "dwm-"VERSION); -+ strcpy(stext, " "); // no shining of dwm version thru panel, when transparent - drawbar(selmon); - } - --- -2.31.1 - From 59db9120dc406392624abca9e7186c39ff6edf99 Mon Sep 17 00:00:00 2001 From: Bryson Steck Date: Wed, 20 Oct 2021 13:08:04 -0600 Subject: [PATCH 03/12] would help if i add the files --- .gitignore | 2 + patches/barheight.diff | 25 ++ patches/pango.diff | 755 ++++++++++++++++++++++++++++++++++++++ patches/uselessgap.diff | 81 ++++ patches/xfce-plugins.diff | 125 +++++++ 5 files changed, 988 insertions(+) create mode 100644 .gitignore create mode 100644 patches/barheight.diff create mode 100644 patches/pango.diff create mode 100644 patches/uselessgap.diff create mode 100644 patches/xfce-plugins.diff diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..874c63c --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.o + diff --git a/patches/barheight.diff b/patches/barheight.diff new file mode 100644 index 0000000..a576111 --- /dev/null +++ b/patches/barheight.diff @@ -0,0 +1,25 @@ +diff --git a/config.def.h b/config.def.h +index 1c0b587..9814500 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -5,6 +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 int user_bh = 0; /* 0 means that dwm will calculate bar height, >= 1 means dwm will user_bh as bar height */ + 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 4465af1..2c27cb3 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -1545,7 +1545,7 @@ setup(void) + if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) + die("no fonts could be loaded."); + lrpad = drw->fonts->h; +- bh = drw->fonts->h + 2; ++ bh = user_bh ? user_bh : drw->fonts->h + 2; + updategeom(); + /* init atoms */ + utf8string = XInternAtom(dpy, "UTF8_STRING", False); diff --git a/patches/pango.diff b/patches/pango.diff new file mode 100644 index 0000000..b64fdbe --- /dev/null +++ b/patches/pango.diff @@ -0,0 +1,755 @@ +From 986b03fee484ecc98c0913ee3678318bc8c29d65 Mon Sep 17 00:00:00 2001 +From: Marius Iacob +Date: Mon, 11 May 2020 12:17:20 +0300 +Subject: [PATCH 1/4] pango support + +--- + config.def.h | 2 +- + config.mk | 4 +- + drw.c | 303 +++++++++++++-------------------------------------- + drw.h | 17 ++- + dwm.c | 28 ++--- + util.h | 4 + + 6 files changed, 106 insertions(+), 252 deletions(-) + +diff --git a/config.def.h b/config.def.h +index 1c0b587..d201ae6 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 7084c33..b5c7e12 100644 +--- a/config.mk ++++ b/config.mk +@@ -21,8 +21,8 @@ FREETYPEINC = /usr/include/freetype2 + #FREETYPEINC = ${X11INC}/freetype2 + + # 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_POSIX_C_SOURCE=200809L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} +diff --git a/drw.c b/drw.c +index 8fd1ca4..6d1b64e 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) + { +@@ -99,58 +49,37 @@ drw_free(Drw *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 { +- die("no font specified."); +- } ++ PangoFontMap *fontmap; ++ PangoContext *context; ++ PangoFontDescription *desc; ++ PangoFontMetrics *metrics; + +- /* Do not allow using color fonts. This is a workaround for a BadLength +- * error from Xft with color glyphs. Modelled on the Xterm workaround. See +- * https://bugzilla.redhat.com/show_bug.cgi?id=1498269 +- * https://lists.suckless.org/dev/1701/30932.html +- * https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=916349 +- * and lots more all over the internet. +- */ +- FcBool iscol; +- if(FcPatternGetBool(xfont->pattern, FC_COLOR, 0, &iscol) == FcResultMatch && iscol) { +- XftFontClose(drw->dpy, xfont); +- return NULL; ++ ++ 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, pango_language_from_string ("en-us")); ++ font->h = pango_font_metrics_get_height(metrics) / PANGO_SCALE; ++ ++ pango_font_metrics_unref(metrics); ++ g_object_unref(context); ++ + return font; + } + +@@ -159,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); + } + } +@@ -221,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) + { +@@ -248,24 +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) + { + char buf[1024]; + int ty; + unsigned int ew; + XftDraw *d = NULL; +- Fnt *usedfont, *curfont, *nextfont; + size_t i, len; +- 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; +- +- if (!drw || (render && !drw->scheme) || !text || !drw->fonts) ++ int render = x || y || w || h; ++ ++ if (!drw || (render && !drw->scheme) || !text || !drw->font) + return 0; + + if (!render) { +@@ -280,98 +187,37 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp + w -= lpad; + } + +- usedfont = drw->fonts; +- while (1) { +- 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) { +- if (curfont == usedfont) { +- utf8strlen += utf8charlen; +- text += utf8charlen; +- } else { +- nextfont = curfont; +- } +- break; +- } +- } +- +- if (!charexists || nextfont) +- break; +- else +- charexists = 0; +- } +- +- if (utf8strlen) { +- drw_font_getexts(usedfont, utf8str, utf8strlen, &ew, NULL); +- /* shorten text if necessary */ +- for (len = MIN(utf8strlen, sizeof(buf) - 1); len && ew > w; len--) +- drw_font_getexts(usedfont, utf8str, len, &ew, NULL); +- +- if (len) { +- memcpy(buf, utf8str, len); +- buf[len] = '\0'; +- if (len < utf8strlen) +- 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 *)buf, len); +- } +- x += ew; +- w -= ew; +- } +- } +- +- if (!*text) { +- 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; +- +- 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); +- FcPatternAddBool(fcpattern, FC_COLOR, FcFalse); +- +- 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); +- usedfont = drw->fonts; +- } ++ len = strlen(text); ++ ++ if (len) { ++ drw_font_getexts(drw->font, text, len, &ew, NULL, markup); ++ /* shorten text if necessary */ ++ for (len = MIN(len, sizeof(buf) - 1); len && ew > w; len--) ++ drw_font_getexts(drw->font, text, len, &ew, NULL, markup); ++ ++ 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 - drw->font->h) / 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 (d) + XftDrawDestroy(d); + +@@ -389,24 +235,29 @@ 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); + } + + 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; + } +diff --git a/drw.h b/drw.h +index 4bcd5ad..3d3a906 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,10 +30,10 @@ 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); +-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); ++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); +@@ -46,12 +44,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 9fd0286..cc180c4 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 */ +@@ -237,7 +239,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, blw = 0; /* bar geometry */ +@@ -440,7 +442,7 @@ buttonpress(XEvent *e) + arg.ui = 1 << i; + } else if (ev->x < x + blw) + click = ClkLtSymbol; +- else if (ev->x > selmon->ww - TEXTW(stext)) ++ else if (ev->x > selmon->ww - TEXTWM(stext)) + click = ClkStatusText; + else + click = ClkWinTitle; +@@ -697,16 +699,16 @@ 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; + + /* 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) { +@@ -718,7 +720,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, +@@ -727,12 +729,12 @@ drawbar(Monitor *m) + } + w = blw = 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 { +@@ -1543,10 +1545,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.28.0 + + +From 62b46168970345a67cce6afb7bddb3c4eddbde8c Mon Sep 17 00:00:00 2001 +From: Marius Iacob +Date: Wed, 20 May 2020 17:04:34 +0300 +Subject: [PATCH 2/4] removed some blank lines + +--- + drw.c | 1 - + dwm.c | 1 - + 2 files changed, 2 deletions(-) + +diff --git a/drw.c b/drw.c +index 6d1b64e..30543f2 100644 +--- a/drw.c ++++ b/drw.c +@@ -60,7 +60,6 @@ xfont_create(Drw *drw, const char *fontname) + PangoFontDescription *desc; + PangoFontMetrics *metrics; + +- + if (!fontname) { + die("no font specified."); + } +diff --git a/dwm.c b/dwm.c +index cc180c4..d63ebb4 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -1599,7 +1599,6 @@ setup(void) + focus(NULL); + } + +- + void + seturgent(Client *c, int urg) + { +-- +2.28.0 + + +From 1d3a8696e884317c7eab0cc47c2a2e4fca1d1685 Mon Sep 17 00:00:00 2001 +From: Marius Iacob +Date: Wed, 22 Jul 2020 09:48:32 +0300 +Subject: [PATCH 3/4] Fixed patch after update + +--- + drw.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drw.c b/drw.c +index b834cef..34bda61 100644 +--- a/drw.c ++++ b/drw.c +@@ -45,7 +45,7 @@ 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); + } + +-- +2.28.0 + + +From 63d0a5e4a8fb109c5a032e76d5e2410fa792e45f Mon Sep 17 00:00:00 2001 +From: Marius Iacob +Date: Tue, 20 Oct 2020 21:06:48 +0300 +Subject: [PATCH 4/4] font rendering fixes + +removed hardcoded locale, should use system defined in env vars + +get height of text on a case by case basis, helps with CJK fonts +--- + drw.c | 20 ++++++++++++-------- + 1 file changed, 12 insertions(+), 8 deletions(-) + +diff --git a/drw.c b/drw.c +index 34bda61..1795a13 100644 +--- a/drw.c ++++ b/drw.c +@@ -74,7 +74,7 @@ xfont_create(Drw *drw, const char *fontname) + font->layout = pango_layout_new(context); + pango_layout_set_font_description(font->layout, desc); + +- metrics = pango_context_get_metrics(context, desc, pango_language_from_string ("en-us")); ++ metrics = pango_context_get_metrics(context, desc, NULL); + font->h = pango_font_metrics_get_height(metrics) / PANGO_SCALE; + + pango_font_metrics_unref(metrics); +@@ -166,8 +166,8 @@ 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) + { + char buf[1024]; +- int ty; +- unsigned int ew; ++ int ty, th; ++ unsigned int ew, eh; + XftDraw *d = NULL; + size_t i, len; + int render = x || y || w || h; +@@ -190,10 +190,14 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp + len = strlen(text); + + if (len) { +- drw_font_getexts(drw->font, text, len, &ew, NULL, markup); ++ 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, NULL, markup); ++ 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 (len) { + memcpy(buf, text, len); +@@ -203,7 +207,7 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp + ; /* NOP */ + + if (render) { +- ty = y + (h - drw->font->h) / 2; ++ ty = y + (h - th) / 2; + if(markup) + pango_layout_set_markup(drw->font->layout, buf, len); + else +@@ -259,7 +263,7 @@ drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, + if (w) + *w = r.width / PANGO_SCALE; + if (h) +- *h = font->h; ++ *h = r.height / PANGO_SCALE; + } + + Cur * +-- +2.28.0 + diff --git a/patches/uselessgap.diff b/patches/uselessgap.diff new file mode 100644 index 0000000..d9cacbe --- /dev/null +++ b/patches/uselessgap.diff @@ -0,0 +1,81 @@ +From 58a5ece9406ca6c90dc362617c065e4aac19417f Mon Sep 17 00:00:00 2001 +From: Cyril Cressent +Date: Wed, 3 Jul 2019 21:33:45 -0700 +Subject: [PATCH] Port the uselessgap patch to 6.2 + +--- + config.def.h | 1 + + dwm.c | 36 ++++++++++++++++++++++++++++++------ + 2 files changed, 31 insertions(+), 6 deletions(-) + +diff --git a/config.def.h b/config.def.h +index 1c0b587..b11471d 100644 +--- 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 = 6; /* 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 */ +diff --git a/dwm.c b/dwm.c +index 4465af1..4545e05 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -52,8 +52,8 @@ + #define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags])) + #define LENGTH(X) (sizeof X / sizeof X[0]) + #define MOUSEMASK (BUTTONMASK|PointerMotionMask) +-#define WIDTH(X) ((X)->w + 2 * (X)->bw) +-#define HEIGHT(X) ((X)->h + 2 * (X)->bw) ++#define WIDTH(X) ((X)->w + 2 * (X)->bw + gappx) ++#define HEIGHT(X) ((X)->h + 2 * (X)->bw + gappx) + #define TAGMASK ((1 << LENGTH(tags)) - 1) + #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) + +@@ -1276,12 +1276,36 @@ void + resizeclient(Client *c, int x, int y, int w, int h) + { + XWindowChanges wc; ++ unsigned int n; ++ unsigned int gapoffset; ++ unsigned int gapincr; ++ Client *nbc; + +- c->oldx = c->x; c->x = wc.x = x; +- c->oldy = c->y; c->y = wc.y = y; +- c->oldw = c->w; c->w = wc.width = w; +- c->oldh = c->h; c->h = wc.height = h; + wc.border_width = c->bw; ++ ++ /* Get number of clients for the selected monitor */ ++ for (n = 0, nbc = nexttiled(selmon->clients); nbc; nbc = nexttiled(nbc->next), n++); ++ ++ /* Do nothing if layout is floating */ ++ if (c->isfloating || selmon->lt[selmon->sellt]->arrange == NULL) { ++ gapincr = gapoffset = 0; ++ } else { ++ /* Remove border and gap if layout is monocle or only one client */ ++ if (selmon->lt[selmon->sellt]->arrange == monocle || n == 1) { ++ gapoffset = 0; ++ gapincr = -2 * borderpx; ++ wc.border_width = 0; ++ } else { ++ gapoffset = gappx; ++ gapincr = 2 * gappx; ++ } ++ } ++ ++ c->oldx = c->x; c->x = wc.x = x + gapoffset; ++ c->oldy = c->y; c->y = wc.y = y + gapoffset; ++ c->oldw = c->w; c->w = wc.width = w - gapincr; ++ c->oldh = c->h; c->h = wc.height = h - gapincr; ++ + XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); + configure(c); + XSync(dpy, False); +-- +2.22.0 + diff --git a/patches/xfce-plugins.diff b/patches/xfce-plugins.diff new file mode 100644 index 0000000..c789daf --- /dev/null +++ b/patches/xfce-plugins.diff @@ -0,0 +1,125 @@ +From 4e33fe0d465fb24f6b42d4a1fb63d4d7902f1986 Mon Sep 17 00:00:00 2001 +From: Gunther Klessinger +Date: Thu, 1 Jul 2021 09:19:07 +0200 +Subject: [PATCH] Supporting xfce4-panel in dwm + +We treat the panel as special window which +- never has borders +- never has focus +- always has y=0 +- is never shown as active window in the indicators +- is shown on all tags (via config rule) +- is ignored on focusstack (MOD+j, MOD+k) + +Which window? "xfce4-panel" - configurable in config.h +--- + config.def.h | 2 ++ + dwm.c | 28 +++++++++++++++++++++------- + 2 files changed, 23 insertions(+), 7 deletions(-) + +diff --git a/config.def.h b/config.def.h +index 1c0b587..3b9e7d6 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -3,6 +3,7 @@ + /* appearance */ + static const unsigned int borderpx = 1; /* border pixel of windows */ + static const unsigned int snap = 32; /* snap pixel */ ++static const char panel[][20] = { "xfce4-panel", "Xfce4-panel" }; /* name & cls of panel win */ + 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" }; + + + /* layout(s) */ +diff --git a/dwm.c b/dwm.c +index b0b3466..956d402 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -175,6 +175,7 @@ static long getstate(Window w); + static int gettextprop(Window w, Atom atom, char *text, unsigned int size); + static void grabbuttons(Client *c, int focused); + static void grabkeys(void); ++static int ispanel(Client *c); + static void incnmaster(const Arg *arg); + static void keypress(XEvent *e); + static void killclient(const Arg *arg); +@@ -710,6 +711,8 @@ drawbar(Monitor *m) + } + + for (c = m->clients; c; c = c->next) { ++ // prevent showing the panel as active application: ++ if (ispanel(c)) continue; + occ |= c->tags; + if (c->isurgent) + urg |= c->tags; +@@ -793,11 +796,14 @@ focus(Client *c) + selmon = c->mon; + if (c->isurgent) + seturgent(c, 0); +- detachstack(c); +- attachstack(c); +- grabbuttons(c, 1); +- XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel); +- setfocus(c); ++ // prevents the panel getting focus when tag switching: ++ if (!ispanel(c)) { ++ detachstack(c); ++ attachstack(c); ++ grabbuttons(c, 1); ++ XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel); ++ setfocus(c); ++ } + } else { + XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); + XDeleteProperty(dpy, root, netatom[NetActiveWindow]); +@@ -853,6 +859,7 @@ focusstack(const Arg *arg) + if (c) { + focus(c); + restack(selmon); ++ if (ispanel(c)) focusstack(arg); + } + } + +@@ -964,6 +971,11 @@ grabkeys(void) + } + } + ++int ++ispanel(Client *c) { ++ return !strcmp(c->name, panel[0]); ++} ++ + void + incnmaster(const Arg *arg) + { +@@ -1049,7 +1061,8 @@ manage(Window w, XWindowAttributes *wa) + c->y = MAX(c->y, ((c->mon->by == c->mon->my) && (c->x + (c->w / 2) >= c->mon->wx) + && (c->x + (c->w / 2) < c->mon->wx + c->mon->ww)) ? bh : c->mon->my); + c->bw = borderpx; +- ++ // no border - even when active ++ if (ispanel(c)) c->bw = c->oldbw = 0; + wc.border_width = c->bw; + XConfigureWindow(dpy, w, CWBorderWidth, &wc); + XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColBorder].pixel); +@@ -1283,6 +1296,7 @@ resizeclient(Client *c, int x, int y, int w, int h) + c->oldw = c->w; c->w = wc.width = w; + c->oldh = c->h; c->h = wc.height = h; + wc.border_width = c->bw; ++ if (ispanel(c)) c->y = c->oldy = c->bw = wc.y = wc.border_width = 0; + XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); + configure(c); + XSync(dpy, False); +@@ -1991,7 +2005,7 @@ void + updatestatus(void) + { + if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) +- strcpy(stext, "dwm-"VERSION); ++ strcpy(stext, " "); // no shining of dwm version thru panel, when transparent + drawbar(selmon); + } + +-- +2.31.1 + From 507760bbff6d87f4d9c8371ebe50abd389153dd0 Mon Sep 17 00:00:00 2001 From: Bryson Steck Date: Wed, 20 Oct 2021 13:08:40 -0600 Subject: [PATCH 04/12] removed compiled files --- drw.o | Bin 10584 -> 0 bytes dwm.o | Bin 57800 -> 0 bytes util.o | Bin 2256 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 drw.o delete mode 100644 dwm.o delete mode 100644 util.o diff --git a/drw.o b/drw.o deleted file mode 100644 index 57700fd5a8de8afefcb924e12f501da0236c1fb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10584 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 AdH?_b From ed5d75083c5311d51e6a8977494590bada117ce2 Mon Sep 17 00:00:00 2001 From: Bryson Steck Date: Wed, 20 Oct 2021 13:55:26 -0600 Subject: [PATCH 05/12] fixed zoom and colors --- config.h | 4 ++-- dwm | Bin 62096 -> 62128 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config.h b/config.h index 73c4f2a..f136885 100644 --- a/config.h +++ b/config.h @@ -7,7 +7,7 @@ static const int showbar = 1; /* 0 means no bar */ static const int topbar = 1; /* 0 means bottom bar */ static const char *fonts[] = { "JetBrains Mono:size=12" }; static const char dmenufont[] = "JetBrains Mono:size=12"; -static const char black[] = "#000000"; +static const char col_black[] = "#000000"; static const char col_gray1[] = "#222222"; static const char col_gray2[] = "#444444"; static const char col_gray3[] = "#bbbbbb"; @@ -23,7 +23,7 @@ static const unsigned int gappx = 6; static const char *colors[][3] = { /* fg bg border */ - [SchemeNorm] = { col_nord4, col_gray1, col_gray1 }, + [SchemeNorm] = { col_nord4, col_black, col_gray1 }, [SchemeSel] = { col_nord4, col_gray2, col_gray1 }, }; diff --git a/dwm b/dwm index 62c1b44e802a5d336b8aeb2b742e268d2edde92e..bb77d6012b0ac1c5bbc16bfd997ec82bc93e84e6 100755 GIT binary patch delta 3919 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 From 51eabedba7501428a87f2a3bd9a76528ca79603b Mon Sep 17 00:00:00 2001 From: Bryson Steck Date: Mon, 8 Nov 2021 21:20:47 -0700 Subject: [PATCH 06/12] made things better and cleaner --- config.h | 49 ++++++++++++++++++++++++++++++------------------- dwm | Bin 62128 -> 66192 bytes 2 files changed, 30 insertions(+), 19 deletions(-) diff --git a/config.h b/config.h index f136885..ffd2d4c 100644 --- a/config.h +++ b/config.h @@ -1,34 +1,39 @@ /* See LICENSE file for copyright and license details. */ /* appearance */ -static const unsigned int borderpx = 1; /* border pixel of windows */ +static const unsigned int borderpx = 0; /* 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[] = { "JetBrains Mono:size=12" }; -static const char dmenufont[] = "JetBrains Mono:size=12"; -static const char col_black[] = "#000000"; +static const int topbar = 0; /* 0 means bottom bar */ +static const char *fonts[] = { "Roboto:size=14" }; +static const char dmenufont[] = "Roboto:size=14"; +static const char col_turquoise[] = "#00776C"; +static const char col_black[] = "#000000"; static const char col_gray1[] = "#222222"; +static const char col_gray1_5[] = "#333333"; 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 col_nord0[] = "#2e3440"; -static const char col_nord1[] = "#3b4252"; -static const char col_nord2[] = "#434c5e"; -static const char col_nord3[] = "#4c566a"; -static const char col_nord4[] = "#d8dee9"; -static const char col_nord10[] = "#5e81ac"; -static const unsigned int gappx = 6; +static const char col_nord0[] = "#2e3440"; +static const char col_nord1[] = "#3b4252"; +static const char col_nord2[] = "#434c5e"; +static const char col_nord3[] = "#4c566a"; +static const char col_nord4[] = "#d8dee9"; +static const char col_nord10[] = "#5e81ac"; +static const char col_blue[] = "#144982"; +static const char col_yellow[] = "#D3AD66"; +static const char col_warm_white[] = "#DCD6B8"; +static const unsigned int gappx = 6; static const char *colors[][3] = { /* fg bg border */ - [SchemeNorm] = { col_nord4, col_black, col_gray1 }, - [SchemeSel] = { col_nord4, col_gray2, col_gray1 }, + [SchemeNorm] = { col_nord4, col_black, col_black }, + [SchemeSel] = { col_nord4, col_gray1, col_black }, }; /* tagging */ -static const char *tags[] = { "1", "2", "3", "4" }; +static const char *tags[] = { "1", "2", "3", "4", "5" }; static const Rule rules[] = { /* xprop(1): @@ -38,6 +43,12 @@ static const Rule rules[] = { /* class instance title tags mask isfloating monitor */ { "zoom", NULL, NULL, 0, 1, -1 }, { "Firefox", NULL, NULL, 1 << 8, 0, -1 }, + { "Mars", NULL, NULL, 0, 1, -1 }, + { "Engrampa", NULL, NULL, 0, 1, -1 }, + { "chatterino",NULL, NULL, 0, 1, -1 }, + { "Wiimmfi-RPC v1.7.5",NULL,NULL, 0, 1, -1 }, + { "minecraft-launcher",NULL,NULL, 0, 1, -1 }, + { "nitrogen", NULL, NULL, 0, 1, -1 }, }; /* layout(s) */ @@ -48,9 +59,9 @@ static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen win static const Layout layouts[] = { /* symbol arrange function */ - { "[]=", tile }, /* first entry is default */ - { "><>", NULL }, /* no layout function means floating behavior */ - { "[M]", monocle }, + { "t", tile }, /* first entry is default */ + { "f", NULL }, /* no layout function means floating behavior */ + { "m", monocle }, }; /* key definitions */ @@ -66,7 +77,7 @@ 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_history", "-b", "-m", dmenumon, "-fn", dmenufont, "-nb", col_black, "-nf", col_gray3, "-sb", col_blue, "-sf", col_gray4, NULL }; static const char *termcmd[] = { "alacritty", NULL }; static const char *brightnessup[] = { "brightness-up", NULL }; static const char *brightnessdown[] = { "brightness-down", NULL }; diff --git a/dwm b/dwm index bb77d6012b0ac1c5bbc16bfd997ec82bc93e84e6..03b3a83bf39c2a0780e296222a5affd78fad17aa 100755 GIT binary patch delta 24397 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 delta 24211 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 From 3425d4bda4641a1ca3082361ba756947f029fa8a Mon Sep 17 00:00:00 2001 From: Bryson Steck Date: Mon, 7 Feb 2022 11:54:51 -0700 Subject: [PATCH 07/12] saving changes before redoing --- .gitignore | 2 +- config.def.h | 9 ++ config.h | 41 ++++++-- drw.c | 1 + dwm | Bin 66192 -> 0 bytes dwm.1 | 33 +++++-- dwm.c | 263 ++++++++++++++++++++++++++++++++++++++++++--------- 7 files changed, 286 insertions(+), 63 deletions(-) delete mode 100755 dwm diff --git a/.gitignore b/.gitignore index 874c63c..0564216 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ *.o - +/patches diff --git a/config.def.h b/config.def.h index 08cfbd4..9f840d6 100644 --- a/config.def.h +++ b/config.def.h @@ -6,6 +6,13 @@ static const unsigned int gappx = 6; /* 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 */ +/* Display modes of the tab bar: never shown, always shown, shown only in */ +/* monocle mode in the presence of several windows. */ +/* Modes after showtab_nmodes are disabled. */ +enum showtab_modes { showtab_never, showtab_auto, showtab_nmodes, showtab_always}; +static const int showtab = showtab_auto; /* Default tab bar show mode */ +static const int toptab = False; /* False means bottom tab bar */ + static const char *fonts[] = { "monospace:size=10" }; static const char dmenufont[] = "monospace:size=10"; static const char col_gray1[] = "#222222"; @@ -66,6 +73,7 @@ static Key keys[] = { { MODKEY, XK_p, spawn, {.v = dmenucmd } }, { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, { MODKEY, XK_b, togglebar, {0} }, + { MODKEY, XK_w, tabmode, {-1} }, { MODKEY, XK_j, focusstack, {.i = +1 } }, { MODKEY, XK_k, focusstack, {.i = -1 } }, { MODKEY, XK_i, incnmaster, {.i = +1 } }, @@ -113,5 +121,6 @@ static Button buttons[] = { { ClkTagBar, 0, Button3, toggleview, {0} }, { ClkTagBar, MODKEY, Button1, tag, {0} }, { ClkTagBar, MODKEY, Button3, toggletag, {0} }, + { ClkTabBar, 0, Button1, focuswin, {0} }, }; diff --git a/config.h b/config.h index ffd2d4c..cb2f1b3 100644 --- a/config.h +++ b/config.h @@ -1,14 +1,15 @@ /* See LICENSE file for copyright and license details. */ /* appearance */ -static const unsigned int borderpx = 0; /* border pixel of windows */ +static const unsigned int borderpx = 3; /* 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 = 0; /* 0 means bottom bar */ -static const char *fonts[] = { "Roboto:size=14" }; +static const char *fonts[] = { "Roboto:size=14", "emoji:size=14" }; static const char dmenufont[] = "Roboto:size=14"; static const char col_turquoise[] = "#00776C"; static const char col_black[] = "#000000"; +static const char col_black_border[] = "#101010"; static const char col_gray1[] = "#222222"; static const char col_gray1_5[] = "#333333"; static const char col_gray2[] = "#444444"; @@ -21,19 +22,32 @@ static const char col_nord2[] = "#434c5e"; static const char col_nord3[] = "#4c566a"; static const char col_nord4[] = "#d8dee9"; static const char col_nord10[] = "#5e81ac"; +static const char col_white1[] = "#DBDBDD"; +static const char col_white2[] = "#FFFFFF"; +static const char col_purple1[] = "#02060F"; +static const char col_purple2[] = "#0D0224"; static const char col_blue[] = "#144982"; +static const char col_blue2[] = "#143968"; +static const char col_orange[] = "#F59549"; +static const char col_other[] = "#191C21"; static const char col_yellow[] = "#D3AD66"; static const char col_warm_white[] = "#DCD6B8"; static const unsigned int gappx = 6; +/* Display modes of the tab bar: never shown, always shown, shown only in */ +/* monocle mode in the presence of several windows. */ +/* Modes after showtab_nmodes are disabled. */ +enum showtab_modes { showtab_never, showtab_auto, showtab_nmodes, showtab_always}; +static const int showtab = showtab_auto; /* Default tab bar show mode */ +static const int toptab = False; /* False means bottom tab bar */ static const char *colors[][3] = { /* fg bg border */ - [SchemeNorm] = { col_nord4, col_black, col_black }, - [SchemeSel] = { col_nord4, col_gray1, col_black }, + [SchemeNorm] = { col_nord4, col_black, col_black_border }, + [SchemeSel] = { col_nord4, col_gray1, col_blue }, }; /* tagging */ -static const char *tags[] = { "1", "2", "3", "4", "5" }; +static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8" }; static const Rule rules[] = { /* xprop(1): @@ -49,6 +63,7 @@ static const Rule rules[] = { { "Wiimmfi-RPC v1.7.5",NULL,NULL, 0, 1, -1 }, { "minecraft-launcher",NULL,NULL, 0, 1, -1 }, { "nitrogen", NULL, NULL, 0, 1, -1 }, + { "Galculator",NULL, NULL, 0, 1, -1 }, }; /* layout(s) */ @@ -78,15 +93,22 @@ static const Layout layouts[] = { /* commands */ static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ static const char *dmenucmd[] = { "dmenu_run_history", "-b", "-m", dmenumon, "-fn", dmenufont, "-nb", col_black, "-nf", col_gray3, "-sb", col_blue, "-sf", col_gray4, NULL }; -static const char *termcmd[] = { "alacritty", NULL }; +static const char *termcmd[] = { "spawn-alacritty.sh", NULL }; static const char *brightnessup[] = { "brightness-up", NULL }; static const char *brightnessdown[] = { "brightness-down", NULL }; +static const char *screenshooter[] = { "xfce4-screenshooter", NULL }; +static const char *volup[] = { "volup.sh", NULL }; +static const char *voldown[] = { "voldown.sh", NULL }; +static const char *volmute[] = { "volmute.sh", NULL }; +static const char *firefox[] = { "firefox", "--new-window", NULL }; static Key keys[] = { /* modifier key function argument */ { MODKEY, XK_p, spawn, {.v = dmenucmd } }, { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, + { MODKEY|ShiftMask, XK_f, spawn, {.v = firefox } }, { MODKEY, XK_b, togglebar, {0} }, + { MODKEY, XK_w, tabmode, {-1} }, { MODKEY, XK_j, focusstack, {.i = +1 } }, { MODKEY, XK_k, focusstack, {.i = -1 } }, { MODKEY, XK_i, incnmaster, {.i = +1 } }, @@ -109,6 +131,10 @@ static Key keys[] = { { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, { MODKEY, XK_F4, spawn, {.v = brightnessup } }, { MODKEY, XK_F3, spawn, {.v = brightnessdown } }, + { MODKEY, XK_Print, spawn, {.v = screenshooter } }, + { MODKEY, XK_F9, spawn, {.v = volmute } }, + { MODKEY, XK_F10, spawn, {.v = voldown } }, + { MODKEY, XK_F11, spawn, {.v = volup } }, TAGKEYS( XK_1, 0) TAGKEYS( XK_2, 1) TAGKEYS( XK_3, 2) @@ -118,7 +144,7 @@ static Key keys[] = { TAGKEYS( XK_7, 6) TAGKEYS( XK_8, 7) TAGKEYS( XK_9, 8) - { MODKEY|ShiftMask, XK_q, quit, {0} }, + { MODKEY|ShiftMask, XK_BackSpace, quit, {0} }, }; /* button definitions */ @@ -136,5 +162,6 @@ static Button buttons[] = { { ClkTagBar, 0, Button3, toggleview, {0} }, { ClkTagBar, MODKEY, Button1, tag, {0} }, { ClkTagBar, MODKEY, Button3, toggletag, {0} }, + { ClkTabBar, 0, Button1, focuswin, {0} }, }; diff --git a/drw.c b/drw.c index 4cdbcbe..190420f 100644 --- a/drw.c +++ b/drw.c @@ -203,6 +203,7 @@ drw_clr_create(Drw *drw, Clr *dest, const char *clrname) 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 diff --git a/dwm b/dwm deleted file mode 100755 index 03b3a83bf39c2a0780e296222a5affd78fad17aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66192 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

fj>w1 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 diff --git a/dwm.1 b/dwm.1 index ddc8321..7752444 100644 --- a/dwm.1 +++ b/dwm.1 @@ -20,14 +20,22 @@ layout applied. Windows are grouped by tags. Each window can be tagged with one or multiple tags. Selecting certain tags displays all windows with these tags. .P -Each screen contains a small status bar which displays all available tags, the -layout, the title of the focused window, and the text read from the root window -name property, if the screen is focused. A floating window is indicated with an -empty square and a maximised floating window is indicated with a filled square -before the windows title. The selected tags are indicated with a different -color. The tags of the focused window are indicated with a filled square in the -top left corner. The tags which are applied to one or more windows are -indicated with an empty square in the top left corner. +Each screen contains two small status bars. +.P +One bar displays all available tags, the layout, the title of the focused +window, and the text read from the root window name property, if the screen is +focused. A floating window is indicated with an empty square and a maximised +floating window is indicated with a filled square before the windows title. The +selected tags are indicated with a different color. The tags of the focused +window are indicated with a filled square in the top left corner. The tags +which are applied to one or more windows are indicated with an empty square in +the top left corner. +.P +Another bar contains a tab for each window of the current view and allows +navigation between windows, especially in the monocle mode. The different +display modes of this bar are described under the Mod1\-w Keybord command +section. When a single tag is selected, this tag is indicated in the left corner +of the tab bar. .P dwm draws a small border around windows to indicate the focus state. .SH OPTIONS @@ -44,7 +52,8 @@ command. .TP .B Button1 click on a tag label to display all windows with that tag, click on the layout -label toggles between tiled and floating layout. +label toggles between tiled and floating layout, click on a window name in the +tab bar brings focus to that window. .TP .B Button3 click on a tag label adds/removes all windows with that tag to/from the view. @@ -110,6 +119,12 @@ Increase master area size. .B Mod1\-h Decrease master area size. .TP +.B Mod1\-w +Cycle over the tab bar display modes: never displayed, always displayed, +displayed only in monocle mode when the view contains more than one window (auto +mode). Some display modes can be disabled in the configuration, config.h. In +the default configuration only "never" and "auto" display modes are enabled. +.TP .B Mod1\-Return Zooms/cycles focused window to/from master area (tiled layouts only). .TP diff --git a/dwm.c b/dwm.c index 496e52b..e9b6234 100644 --- a/dwm.c +++ b/dwm.c @@ -64,7 +64,7 @@ enum { NetSupported, NetWMName, NetWMState, NetWMCheck, NetWMFullscreen, NetActiveWindow, NetWMWindowType, NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ -enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, +enum { ClkTagBar, ClkTabBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ typedef union { @@ -111,24 +111,32 @@ typedef struct { void (*arrange)(Monitor *); } Layout; +#define MAXTABS 50 + struct Monitor { char ltsymbol[16]; float mfact; int nmaster; int num; int by; /* bar geometry */ + int ty; /* tab bar geometry */ int mx, my, mw, mh; /* screen size */ int wx, wy, ww, wh; /* window area */ unsigned int seltags; unsigned int sellt; unsigned int tagset[2]; int showbar; + int showtab; int topbar; + int toptab; Client *clients; Client *sel; Client *stack; Monitor *next; Window barwin; + Window tabwin; + int ntabs; + int tab_widths[MAXTABS]; const Layout *lt[2]; }; @@ -165,10 +173,13 @@ static void drawbar(Monitor *m); static void drawbars(void); static void enternotify(XEvent *e); static void expose(XEvent *e); +static void drawtab(Monitor *m); +static void drawtabs(void); static void focus(Client *c); static void focusin(XEvent *e); static void focusmon(const Arg *arg); static void focusstack(const Arg *arg); +static void focuswin(const Arg* arg); static Atom getatomprop(Client *c, Atom prop); static int getrootptr(int *x, int *y); static long getstate(Window w); @@ -207,6 +218,7 @@ static void seturgent(Client *c, int urg); static void showhide(Client *c); static void sigchld(int unused); static void spawn(const Arg *arg); +static void tabmode(const Arg *arg); static void tag(const Arg *arg); static void tagmon(const Arg *arg); static void tile(Monitor *); @@ -241,6 +253,7 @@ static char stext[256]; static int screen; static int sw, sh; /* X display screen geometry width, height */ static int bh, blw = 0; /* bar geometry */ +static int th = 0; /* tab bar geometry */ static int lrpad; /* sum of left and right padding for text */ static int (*xerrorxlib)(Display *, XErrorEvent *); static unsigned int numlockmask = 0; @@ -393,8 +406,9 @@ arrange(Monitor *m) } void -arrangemon(Monitor *m) -{ +arrangemon(Monitor *m) { + updatebarpos(m); + XMoveResizeWindow(dpy, m->tabwin, m->wx, m->ty, m->ww, th); strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof m->ltsymbol); if (m->lt[m->sellt]->arrange) m->lt[m->sellt]->arrange(m); @@ -444,7 +458,24 @@ buttonpress(XEvent *e) click = ClkStatusText; else click = ClkWinTitle; - } else if ((c = wintoclient(ev->window))) { + } + if(ev->window == selmon->tabwin) { + i = 0; x = 0; + for(c = selmon->clients; c; c = c->next){ + if(!ISVISIBLE(c)) continue; + x += selmon->tab_widths[i]; + if (ev->x > x) + ++i; + else + break; + if(i >= m->ntabs) break; + } + if(c) { + click = ClkTabBar; + arg.ui = i; + } + } + else if((c = wintoclient(ev->window))) { focus(c); restack(selmon); XAllowEvents(dpy, ReplayPointer, CurrentTime); @@ -452,8 +483,9 @@ buttonpress(XEvent *e) } for (i = 0; i < LENGTH(buttons); i++) if (click == buttons[i].click && buttons[i].func && buttons[i].button == ev->button - && CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state)) - buttons[i].func(click == ClkTagBar && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg); + && CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state)){ + buttons[i].func(((click == ClkTagBar || click == ClkTabBar) && buttons[i].arg.i == 0) ? &arg : &buttons[i].arg); + } } void @@ -507,6 +539,8 @@ cleanupmon(Monitor *mon) } XUnmapWindow(dpy, mon->barwin); XDestroyWindow(dpy, mon->barwin); + XUnmapWindow(dpy, mon->tabwin); + XDestroyWindow(dpy, mon->tabwin); free(mon); } @@ -638,7 +672,10 @@ createmon(void) m->mfact = mfact; m->nmaster = nmaster; m->showbar = showbar; + m->showtab = showtab; m->topbar = topbar; + m->toptab = toptab; + m->ntabs = 0; m->lt[0] = &layouts[0]; m->lt[1] = &layouts[1 % LENGTH(layouts)]; strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); @@ -752,6 +789,105 @@ drawbars(void) drawbar(m); } +void +drawtabs(void) { + Monitor *m; + + for(m = mons; m; m = m->next) + drawtab(m); +} + +static int +cmpint(const void *p1, const void *p2) { + /* The actual arguments to this function are "pointers to + pointers to char", but strcmp(3) arguments are "pointers + to char", hence the following cast plus dereference */ + return *((int*) p1) > * (int*) p2; +} + + +void +drawtab(Monitor *m) { + Client *c; + int i; + int itag = -1; + char view_info[50]; + int view_info_w = 0; + int sorted_label_widths[MAXTABS]; + int tot_width; + int maxsize = bh; + int x = 0; + int w = 0; + + //view_info: indicate the tag which is displayed in the view + for(i = 0; i < LENGTH(tags); ++i){ + if((selmon->tagset[selmon->seltags] >> i) & 1) { + if(itag >=0){ //more than one tag selected + itag = -1; + break; + } + itag = i; + } + } + + if(0 <= itag && itag < LENGTH(tags)){ + snprintf(view_info, sizeof view_info, "[%s]", tags[itag]); + } else { + strncpy(view_info, "[...]", sizeof view_info); + } + view_info[sizeof(view_info) - 1 ] = 0; + view_info_w = TEXTW(view_info); + tot_width = view_info_w; + + /* Calculates number of labels and their width */ + m->ntabs = 0; + for(c = m->clients; c; c = c->next){ + if(!ISVISIBLE(c)) continue; + m->tab_widths[m->ntabs] = TEXTW(c->name); + tot_width += m->tab_widths[m->ntabs]; + ++m->ntabs; + if(m->ntabs >= MAXTABS) break; + } + + if(tot_width > m->ww){ //not enough space to display the labels, they need to be truncated + memcpy(sorted_label_widths, m->tab_widths, sizeof(int) * m->ntabs); + qsort(sorted_label_widths, m->ntabs, sizeof(int), cmpint); + tot_width = view_info_w; + for(i = 0; i < m->ntabs; ++i){ + if(tot_width + (m->ntabs - i) * sorted_label_widths[i] > m->ww) + break; + tot_width += sorted_label_widths[i]; + } + maxsize = (m->ww - tot_width) / (m->ntabs - i); + } else{ + maxsize = m->ww; + } + i = 0; + for(c = m->clients; c; c = c->next){ + if(!ISVISIBLE(c)) continue; + if(i >= m->ntabs) break; + if(m->tab_widths[i] > maxsize) m->tab_widths[i] = maxsize; + w = m->tab_widths[i]; + drw_setscheme(drw, scheme[(c == m->sel) ? SchemeSel : SchemeNorm]); + drw_text(drw, x, 0, w, th, 0, c->name, 0); + x += w; + ++i; + } + + drw_setscheme(drw, scheme[SchemeNorm]); + + /* cleans interspace between window names and current viewed tag label */ + w = m->ww - view_info_w - x; + drw_text(drw, x, 0, w, th, 0, "", 0); + + /* view info */ + x += w; + w = view_info_w; + drw_text(drw, x, 0, w, th, 0, view_info, 0); + + drw_map(drw, m->tabwin, 0, 0, m->ww, th); +} + void enternotify(XEvent *e) { @@ -777,8 +913,10 @@ expose(XEvent *e) Monitor *m; XExposeEvent *ev = &e->xexpose; - if (ev->count == 0 && (m = wintomon(ev->window))) + if(ev->count == 0 && (m = wintomon(ev->window))){ drawbar(m); + drawtab(m); + } } void @@ -804,6 +942,7 @@ focus(Client *c) } selmon->sel = c; drawbars(); + drawtabs(); } /* there are some broken focus acquiring clients needing extra handling */ @@ -828,6 +967,8 @@ focusmon(const Arg *arg) unfocus(selmon->sel, 0); selmon = m; focus(NULL); + if (selmon->sel) + XWarpPointer(dpy, None, selmon->sel->win, 0, 0, 0, 0, selmon->sel->w/2, selmon->sel->h/2); } void @@ -853,9 +994,23 @@ focusstack(const Arg *arg) if (c) { focus(c); restack(selmon); + XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w/2, c->h/2); } } +void +focuswin(const Arg* arg){ + int iwin = arg->i; + Client* c = NULL; + for(c = selmon->clients; c && (iwin || !ISVISIBLE(c)) ; c = c->next){ + if(ISVISIBLE(c)) --iwin; + }; + if(c) { + focus(c); + restack(selmon); + } +} + Atom getatomprop(Client *c, Atom prop) { @@ -1234,12 +1389,14 @@ propertynotify(XEvent *e) case XA_WM_HINTS: updatewmhints(c); drawbars(); + drawtabs(); break; } if (ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) { updatetitle(c); if (c == c->mon->sel) drawbar(c->mon); + drawtab(c->mon); } if (ev->atom == netatom[NetWMWindowType]) updatewindowtype(c); @@ -1277,36 +1434,13 @@ void resizeclient(Client *c, int x, int y, int w, int h) { XWindowChanges wc; - unsigned int n; - unsigned int gapoffset; - unsigned int gapincr; - Client *nbc; + c->oldx = c->x; c->x = wc.x = x; + c->oldy = c->y; c->y = wc.y = y; + c->oldw = c->w; c->w = wc.width = w; + c->oldh = c->h; c->h = wc.height = h; wc.border_width = c->bw; - /* Get number of clients for the selected monitor */ - for (n = 0, nbc = nexttiled(selmon->clients); nbc; nbc = nexttiled(nbc->next), n++); - - /* Do nothing if layout is floating */ - if (c->isfloating || selmon->lt[selmon->sellt]->arrange == NULL) { - gapincr = gapoffset = 0; - } else { - /* Remove border and gap if layout is monocle or only one client */ - if (selmon->lt[selmon->sellt]->arrange == monocle || n == 1) { - gapoffset = 0; - gapincr = -2 * borderpx; - wc.border_width = 0; - } else { - gapoffset = gappx; - gapincr = 2 * gappx; - } - } - - c->oldx = c->x; c->x = wc.x = x + gapoffset; - c->oldy = c->y; c->y = wc.y = y + gapoffset; - c->oldw = c->w; c->w = wc.width = w - gapincr; - c->oldh = c->h; c->h = wc.height = h - gapincr; - XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); configure(c); XSync(dpy, False); @@ -1377,6 +1511,7 @@ restack(Monitor *m) XWindowChanges wc; drawbar(m); + drawtab(m); if (!m->sel) return; if (m->sel->isfloating || !m->lt[m->sellt]->arrange) @@ -1571,6 +1706,7 @@ setup(void) die("no fonts could be loaded."); lrpad = drw->fonts->h; bh = drw->fonts->h + 2; + th = bh; updategeom(); /* init atoms */ utf8string = XInternAtom(dpy, "UTF8_STRING", False); @@ -1698,7 +1834,7 @@ tagmon(const Arg *arg) void tile(Monitor *m) { - unsigned int i, n, h, mw, my, ty; + unsigned int i, n, h, r, g = 0, mw, my, ty; Client *c; for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); @@ -1706,20 +1842,20 @@ tile(Monitor *m) return; if (n > m->nmaster) - mw = m->nmaster ? m->ww * m->mfact : 0; + mw = m->nmaster ? (m->ww - (g = gappx)) * 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); + r = MIN(n, m->nmaster) - i; + h = (m->wh - my - gappx * (r - 1)) / r; 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); + my += HEIGHT(c) + 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); + r = n - i; + h = (m->wh - ty - gappx * (r - 1)) / r; + resize(c, m->wx + mw + g, m->wy + ty, m->ww - mw - g - (2*c->bw), h - (2*c->bw), False); + ty += HEIGHT(c) + gappx; } } @@ -1732,6 +1868,17 @@ togglebar(const Arg *arg) arrange(selmon); } +void +tabmode(const Arg *arg) +{ + if(arg && arg->i >= 0) + selmon->showtab = arg->ui % showtab_nmodes; + else + selmon->showtab = (selmon->showtab + 1 ) % showtab_nmodes; + arrange(selmon); +} + + void togglefloating(const Arg *arg) { @@ -1843,6 +1990,11 @@ updatebars(void) CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); XMapRaised(dpy, m->barwin); + m->tabwin = XCreateWindow(dpy, root, m->wx, m->ty, m->ww, th, 0, DefaultDepth(dpy, screen), + CopyFromParent, DefaultVisual(dpy, screen), + CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); + XDefineCursor(dpy, m->tabwin, cursor[CurNormal]->cursor); + XMapRaised(dpy, m->tabwin); XSetClassHint(dpy, m->barwin, &ch); } } @@ -1850,14 +2002,33 @@ updatebars(void) void updatebarpos(Monitor *m) { + Client *c; + int nvis = 0; + 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; - } else + if ( m->topbar ) + m->wy += bh; + } else { m->by = -bh; + } + + for(c = m->clients; c; c = c->next) { + if(ISVISIBLE(c)) ++nvis; + } + + if(m->showtab == showtab_always + || ((m->showtab == showtab_auto) && (nvis > 1) && (m->lt[m->sellt]->arrange == monocle))) { + m->wh -= th; + m->ty = m->toptab ? m->wy : m->wy + m->wh; + if ( m->toptab ) + m->wy += th; + } else { + m->ty = -th; + } } void @@ -2094,7 +2265,7 @@ wintomon(Window w) if (w == root && getrootptr(&x, &y)) return recttomon(x, y, 1, 1); for (m = mons; m; m = m->next) - if (w == m->barwin) + if (w == m->barwin || w == m->tabwin) return m; if ((c = wintoclient(w))) return c->mon; From 1647a70ea6f53e17625d00a91c7c388e1c5892e1 Mon Sep 17 00:00:00 2001 From: Bryson Steck Date: Mon, 7 Feb 2022 12:42:39 -0700 Subject: [PATCH 08/12] added fullgaps --- .gitignore | 4 ++++ dwm.c | 37 +++++++++++++++++++++++++------------ 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index 0564216..bd6f44c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,6 @@ *.o /patches +dwm +*.orig +*.rej +*.1 diff --git a/dwm.c b/dwm.c index e9b6234..187cc33 100644 --- a/dwm.c +++ b/dwm.c @@ -122,6 +122,7 @@ struct Monitor { int ty; /* tab bar geometry */ int mx, my, mw, mh; /* screen size */ int wx, wy, ww, wh; /* window area */ + int gappx; unsigned int seltags; unsigned int sellt; unsigned int tagset[2]; @@ -211,6 +212,7 @@ static void sendmon(Client *c, Monitor *m); 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); @@ -674,6 +676,7 @@ createmon(void) m->showbar = showbar; m->showtab = showtab; m->topbar = topbar; + m->gappx = gappx; m->toptab = toptab; m->ntabs = 0; m->lt[0] = &layouts[0]; @@ -1657,6 +1660,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) { @@ -1834,7 +1847,7 @@ tagmon(const Arg *arg) void tile(Monitor *m) { - unsigned int i, n, h, r, g = 0, mw, my, ty; + unsigned int i, n, h, mw, my, ty; Client *c; for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); @@ -1842,20 +1855,20 @@ tile(Monitor *m) return; if (n > m->nmaster) - mw = m->nmaster ? (m->ww - (g = gappx)) * m->mfact : 0; + 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++) + 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) { - r = MIN(n, m->nmaster) - i; - h = (m->wh - my - gappx * (r - 1)) / r; - resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0); - my += HEIGHT(c) + gappx; + 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 { - r = n - i; - h = (m->wh - ty - gappx * (r - 1)) / r; - resize(c, m->wx + mw + g, m->wy + ty, m->ww - mw - g - (2*c->bw), h - (2*c->bw), False); - ty += HEIGHT(c) + gappx; + 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; } } From 83ef57559adfeb584ff3fac36a2135283df0b44a Mon Sep 17 00:00:00 2001 From: Bryson Steck Date: Thu, 3 Mar 2022 15:54:08 -0700 Subject: [PATCH 09/12] clean config --- .gitignore | 1 - config.h | 45 ++++++++++++++++----------------------------- dwm.c | 2 +- 3 files changed, 17 insertions(+), 31 deletions(-) diff --git a/.gitignore b/.gitignore index bd6f44c..236bde9 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,3 @@ dwm *.orig *.rej -*.1 diff --git a/config.h b/config.h index cb2f1b3..bb004ad 100644 --- a/config.h +++ b/config.h @@ -1,37 +1,22 @@ /* See LICENSE file for copyright and license details. */ /* appearance */ -static const unsigned int borderpx = 3; /* border pixel of windows */ +static const unsigned int borderpx = 5; /* 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 = 0; /* 0 means bottom bar */ -static const char *fonts[] = { "Roboto:size=14", "emoji:size=14" }; -static const char dmenufont[] = "Roboto:size=14"; -static const char col_turquoise[] = "#00776C"; +static const char *fonts[] = { "Inter-Bold:size=12", "emoji:size=12" }; +static const char dmenufont[] = "Inter-Bold:size=12"; +//static const char *fonts[] = { "ComicMono:size=12", "emoji:size=12" }; +//static const char dmenufont[] = "ComicMono:size=12"; static const char col_black[] = "#000000"; static const char col_black_border[] = "#101010"; static const char col_gray1[] = "#222222"; -static const char col_gray1_5[] = "#333333"; 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 col_nord0[] = "#2e3440"; -static const char col_nord1[] = "#3b4252"; -static const char col_nord2[] = "#434c5e"; -static const char col_nord3[] = "#4c566a"; static const char col_nord4[] = "#d8dee9"; -static const char col_nord10[] = "#5e81ac"; -static const char col_white1[] = "#DBDBDD"; -static const char col_white2[] = "#FFFFFF"; -static const char col_purple1[] = "#02060F"; -static const char col_purple2[] = "#0D0224"; static const char col_blue[] = "#144982"; -static const char col_blue2[] = "#143968"; -static const char col_orange[] = "#F59549"; -static const char col_other[] = "#191C21"; -static const char col_yellow[] = "#D3AD66"; -static const char col_warm_white[] = "#DCD6B8"; static const unsigned int gappx = 6; /* Display modes of the tab bar: never shown, always shown, shown only in */ /* monocle mode in the presence of several windows. */ @@ -92,21 +77,23 @@ static const Layout layouts[] = { /* commands */ static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ -static const char *dmenucmd[] = { "dmenu_run_history", "-b", "-m", dmenumon, "-fn", dmenufont, "-nb", col_black, "-nf", col_gray3, "-sb", col_blue, "-sf", col_gray4, NULL }; -static const char *termcmd[] = { "spawn-alacritty.sh", NULL }; -static const char *brightnessup[] = { "brightness-up", NULL }; -static const char *brightnessdown[] = { "brightness-down", NULL }; -static const char *screenshooter[] = { "xfce4-screenshooter", NULL }; -static const char *volup[] = { "volup.sh", NULL }; -static const char *voldown[] = { "voldown.sh", NULL }; -static const char *volmute[] = { "volmute.sh", NULL }; -static const char *firefox[] = { "firefox", "--new-window", NULL }; +static const char *dmenucmd[] = { "dmenu_run_history", "-b", "-m", dmenumon, "-fn", dmenufont, "-nb", col_black, "-nf", col_gray3, "-sb", col_blue, "-sf", col_gray4, NULL }; +static const char *termcmd[] = { "spawn-alacritty.sh", NULL }; +static const char *brightnessup[] = { "brightness-up", NULL }; +static const char *brightnessdown[] = { "brightness-down", NULL }; +static const char *screenshooter[] = { "screenshot.sh", NULL }; +static const char *volup[] = { "volup.sh", NULL }; +static const char *voldown[] = { "voldown.sh", NULL }; +static const char *volmute[] = { "volmute.sh", NULL }; +static const char *firefox[] = { "firefox", "--new-window", NULL }; +static const char *slock[] = { "slock", NULL }; static Key keys[] = { /* modifier key function argument */ { MODKEY, XK_p, spawn, {.v = dmenucmd } }, { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, { MODKEY|ShiftMask, XK_f, spawn, {.v = firefox } }, + { MODKEY|ShiftMask, XK_Escape, spawn, {.v = slock } }, { MODKEY, XK_b, togglebar, {0} }, { MODKEY, XK_w, tabmode, {-1} }, { MODKEY, XK_j, focusstack, {.i = +1 } }, diff --git a/dwm.c b/dwm.c index 187cc33..4a47064 100644 --- a/dwm.c +++ b/dwm.c @@ -212,7 +212,7 @@ static void sendmon(Client *c, Monitor *m); 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 setgaps(const Arg *arg); static void setlayout(const Arg *arg); static void setmfact(const Arg *arg); static void setup(void); From daf0fff8608e0715dcbd62e14ed59f2c50f1c01d Mon Sep 17 00:00:00 2001 From: Bryson Steck Date: Thu, 14 Apr 2022 19:04:46 -0600 Subject: [PATCH 10/12] gruvbox layout --- config.h | 39 +++++++++++++++++---------------------- dwm.c | 20 +++++++++++++------- 2 files changed, 30 insertions(+), 29 deletions(-) diff --git a/config.h b/config.h index bb004ad..fedc405 100644 --- a/config.h +++ b/config.h @@ -1,22 +1,17 @@ /* See LICENSE file for copyright and license details. */ /* appearance */ -static const unsigned int borderpx = 5; /* border pixel of windows */ +static const unsigned int borderpx = 0; /* 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 = 0; /* 0 means bottom bar */ -static const char *fonts[] = { "Inter-Bold:size=12", "emoji:size=12" }; -static const char dmenufont[] = "Inter-Bold:size=12"; -//static const char *fonts[] = { "ComicMono:size=12", "emoji:size=12" }; -//static const char dmenufont[] = "ComicMono:size=12"; -static const char col_black[] = "#000000"; -static const char col_black_border[] = "#101010"; -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_nord4[] = "#d8dee9"; -static const char col_blue[] = "#144982"; +static const int topbar = 1; /* 0 means bottom bar */ +static const char *fonts[] = { "Manrope:style=bold:size=13", "emoji:size=12" }; +static const char dmenufont[] = "Manrope:style=bold:size=13"; +static const char fg[] = "#ebdbb2"; +static const char bg_normal[] = "#3c3836"; +static const char dr_normal[] = "#282828"; +static const char bg_selected[] = "#504945"; +static const char dr_selected[] = "#ebdbb2"; static const unsigned int gappx = 6; /* Display modes of the tab bar: never shown, always shown, shown only in */ /* monocle mode in the presence of several windows. */ @@ -27,12 +22,12 @@ static const int toptab = False; /* False means bottom tab bar static const char *colors[][3] = { /* fg bg border */ - [SchemeNorm] = { col_nord4, col_black, col_black_border }, - [SchemeSel] = { col_nord4, col_gray1, col_blue }, + [SchemeNorm] = { fg, bg_normal, dr_normal }, + [SchemeSel] = { fg, bg_selected, dr_selected }, }; /* tagging */ -static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8" }; +static const char *tags[] = { "1", "2", "3", "4", "5", "6" }; static const Rule rules[] = { /* xprop(1): @@ -60,12 +55,12 @@ static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen win static const Layout layouts[] = { /* symbol arrange function */ { "t", tile }, /* first entry is default */ - { "f", NULL }, /* no layout function means floating behavior */ + { "FL", NULL }, /* no layout function means floating behavior */ { "m", monocle }, }; /* key definitions */ -#define MODKEY Mod1Mask +#define MODKEY Mod4Mask #define TAGKEYS(KEY,TAG) \ { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \ @@ -77,10 +72,10 @@ static const Layout layouts[] = { /* commands */ static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ -static const char *dmenucmd[] = { "dmenu_run_history", "-b", "-m", dmenumon, "-fn", dmenufont, "-nb", col_black, "-nf", col_gray3, "-sb", col_blue, "-sf", col_gray4, NULL }; +static const char *dmenucmd[] = { "dmenu_run_history", "-m", dmenumon, "-fn", dmenufont, "-nb", bg_normal, "-nf", fg, "-sb", bg_selected, "-sf", fg, NULL }; static const char *termcmd[] = { "spawn-alacritty.sh", NULL }; -static const char *brightnessup[] = { "brightness-up", NULL }; -static const char *brightnessdown[] = { "brightness-down", NULL }; +static const char *brightnessup[] = { "brightness-up.sh", NULL }; +static const char *brightnessdown[] = { "brightness-down.sh", NULL }; static const char *screenshooter[] = { "screenshot.sh", NULL }; static const char *volup[] = { "volup.sh", NULL }; static const char *voldown[] = { "voldown.sh", NULL }; diff --git a/dwm.c b/dwm.c index 4a47064..c0b3479 100644 --- a/dwm.c +++ b/dwm.c @@ -93,6 +93,7 @@ struct Client { int bw, oldbw; unsigned int tags; int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; + int issteam; Client *next; Client *snext; Monitor *mon; @@ -307,6 +308,9 @@ applyrules(Client *c) class = ch.res_class ? ch.res_class : broken; instance = ch.res_name ? ch.res_name : broken; + if (strstr(class, "Steam") || strstr(class, "steam_app_")) + c->issteam = 1; + for (i = 0; i < LENGTH(rules); i++) { r = &rules[i]; if ((!r->title || strstr(c->name, r->title)) @@ -625,13 +629,15 @@ configurerequest(XEvent *e) c->bw = ev->border_width; else if (c->isfloating || !selmon->lt[selmon->sellt]->arrange) { m = c->mon; - if (ev->value_mask & CWX) { - c->oldx = c->x; - c->x = m->mx + ev->x; - } - if (ev->value_mask & CWY) { - c->oldy = c->y; - c->y = m->my + ev->y; + if (!c->issteam) { + if (ev->value_mask & CWX) { + c->oldx = c->x; + c->x = m->mx + ev->x; + } + if (ev->value_mask & CWY) { + c->oldy = c->y; + c->y = m->my + ev->y; + } } if (ev->value_mask & CWWidth) { c->oldw = c->w; From 39d86bd3ffb4c35a0d5d6ede5798bddc00c3f42a Mon Sep 17 00:00:00 2001 From: Bryson Steck Date: Wed, 20 Apr 2022 17:07:18 -0600 Subject: [PATCH 11/12] added a few patches --- config.h | 21 +++++++++++++-------- dwm.c | 21 +++++++++++++-------- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/config.h b/config.h index fedc405..c33186f 100644 --- a/config.h +++ b/config.h @@ -27,7 +27,7 @@ static const char *colors[][3] = { }; /* tagging */ -static const char *tags[] = { "1", "2", "3", "4", "5", "6" }; +static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8" }; static const Rule rules[] = { /* xprop(1): @@ -79,9 +79,12 @@ static const char *brightnessdown[] = { "brightness-down.sh", NULL }; static const char *screenshooter[] = { "screenshot.sh", NULL }; static const char *volup[] = { "volup.sh", NULL }; static const char *voldown[] = { "voldown.sh", NULL }; -static const char *volmute[] = { "volmute.sh", NULL }; +//static const char *volmute[] = { "volmute.sh", NULL }; (replaced with *next[] for different keyboards) static const char *firefox[] = { "firefox", "--new-window", NULL }; static const char *slock[] = { "slock", NULL }; +static const char *playpause[] = { "playerctl", "play-pause", NULL }; +static const char *next[] = { "f9.sh", NULL }; +static const char *previous[] = { "playerctl", "previous", NULL }; static Key keys[] = { /* modifier key function argument */ @@ -111,12 +114,14 @@ 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_F4, spawn, {.v = brightnessup } }, - { MODKEY, XK_F3, spawn, {.v = brightnessdown } }, - { MODKEY, XK_Print, spawn, {.v = screenshooter } }, - { MODKEY, XK_F9, spawn, {.v = volmute } }, - { MODKEY, XK_F10, spawn, {.v = voldown } }, - { MODKEY, XK_F11, spawn, {.v = volup } }, + { MODKEY, XK_F4, spawn, {.v = brightnessup } }, + { MODKEY, XK_F3, spawn, {.v = brightnessdown } }, + { MODKEY, XK_Print, spawn, {.v = screenshooter } }, + { MODKEY, XK_F10, spawn, {.v = voldown } }, + { MODKEY, XK_F11, spawn, {.v = volup } }, + { MODKEY, XK_F7, spawn, {.v = previous } }, + { MODKEY, XK_F8, spawn, {.v = playpause } }, + { MODKEY, XK_F9, spawn, {.v = next } }, TAGKEYS( XK_1, 0) TAGKEYS( XK_2, 1) TAGKEYS( XK_3, 2) diff --git a/dwm.c b/dwm.c index c0b3479..edac73b 100644 --- a/dwm.c +++ b/dwm.c @@ -437,7 +437,7 @@ attachstack(Client *c) void buttonpress(XEvent *e) { - unsigned int i, x, click; + unsigned int i, x, click, occ = 0; Arg arg = {0}; Client *c; Monitor *m; @@ -452,9 +452,14 @@ buttonpress(XEvent *e) } if (ev->window == selmon->barwin) { i = x = 0; - do + for (c = m->clients; c; c = c->next) + occ |= c->tags == 255 ? 0 : 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; @@ -756,19 +761,19 @@ drawbar(Monitor *m) } for (c = m->clients; c; c = c->next) { - occ |= c->tags; + occ |= c->tags == 255 ? 0 : c->tags; if (c->isurgent) urg |= c->tags; } 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); From 0df08d5efd99418de6e138285a32bafd7cb2154c Mon Sep 17 00:00:00 2001 From: Bryson Steck Date: Sat, 14 May 2022 00:57:35 -0600 Subject: [PATCH 12/12] add new layout --- config.def.h | 4 ++ config.h | 6 ++- dwm.c | 85 ++++++++++++++++++++++++++++++++++------- patches/uselessgap.diff | 14 ------- 4 files changed, 80 insertions(+), 29 deletions(-) diff --git a/config.def.h b/config.def.h index 9f840d6..9560f9f 100644 --- a/config.def.h +++ b/config.def.h @@ -50,6 +50,8 @@ static const Layout layouts[] = { { "[]=", tile }, /* first entry is default */ { "><>", NULL }, /* no layout function means floating behavior */ { "[M]", monocle }, + { "TTT", bstack }, + { "===", bstackhoriz }, }; /* key definitions */ @@ -86,6 +88,8 @@ static Key keys[] = { { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, + { MODKEY, XK_u, setlayout, {.v = &layouts[3]} }, + { MODKEY, XK_o, setlayout, {.v = &layouts[4]} }, { MODKEY, XK_space, setlayout, {0} }, { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, { MODKEY, XK_0, view, {.ui = ~0 } }, diff --git a/config.h b/config.h index c33186f..c13ca3a 100644 --- a/config.h +++ b/config.h @@ -27,7 +27,7 @@ static const char *colors[][3] = { }; /* tagging */ -static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8" }; +static const char *tags[] = { "1", "2", "3", "4", "5", "6" }; static const Rule rules[] = { /* xprop(1): @@ -57,6 +57,7 @@ static const Layout layouts[] = { { "t", tile }, /* first entry is default */ { "FL", NULL }, /* no layout function means floating behavior */ { "m", monocle }, + { "=", bstackhoriz }, }; /* key definitions */ @@ -80,7 +81,7 @@ static const char *screenshooter[] = { "screenshot.sh", NULL }; static const char *volup[] = { "volup.sh", NULL }; static const char *voldown[] = { "voldown.sh", NULL }; //static const char *volmute[] = { "volmute.sh", NULL }; (replaced with *next[] for different keyboards) -static const char *firefox[] = { "firefox", "--new-window", NULL }; +static const char *firefox[] = { "librewolf-bin", NULL }; static const char *slock[] = { "slock", NULL }; static const char *playpause[] = { "playerctl", "play-pause", NULL }; static const char *next[] = { "f9.sh", NULL }; @@ -106,6 +107,7 @@ static Key keys[] = { { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, + { MODKEY, XK_o, setlayout, {.v = &layouts[3]} }, { MODKEY, XK_space, setlayout, {0} }, { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, { MODKEY, XK_0, view, {.ui = ~0 } }, diff --git a/dwm.c b/dwm.c index edac73b..e62a2cb 100644 --- a/dwm.c +++ b/dwm.c @@ -249,6 +249,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 bstack(Monitor *m); +static void bstackhoriz(Monitor *m); /* variables */ static const char broken[] = "broken"; @@ -437,7 +439,7 @@ attachstack(Client *c) void buttonpress(XEvent *e) { - unsigned int i, x, click, occ = 0; + unsigned int i, x, click; Arg arg = {0}; Client *c; Monitor *m; @@ -452,14 +454,9 @@ buttonpress(XEvent *e) } if (ev->window == selmon->barwin) { i = x = 0; - for (c = m->clients; c; c = c->next) - occ |= c->tags == 255 ? 0 : c->tags; - do { - /* do not reserve space for vacant tags */ - if (!(occ & 1 << i || m->tagset[m->seltags] & 1 << i)) - continue; + do 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; @@ -761,19 +758,19 @@ drawbar(Monitor *m) } for (c = m->clients; c; c = c->next) { - occ |= c->tags == 255 ? 0 : c->tags; + occ |= c->tags; if (c->isurgent) urg |= c->tags; } 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); @@ -2369,3 +2366,65 @@ main(int argc, char *argv[]) XCloseDisplay(dpy); return EXIT_SUCCESS; } + +static void +bstack(Monitor *m) { + int w, h, mh, mx, tx, ty, tw; + unsigned int i, n; + Client *c; + + for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); + if (n == 0) + return; + if (n > m->nmaster) { + mh = m->nmaster ? m->mfact * m->wh : 0; + tw = m->ww / (n - m->nmaster); + ty = m->wy + mh; + } else { + mh = m->wh; + tw = m->ww; + ty = m->wy; + } + for (i = mx = 0, tx = m->wx, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) { + if (i < m->nmaster) { + w = (m->ww - mx) / (MIN(n, m->nmaster) - i); + resize(c, m->wx + mx, m->wy, w - (2 * c->bw), mh - (2 * c->bw), 0); + mx += WIDTH(c); + } else { + h = m->wh - mh; + resize(c, tx, ty, tw - (2 * c->bw), h - (2 * c->bw), 0); + if (tw != m->ww) + tx += WIDTH(c); + } + } +} + +static void +bstackhoriz(Monitor *m) { + int w, mh, mx, tx, ty, th; + unsigned int i, n; + Client *c; + + for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); + if (n == 0) + return; + if (n > m->nmaster) { + mh = m->nmaster ? m->mfact * m->wh : 0; + th = (m->wh - mh) / (n - m->nmaster); + ty = m->wy + mh; + } else { + th = mh = m->wh; + ty = m->wy; + } + for (i = mx = 0, tx = m->wx, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) { + if (i < m->nmaster) { + w = (m->ww - mx) / (MIN(n, m->nmaster) - i); + resize(c, m->wx + mx, m->wy, w - (2 * c->bw), mh - (2 * c->bw), 0); + mx += WIDTH(c); + } else { + resize(c, tx, ty, m->ww - (2 * c->bw), th - (2 * c->bw), 0); + if (th != m->wh) + ty += HEIGHT(c); + } + } +} diff --git a/patches/uselessgap.diff b/patches/uselessgap.diff index d9cacbe..1bf2ea0 100644 --- a/patches/uselessgap.diff +++ b/patches/uselessgap.diff @@ -4,22 +4,8 @@ Date: Wed, 3 Jul 2019 21:33:45 -0700 Subject: [PATCH] Port the uselessgap patch to 6.2 --- - config.def.h | 1 + dwm.c | 36 ++++++++++++++++++++++++++++++------ 2 files changed, 31 insertions(+), 6 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 1c0b587..b11471d 100644 ---- 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 = 6; /* 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 */ diff --git a/dwm.c b/dwm.c index 4465af1..4545e05 100644 --- a/dwm.c