From 79e342426a618f011a7245be6bfa1df22fd113d3 Mon Sep 17 00:00:00 2001 From: bjarke-cachy-btw Date: Sat, 11 Jul 2026 22:38:28 +0200 Subject: [PATCH] add awesomebar patch --- config.def.h | 1 + config.def.h.rej | 29 +- config.h | 7 + dwm | Bin 100616 -> 100872 bytes dwm.c | 226 ++++++++++-- dwm.c.orig | 22 +- dwm.c.rej | 224 +++++++++++- dwm.o | Bin 93952 -> 97624 bytes patches/dwm-awesomebar-20250923-6.6.diff | 448 +++++++++++++++++++++++ patches/dwm-winicon-6.6.diff | 429 ++++++++++++++++++++++ 10 files changed, 1344 insertions(+), 42 deletions(-) create mode 100644 patches/dwm-awesomebar-20250923-6.6.diff create mode 100644 patches/dwm-winicon-6.6.diff diff --git a/config.def.h b/config.def.h index 6fff8ea..96e3ebc 100644 --- a/config.def.h +++ b/config.def.h @@ -26,6 +26,7 @@ static const char *colors[][3] = { /* fg bg border */ [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, [SchemeSel] = { col_gray4, col_cyan, col_cyan }, + [SchemeHid] = { col_cyan, col_gray1, col_cyan }, }; typedef struct { diff --git a/config.def.h.rej b/config.def.h.rej index d265e11..ee73f24 100644 --- a/config.def.h.rej +++ b/config.def.h.rej @@ -1,10 +1,33 @@ --- config.def.h +++ config.def.h -@@ -103,6 +103,7 @@ static const Button buttons[] = { +@@ -67,8 +68,10 @@ static const Key keys[] = { + { 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_j, focusstackvis, {.i = +1 } }, ++ { MODKEY, XK_k, focusstackvis, {.i = -1 } }, ++ { MODKEY|ShiftMask, XK_j, focusstackhid, {.i = +1 } }, ++ { MODKEY|ShiftMask, XK_k, focusstackhid, {.i = -1 } }, + { MODKEY, XK_i, incnmaster, {.i = +1 } }, + { MODKEY, XK_d, incnmaster, {.i = -1 } }, + { MODKEY, XK_h, setmfact, {.f = -0.05} }, +@@ -87,6 +90,9 @@ static const Key keys[] = { + { MODKEY, XK_period, focusmon, {.i = +1 } }, + { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, + { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, ++ { MODKEY, XK_s, show, {0} }, ++ { MODKEY|ShiftMask, XK_s, showall, {0} }, ++ { MODKEY, XK_h, hide, {0} }, + TAGKEYS( XK_1, 0) + TAGKEYS( XK_2, 1) + TAGKEYS( XK_3, 2) +@@ -105,6 +111,7 @@ static const 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} }, ++ { ClkWinTitle, 0, Button1, togglewin, {0} }, + { ClkWinTitle, 0, Button2, zoom, {0} }, { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, { ClkClientWin, MODKEY, Button1, movemouse, {0} }, - { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, diff --git a/config.h b/config.h index a76742d..99f12f7 100644 --- a/config.h +++ b/config.h @@ -27,6 +27,7 @@ static const char *colors[][3] = { /* fg bg border */ [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, [SchemeSel] = { col_gray4, col_cyan, col_cyan }, + [SchemeHid] = { col_cyan, col_gray1, col_cyan }, }; typedef struct { @@ -69,6 +70,7 @@ 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 refreshrate = 144; /* refresh rate (per second) for client move/resize */ +static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */ #define FORCE_VSPLIT 1 /* nrowgrid layout: force two clients to always split vertically */ #include "vanitygaps.c" @@ -190,6 +192,10 @@ static const Key keys[] = { { MODKEY, XK_v, setlayout, {.v = &layouts[1]} }, { MODKEY, XK_c, setlayout, {.v = &layouts[2]} }, + { MODKEY, XK_s, show, {0} }, + { MODKEY|ShiftMask, XK_s, showall, {0} }, + { MODKEY|ShiftMask, XK_h, hide, {0} }, + { MODKEY, XK_space, setlayout, {0} }, { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, { MODKEY, XK_f, togglefullscreen, {0} }, @@ -227,5 +233,6 @@ static const Button buttons[] = { { ClkTagBar, 0, Button3, toggleview, {0} }, { ClkTagBar, MODKEY, Button1, tag, {0} }, { ClkTagBar, MODKEY, Button3, toggletag, {0} }, + { ClkWinTitle, 0, Button1, togglewin, {0} }, }; diff --git a/dwm b/dwm index 399ed883f2e2bf90fddc37ce2def8ea3b04f326e..ebab94ca4668f180bdfaa9b32daeb8e96883edfa 100755 GIT binary patch delta 43348 zcma%k3w#V$`~S`+OAxz3LP|og$ZC+Z30bo2vSFf8ajOuQxU_X|%BIqy8#W@^PDqh zc8gxFQ}jxmlE}uDqYV7dsR4tSzpUeX^(y?g70bTwQoqyd8m-gotg+C!_ZgdZt3yMW zb}s%Jz@c*zA#(}N> zt&EazjjM#Yg2sm1>pXY#wNhi_PhDLT$25K7{U=YiyS;f!(3w!9LEQXuSo?Zj-Nq12 z%uqI3yU6p~uH*Cl_>utp`AUs{LjYbpq2Vh6@GouA@TWDr*Ps`W(O2_EO@M%URuc$| z)95-fJ*i@mpH*0Ks6mTeATC-I@j93;YGw1mN`= z*9PEYsKO}U5Z39zn&|?O0eIa*@d0?9KRE#J^m{ZT0I&0B0#D`NZGterK+eAi5ua$2o z2_P)k;IF~I;4A(GU-K{cur3c)KyQLbZvde(Rbz|~!0Q6Z0r)k3{)_;;&Yu~8&-U}@ z`0-wSIOzg;0Rm3HKuG{z=U)+kkMZ+w2*B(7+aJWk|9*jr2MGpU;B)}K%-`v10`NM2 zZ2&&s&mR{5e>DNhj|?C<{Q~g;c)ft+0DO#}KO+Et+25&i0`QIfeXE4<)c^D*&q zbV&gIK((f4!@uAwI3E7jhhODMO`s+~K*xtAJy?VGe*X9Xyq-^F1mIuu=NUQo;G1O_rLf6f?hyI0A4R3CjhS(P!fQ@TY&() zuD_zIp!I*f3G@PL0tEB|!n*x$4XDxL1MqqQ83A}*f6iUJR{p&vxJw|l_ccKPUN4{` z0IwHN6M(;4f#iS+c=b*cK+p@w2*B$Fee6SkEwkAV0B_{7`mvpjw_ar3 z0qV`&JSFy3!F%LCTG1;~9&EMIQ#JgW0Q}@1HT?Slc%6Sk0N&{5-yVRU{{z?KH5>{c zyy*8uWdOdz7h1s~jt31jX^ISC0r(HT*Z5-s@SXfIGoIryHuP2=dP);W4iM=4nuZqx z@Yg@r@YwWpQ2^esOT(Akk2eAL=ewI1JZuhO*^h=ibh_VzwafM|lq=bwN1F)> zoB!xiTGlpB?Au~f#`2Jsxy)clFHTxrYA__I>C#Q*y*sKZ7MA5kh;mYYwmH+KC1>;UE)eNF!%KM#}N5nYV1C?-7`Souw z6g$R4LXkD*P>u2xD9YzK;5sQ5yRES(_2dnxmmSqN*whg&(-y?f_Us*_&m}+aNzUkI@QI7r{*K)=v zQCd>51~OvdkDivI{8MC9rn6IF;`fv=GSJfczOZZVN?(`v-j#pm3MIxqZ%{_Dd*eH&5d`liE;YvMc zNq#8N)pDh~1Ge&LA>cPK*?N#eoCLKo@o@J{N4yXZq1t>KSxB@wfE@kwh)zOANf z3td0WuM4bskeMhx9NaDzvcVpc@+Lbns#bB_s za#Cmf{t}ESHk~A3ul1n!n%)2-`mLv)T4`yOPrT)R2>uT^f7075Yjl+GB+DD!(l!q$ zL+-=FMDzz*JB!jUo={Zqsf#dBLO)R^qWlAC+O(lqo6jZxzL0Q930`;8b4V z9@k`Yhd|(YO<=ty(14TYgrrM%lvdYOwR&Xk%)%I*6QYFwM)jYQtb75d@X8x+uqD~frj;NdT7-$xPf)vQslkv{)m>&6 zvb!1Y$gIV<8G?^39@kI!jGY`e*(h9Rj`5v@3vBB67$Jcz8K2nbpKDxmi0IoFlW;Su zY7{#$zLzodH`aJUoY0x|n(&Jd$=Xe9YYe`|`cLd3bYlxAcJ4dp7w!YMH72*Yv)~GP zKylJVL<^Xv96{ffOe4YJa||TDdn~S(HI}uUto+H@ z!cErWsZ`-IoBxz5#IgBLw~Jhe9x}@z7g%W#gEG*X8R&n{uw75L5(cuLp0*0>SkR<5 zy^GHwV1$>X+b>xPa^O{YsMRe8<6f~8WaC~*t5Q|jgWw_^L<=iZex=&?Nfv#1k%n9| zTzG5|Z|E*Q6hs6$FH-p#T6$$$}K?jTWUv9x_Z%eaGSGzT<8e4h6cN-TCv zBeSk3>mgS?{Ju^z*~d0awh4^=Fu8NM6}-Nb5`)L&mM2=>@KEEQSk#ngVHWE?<#FL> zCQW&*`S0_!DnP$Ul&Y&6lVNV@q7u&>Q`@w6{6fZHbXig9@`N(UR9=a(EXt)N@Sj-R zJ5Q7c=dr@6389ONs5Ocg5MZBAwe{MWkE`5AM46)~8nhDSB9fDz&6LwOX16WM#7%BJ zQO+;IMfDj`T0k;TZ+hnfYcb6(6Tq7LWSFY$YmM0$NrZk{gkZ&vmzpuxK|$JW;16bw8U65xTNyx)uMDd z3q?h=fhw`^q{k}Cz4O@Z8Ot(XeV)ZVV>Ryli4A_Hi{&k92I;(5 zOk;l3e>ayr(_JuTUt~vf1~(Hyv)`E4AZSrIDrMX2lA6k<*48H;wN=J%yzSWD)Yw1wq+PrAg`5P~};mWn8Fxs{bqZ$*`>7 z?~>}ueTMRjI&vS8U!Vnsq>FN})w2FumlST5C^|;6goTmJ{9Guj_hO9KPKw-CcVU^O z-~-aWH{tM!OVV)_EqvU5WM-&KI^?#j-{Z2E&8+g(nsUQ0GPvlv> z$)r40e$pv?Eu54_p=R>v6qoHA;cr33Z8&b-w!iKBXQhDA>Do@ssvcI4rAilVe@mxV zx^C6l5XcUa3x(4{E%_PO=og19>uX%Lqb}RcYBNzG;gZe~Jq^vJB%pc+-Ck=b6r!UX zbX!B{in?=O`=wb;f3t)k4*h1yED1pcf3q~gU3ECHqpYF8uJB`Vr+5CL@Y)$7?k{*WyBub9)n`QxSHw~zq$A= zh$xK{kNAld_sX+M9%~GBLFGv*7Z)g-`b-Q4Ux{>@EJ#hbVyi)|W84z@F)pl1GBKm~ zK-wFL3R?;qP|vYnkxQrx-L>#pGU6zy6HdCM)0(L+TLl?p8GhJh|6>*`4{O-^ITFg; zLpsp`(34P?BQPbLCg0fKETgDWhm;e@ANg8FF5*$RB%F4Fio^Q{A%zfzTEnVm@oKxJ zDyXswCsUoAC+`FYlK2U1ZgQbr8-%{@t8iBU*`_rZFS6U+}uDX1O zxeA($UG)R3_3g{d8toe88toe68e2}`@wn@W0myKN4WRItCjB!^`eTUnwdlKyEYh3D z>xjM-cDGmY{zbjYrTf*@1D=`14tv{p5i!D*`7n^2g+8-04ZS>1c?Ot!on|@&i>S-E zdZa^;`pteg1tIo-x=nM?$~i6U-+N6I+C37zCR}mUrJ`|#;-ld5NOYT*P#Ok3KIdA) zY=79krWVUayEN)XA3a^tbc2Ky*1lK->lQ40j;-%8B;ao9d8vgbEd^c-QQRcDf z^WwZweBmY{6lKyJTa1K;3UE^aLzPMhpiDQ_J1ZFVo@-4#*VT(&)MeRy$i70FdS`w{7orSD$#5IF@EIp&foQl&3lwnKu7K)ug)Kj1GD-h`1dnl(HYLa4Fu9qf)nk>Qw`VsRZ@-7Mj70w$R&qzV7x z2#J5R_R32*iGko&(toFrtc@K&8aeDGZ^Lere zFy>P&{`tohLL3j(hpPL!rCYXJzF!4T4Clk=-Kg#IS~?!*oNh~8Z8Z&DG!19?w*iV7 znCB7Lol%5sCtbIl@Ld#Kaw$c6&m_$=(3f)0JJ4s}qp6F7I^iT~LhNUI z=C?F{U&GGNZ`G1gAlQG;WA_Q|o5or$=xEHTL7@+s6SdCEw(R}$Dor2 z4;x+B3q`(O*bPN~TiB+_4qC=SM$fyH6<1jOg{_PYjBGfnpJigj&jl5r;V2?b$yBWt?SpKlh;$y4mG2$6N_qQS<8o@TojwK0Bm39&Si{koNKJjo8e)RxVb8YYm*>C(0P=K&fW_gQQ}Q}T@L8n!23@n&g|v0@^t zv$(afP=UqGS)avm#wRDTXBW3IKBQsRFK%e8RM@V?k;ajSVemuj`r^c=cPlU$BZImP zg^u@W!b8t?p%%%!Yh8iklU=9)aA;*=FJeFZj?^3BFcNZ6wsNVK&-ECe@GJsisBOOz z4b864-~+73PqHO)TVd*$K4|BW58oHGF#jvwSjs@+s=J8n|<-dBdwh)Z{4=l2K7yre4+3)O{%x0J#t?+;SUA%O<`egMnx{f zhMV%i=hSTemHH@AE~r?;+;65Bx1D1P-n4sfeTs0KIrZe7tkG3Xz>1`_e6U;Y=Tw5f zhoJpnZhiRZrBmoWwlaBOlsr6Hls{d88o1?#H&Fm8vKcxutNz%9#{=F;21`L} zwCsDrHOw`1n17WYt86??6K1GYSKIBBS5>88?BqBmK?kij?a`0pN|gI0%acNKbFh^& z2KVX3?LOsY#VZGoQhglBgvGwsjBizyugKl9X_976G)U3`*)$BdSUbxR>A0}%br*|w z+{JSrG0L-?a=3Mh!8Oz^dH-}{a{CVZ&0l||s$*S9#jrp5v+_6A*$FqXhnPnZ6#v2~ z(e9>ih?US@2W^YZ-I(3_lus30zB6h)3^(8Qi8RPO!MMS*mwdicvTsK{;3S2nhby

n1cM*(&pLzoU&Rgj5 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 BAua#_ delta 40858 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

_4m4JVr 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 diff --git a/dwm.c b/dwm.c index 9b3a0fe..ec0c5c3 100644 --- a/dwm.c +++ b/dwm.c @@ -51,6 +51,7 @@ * MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy))) #define ISVISIBLEONTAG(C, T) ((C->tags & T)) #define ISVISIBLE(C) ISVISIBLEONTAG(C, C->mon->tagset[C->mon->seltags]) +#define HIDDEN(C) ((getstate(C->win) == IconicState)) #define MOUSEMASK (BUTTONMASK|PointerMotionMask) #define WIDTH(X) ((X)->w + 2 * (X)->bw) #define HEIGHT(X) ((X)->h + 2 * (X)->bw) @@ -76,7 +77,7 @@ /* enums */ enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ -enum { SchemeNorm, SchemeSel }; /* color schemes */ +enum { SchemeNorm, SchemeSel, SchemeHid }; /* color schemes */ enum { NetSupported, NetWMName, NetWMState, NetWMCheck, NetSystemTray, NetSystemTrayOP, NetSystemTrayOrientation, NetSystemTrayOrientationHorz, NetWMFullscreen, NetActiveWindow, NetWMWindowType, @@ -139,6 +140,8 @@ struct Monitor { int nmaster; int num; int by; /* bar geometry */ + int btw; /* width of tasks portion of bar */ + int bt; /* number of tasks */ int mx, my, mw, mh; /* screen size */ int wx, wy, ww, wh; /* window area */ int gappih; /* horizontal gap between windows */ @@ -150,6 +153,7 @@ struct Monitor { unsigned int tagset[2]; int showbar; int topbar; + int hidsel; Client *clients; Client *sel; Client *stack; @@ -203,7 +207,9 @@ static void focus(Client *c); static void focusdir(const Arg *arg); static void focusin(XEvent *e); static void focusmon(const Arg *arg); -static void focusstack(const Arg *arg); +static void focusstackvis(const Arg *arg); +static void focusstackhid(const Arg *arg); +static void focusstack(int inc, int vis); static Atom getatomprop(Client *c, Atom prop); static int getrootptr(int *x, int *y); static long getstate(Window w); @@ -211,6 +217,8 @@ static unsigned int getsystraywidth(); static int gettextprop(Window w, Atom atom, char *text, unsigned int size); static void grabbuttons(Client *c, int focused); static void grabkeys(void); +static void hide(const Arg *arg); +static void hidewin(Client *c); static void incnmaster(const Arg *arg); static void keypress(XEvent *e); static void killclient(const Arg *arg); @@ -253,6 +261,9 @@ static void setnumdesktops(void); static void setup(void); static void setviewport(void); static void seturgent(Client *c, int urg); +static void show(const Arg *arg); +static void showall(const Arg *arg); +static void showwin(Client *c); static void showhide(Client *c); static void sighup(int unused); static void sigterm(int unused); @@ -267,6 +278,7 @@ static void togglefullscreen(const Arg *arg); static void togglescratch(const Arg *arg); static void toggletag(const Arg *arg); static void toggleview(const Arg *arg); +static void togglewin(const Arg *arg); static void unfocus(Client *c, int setfocus); static void unmanage(Client *c, int destroyed); static void unmapnotify(XEvent *e); @@ -565,10 +577,24 @@ buttonpress(XEvent *e) arg.ui = 1 << i; } else if (ev->x < x + TEXTW(selmon->ltsymbol)) click = ClkLtSymbol; - else if (ev->x > selmon->ww - (int)TEXTW(stext) - getsystraywidth()) + else if (ev->x > selmon->ww - (int)TEXTW(stext) - getsystraywidth() + lrpad - 2) click = ClkStatusText; - else - click = ClkWinTitle; + else { + x += TEXTW(selmon->ltsymbol); + c = m->clients; + + if (c) { + do { + if (!ISVISIBLE(c)) + continue; + else + x +=(1.0 / (double)m->bt) * m->btw; + } while (ev->x > x && (c = c->next)); + + click = ClkWinTitle; + arg.v = c; + } + } } else if ((c = wintoclient(ev->window))) { focus(c); restack(selmon); @@ -578,7 +604,7 @@ 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); + buttons[i].func((click == ClkTagBar || click == ClkWinTitle) && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg); } void @@ -909,7 +935,7 @@ dirtomon(int dir) void drawbar(Monitor *m) { - int x, w, tw = 0, stw = 0; + int x, w, tw = 0, stw = 0, n = 0, scm; int boxs = drw->fonts->h / 9; int boxw = drw->fonts->h / 6 + 2; unsigned int i, occ = 0, urg = 0; @@ -930,6 +956,8 @@ drawbar(Monitor *m) resizebarwin(m); for (c = m->clients; c; c = c->next) { + if (ISVISIBLE(c)) + n++; occ |= c->tags; if (c->isurgent) urg |= c->tags; @@ -950,16 +978,36 @@ drawbar(Monitor *m) x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); if ((w = m->ww - tw - stw - 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); - if (m->sel->isfloating) - drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0); + if (n > 0) { + int remainder = w % n; + int tabw = (1.0 / (double)n) * w + 1; + for (c = m->clients; c; c = c->next) { + if (!ISVISIBLE(c)) + continue; + if (m->sel == c) + scm = SchemeSel; + else if (HIDDEN(c)) + scm = SchemeHid; + else + scm = SchemeNorm; + drw_setscheme(drw, scheme[scm]); + + if (remainder >= 0) { + if (remainder == 0) { + tabw--; + } + remainder--; + } + drw_text(drw, x, 0, tabw, bh, lrpad / 2, c->name, 0); + x += tabw; + } } else { drw_setscheme(drw, scheme[SchemeNorm]); drw_rect(drw, x, 0, w, bh, 1, 1); } } + m->bt = n; + m->btw = w; drw_map(drw, m->barwin, 0, 0, m->ww - stw, bh); } @@ -1008,10 +1056,16 @@ void focus(Client *c) { if (!c || !ISVISIBLE(c)) - for (c = selmon->stack; c && !ISVISIBLE(c); c = c->snext); + for (c = selmon->stack; c && (!ISVISIBLE(c) || HIDDEN(c)); c = c->snext); if (selmon->sel && selmon->sel != c) { losefullscreen(c); unfocus(selmon->sel, 0); + if (selmon->hidsel) { + hidewin(selmon->sel); + if (c) + arrange(c->mon); + selmon->hidsel = 0; + } } if (c) { if (c->mon != selmon) @@ -1122,28 +1176,53 @@ focusmon(const Arg *arg) } void -focusstack(const Arg *arg) +focusstackvis(const Arg *arg) { + focusstack(arg->i, 0); +} + +void +focusstackhid(const Arg *arg) { + focusstack(arg->i, 1); +} + +void +focusstack(int inc, int hid) { Client *c = NULL, *i; - if (!selmon->sel || (selmon->sel->isfullscreen && selmon->sel->fakefullscreen != 1)) + // if no client selected AND exclude hidden client; if client selected but fullscreened + if ((!selmon->sel && !hid) || (selmon->sel && selmon->sel->isfullscreen && lockfullscreen)) return; - if (arg->i > 0) { - for (c = selmon->sel->next; c && !ISVISIBLE(c); c = c->next); + if (!selmon->clients) + return; + if (inc > 0) { + if (selmon->sel) + for (c = selmon->sel->next; + c && (!ISVISIBLE(c) || (!hid && HIDDEN(c))); + c = c->next); if (!c) - for (c = selmon->clients; c && !ISVISIBLE(c); c = c->next); + for (c = selmon->clients; + c && (!ISVISIBLE(c) || (!hid && HIDDEN(c))); + c = c->next); } else { - for (i = selmon->clients; i != selmon->sel; i = i->next) - if (ISVISIBLE(i)) - c = i; + if (selmon->sel) { + for (i = selmon->clients; i != selmon->sel; i = i->next) + if (ISVISIBLE(i) && !(!hid && HIDDEN(i))) + c = i; + } else + c = selmon->clients; if (!c) for (; i; i = i->next) - if (ISVISIBLE(i)) + if (ISVISIBLE(i) && !(!hid && HIDDEN(i))) c = i; } if (c) { focus(c); restack(selmon); + if (HIDDEN(c)) { + showwin(c); + c->mon->hidsel = 1; + } } } @@ -1281,6 +1360,36 @@ grabkeys(void) } } +void +hide(const Arg *arg) +{ + hidewin(selmon->sel); + focus(NULL); + arrange(selmon); +} + +void +hidewin(Client *c) { + if (!c || HIDDEN(c)) + return; + + Window w = c->win; + static XWindowAttributes ra, ca; + + // more or less taken directly from blackbox's hide() function + XGrabServer(dpy); + XGetWindowAttributes(dpy, root, &ra); + XGetWindowAttributes(dpy, w, &ca); + // prevent UnmapNotify events + XSelectInput(dpy, root, ra.your_event_mask & ~SubstructureNotifyMask); + XSelectInput(dpy, w, ca.your_event_mask & ~StructureNotifyMask); + XUnmapWindow(dpy, w); + setclientstate(c, IconicState); + XSelectInput(dpy, root, ra.your_event_mask); + XSelectInput(dpy, w, ca.your_event_mask); + XUngrabServer(dpy); +} + void incnmaster(const Arg *arg) { @@ -1415,14 +1524,16 @@ manage(Window w, XWindowAttributes *wa) XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend, (unsigned char *) &(c->win), 1); XMoveResizeWindow(dpy, c->win, c->x + 2 * sw, c->y, c->w, c->h); /* some windows require this */ - setclientstate(c, NormalState); + if (!HIDDEN(c)) + setclientstate(c, NormalState); if (c->mon == selmon) { losefullscreen(c); unfocus(selmon->sel, 0); } c->mon->sel = c; arrange(c->mon); - XMapWindow(dpy, c->win); + if (!HIDDEN(c)) + XMapWindow(dpy, c->win); focus(NULL); } @@ -1560,7 +1671,7 @@ nexttagged(Client *c) { Client * nexttiled(Client *c) { - for (; c && (c->isfloating || !ISVISIBLE(c)); c = c->next); + for (; c && (c->isfloating || !ISVISIBLE(c) || HIDDEN(c)); c = c->next); return c; } @@ -1721,6 +1832,16 @@ propertynotify(XEvent *e) void quit(const Arg *arg) { + // fix: reloading dwm keeps all the hidden clients hidden + Monitor *m; + Client *c; + for (m = mons; m; m = m->next) { + if (m) { + for (c = m->stack; c; c = c->next) + if (c && HIDDEN(c)) showwin(c); + } + } + if(arg->i) restart = 1; running = 0; } @@ -2261,6 +2382,42 @@ seturgent(Client *c, int urg) XFree(wmh); } +void +show(const Arg *arg) +{ + if (selmon->hidsel) + selmon->hidsel = 0; + showwin(selmon->sel); +} + +void +showall(const Arg *arg) +{ + Client *c = NULL; + selmon->hidsel = 0; + for (c = selmon->clients; c; c = c->next) { + if (ISVISIBLE(c)) + showwin(c); + } + if (!selmon->sel) { + for (c = selmon->clients; c && !ISVISIBLE(c); c = c->next); + if (c) + focus(c); + } + restack(selmon); +} + +void +showwin(Client *c) +{ + if (!c || !HIDDEN(c)) + return; + + XMapWindow(dpy, c->win); + setclientstate(c, NormalState); + arrange(c->mon); +} + void showhide(Client *c) { @@ -2481,6 +2638,25 @@ toggleview(const Arg *arg) } } +void +togglewin(const Arg *arg) +{ + Client *c = (Client*)arg->v; + + if (!c) + return; + if (c == selmon->sel) { + hidewin(c); + focus(NULL); + arrange(c->mon); + } else { + if (HIDDEN(c)) + showwin(c); + focus(c); + restack(selmon); + } +} + void unfocus(Client *c, int setfocus) { diff --git a/dwm.c.orig b/dwm.c.orig index e8fe533..9b3a0fe 100644 --- a/dwm.c.orig +++ b/dwm.c.orig @@ -83,8 +83,8 @@ enum { NetSupported, NetWMName, NetWMState, NetWMCheck, NetWMWindowTypeDialog, NetClientList, NetClientInfo, NetDesktopNames, NetDesktopViewport, NetNumberOfDesktops, NetCurrentDesktop, NetLast }; /* EWMH atoms */ enum { Manager, Xembed, XembedInfo, XLast }; /* Xembed atoms */ enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ -enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkClientWin, - ClkRootWin, ClkLast }; /* clicks */ +enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, + ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ typedef union { int i; @@ -568,7 +568,7 @@ buttonpress(XEvent *e) else if (ev->x > selmon->ww - (int)TEXTW(stext) - getsystraywidth()) click = ClkStatusText; else - click = ClkStatusText; + click = ClkWinTitle; } else if ((c = wintoclient(ev->window))) { focus(c); restack(selmon); @@ -950,8 +950,15 @@ drawbar(Monitor *m) x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); if ((w = m->ww - tw - stw - x) > bh) { - drw_setscheme(drw, scheme[SchemeNorm]); - drw_rect(drw, x, 0, w, bh, 1, 1); + if (m->sel) { + drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); + drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); + if (m->sel->isfloating) + drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0); + } else { + drw_setscheme(drw, scheme[SchemeNorm]); + drw_rect(drw, x, 0, w, bh, 1, 1); + } } drw_map(drw, m->barwin, 0, 0, m->ww - stw, bh); } @@ -1701,8 +1708,11 @@ propertynotify(XEvent *e) drawbars(); break; } - if (ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) + if (ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) { updatetitle(c); + if (c == c->mon->sel) + drawbar(c->mon); + } if (ev->atom == netatom[NetWMWindowType]) updatewindowtype(c); } diff --git a/dwm.c.rej b/dwm.c.rej index 73d32f8..fc2a28a 100644 --- a/dwm.c.rej +++ b/dwm.c.rej @@ -1,18 +1,226 @@ --- dwm.c +++ dwm.c -@@ -734,8 +734,15 @@ drawbar(Monitor *m) +@@ -50,6 +50,7 @@ + #define INTERSECT(x,y,w,h,m) (MAX(0, MIN((x)+(w),(m)->wx+(m)->ww) - MAX((x),(m)->wx)) \ + * MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy))) + #define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags])) ++#define HIDDEN(C) ((getstate(C->win) == IconicState)) + #define MOUSEMASK (BUTTONMASK|PointerMotionMask) + #define WIDTH(X) ((X)->w + 2 * (X)->bw) + #define HEIGHT(X) ((X)->h + 2 * (X)->bw) +@@ -170,13 +174,17 @@ static void expose(XEvent *e); + static void focus(Client *c); + static void focusin(XEvent *e); + static void focusmon(const Arg *arg); +-static void focusstack(const Arg *arg); ++static void focusstackvis(const Arg *arg); ++static void focusstackhid(const Arg *arg); ++static void focusstack(int inc, int vis); + static Atom getatomprop(Client *c, Atom prop); + static int getrootptr(int *x, int *y); + 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 void hide(const Arg *arg); ++static void hidewin(Client *c); + static void incnmaster(const Arg *arg); + static void keypress(XEvent *e); + static void killclient(const Arg *arg); +@@ -447,10 +459,25 @@ buttonpress(XEvent *e) + arg.ui = 1 << i; + } else if (ev->x < x + TEXTW(selmon->ltsymbol)) + click = ClkLtSymbol; +- else if (ev->x > selmon->ww - (int)TEXTW(stext)) ++ /* 2px right padding */ ++ else if (ev->x > selmon->ww - TEXTW(stext) + lrpad - 2) + click = ClkStatusText; +- else +- click = ClkWinTitle; ++ else { ++ x += TEXTW(selmon->ltsymbol); ++ c = m->clients; ++ ++ if (c) { ++ do { ++ if (!ISVISIBLE(c)) ++ continue; ++ else ++ x +=(1.0 / (double)m->bt) * m->btw; ++ } while (ev->x > x && (c = c->next)); ++ ++ click = ClkWinTitle; ++ arg.v = c; ++ } ++ } + } else if ((c = wintoclient(ev->window))) { + focus(c); + restack(selmon); +@@ -704,7 +731,7 @@ dirtomon(int dir) + void + drawbar(Monitor *m) + { +- int x, w, tw = 0; ++ int x, w, tw = 0, n = 0, scm; + int boxs = drw->fonts->h / 9; + int boxw = drw->fonts->h / 6 + 2; + unsigned int i, occ = 0, urg = 0; +@@ -743,16 +772,36 @@ drawbar(Monitor *m) x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); 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); -+ if (m->sel->isfloating) -+ drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0); -+ } else { +- if (m->sel) { +- drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); +- drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); +- if (m->sel->isfloating) +- drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0); ++ if (n > 0) { ++ int remainder = w % n; ++ int tabw = (1.0 / (double)n) * w + 1; ++ for (c = m->clients; c; c = c->next) { ++ if (!ISVISIBLE(c)) ++ continue; ++ if (m->sel == c) ++ scm = SchemeSel; ++ else if (HIDDEN(c)) ++ scm = SchemeHid; ++ else ++ scm = SchemeNorm; ++ drw_setscheme(drw, scheme[scm]); ++ ++ if (remainder >= 0) { ++ if (remainder == 0) { ++ tabw--; ++ } ++ remainder--; ++ } ++ drw_text(drw, x, 0, tabw, bh, lrpad / 2, c->name, 0); ++ x += tabw; ++ } + } else { drw_setscheme(drw, scheme[SchemeNorm]); drw_rect(drw, x, 0, w, bh, 1, 1); -+ } + } } ++ m->bt = n; ++ m->btw = w; drw_map(drw, m->barwin, 0, 0, m->ww, bh); } + +@@ -798,9 +847,17 @@ void + focus(Client *c) + { + if (!c || !ISVISIBLE(c)) +- for (c = selmon->stack; c && !ISVISIBLE(c); c = c->snext); +- if (selmon->sel && selmon->sel != c) ++ for (c = selmon->stack; c && (!ISVISIBLE(c) || HIDDEN(c)); c = c->snext); ++ if (selmon->sel && selmon->sel != c) { + unfocus(selmon->sel, 0); ++ ++ if (selmon->hidsel) { ++ hidewin(selmon->sel); ++ if (c) ++ arrange(c->mon); ++ selmon->hidsel = 0; ++ } ++ } + if (c) { + if (c->mon != selmon) + selmon = c->mon; +@@ -844,28 +901,52 @@ focusmon(const Arg *arg) + } + + void +-focusstack(const Arg *arg) ++focusstackvis(const Arg *arg) { ++ focusstack(arg->i, 0); ++} ++ ++void ++focusstackhid(const Arg *arg) { ++ focusstack(arg->i, 1); ++} ++ ++void ++focusstack(int inc, int hid) + { + Client *c = NULL, *i; +- +- if (!selmon->sel || (selmon->sel->isfullscreen && lockfullscreen)) ++ // if no client selected AND exclude hidden client; if client selected but fullscreened ++ if ((!selmon->sel && !hid) || (selmon->sel && selmon->sel->isfullscreen && lockfullscreen)) + return; +- if (arg->i > 0) { +- for (c = selmon->sel->next; c && !ISVISIBLE(c); c = c->next); ++ if (!selmon->clients) ++ return; ++ if (inc > 0) { ++ if (selmon->sel) ++ for (c = selmon->sel->next; ++ c && (!ISVISIBLE(c) || (!hid && HIDDEN(c))); ++ c = c->next); + if (!c) +- for (c = selmon->clients; c && !ISVISIBLE(c); c = c->next); ++ for (c = selmon->clients; ++ c && (!ISVISIBLE(c) || (!hid && HIDDEN(c))); ++ c = c->next); + } else { +- for (i = selmon->clients; i != selmon->sel; i = i->next) +- if (ISVISIBLE(i)) +- c = i; ++ if (selmon->sel) { ++ for (i = selmon->clients; i != selmon->sel; i = i->next) ++ if (ISVISIBLE(i) && !(!hid && HIDDEN(i))) ++ c = i; ++ } else ++ c = selmon->clients; + if (!c) + for (; i; i = i->next) +- if (ISVISIBLE(i)) ++ if (ISVISIBLE(i) && !(!hid && HIDDEN(i))) + c = i; + } + if (c) { + focus(c); + restack(selmon); ++ if (HIDDEN(c)) { ++ showwin(c); ++ c->mon->hidsel = 1; ++ } + } + } + +@@ -1117,12 +1228,14 @@ manage(Window w, XWindowAttributes *wa) + XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend, + (unsigned char *) &(c->win), 1); + XMoveResizeWindow(dpy, c->win, c->x + 2 * sw, c->y, c->w, c->h); /* some windows require this */ +- setclientstate(c, NormalState); ++ if (!HIDDEN(c)) ++ setclientstate(c, NormalState); + if (c->mon == selmon) + unfocus(selmon->sel, 0); + c->mon->sel = c; + arrange(c->mon); +- XMapWindow(dpy, c->win); ++ if (!HIDDEN(c)) ++ XMapWindow(dpy, c->win); + focus(NULL); + } + +@@ -1296,6 +1409,16 @@ propertynotify(XEvent *e) + void + quit(const Arg *arg) + { ++ // fix: reloading dwm keeps all the hidden clients hidden ++ Monitor *m; ++ Client *c; ++ for (m = mons; m; m = m->next) { ++ if (m) { ++ for (c = m->stack; c; c = c->next) ++ if (c && HIDDEN(c)) showwin(c); ++ } ++ } ++ + running = 0; + } + diff --git a/dwm.o b/dwm.o index c84586b0825d1d867b5e5a4c85532f8e52097e8e..b07d6d59596138fe38dc3618c24f085337228625 100644 GIT binary patch literal 97624 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 aKOrhE$#=wLwyX5(76#>O9ny5pr~iLDAQ5c< literal 93952 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 z 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 diff --git a/patches/dwm-awesomebar-20250923-6.6.diff b/patches/dwm-awesomebar-20250923-6.6.diff new file mode 100644 index 0000000..3caa9bc --- /dev/null +++ b/patches/dwm-awesomebar-20250923-6.6.diff @@ -0,0 +1,448 @@ +diff --git a/config.def.h b/config.def.h +index 81c3fc0..6497687 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -16,6 +16,7 @@ static const char *colors[][3] = { + /* fg bg border */ + [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, + [SchemeSel] = { col_gray4, col_cyan, col_cyan }, ++ [SchemeHid] = { col_cyan, col_gray1, col_cyan }, + }; + + /* tagging */ +@@ -66,8 +67,10 @@ static const Key keys[] = { + { 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_j, focusstackvis, {.i = +1 } }, ++ { MODKEY, XK_k, focusstackvis, {.i = -1 } }, ++ { MODKEY|ShiftMask, XK_j, focusstackhid, {.i = +1 } }, ++ { MODKEY|ShiftMask, XK_k, focusstackhid, {.i = -1 } }, + { MODKEY, XK_i, incnmaster, {.i = +1 } }, + { MODKEY, XK_d, incnmaster, {.i = -1 } }, + { MODKEY, XK_h, setmfact, {.f = -0.05} }, +@@ -86,6 +89,9 @@ static const Key keys[] = { + { MODKEY, XK_period, focusmon, {.i = +1 } }, + { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, + { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, ++ { MODKEY, XK_s, show, {0} }, ++ { MODKEY|ShiftMask, XK_s, showall, {0} }, ++ { MODKEY, XK_h, hide, {0} }, + TAGKEYS( XK_1, 0) + TAGKEYS( XK_2, 1) + TAGKEYS( XK_3, 2) +@@ -104,6 +110,7 @@ static const Button buttons[] = { + /* click event mask button function argument */ + { ClkLtSymbol, 0, Button1, setlayout, {0} }, + { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, ++ { ClkWinTitle, 0, Button1, togglewin, {0} }, + { ClkWinTitle, 0, Button2, zoom, {0} }, + { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, + { ClkClientWin, MODKEY, Button1, movemouse, {0} }, +diff --git a/dwm.c b/dwm.c +index 4cf07eb..a270d44 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -50,6 +50,7 @@ + #define INTERSECT(x,y,w,h,m) (MAX(0, MIN((x)+(w),(m)->wx+(m)->ww) - MAX((x),(m)->wx)) \ + * MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy))) + #define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags])) ++#define HIDDEN(C) ((getstate(C->win) == IconicState)) + #define MOUSEMASK (BUTTONMASK|PointerMotionMask) + #define WIDTH(X) ((X)->w + 2 * (X)->bw) + #define HEIGHT(X) ((X)->h + 2 * (X)->bw) +@@ -58,7 +59,7 @@ + + /* enums */ + enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ +-enum { SchemeNorm, SchemeSel }; /* color schemes */ ++enum { SchemeNorm, SchemeSel, SchemeHid }; /* color schemes */ + enum { NetSupported, NetWMName, NetWMState, NetWMCheck, + NetWMFullscreen, NetActiveWindow, NetWMWindowType, + NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ +@@ -116,6 +117,8 @@ struct Monitor { + int nmaster; + int num; + int by; /* bar geometry */ ++ int btw; /* width of tasks portion of bar */ ++ int bt; /* number of tasks */ + int mx, my, mw, mh; /* screen size */ + int wx, wy, ww, wh; /* window area */ + unsigned int seltags; +@@ -123,6 +126,7 @@ struct Monitor { + unsigned int tagset[2]; + int showbar; + int topbar; ++ int hidsel; + Client *clients; + Client *sel; + Client *stack; +@@ -167,13 +171,17 @@ static void expose(XEvent *e); + static void focus(Client *c); + static void focusin(XEvent *e); + static void focusmon(const Arg *arg); +-static void focusstack(const Arg *arg); ++static void focusstackvis(const Arg *arg); ++static void focusstackhid(const Arg *arg); ++static void focusstack(int inc, int vis); + static Atom getatomprop(Client *c, Atom prop); + static int getrootptr(int *x, int *y); + 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 void hide(const Arg *arg); ++static void hidewin(Client *c); + static void incnmaster(const Arg *arg); + static void keypress(XEvent *e); + static void killclient(const Arg *arg); +@@ -203,6 +211,9 @@ static void setlayout(const Arg *arg); + static void setmfact(const Arg *arg); + static void setup(void); + static void seturgent(Client *c, int urg); ++static void show(const Arg *arg); ++static void showall(const Arg *arg); ++static void showwin(Client *c); + static void showhide(Client *c); + static void spawn(const Arg *arg); + static void tag(const Arg *arg); +@@ -212,6 +223,7 @@ static void togglebar(const Arg *arg); + static void togglefloating(const Arg *arg); + static void toggletag(const Arg *arg); + static void toggleview(const Arg *arg); ++static void togglewin(const Arg *arg); + static void unfocus(Client *c, int setfocus); + static void unmanage(Client *c, int destroyed); + static void unmapnotify(XEvent *e); +@@ -440,10 +452,25 @@ buttonpress(XEvent *e) + arg.ui = 1 << i; + } else if (ev->x < x + TEXTW(selmon->ltsymbol)) + click = ClkLtSymbol; +- else if (ev->x > selmon->ww - (int)TEXTW(stext)) ++ /* 2px right padding */ ++ else if (ev->x > selmon->ww - TEXTW(stext) + lrpad - 2) + click = ClkStatusText; +- else +- click = ClkWinTitle; ++ else { ++ x += TEXTW(selmon->ltsymbol); ++ c = m->clients; ++ ++ if (c) { ++ do { ++ if (!ISVISIBLE(c)) ++ continue; ++ else ++ x +=(1.0 / (double)m->bt) * m->btw; ++ } while (ev->x > x && (c = c->next)); ++ ++ click = ClkWinTitle; ++ arg.v = c; ++ } ++ } + } else if ((c = wintoclient(ev->window))) { + focus(c); + restack(selmon); +@@ -453,7 +480,7 @@ 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); ++ buttons[i].func((click == ClkTagBar || click == ClkWinTitle) && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg); + } + + void +@@ -697,7 +724,7 @@ dirtomon(int dir) + void + drawbar(Monitor *m) + { +- int x, w, tw = 0; ++ int x, w, tw = 0, n = 0, scm; + int boxs = drw->fonts->h / 9; + int boxw = drw->fonts->h / 6 + 2; + unsigned int i, occ = 0, urg = 0; +@@ -714,6 +741,8 @@ drawbar(Monitor *m) + } + + for (c = m->clients; c; c = c->next) { ++ if (ISVISIBLE(c)) ++ n++; + occ |= c->tags; + if (c->isurgent) + urg |= c->tags; +@@ -734,16 +763,36 @@ drawbar(Monitor *m) + x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); + + 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); +- if (m->sel->isfloating) +- drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0); ++ if (n > 0) { ++ int remainder = w % n; ++ int tabw = (1.0 / (double)n) * w + 1; ++ for (c = m->clients; c; c = c->next) { ++ if (!ISVISIBLE(c)) ++ continue; ++ if (m->sel == c) ++ scm = SchemeSel; ++ else if (HIDDEN(c)) ++ scm = SchemeHid; ++ else ++ scm = SchemeNorm; ++ drw_setscheme(drw, scheme[scm]); ++ ++ if (remainder >= 0) { ++ if (remainder == 0) { ++ tabw--; ++ } ++ remainder--; ++ } ++ drw_text(drw, x, 0, tabw, bh, lrpad / 2, c->name, 0); ++ x += tabw; ++ } + } else { + drw_setscheme(drw, scheme[SchemeNorm]); + drw_rect(drw, x, 0, w, bh, 1, 1); + } + } ++ m->bt = n; ++ m->btw = w; + drw_map(drw, m->barwin, 0, 0, m->ww, bh); + } + +@@ -789,9 +838,17 @@ void + focus(Client *c) + { + if (!c || !ISVISIBLE(c)) +- for (c = selmon->stack; c && !ISVISIBLE(c); c = c->snext); +- if (selmon->sel && selmon->sel != c) ++ for (c = selmon->stack; c && (!ISVISIBLE(c) || HIDDEN(c)); c = c->snext); ++ if (selmon->sel && selmon->sel != c) { + unfocus(selmon->sel, 0); ++ ++ if (selmon->hidsel) { ++ hidewin(selmon->sel); ++ if (c) ++ arrange(c->mon); ++ selmon->hidsel = 0; ++ } ++ } + if (c) { + if (c->mon != selmon) + selmon = c->mon; +@@ -835,28 +892,52 @@ focusmon(const Arg *arg) + } + + void +-focusstack(const Arg *arg) ++focusstackvis(const Arg *arg) { ++ focusstack(arg->i, 0); ++} ++ ++void ++focusstackhid(const Arg *arg) { ++ focusstack(arg->i, 1); ++} ++ ++void ++focusstack(int inc, int hid) + { + Client *c = NULL, *i; +- +- if (!selmon->sel || (selmon->sel->isfullscreen && lockfullscreen)) ++ // if no client selected AND exclude hidden client; if client selected but fullscreened ++ if ((!selmon->sel && !hid) || (selmon->sel && selmon->sel->isfullscreen && lockfullscreen)) + return; +- if (arg->i > 0) { +- for (c = selmon->sel->next; c && !ISVISIBLE(c); c = c->next); ++ if (!selmon->clients) ++ return; ++ if (inc > 0) { ++ if (selmon->sel) ++ for (c = selmon->sel->next; ++ c && (!ISVISIBLE(c) || (!hid && HIDDEN(c))); ++ c = c->next); + if (!c) +- for (c = selmon->clients; c && !ISVISIBLE(c); c = c->next); ++ for (c = selmon->clients; ++ c && (!ISVISIBLE(c) || (!hid && HIDDEN(c))); ++ c = c->next); + } else { +- for (i = selmon->clients; i != selmon->sel; i = i->next) +- if (ISVISIBLE(i)) +- c = i; ++ if (selmon->sel) { ++ for (i = selmon->clients; i != selmon->sel; i = i->next) ++ if (ISVISIBLE(i) && !(!hid && HIDDEN(i))) ++ c = i; ++ } else ++ c = selmon->clients; + if (!c) + for (; i; i = i->next) +- if (ISVISIBLE(i)) ++ if (ISVISIBLE(i) && !(!hid && HIDDEN(i))) + c = i; + } + if (c) { + focus(c); + restack(selmon); ++ if (HIDDEN(c)) { ++ showwin(c); ++ c->mon->hidsel = 1; ++ } + } + } + +@@ -976,6 +1057,36 @@ grabkeys(void) + } + } + ++void ++hide(const Arg *arg) ++{ ++ hidewin(selmon->sel); ++ focus(NULL); ++ arrange(selmon); ++} ++ ++void ++hidewin(Client *c) { ++ if (!c || HIDDEN(c)) ++ return; ++ ++ Window w = c->win; ++ static XWindowAttributes ra, ca; ++ ++ // more or less taken directly from blackbox's hide() function ++ XGrabServer(dpy); ++ XGetWindowAttributes(dpy, root, &ra); ++ XGetWindowAttributes(dpy, w, &ca); ++ // prevent UnmapNotify events ++ XSelectInput(dpy, root, ra.your_event_mask & ~SubstructureNotifyMask); ++ XSelectInput(dpy, w, ca.your_event_mask & ~StructureNotifyMask); ++ XUnmapWindow(dpy, w); ++ setclientstate(c, IconicState); ++ XSelectInput(dpy, root, ra.your_event_mask); ++ XSelectInput(dpy, w, ca.your_event_mask); ++ XUngrabServer(dpy); ++} ++ + void + incnmaster(const Arg *arg) + { +@@ -1078,12 +1189,14 @@ manage(Window w, XWindowAttributes *wa) + XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend, + (unsigned char *) &(c->win), 1); + XMoveResizeWindow(dpy, c->win, c->x + 2 * sw, c->y, c->w, c->h); /* some windows require this */ +- setclientstate(c, NormalState); ++ if (!HIDDEN(c)) ++ setclientstate(c, NormalState); + if (c->mon == selmon) + unfocus(selmon->sel, 0); + c->mon->sel = c; + arrange(c->mon); +- XMapWindow(dpy, c->win); ++ if (!HIDDEN(c)) ++ XMapWindow(dpy, c->win); + focus(NULL); + } + +@@ -1204,7 +1317,7 @@ movemouse(const Arg *arg) + Client * + nexttiled(Client *c) + { +- for (; c && (c->isfloating || !ISVISIBLE(c)); c = c->next); ++ for (; c && (c->isfloating || !ISVISIBLE(c) || HIDDEN(c)); c = c->next); + return c; + } + +@@ -1257,6 +1370,16 @@ propertynotify(XEvent *e) + void + quit(const Arg *arg) + { ++ // fix: reloading dwm keeps all the hidden clients hidden ++ Monitor *m; ++ Client *c; ++ for (m = mons; m; m = m->next) { ++ if (m) { ++ for (c = m->stack; c; c = c->next) ++ if (c && HIDDEN(c)) showwin(c); ++ } ++ } ++ + running = 0; + } + +@@ -1625,6 +1748,42 @@ seturgent(Client *c, int urg) + XFree(wmh); + } + ++void ++show(const Arg *arg) ++{ ++ if (selmon->hidsel) ++ selmon->hidsel = 0; ++ showwin(selmon->sel); ++} ++ ++void ++showall(const Arg *arg) ++{ ++ Client *c = NULL; ++ selmon->hidsel = 0; ++ for (c = selmon->clients; c; c = c->next) { ++ if (ISVISIBLE(c)) ++ showwin(c); ++ } ++ if (!selmon->sel) { ++ for (c = selmon->clients; c && !ISVISIBLE(c); c = c->next); ++ if (c) ++ focus(c); ++ } ++ restack(selmon); ++} ++ ++void ++showwin(Client *c) ++{ ++ if (!c || !HIDDEN(c)) ++ return; ++ ++ XMapWindow(dpy, c->win); ++ setclientstate(c, NormalState); ++ arrange(c->mon); ++} ++ + void + showhide(Client *c) + { +@@ -1761,6 +1920,25 @@ toggleview(const Arg *arg) + } + } + ++void ++togglewin(const Arg *arg) ++{ ++ Client *c = (Client*)arg->v; ++ ++ if (!c) ++ return; ++ if (c == selmon->sel) { ++ hidewin(c); ++ focus(NULL); ++ arrange(c->mon); ++ } else { ++ if (HIDDEN(c)) ++ showwin(c); ++ focus(c); ++ restack(selmon); ++ } ++} ++ + void + unfocus(Client *c, int setfocus) + { diff --git a/patches/dwm-winicon-6.6.diff b/patches/dwm-winicon-6.6.diff new file mode 100644 index 0000000..2667572 --- /dev/null +++ b/patches/dwm-winicon-6.6.diff @@ -0,0 +1,429 @@ +From 6aafee64cace33c1afc02c087397593350194866 Mon Sep 17 00:00:00 2001 +From: Bakkeby +Date: Thu, 18 Sep 2025 22:29:40 +0200 +Subject: [PATCH] Winicon patch (without imlib2 dependency) + +--- + config.def.h | 2 + + config.mk | 4 +- + drw.c | 11 +++ + drw.h | 3 + + dwm.c | 198 ++++++++++++++++++++++++++++++++++++++++++++++++++- + 5 files changed, 215 insertions(+), 3 deletions(-) + +diff --git a/config.def.h b/config.def.h +index 9efa774..c2a6e47 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -5,6 +5,8 @@ static const unsigned int borderpx = 1; /* border pixel of windows */ + static const unsigned int snap = 32; /* snap pixel */ + static const int showbar = 1; /* 0 means no bar */ + static const int topbar = 1; /* 0 means bottom bar */ ++static int iconsize = 16; /* icon size */ ++static int iconspacing = 5; /* space between icon and title */ + static const char *fonts[] = { "monospace:size=10" }; + static const char dmenufont[] = "monospace:size=10"; + static const char col_gray1[] = "#222222"; +diff --git a/config.mk b/config.mk +index b469a2b..bbea09f 100644 +--- a/config.mk ++++ b/config.mk +@@ -10,6 +10,8 @@ MANPREFIX = ${PREFIX}/share/man + X11INC = /usr/X11R6/include + X11LIB = /usr/X11R6/lib + ++XRENDER = -lXrender ++ + # Xinerama, comment if you don't want it + XINERAMALIBS = -lXinerama + XINERAMAFLAGS = -DXINERAMA +@@ -23,7 +25,7 @@ FREETYPEINC = /usr/include/freetype2 + + # includes and libs + INCS = -I${X11INC} -I${FREETYPEINC} +-LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} ++LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} ${XRENDER} + + # flags + CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} +diff --git a/drw.c b/drw.c +index c41e6af..cfa769f 100644 +--- a/drw.c ++++ b/drw.c +@@ -57,6 +57,7 @@ drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h + drw->w = w; + drw->h = h; + drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen)); ++ drw->picture = XRenderCreatePicture(dpy, drw->drawable, XRenderFindVisualFormat(dpy, DefaultVisual(dpy, screen)), 0, NULL); + drw->gc = XCreateGC(dpy, root, 0, NULL); + XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter); + +@@ -71,6 +72,8 @@ drw_resize(Drw *drw, unsigned int w, unsigned int h) + + drw->w = w; + drw->h = h; ++ if (drw->picture) ++ XRenderFreePicture(drw->dpy, drw->picture); + if (drw->drawable) + XFreePixmap(drw->dpy, drw->drawable); + drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen)); +@@ -392,6 +395,14 @@ drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h) + XSync(drw->dpy, False); + } + ++void ++drw_pic(Drw *drw, int x, int y, unsigned int w, unsigned int h, Picture pic) ++{ ++ if (!drw) ++ return; ++ XRenderComposite(drw->dpy, PictOpOver, pic, None, drw->picture, 0, 0, 0, 0, x, y, w, h); ++} ++ + unsigned int + drw_fontset_getwidth(Drw *drw, const char *text) + { +diff --git a/drw.h b/drw.h +index 6471431..ff75898 100644 +--- a/drw.h ++++ b/drw.h +@@ -21,6 +21,7 @@ typedef struct { + int screen; + Window root; + Drawable drawable; ++ Picture picture; + GC gc; + Clr *scheme; + Fnt *fonts; +@@ -56,3 +57,5 @@ int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned in + + /* Map functions */ + void drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h); ++void drw_pic(Drw *drw, int x, int y, unsigned int w, unsigned int h, Picture pic); ++ +diff --git a/dwm.c b/dwm.c +index 1443802..62ea0e6 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -25,6 +25,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -59,7 +60,7 @@ + /* enums */ + enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ + enum { SchemeNorm, SchemeSel }; /* color schemes */ +-enum { NetSupported, NetWMName, NetWMState, NetWMCheck, ++enum { NetSupported, NetWMName, NetWMIcon, NetWMState, NetWMCheck, + NetWMFullscreen, NetActiveWindow, NetWMWindowType, + NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ + enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ +@@ -92,6 +93,8 @@ struct Client { + int bw, oldbw; + unsigned int tags; + int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; ++ unsigned int icw, ich; ++ Picture icon; + Client *next; + Client *snext; + Monitor *mon; +@@ -147,6 +150,7 @@ static void arrange(Monitor *m); + static void arrangemon(Monitor *m); + static void attach(Client *c); + static void attachstack(Client *c); ++static uint32_t *bilinear_scale(const uint32_t *src, int sw, int sh, uint32_t dw, uint32_t dh); + static void buttonpress(XEvent *e); + static void checkotherwm(void); + static void cleanup(void); +@@ -168,9 +172,11 @@ static void focus(Client *c); + static void focusin(XEvent *e); + static void focusmon(const Arg *arg); + static void focusstack(const Arg *arg); ++static void freeicon(Client *c); + static Atom getatomprop(Client *c, Atom prop); + static int getrootptr(int *x, int *y); + static long getstate(Window w); ++static Picture geticonprop(Display *dpy, Window w, int iconsize, unsigned int *icw, unsigned int *ich); + static int gettextprop(Window w, Atom atom, char *text, unsigned int size); + static void grabbuttons(Client *c, int focused); + static void grabkeys(void); +@@ -185,6 +191,7 @@ static void motionnotify(XEvent *e); + static void movemouse(const Arg *arg); + static Client *nexttiled(Client *c); + static void pop(Client *c); ++static uint32_t prealpha(uint32_t p); + static void propertynotify(XEvent *e); + static void quit(const Arg *arg); + static Monitor *recttomon(int x, int y, int w, int h); +@@ -219,6 +226,7 @@ static void updatebarpos(Monitor *m); + static void updatebars(void); + static void updateclientlist(void); + static int updategeom(void); ++static void updateicon(Client *c); + static void updatenumlockmask(void); + static void updatesizehints(Client *c); + static void updatestatus(void); +@@ -414,6 +422,57 @@ attachstack(Client *c) + c->mon->stack = c; + } + ++uint32_t * ++bilinear_scale(const uint32_t *src, int sw, int sh, unsigned int dw, unsigned int dh) ++{ ++ uint32_t *dst = calloc(dw * dh, sizeof(uint32_t)); ++ if (!dst) return NULL; ++ ++ for (int y = 0; y < dh; y++) { ++ /* Source position (in fixed-point) */ ++ float sy = (y + 0.5f) * sh / (float)dh - 0.5f; ++ int y0 = (sy < 0) ? (int)(sy - 1) : (int)(sy);; ++ int y1 = y0 + 1; ++ float fy = sy - y0; ++ if (y0 < 0) { y0 = 0; y1 = 0; fy = 0; } ++ if (y1 >= sh) { y1 = sh-1; y0 = y1; fy = 0; } ++ ++ for (int x = 0; x < dw; x++) { ++ float sx = (x + 0.5f) * sw / (float)dw - 0.5f; ++ int x0 = (sx < 0) ? (int)(sx - 1) : (int)(sx); ++ int x1 = x0 + 1; ++ float fx = sx - x0; ++ if (x0 < 0) { x0 = 0; x1 = 0; fx = 0; } ++ if (x1 >= sw) { x1 = sw-1; x0 = x1; fx = 0; } ++ ++ uint32_t p00 = prealpha(src[y0*sw + x0]); ++ uint32_t p10 = prealpha(src[y0*sw + x1]); ++ uint32_t p01 = prealpha(src[y1*sw + x0]); ++ uint32_t p11 = prealpha(src[y1*sw + x1]); ++ ++ /* Extract premultiplied channels */ ++ int a00 = p00 >> 24, r00 = (p00 >> 16) & 0xFF, g00 = (p00 >> 8) & 0xFF, b00 = p00 & 0xFF; ++ int a10 = p10 >> 24, r10 = (p10 >> 16) & 0xFF, g10 = (p10 >> 8) & 0xFF, b10 = p10 & 0xFF; ++ int a01 = p01 >> 24, r01 = (p01 >> 16) & 0xFF, g01 = (p01 >> 8) & 0xFF, b01 = p01 & 0xFF; ++ int a11 = p11 >> 24, r11 = (p11 >> 16) & 0xFF, g11 = (p11 >> 8) & 0xFF, b11 = p11 & 0xFF; ++ ++ /* Bilinear weights */ ++ float w00 = (1.0f - fx) * (1.0f - fy); ++ float w10 = fx * (1.0f - fy); ++ float w01 = (1.0f - fx) * fy; ++ float w11 = fx * fy; ++ ++ int a = (int)(a00*w00 + a10*w10 + a01*w01 + a11*w11 + 0.5f); ++ int r = (int)(r00*w00 + r10*w10 + r01*w01 + r11*w11 + 0.5f); ++ int g = (int)(g00*w00 + g10*w10 + g01*w01 + g11*w11 + 0.5f); ++ int b = (int)(b00*w00 + b10*w10 + b01*w01 + b11*w11 + 0.5f); ++ ++ dst[y*dw + x] = (a << 24) | (r << 16) | (g << 8) | b; ++ } ++ } ++ return dst; ++} ++ + void + buttonpress(XEvent *e) + { +@@ -736,7 +795,12 @@ drawbar(Monitor *m) + if ((w = m->ww - tw - x) > bh) { + if (m->sel) { + drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); +- drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); ++ if (m->sel->icon) { ++ drw_text(drw, x, 0, w, bh, lrpad / 2 + m->sel->icw + iconspacing, m->sel->name, 0); ++ drw_pic(drw, x + lrpad / 2, (bh - m->sel->ich) / 2, m->sel->icw, m->sel->ich, m->sel->icon); ++ } else { ++ drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); ++ } + if (m->sel->isfloating) + drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0); + } else { +@@ -860,6 +924,15 @@ focusstack(const Arg *arg) + } + } + ++void ++freeicon(Client *c) ++{ ++ if (c->icon) { ++ XRenderFreePicture(dpy, c->icon); ++ c->icon = None; ++ } ++} ++ + Atom + getatomprop(Client *c, Atom prop) + { +@@ -904,6 +977,104 @@ getstate(Window w) + return result; + } + ++/* geticonprop: read, scale, and return an XRender Picture */ ++Picture ++geticonprop(Display *dpy, Window win, int iconsize, unsigned int *icw, unsigned int *ich) { ++ Atom net_wm_icon = XInternAtom(dpy, "_NET_WM_ICON", False); ++ Atom actual_type; ++ int actual_format; ++ unsigned long nitems, bytes_after; ++ unsigned char *data = NULL; ++ Picture pict = None; ++ ++ if (XGetWindowProperty(dpy, win, net_wm_icon, 0, LONG_MAX, False, AnyPropertyType, ++ &actual_type, &actual_format, &nitems, &bytes_after, &data) != Success || !data) { ++ return None; ++ } ++ ++ unsigned long *p = (unsigned long *)data; ++ unsigned long *end = p + nitems; ++ ++ /* Pick icon closest to desired size */ ++ unsigned long *best = NULL; ++ unsigned long best_w = 0, best_h = 0; ++ unsigned long best_diff = ~0UL; ++ ++ while (p + 2 < end) { ++ unsigned long w0 = *p++; ++ unsigned long h0 = *p++; ++ if (w0 == 0 || h0 == 0 || p + w0*h0 > end) break; ++ ++ unsigned long diff = (w0 > (unsigned long)iconsize ? w0 - iconsize : iconsize - w0) ++ + (h0 > (unsigned long)iconsize ? h0 - iconsize : iconsize - h0); ++ ++ if (diff < best_diff) { ++ best_diff = diff; ++ best_w = w0; ++ best_h = h0; ++ best = p; ++ } ++ p += w0 * h0; ++ } ++ ++ if (!best) { ++ XFree(data); ++ return None; ++ } ++ ++ /* Copy into fixed 32-bit array */ ++ uint32_t *src = malloc(best_w * best_h * sizeof(uint32_t)); ++ for (size_t i = 0; i < best_w * best_h; i++) ++ src[i] = (uint32_t)best[i]; ++ ++ /* Scale */ ++ int dst_w, dst_h; ++ if (best_w > best_h) { ++ dst_w = iconsize; ++ dst_h = best_h * iconsize / best_w; ++ } else { ++ dst_h = iconsize; ++ dst_w = best_w * iconsize / best_h; ++ } ++ ++ uint32_t *scaled = bilinear_scale(src, best_w, best_h, dst_w, dst_h); ++ free(src); ++ XFree(data); ++ if (!scaled) return None; ++ ++ /* Create pixmap and upload pixels */ ++ Pixmap pm = XCreatePixmap(dpy, root, dst_w, dst_h, 32); ++ ++ XImage img; ++ memset(&img, 0, sizeof img); ++ img.width = dst_w; ++ img.height = dst_h; ++ img.format = ZPixmap; ++ img.data = (char*)scaled; ++ img.byte_order = LSBFirst; ++ img.bitmap_unit = 32; ++ img.bitmap_bit_order = LSBFirst; ++ img.bitmap_pad = 32; ++ img.depth = 32; ++ img.bits_per_pixel = 32; ++ img.bytes_per_line = dst_w * 4; ++ ++ XInitImage(&img); ++ GC gc = XCreateGC(dpy, pm, 0, NULL); ++ XPutImage(dpy, pm, gc, &img, 0, 0, 0, 0, dst_w, dst_h); ++ XFreeGC(dpy, gc); ++ ++ XRenderPictFormat *fmt = XRenderFindStandardFormat(dpy, PictStandardARGB32); ++ pict = XRenderCreatePicture(dpy, pm, fmt, 0, NULL); ++ XFreePixmap(dpy, pm); ++ ++ free(scaled); ++ ++ *icw = dst_w; ++ *ich = dst_h; ++ return pict; ++} ++ + int + gettextprop(Window w, Atom atom, char *text, unsigned int size) + { +@@ -1043,6 +1214,7 @@ manage(Window w, XWindowAttributes *wa) + c->h = c->oldh = wa->height; + c->oldbw = wa->border_width; + ++ updateicon(c); + updatetitle(c); + if (XGetTransientForHint(dpy, w, &trans) && (t = wintoclient(trans))) { + c->mon = t->mon; +@@ -1217,6 +1389,14 @@ pop(Client *c) + arrange(c->mon); + } + ++uint32_t ++prealpha(uint32_t p) { ++ uint8_t a = p >> 24u; ++ uint32_t rb = (a * (p & 0xFF00FFu)) >> 8u; ++ uint32_t g = (a * (p & 0x00FF00u)) >> 8u; ++ return (rb & 0xFF00FFu) | (g & 0x00FF00u) | (a << 24u); ++} ++ + void + propertynotify(XEvent *e) + { +@@ -1249,6 +1429,11 @@ propertynotify(XEvent *e) + if (c == c->mon->sel) + drawbar(c->mon); + } ++ if (ev->atom == netatom[NetWMIcon]) { ++ updateicon(c); ++ if (c == c->mon->sel) ++ drawbar(c->mon); ++ } + if (ev->atom == netatom[NetWMWindowType]) + updatewindowtype(c); + } +@@ -1572,6 +1757,7 @@ setup(void) + netatom[NetActiveWindow] = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False); + netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); + netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); ++ netatom[NetWMIcon] = XInternAtom(dpy, "_NET_WM_ICON", False); + netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False); + netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", False); + netatom[NetWMFullscreen] = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False); +@@ -1782,6 +1968,7 @@ unmanage(Client *c, int destroyed) + + detach(c); + detachstack(c); ++ freeicon(c); + if (!destroyed) { + wc.border_width = c->oldbw; + XGrabServer(dpy); /* avoid race conditions */ +@@ -1863,6 +2050,13 @@ updateclientlist(void) + (unsigned char *) &(c->win), 1); + } + ++void ++updateicon(Client *c) ++{ ++ freeicon(c); ++ c->icon = geticonprop(dpy, c->win, iconsize, &c->icw, &c->ich); ++} ++ + int + updategeom(void) + { +-- +2.51.0 +