From 45d035930f7fc1faa4096522c7a4593480a64592 Mon Sep 17 00:00:00 2001 From: Jef Roosens Date: Wed, 28 Oct 2020 14:31:09 +0100 Subject: [PATCH] Added alpha patch --- .gitignore | 3 + config.def.h | 7 + config.h | 81 +- config.mk | 2 +- drw.c | 24 +- drw.h | 9 +- drw.o | Bin 10624 -> 10672 bytes dwm | Bin 66992 -> 67368 bytes dwm.c | 79 +- dwm.c.orig | 2152 ----------------------- dwm.o | Bin 59256 -> 60904 bytes patches/dwm-alpha-20180613-b69c870.diff | 289 +++ patches/dwm-attachbottom-6.2.diff | 71 + 13 files changed, 507 insertions(+), 2210 deletions(-) delete mode 100644 dwm.c.orig create mode 100644 patches/dwm-alpha-20180613-b69c870.diff create mode 100644 patches/dwm-attachbottom-6.2.diff diff --git a/.gitignore b/.gitignore index a9fbecd..c984e79 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ .vim/ +*.o +*.orig +*.rej diff --git a/config.def.h b/config.def.h index ba42cb7..99b8ad4 100644 --- a/config.def.h +++ b/config.def.h @@ -12,11 +12,18 @@ 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 unsigned int baralpha = 0xd0; +static const unsigned int borderalpha = OPAQUE; static const char *colors[][3] = { /* fg bg border */ [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, [SchemeSel] = { col_gray4, col_cyan, col_cyan }, }; +static const unsigned int alphas[][3] = { + /* fg bg border */ + [SchemeNorm] = { OPAQUE, baralpha, borderalpha }, + [SchemeSel] = { OPAQUE, baralpha, borderalpha }, +}; /* tagging */ static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; diff --git a/config.h b/config.h index ba42cb7..12b3902 100644 --- a/config.h +++ b/config.h @@ -12,12 +12,22 @@ 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 unsigned int baralpha = 150; // Default is 0xd0 +static const unsigned int borderalpha = OPAQUE; // Max is 255 + static const char *colors[][3] = { /* fg bg border */ [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, [SchemeSel] = { col_gray4, col_cyan, col_cyan }, }; +static const unsigned int alphas[][3] = { + /* fg bg border */ + [SchemeNorm] = { OPAQUE, baralpha, borderalpha }, + [SchemeSel] = { OPAQUE, baralpha, borderalpha }, +}; + /* tagging */ static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; @@ -59,41 +69,44 @@ static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; static const char *termcmd[] = { "st", NULL }; -static Key keys[] = { /* modifier key function argument */ - { MODKEY, XK_d, spawn, {.v = dmenucmd } }, - { MODKEY, 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 , XK_x, 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_y, 0) - TAGKEYS( XK_u, 1) - TAGKEYS( XK_i, 2) - TAGKEYS( XK_o, 3) - TAGKEYS( XK_p, 4) - TAGKEYS( XK_6, 5) - TAGKEYS( XK_7, 6) - TAGKEYS( XK_8, 7) - TAGKEYS( XK_9, 8) - { MODKEY|ShiftMask, XK_q, quit, {0} }, +static Key keys[] = { + { MODKEY , XK_d , spawn , {.v = dmenucmd } } , + { MODKEY , 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 , XK_x , 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 } } , + { MODKEY , XK_F2 , spawn , {.v = { "dmenu_optimus" , NULL }}} , + { MODKEY , XK_F3 , spawn , {.v = { "dmenu_kb_layout" , NULL }}} , + { MODKEY , XK_F4 , spawn , {.v = { "dmenu_audio_sinks" , NULL }}} , + { MODKEY|ShiftMask , XK_q , quit , {0} } , + TAGKEYS( XK_y , 0) + TAGKEYS( XK_u , 1) + TAGKEYS( XK_i , 2) + TAGKEYS( XK_o , 3) + TAGKEYS( XK_p , 4) + TAGKEYS( XK_6 , 5) + TAGKEYS( XK_7 , 6) + TAGKEYS( XK_8 , 7) + TAGKEYS( XK_9 , 8) }; /* button definitions */ diff --git a/config.mk b/config.mk index 7084c33..21b5404 100644 --- a/config.mk +++ b/config.mk @@ -22,7 +22,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} -lXrender # 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 4cdbcbe..9557ad8 100644 --- a/drw.c +++ b/drw.c @@ -61,7 +61,7 @@ utf8decode(const char *c, long *u, size_t clen) } Drw * -drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h) +drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h, Visual *visual, unsigned int depth, Colormap cmap) { Drw *drw = ecalloc(1, sizeof(Drw)); @@ -70,8 +70,11 @@ drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h drw->root = root; drw->w = w; drw->h = h; - drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen)); - drw->gc = XCreateGC(dpy, root, 0, NULL); + drw->visual = visual; + drw->depth = depth; + drw->cmap = cmap; + drw->drawable = XCreatePixmap(dpy, root, w, h, depth); + drw->gc = XCreateGC(dpy, drw->drawable, 0, NULL); XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter); return drw; @@ -194,21 +197,22 @@ drw_fontset_free(Fnt *font) } void -drw_clr_create(Drw *drw, Clr *dest, const char *clrname) +drw_clr_create(Drw *drw, Clr *dest, const char *clrname, unsigned int alpha) { if (!drw || !dest || !clrname) return; - if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen), - DefaultColormap(drw->dpy, drw->screen), + if (!XftColorAllocName(drw->dpy, drw->visual, drw->cmap, clrname, dest)) die("error, cannot allocate color '%s'", clrname); + + dest->pixel = (dest->pixel & 0x00ffffffU) | (alpha << 24); } /* Wrapper to create color schemes. The caller has to call free(3) on the * returned color scheme when done using it. */ Clr * -drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) +drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int alphas[], size_t clrcount) { size_t i; Clr *ret; @@ -218,7 +222,7 @@ drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) return NULL; for (i = 0; i < clrcount; i++) - drw_clr_create(drw, &ret[i], clrnames[i]); + drw_clr_create(drw, &ret[i], clrnames[i], alphas[i]); return ret; } @@ -274,9 +278,7 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp } else { XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel); XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); - d = XftDrawCreate(drw->dpy, drw->drawable, - DefaultVisual(drw->dpy, drw->screen), - DefaultColormap(drw->dpy, drw->screen)); + d = XftDrawCreate(drw->dpy, drw->drawable, drw->visual, drw->cmap); x += lpad; w -= lpad; } diff --git a/drw.h b/drw.h index 4bcd5ad..5dda1c5 100644 --- a/drw.h +++ b/drw.h @@ -20,6 +20,9 @@ typedef struct { Display *dpy; int screen; Window root; + Visual *visual; + unsigned int depth; + Colormap cmap; Drawable drawable; GC gc; Clr *scheme; @@ -27,7 +30,7 @@ typedef struct { } Drw; /* Drawable abstraction */ -Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h); +Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h, Visual *visual, unsigned int depth, Colormap cmap); void drw_resize(Drw *drw, unsigned int w, unsigned int h); void drw_free(Drw *drw); @@ -38,8 +41,8 @@ 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); /* Colorscheme abstraction */ -void drw_clr_create(Drw *drw, Clr *dest, const char *clrname); -Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount); +void drw_clr_create(Drw *drw, Clr *dest, const char *clrname, unsigned int alpha); +Clr *drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int alphas[], size_t clrcount); /* Cursor abstraction */ Cur *drw_cur_create(Drw *drw, int shape); diff --git a/drw.o b/drw.o index 941460bd62bca873538fd2390d633e6978db77e9..a2bb4fdff7a4c4a2fdefce624600265762237e57 100644 GIT binary patch delta 2482 zcmZ`)4Qx|Y6n^)$+uE_cc82Y>^3wv{)`_^5Xc#}Tz3~ROP)Ko1Mqt21!z9E&wmHJz zAfu4$13?Zk5D_84L=sE}iwY)Uw;@Uhkr{&G?}h|MKoA8c0@iceSG_jzCilK~zwbNe z+;h(D>xSy~>K%R(I8t(xw1(Lk+IGXmntVAYY9&eP$0_N?9AA#k?(6I~-OzoJ5Iad( zgDuQ%>MY`Ur;k9XHl_J|rSWz=Z3 zCH)%B71UUl+N_JDqSamF*=TcU^j?UackJq#8NFQN*cGd`bu~|;(RfoOWp}ADH-PTE zSO|0&V*O#(mv9h`H9NxW3f=ZB_rjr8i5gW>=g+RfcswpqdpBiu()>DYLAN$ndp^W2 zXf-v}SWYJf#AvkbK5@Jm!(dp!M?4-4u>s1yJmExVl$}kUGa73O1iz!~N6pCD7cvI_ z6lS+*=M^iBqkr9Jqr@!V_$PnhRkpR9zb*%3SS%;TuG1E3i@LdUY(q=rpEn9otA|i{ z*Xna)b=D-SQx%OR{ zr${EXG*XKUQ|!x8({6X+dfL8EzJC{9&K}{3P}W6_3NOWW-U+i8yw{J1+138+fp|P@ zEQ!FOY|Z)FgE*FDudf#Kd6AAD3V&w%(fg=DZDurrgpnrskmOZR4LwVR!#A5 z&d`)VTc)m5$V-&~0-EAQ0Xjtw{HpYt_SxKCl7>heyz^gBYC_B=!(_*+WCMKQ7)=gC zpQF_Nz06G{$pda@vHc6>Jv&v}?Ts+qIW|)oibNPTIz41L9B>wAxNyH4&N@qv<{h(O z*2f3WCC!kRUrNq_man?UTDU7IVaK04@C=VhM4AOF^GogPO?C+!$}bM~nY%>NsO>Se zi?PUjn8_rP<35%FDNsohxC<7^!!lrX!BkQQodu=#Z!(ewo{swk(+C*=&7~4Q%yX5J zr5((5HG}j+-f-1D+RT*uFTwc`f24er!vSO$3G8TreG7V!?G#wiwgQMpbX{#-N(9(h!F z=*e-P5zs=x<{*sls_rwH2;ty1<8h{H(F?PYeJ6`^lEhD$i<93`J`Tf1WDD`u^1*E@ zai(lH!V#~Emx8a8pbwQTcCJe*b$q6jTOefU3rJW7GU?gtIo_XXRj0{aoHM7B#{ zrwMEi96rs6j-rV zyWtIt)hDoGkA@6FM>u$_3Y@9B=>qN(@VRh%q)JwSeN<`vYT+&x3z{3;84mssJDw}t zlL^SBV$}*b|AR~6*yT}M+|9gcIIQMJhHv>i2eWQl-o`%<%cyAh>`iew^UnrLhBzyFPv?7i0o6Xpp zhA#zH_%+!K^+n^bC3}j>0bZbBFE p`|S<iy%$AF#(?F1zyJTmNLVaF>+ZV}(h<3g|2H{0*H_#*qL3 delta 2501 zcmZ8ie{54#6z=VhwcS|zX4qa!fWEQ9I*_#`2n7e*+d8<_qSb+Hy6G53_yYsWHYbi{ z%rWrgIfNWS79&QY34+lu7US@bWj_!%Lqt@P85Kt~vWYM-WJ+Mxb6;Qe+LOH7d%y2H z=bm%!z1!)Ey%mRiFqLKLS^67kqg$`^mlzC&*aQxSuyQx7{1H`dQf0f1DpL{VoKh*! z!JnPryE^oR|9;797?1 zr=!aFGc|HGd}QKR>JKg@y{Y1H*MF)qRQ3~Y%%%T zs{W40hc{7WhN{gHRoiS@K&m$RsM?xbw1yI>GF3B)yBcWcG`d`N9vPyYH=IWXY(q_@ zv@_ngCaOMeqg&St5#<(DCh6d~HDYRKzER~ORbw%#?kdqjbq+KM6dTjlwT1;ugsmBt zpOQDR$Q88XcNgx$cIcQP&ZBILNCdOQUF3)|jm_v6&@qu0R`_7>d#YTCsI#v`l_?q@ zrh~tlDYno?$@zq6)sIxgb@SMDV{m|WoO5BvYF5b44zrl3Z4UiA3k=JfSt_z}S>Cv* zqC(y1EkTuY->bMKRo4gL8?)Dq9coE*sJt^y)e3D*)dmR!OO*`|=^pE8Z@tA#LT{My zum-dk-8iKkEdhgbUl&e44|~1ZQDRPeyf#Fe6M_&(v!SK~45uo^gNc=Z z$2y;cV6C-?T!j|vL*xVKvF;(E-a=a;Ni!L#sUZM$_8q9XXm{Z_VSn4`nugcXb3Gxd z3{ka2!pqilC#uv**Uv_kYZC>3#^X^Hui8kuEVSIi%c#EYt;G7Cr%PsmJHv<3OEZp< z-tk#3LXN}T%mtQ+qr|uqBu8J{TuiQ!^#-ky4Pl3{-)P*B?y!|-$PU|bgpTNZBjZaQ z!a-xH!_{Sy9nyYt*x~E2gfU#L!-s(EaG{{oVPhBPg6@~j{LmOS{(sDAU_tNb;7J2K zCd`GS&L_zZm~<{7-HwV1|dKFoa23a)N$HwEQMBKnS~V)f{z6csf5cy zzP8>6B+Cy{rnxte)n~$*CueUaH6UmENgvc_i|#olEueupGdqL{JYXP(6>vP;Z+}5& zE8)BB{9wPn(yB-8C0)A=Tg)t39jlDRD1u;)NY+6l=Q-n)8BXP_BYwD@{dmF_!zE-N;n*b{+X2KQx=(T} z@9TpgvSoTHEb>y$HwIfgBB^2;@*W)ah`}?ul7-9Wl()DDUJlQO+Zdm{KxXVGgkLiA zIgl%fnLG9R8CwiXB@wEnS?-t8aEX@ca}3%g(LKnqGOCgh_d*Y{T~^K2z_QHb*fh8* ziKGs)az*kc8{PBl2_@U5j8j&EjO=!fE$7%*pdQ(Fj?LxRgK!+#Zk=U0h#dPaTtfB? z$GSN76Cevj_b|uK=GYO9{g&G|!m&TVmIY$u7RNryu`?VV<#3yRPgw^Radw4DtIE#kEhU{C*rdk^oWsuCP8CAtME%I zf8y}f9KM*lG3QeOvG^A5Ocl6M^+9y7LNUmvu4|9j%qDeMa9@rrH9C*GaHCLjA( zDR}a+|B`|i>6!nPg0Iu@U3!km+@=zEo8he#!mpQlAq7wV(J0~`B$JHkM^c@F+x5eE zEd{4KZYXTn{bD1WU-$*t28S1|Bosy$6&p`vKvrfBNcq0xv^L*IPJohMOa@>S$7Nvm v6&uSlHC?UGXQ%ANp}hl#eJjZbj3PZDKzhMiavCB9#r8uB6M|ikmGAinI8(!( diff --git a/dwm b/dwm index 8ec14ecc79c78b2703cad0342f1ea94902a477fd..a0943a940a7854e687ba7c7a0bc00140db797c41 100755 GIT binary patch delta 27802 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

;Ga)yI2QcY$ER0$;Fs3j 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 P9gJ^3U-g#B(DeTRAPF3N delta 26704 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 Nk)AZEuhv!@|36p`r1Jm( diff --git a/dwm.c b/dwm.c index 94aa6f3..c30fbab 100644 --- a/dwm.c +++ b/dwm.c @@ -58,6 +58,8 @@ #define TAGMASK ((1 << LENGTH(tags)) - 1) #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) +#define OPAQUE 0xffU + /* enums */ enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ enum { SchemeNorm, SchemeSel }; /* color schemes */ @@ -148,6 +150,7 @@ static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interac static void arrange(Monitor *m); static void arrangemon(Monitor *m); static void attach(Client *c); +static void attachbottom(Client *c); static void attachstack(Client *c); static void buttonpress(XEvent *e); static void checkotherwm(void); @@ -235,6 +238,7 @@ static Monitor *wintomon(Window w); static int xerror(Display *dpy, XErrorEvent *ee); static int xerrordummy(Display *dpy, XErrorEvent *ee); static int xerrorstart(Display *dpy, XErrorEvent *ee); +static void xinitvisual(); static void zoom(const Arg *arg); /* variables */ @@ -275,6 +279,11 @@ static Drw *drw; static Monitor *mons, *selmon; static Window root, wmcheckwin; +static int useargb = 0; +static Visual *visual; +static int depth; +static Colormap cmap; + /* configuration, allows nested code to access above variables */ #include "config.h" @@ -413,6 +422,18 @@ attach(Client *c) c->mon->clients = c; } +void +attachbottom(Client *c) +{ + Client *below = c->mon->clients; + for (; below && below->next; below = below->next); + c->next = NULL; + if (below) + below->next = c; + else + c->mon->clients = c; +} + void attachstack(Client *c) { @@ -1069,7 +1090,7 @@ manage(Window w, XWindowAttributes *wa) c->isfloating = c->oldstate = trans != None || c->isfixed; if (c->isfloating) XRaiseWindow(dpy, c->win); - attach(c); + attachbottom(c); attachstack(c); XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend, (unsigned char *) &(c->win), 1); @@ -1501,7 +1522,7 @@ sendmon(Client *c, Monitor *m) detachstack(c); c->mon = m; c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */ - attach(c); + attachbottom(c); attachstack(c); focus(NULL); arrange(NULL); @@ -1625,7 +1646,8 @@ setup(void) sw = DisplayWidth(dpy, screen); sh = DisplayHeight(dpy, screen); root = RootWindow(dpy, screen); - drw = drw_create(dpy, screen, root, sw, sh); + xinitvisual(); + drw = drw_create(dpy, screen, root, sw, sh, visual, depth, cmap); if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) die("no fonts could be loaded."); lrpad = drw->fonts->h; @@ -1653,7 +1675,7 @@ setup(void) /* init appearance */ scheme = ecalloc(LENGTH(colors), sizeof(Clr *)); for (i = 0; i < LENGTH(colors); i++) - scheme[i] = drw_scm_create(drw, colors[i], 3); + scheme[i] = drw_scm_create(drw, colors[i], alphas[i], 3); /* init bars */ updatebars(); updatestatus(); @@ -1890,16 +1912,18 @@ updatebars(void) Monitor *m; XSetWindowAttributes wa = { .override_redirect = True, - .background_pixmap = ParentRelative, + .background_pixel = 0, + .border_pixel = 0, + .colormap = cmap, .event_mask = ButtonPressMask|ExposureMask }; XClassHint ch = {"dwm", "dwm"}; for (m = mons; m; m = m->next) { if (m->barwin) continue; - m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen), - CopyFromParent, DefaultVisual(dpy, screen), - CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); + m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, depth, + InputOutput, visual, + CWOverrideRedirect|CWBackPixel|CWBorderPixel|CWColormap|CWEventMask, &wa); XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); XMapRaised(dpy, m->barwin); XSetClassHint(dpy, m->barwin, &ch); @@ -1983,7 +2007,7 @@ updategeom(void) m->clients = c->next; detachstack(c); c->mon = mons; - attach(c); + attachbottom(c); attachstack(c); } if (m == selmon) @@ -2196,6 +2220,43 @@ xerrorstart(Display *dpy, XErrorEvent *ee) return -1; } +void +xinitvisual() +{ + XVisualInfo *infos; + XRenderPictFormat *fmt; + int nitems; + int i; + + XVisualInfo tpl = { + .screen = screen, + .depth = 32, + .class = TrueColor + }; + long masks = VisualScreenMask | VisualDepthMask | VisualClassMask; + + infos = XGetVisualInfo(dpy, masks, &tpl, &nitems); + visual = NULL; + for(i = 0; i < nitems; i ++) { + fmt = XRenderFindVisualFormat(dpy, infos[i].visual); + if (fmt->type == PictTypeDirect && fmt->direct.alphaMask) { + visual = infos[i].visual; + depth = infos[i].depth; + cmap = XCreateColormap(dpy, root, visual, AllocNone); + useargb = 1; + break; + } + } + + XFree(infos); + + if (! visual) { + visual = DefaultVisual(dpy, screen); + depth = DefaultDepth(dpy, screen); + cmap = DefaultColormap(dpy, screen); + } +} + void zoom(const Arg *arg) { diff --git a/dwm.c.orig b/dwm.c.orig deleted file mode 100644 index 664c527..0000000 --- a/dwm.c.orig +++ /dev/null @@ -1,2152 +0,0 @@ -/* See LICENSE file for copyright and license details. - * - * dynamic window manager is designed like any other X client as well. It is - * driven through handling X events. In contrast to other X clients, a window - * manager selects for SubstructureRedirectMask on the root window, to receive - * events about window (dis-)appearance. Only one X connection at a time is - * allowed to select for this event mask. - * - * The event handlers of dwm are organized in an array which is accessed - * whenever a new event has been fetched. This allows event dispatching - * in O(1) time. - * - * Each child of the root window is called a client, except windows which have - * set the override_redirect flag. Clients are organized in a linked client - * list on each monitor, the focus history is remembered through a stack list - * on each monitor. Each client contains a bit array to indicate the tags of a - * client. - * - * Keys and tagging rules are organized as arrays and defined in config.h. - * - * To understand everything else, start reading main(). - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef XINERAMA -#include -#endif /* XINERAMA */ -#include - -#include "drw.h" -#include "util.h" - -/* macros */ -#define BUTTONMASK (ButtonPressMask|ButtonReleaseMask) -#define CLEANMASK(mask) (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask)) -#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 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 TAGMASK ((1 << LENGTH(tags)) - 1) -#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) - -/* enums */ -enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ -enum { SchemeNorm, SchemeSel }; /* color schemes */ -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, - ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ - -typedef union { - int i; - unsigned int ui; - float f; - const void *v; -} Arg; - -typedef struct { - unsigned int click; - unsigned int mask; - unsigned int button; - void (*func)(const Arg *arg); - const Arg arg; -} Button; - -typedef struct Monitor Monitor; -typedef struct Client Client; -struct Client { - char name[256]; - float mina, maxa; - int x, y, w, h; - int oldx, oldy, oldw, oldh; - int basew, baseh, incw, inch, maxw, maxh, minw, minh; - int bw, oldbw; - unsigned int tags; - int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; - Client *next; - Client *snext; - Monitor *mon; - Window win; -}; - -typedef struct { - unsigned int mod; - KeySym keysym; - void (*func)(const Arg *); - const Arg arg; -} Key; - -typedef struct { - const char *symbol; - void (*arrange)(Monitor *); -} Layout; - -struct Monitor { - char ltsymbol[16]; - float mfact; - int nmaster; - int num; - int by; /* 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 topbar; - Client *clients; - Client *sel; - Client *stack; - Monitor *next; - Window barwin; - const Layout *lt[2]; -}; - -typedef struct { - const char *class; - const char *instance; - const char *title; - unsigned int tags; - int isfloating; - int monitor; -} Rule; - -/* function declarations */ -static void applyrules(Client *c); -static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact); -static void arrange(Monitor *m); -static void arrangemon(Monitor *m); -static void attach(Client *c); -static void attachstack(Client *c); -static void buttonpress(XEvent *e); -static void checkotherwm(void); -static void cleanup(void); -static void cleanupmon(Monitor *mon); -static void clientmessage(XEvent *e); -static void configure(Client *c); -static void configurenotify(XEvent *e); -static void configurerequest(XEvent *e); -static Monitor *createmon(void); -static void destroynotify(XEvent *e); -static void detach(Client *c); -static void detachstack(Client *c); -static Monitor *dirtomon(int dir); -static void drawbar(Monitor *m); -static void drawbars(void); -static void enternotify(XEvent *e); -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 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 incnmaster(const Arg *arg); -static void keypress(XEvent *e); -static void killclient(const Arg *arg); -static void manage(Window w, XWindowAttributes *wa); -static void mappingnotify(XEvent *e); -static void maprequest(XEvent *e); -static void monocle(Monitor *m); -static void motionnotify(XEvent *e); -static void movemouse(const Arg *arg); -static Client *nexttiled(Client *c); -static void pop(Client *); -static void propertynotify(XEvent *e); -static void quit(const Arg *arg); -static Monitor *recttomon(int x, int y, int w, int h); -static void resize(Client *c, int x, int y, int w, int h, int interact); -static void resizeclient(Client *c, int x, int y, int w, int h); -static void resizemouse(const Arg *arg); -static void restack(Monitor *m); -static void run(void); -static void scan(void); -static int sendevent(Client *c, Atom proto); -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 setlayout(const Arg *arg); -static void setmfact(const Arg *arg); -static void setup(void); -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 tag(const Arg *arg); -static void tagmon(const Arg *arg); -static void tile(Monitor *); -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 unfocus(Client *c, int setfocus); -static void unmanage(Client *c, int destroyed); -static void unmapnotify(XEvent *e); -static void updatebarpos(Monitor *m); -static void updatebars(void); -static void updateclientlist(void); -static int updategeom(void); -static void updatenumlockmask(void); -static void updatesizehints(Client *c); -static void updatestatus(void); -static void updatetitle(Client *c); -static void updatewindowtype(Client *c); -static void updatewmhints(Client *c); -static void view(const Arg *arg); -static Client *wintoclient(Window w); -static Monitor *wintomon(Window w); -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); - -/* variables */ -static const char broken[] = "broken"; -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 lrpad; /* sum of left and right padding for text */ -static int (*xerrorxlib)(Display *, XErrorEvent *); -static unsigned int numlockmask = 0; -static void (*handler[LASTEvent]) (XEvent *) = { - [ButtonPress] = buttonpress, - [ClientMessage] = clientmessage, - [ConfigureRequest] = configurerequest, - [ConfigureNotify] = configurenotify, - [DestroyNotify] = destroynotify, - [EnterNotify] = enternotify, - [Expose] = expose, - [FocusIn] = focusin, - [KeyPress] = keypress, - [MappingNotify] = mappingnotify, - [MapRequest] = maprequest, - [MotionNotify] = motionnotify, - [PropertyNotify] = propertynotify, - [UnmapNotify] = unmapnotify -}; -static Atom wmatom[WMLast], netatom[NetLast]; -static int running = 1; -static Cur *cursor[CurLast]; -static Clr **scheme; -static Display *dpy; -static Drw *drw; -static Monitor *mons, *selmon; -static Window root, wmcheckwin; - -/* configuration, allows nested code to access above variables */ -#include "config.h" - -/* compile-time check if all tags fit into an unsigned int bit array. */ -struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; - -/* function implementations */ -void -applyrules(Client *c) -{ - const char *class, *instance; - unsigned int i; - const Rule *r; - Monitor *m; - XClassHint ch = { NULL, NULL }; - - /* rule matching */ - c->isfloating = 0; - c->tags = 0; - XGetClassHint(dpy, c->win, &ch); - class = ch.res_class ? ch.res_class : broken; - instance = ch.res_name ? ch.res_name : broken; - - for (i = 0; i < LENGTH(rules); i++) { - r = &rules[i]; - if ((!r->title || strstr(c->name, r->title)) - && (!r->class || strstr(class, r->class)) - && (!r->instance || strstr(instance, r->instance))) - { - c->isfloating = r->isfloating; - c->tags |= r->tags; - for (m = mons; m && m->num != r->monitor; m = m->next); - if (m) - c->mon = m; - } - } - if (ch.res_class) - XFree(ch.res_class); - if (ch.res_name) - XFree(ch.res_name); - c->tags = c->tags & TAGMASK ? c->tags & TAGMASK : c->mon->tagset[c->mon->seltags]; -} - -int -applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact) -{ - int baseismin; - Monitor *m = c->mon; - - /* set minimum possible */ - *w = MAX(1, *w); - *h = MAX(1, *h); - if (interact) { - if (*x > sw) - *x = sw - WIDTH(c); - if (*y > sh) - *y = sh - HEIGHT(c); - if (*x + *w + 2 * c->bw < 0) - *x = 0; - if (*y + *h + 2 * c->bw < 0) - *y = 0; - } else { - if (*x >= m->wx + m->ww) - *x = m->wx + m->ww - WIDTH(c); - if (*y >= m->wy + m->wh) - *y = m->wy + m->wh - HEIGHT(c); - if (*x + *w + 2 * c->bw <= m->wx) - *x = m->wx; - if (*y + *h + 2 * c->bw <= m->wy) - *y = m->wy; - } - if (*h < bh) - *h = bh; - if (*w < bh) - *w = bh; - if (resizehints || c->isfloating || !c->mon->lt[c->mon->sellt]->arrange) { - /* see last two sentences in ICCCM 4.1.2.3 */ - baseismin = c->basew == c->minw && c->baseh == c->minh; - if (!baseismin) { /* temporarily remove base dimensions */ - *w -= c->basew; - *h -= c->baseh; - } - /* adjust for aspect limits */ - if (c->mina > 0 && c->maxa > 0) { - if (c->maxa < (float)*w / *h) - *w = *h * c->maxa + 0.5; - else if (c->mina < (float)*h / *w) - *h = *w * c->mina + 0.5; - } - if (baseismin) { /* increment calculation requires this */ - *w -= c->basew; - *h -= c->baseh; - } - /* adjust for increment value */ - if (c->incw) - *w -= *w % c->incw; - if (c->inch) - *h -= *h % c->inch; - /* restore base dimensions */ - *w = MAX(*w + c->basew, c->minw); - *h = MAX(*h + c->baseh, c->minh); - if (c->maxw) - *w = MIN(*w, c->maxw); - if (c->maxh) - *h = MIN(*h, c->maxh); - } - return *x != c->x || *y != c->y || *w != c->w || *h != c->h; -} - -void -arrange(Monitor *m) -{ - if (m) - showhide(m->stack); - else for (m = mons; m; m = m->next) - showhide(m->stack); - if (m) { - arrangemon(m); - restack(m); - } else for (m = mons; m; m = m->next) - arrangemon(m); -} - -void -arrangemon(Monitor *m) -{ - strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof m->ltsymbol); - if (m->lt[m->sellt]->arrange) - m->lt[m->sellt]->arrange(m); -} - -void -attach(Client *c) -{ - c->next = c->mon->clients; - c->mon->clients = c; -} - -void -attachstack(Client *c) -{ - c->snext = c->mon->stack; - c->mon->stack = c; -} - -void -buttonpress(XEvent *e) -{ - unsigned int i, x, click; - Arg arg = {0}; - Client *c; - Monitor *m; - XButtonPressedEvent *ev = &e->xbutton; - - click = ClkRootWin; - /* focus monitor if necessary */ - if ((m = wintomon(ev->window)) && m != selmon) { - unfocus(selmon->sel, 1); - selmon = m; - focus(NULL); - } - if (ev->window == selmon->barwin) { - i = x = 0; - do - x += TEXTW(tags[i]); - while (ev->x >= x && ++i < LENGTH(tags)); - if (i < LENGTH(tags)) { - click = ClkTagBar; - arg.ui = 1 << i; - } else if (ev->x < x + blw) - click = ClkLtSymbol; - else if (ev->x > selmon->ww - (int)TEXTW(stext)) - click = ClkStatusText; - else - click = ClkWinTitle; - } else if ((c = wintoclient(ev->window))) { - focus(c); - restack(selmon); - XAllowEvents(dpy, ReplayPointer, CurrentTime); - click = ClkClientWin; - } - 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); -} - -void -checkotherwm(void) -{ - xerrorxlib = XSetErrorHandler(xerrorstart); - /* this causes an error if some other window manager is running */ - XSelectInput(dpy, DefaultRootWindow(dpy), SubstructureRedirectMask); - XSync(dpy, False); - XSetErrorHandler(xerror); - XSync(dpy, False); -} - -void -cleanup(void) -{ - Arg a = {.ui = ~0}; - Layout foo = { "", NULL }; - Monitor *m; - size_t i; - - view(&a); - selmon->lt[selmon->sellt] = &foo; - for (m = mons; m; m = m->next) - while (m->stack) - unmanage(m->stack, 0); - XUngrabKey(dpy, AnyKey, AnyModifier, root); - while (mons) - cleanupmon(mons); - for (i = 0; i < CurLast; i++) - drw_cur_free(drw, cursor[i]); - for (i = 0; i < LENGTH(colors); i++) - free(scheme[i]); - XDestroyWindow(dpy, wmcheckwin); - drw_free(drw); - XSync(dpy, False); - XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime); - XDeleteProperty(dpy, root, netatom[NetActiveWindow]); -} - -void -cleanupmon(Monitor *mon) -{ - Monitor *m; - - if (mon == mons) - mons = mons->next; - else { - for (m = mons; m && m->next != mon; m = m->next); - m->next = mon->next; - } - XUnmapWindow(dpy, mon->barwin); - XDestroyWindow(dpy, mon->barwin); - free(mon); -} - -void -clientmessage(XEvent *e) -{ - XClientMessageEvent *cme = &e->xclient; - Client *c = wintoclient(cme->window); - - if (!c) - return; - if (cme->message_type == netatom[NetWMState]) { - if (cme->data.l[1] == netatom[NetWMFullscreen] - || cme->data.l[2] == netatom[NetWMFullscreen]) - setfullscreen(c, (cme->data.l[0] == 1 /* _NET_WM_STATE_ADD */ - || (cme->data.l[0] == 2 /* _NET_WM_STATE_TOGGLE */ && !c->isfullscreen))); - } else if (cme->message_type == netatom[NetActiveWindow]) { - if (c != selmon->sel && !c->isurgent) - seturgent(c, 1); - } -} - -void -configure(Client *c) -{ - XConfigureEvent ce; - - ce.type = ConfigureNotify; - ce.display = dpy; - ce.event = c->win; - ce.window = c->win; - ce.x = c->x; - ce.y = c->y; - ce.width = c->w; - ce.height = c->h; - ce.border_width = c->bw; - ce.above = None; - ce.override_redirect = False; - XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&ce); -} - -void -configurenotify(XEvent *e) -{ - Monitor *m; - Client *c; - XConfigureEvent *ev = &e->xconfigure; - int dirty; - - /* TODO: updategeom handling sucks, needs to be simplified */ - if (ev->window == root) { - dirty = (sw != ev->width || sh != ev->height); - sw = ev->width; - sh = ev->height; - if (updategeom() || dirty) { - drw_resize(drw, sw, bh); - updatebars(); - for (m = mons; m; m = m->next) { - for (c = m->clients; c; c = c->next) - if (c->isfullscreen) - resizeclient(c, m->mx, m->my, m->mw, m->mh); - XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh); - } - focus(NULL); - arrange(NULL); - } - } -} - -void -configurerequest(XEvent *e) -{ - Client *c; - Monitor *m; - XConfigureRequestEvent *ev = &e->xconfigurerequest; - XWindowChanges wc; - - if ((c = wintoclient(ev->window))) { - if (ev->value_mask & CWBorderWidth) - 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 (ev->value_mask & CWWidth) { - c->oldw = c->w; - c->w = ev->width; - } - if (ev->value_mask & CWHeight) { - c->oldh = c->h; - c->h = ev->height; - } - if ((c->x + c->w) > m->mx + m->mw && c->isfloating) - c->x = m->mx + (m->mw / 2 - WIDTH(c) / 2); /* center in x direction */ - if ((c->y + c->h) > m->my + m->mh && c->isfloating) - c->y = m->my + (m->mh / 2 - HEIGHT(c) / 2); /* center in y direction */ - if ((ev->value_mask & (CWX|CWY)) && !(ev->value_mask & (CWWidth|CWHeight))) - configure(c); - if (ISVISIBLE(c)) - XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); - } else - configure(c); - } else { - wc.x = ev->x; - wc.y = ev->y; - wc.width = ev->width; - wc.height = ev->height; - wc.border_width = ev->border_width; - wc.sibling = ev->above; - wc.stack_mode = ev->detail; - XConfigureWindow(dpy, ev->window, ev->value_mask, &wc); - } - XSync(dpy, False); -} - -Monitor * -createmon(void) -{ - Monitor *m; - - m = ecalloc(1, sizeof(Monitor)); - m->tagset[0] = m->tagset[1] = 1; - m->mfact = mfact; - m->nmaster = nmaster; - m->showbar = showbar; - m->topbar = topbar; - m->lt[0] = &layouts[0]; - m->lt[1] = &layouts[1 % LENGTH(layouts)]; - strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); - return m; -} - -void -destroynotify(XEvent *e) -{ - Client *c; - XDestroyWindowEvent *ev = &e->xdestroywindow; - - if ((c = wintoclient(ev->window))) - unmanage(c, 1); -} - -void -detach(Client *c) -{ - Client **tc; - - for (tc = &c->mon->clients; *tc && *tc != c; tc = &(*tc)->next); - *tc = c->next; -} - -void -detachstack(Client *c) -{ - Client **tc, *t; - - for (tc = &c->mon->stack; *tc && *tc != c; tc = &(*tc)->snext); - *tc = c->snext; - - if (c == c->mon->sel) { - for (t = c->mon->stack; t && !ISVISIBLE(t); t = t->snext); - c->mon->sel = t; - } -} - -Monitor * -dirtomon(int dir) -{ - Monitor *m = NULL; - - if (dir > 0) { - if (!(m = selmon->next)) - m = mons; - } else if (selmon == mons) - for (m = mons; m->next; m = m->next); - else - for (m = mons; m->next != selmon; m = m->next); - return m; -} - -void -drawbar(Monitor *m) -{ - int x, w, tw = 0; - int boxs = drw->fonts->h / 9; - int boxw = drw->fonts->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); - } - - for (c = m->clients; c; c = c->next) { - occ |= c->tags; - if (c->isurgent) - urg |= c->tags; - } - x = 0; - 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); - 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); - drw_setscheme(drw, scheme[SchemeNorm]); - 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 { - drw_setscheme(drw, scheme[SchemeNorm]); - drw_rect(drw, x, 0, w, bh, 1, 1); - } - } - drw_map(drw, m->barwin, 0, 0, m->ww, bh); -} - -void -drawbars(void) -{ - Monitor *m; - - for (m = mons; m; m = m->next) - drawbar(m); -} - -void -enternotify(XEvent *e) -{ - Client *c; - Monitor *m; - XCrossingEvent *ev = &e->xcrossing; - - if ((ev->mode != NotifyNormal || ev->detail == NotifyInferior) && ev->window != root) - return; - c = wintoclient(ev->window); - m = c ? c->mon : wintomon(ev->window); - if (m != selmon) { - unfocus(selmon->sel, 1); - selmon = m; - } else if (!c || c == selmon->sel) - return; - focus(c); -} - -void -expose(XEvent *e) -{ - Monitor *m; - XExposeEvent *ev = &e->xexpose; - - if (ev->count == 0 && (m = wintomon(ev->window))) - drawbar(m); -} - -void -focus(Client *c) -{ - if (!c || !ISVISIBLE(c)) - for (c = selmon->stack; c && !ISVISIBLE(c); c = c->snext); - if (selmon->sel && selmon->sel != c) - unfocus(selmon->sel, 0); - if (c) { - if (c->mon != selmon) - 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); - } else { - XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); - XDeleteProperty(dpy, root, netatom[NetActiveWindow]); - } - selmon->sel = c; - drawbars(); -} - -/* there are some broken focus acquiring clients needing extra handling */ -void -focusin(XEvent *e) -{ - XFocusChangeEvent *ev = &e->xfocus; - - if (selmon->sel && ev->window != selmon->sel->win) - setfocus(selmon->sel); -} - -void -focusmon(const Arg *arg) -{ - Monitor *m; - - if (!mons->next) - return; - if ((m = dirtomon(arg->i)) == selmon) - return; - unfocus(selmon->sel, 0); - selmon = m; - focus(NULL); -} - -void -focusstack(const Arg *arg) -{ - Client *c = NULL, *i; - - if (!selmon->sel) - return; - if (arg->i > 0) { - for (c = selmon->sel->next; c && !ISVISIBLE(c); c = c->next); - if (!c) - for (c = selmon->clients; c && !ISVISIBLE(c); c = c->next); - } else { - for (i = selmon->clients; i != selmon->sel; i = i->next) - if (ISVISIBLE(i)) - c = i; - if (!c) - for (; i; i = i->next) - if (ISVISIBLE(i)) - c = i; - } - if (c) { - focus(c); - restack(selmon); - } -} - -Atom -getatomprop(Client *c, Atom prop) -{ - int di; - unsigned long dl; - unsigned char *p = NULL; - Atom da, atom = None; - - if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, XA_ATOM, - &da, &di, &dl, &dl, &p) == Success && p) { - atom = *(Atom *)p; - XFree(p); - } - return atom; -} - -int -getrootptr(int *x, int *y) -{ - int di; - unsigned int dui; - Window dummy; - - return XQueryPointer(dpy, root, &dummy, &dummy, x, y, &di, &di, &dui); -} - -long -getstate(Window w) -{ - int format; - long result = -1; - unsigned char *p = NULL; - unsigned long n, extra; - Atom real; - - if (XGetWindowProperty(dpy, w, wmatom[WMState], 0L, 2L, False, wmatom[WMState], - &real, &format, &n, &extra, (unsigned char **)&p) != Success) - return -1; - if (n != 0) - result = *p; - XFree(p); - return result; -} - -int -gettextprop(Window w, Atom atom, char *text, unsigned int size) -{ - char **list = NULL; - int n; - XTextProperty name; - - if (!text || size == 0) - return 0; - text[0] = '\0'; - if (!XGetTextProperty(dpy, w, &name, atom) || !name.nitems) - return 0; - if (name.encoding == XA_STRING) - strncpy(text, (char *)name.value, size - 1); - else { - if (XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success && n > 0 && *list) { - strncpy(text, *list, size - 1); - XFreeStringList(list); - } - } - text[size - 1] = '\0'; - XFree(name.value); - return 1; -} - -void -grabbuttons(Client *c, int focused) -{ - updatenumlockmask(); - { - unsigned int i, j; - unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; - XUngrabButton(dpy, AnyButton, AnyModifier, c->win); - if (!focused) - XGrabButton(dpy, AnyButton, AnyModifier, c->win, False, - BUTTONMASK, GrabModeSync, GrabModeSync, None, None); - for (i = 0; i < LENGTH(buttons); i++) - if (buttons[i].click == ClkClientWin) - for (j = 0; j < LENGTH(modifiers); j++) - XGrabButton(dpy, buttons[i].button, - buttons[i].mask | modifiers[j], - c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - } -} - -void -grabkeys(void) -{ - updatenumlockmask(); - { - unsigned int i, j; - unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; - KeyCode code; - - XUngrabKey(dpy, AnyKey, AnyModifier, root); - for (i = 0; i < LENGTH(keys); i++) - if ((code = XKeysymToKeycode(dpy, keys[i].keysym))) - for (j = 0; j < LENGTH(modifiers); j++) - XGrabKey(dpy, code, keys[i].mod | modifiers[j], root, - True, GrabModeAsync, GrabModeAsync); - } -} - -void -incnmaster(const Arg *arg) -{ - selmon->nmaster = MAX(selmon->nmaster + arg->i, 0); - arrange(selmon); -} - -#ifdef XINERAMA -static int -isuniquegeom(XineramaScreenInfo *unique, size_t n, XineramaScreenInfo *info) -{ - while (n--) - if (unique[n].x_org == info->x_org && unique[n].y_org == info->y_org - && unique[n].width == info->width && unique[n].height == info->height) - return 0; - return 1; -} -#endif /* XINERAMA */ - -void -keypress(XEvent *e) -{ - unsigned int i; - KeySym keysym; - XKeyEvent *ev; - - ev = &e->xkey; - keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); - for (i = 0; i < LENGTH(keys); i++) - if (keysym == keys[i].keysym - && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state) - && keys[i].func) - keys[i].func(&(keys[i].arg)); -} - -void -killclient(const Arg *arg) -{ - if (!selmon->sel) - return; - if (!sendevent(selmon->sel, wmatom[WMDelete])) { - XGrabServer(dpy); - XSetErrorHandler(xerrordummy); - XSetCloseDownMode(dpy, DestroyAll); - XKillClient(dpy, selmon->sel->win); - XSync(dpy, False); - XSetErrorHandler(xerror); - XUngrabServer(dpy); - } -} - -void -manage(Window w, XWindowAttributes *wa) -{ - Client *c, *t = NULL; - Window trans = None; - XWindowChanges wc; - - c = ecalloc(1, sizeof(Client)); - c->win = w; - /* geometry */ - c->x = c->oldx = wa->x; - c->y = c->oldy = wa->y; - c->w = c->oldw = wa->width; - c->h = c->oldh = wa->height; - c->oldbw = wa->border_width; - - updatetitle(c); - if (XGetTransientForHint(dpy, w, &trans) && (t = wintoclient(trans))) { - c->mon = t->mon; - c->tags = t->tags; - } else { - c->mon = selmon; - applyrules(c); - } - - if (c->x + WIDTH(c) > c->mon->mx + c->mon->mw) - c->x = c->mon->mx + c->mon->mw - WIDTH(c); - if (c->y + HEIGHT(c) > c->mon->my + c->mon->mh) - c->y = c->mon->my + c->mon->mh - HEIGHT(c); - c->x = MAX(c->x, c->mon->mx); - /* only fix client y-offset, if the client center might cover the bar */ - 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; - - wc.border_width = c->bw; - XConfigureWindow(dpy, w, CWBorderWidth, &wc); - XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColBorder].pixel); - configure(c); /* propagates border_width, if size doesn't change */ - updatewindowtype(c); - updatesizehints(c); - updatewmhints(c); - XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask); - grabbuttons(c, 0); - if (!c->isfloating) - c->isfloating = c->oldstate = trans != None || c->isfixed; - if (c->isfloating) - XRaiseWindow(dpy, c->win); - attach(c); - attachstack(c); - 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 (c->mon == selmon) - unfocus(selmon->sel, 0); - c->mon->sel = c; - arrange(c->mon); - XMapWindow(dpy, c->win); - focus(NULL); -} - -void -mappingnotify(XEvent *e) -{ - XMappingEvent *ev = &e->xmapping; - - XRefreshKeyboardMapping(ev); - if (ev->request == MappingKeyboard) - grabkeys(); -} - -void -maprequest(XEvent *e) -{ - static XWindowAttributes wa; - XMapRequestEvent *ev = &e->xmaprequest; - - if (!XGetWindowAttributes(dpy, ev->window, &wa)) - return; - if (wa.override_redirect) - return; - if (!wintoclient(ev->window)) - manage(ev->window, &wa); -} - -void -monocle(Monitor *m) -{ - unsigned int n = 0; - Client *c; - - for (c = m->clients; c; c = c->next) - if (ISVISIBLE(c)) - n++; - if (n > 0) /* override layout symbol */ - snprintf(m->ltsymbol, sizeof m->ltsymbol, "[%d]", n); - for (c = nexttiled(m->clients); c; c = nexttiled(c->next)) - resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0); -} - -void -motionnotify(XEvent *e) -{ - static Monitor *mon = NULL; - Monitor *m; - XMotionEvent *ev = &e->xmotion; - - if (ev->window != root) - return; - if ((m = recttomon(ev->x_root, ev->y_root, 1, 1)) != mon && mon) { - unfocus(selmon->sel, 1); - selmon = m; - focus(NULL); - } - mon = m; -} - -void -movemouse(const Arg *arg) -{ - int x, y, ocx, ocy, nx, ny; - Client *c; - Monitor *m; - XEvent ev; - Time lasttime = 0; - - if (!(c = selmon->sel)) - return; - if (c->isfullscreen) /* no support moving fullscreen windows by mouse */ - return; - restack(selmon); - ocx = c->x; - ocy = c->y; - if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, - None, cursor[CurMove]->cursor, CurrentTime) != GrabSuccess) - return; - if (!getrootptr(&x, &y)) - return; - do { - XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); - switch(ev.type) { - case ConfigureRequest: - case Expose: - case MapRequest: - handler[ev.type](&ev); - break; - case MotionNotify: - if ((ev.xmotion.time - lasttime) <= (1000 / 60)) - continue; - lasttime = ev.xmotion.time; - - nx = ocx + (ev.xmotion.x - x); - ny = ocy + (ev.xmotion.y - y); - if (abs(selmon->wx - nx) < snap) - nx = selmon->wx; - else if (abs((selmon->wx + selmon->ww) - (nx + WIDTH(c))) < snap) - nx = selmon->wx + selmon->ww - WIDTH(c); - if (abs(selmon->wy - ny) < snap) - ny = selmon->wy; - else if (abs((selmon->wy + selmon->wh) - (ny + HEIGHT(c))) < snap) - ny = selmon->wy + selmon->wh - HEIGHT(c); - if (!c->isfloating && selmon->lt[selmon->sellt]->arrange - && (abs(nx - c->x) > snap || abs(ny - c->y) > snap)) - togglefloating(NULL); - if (!selmon->lt[selmon->sellt]->arrange || c->isfloating) - resize(c, nx, ny, c->w, c->h, 1); - break; - } - } while (ev.type != ButtonRelease); - XUngrabPointer(dpy, CurrentTime); - if ((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) { - sendmon(c, m); - selmon = m; - focus(NULL); - } -} - -Client * -nexttiled(Client *c) -{ - for (; c && (c->isfloating || !ISVISIBLE(c)); c = c->next); - return c; -} - -void -pop(Client *c) -{ - detach(c); - attach(c); - focus(c); - arrange(c->mon); -} - -void -propertynotify(XEvent *e) -{ - Client *c; - Window trans; - XPropertyEvent *ev = &e->xproperty; - - if ((ev->window == root) && (ev->atom == XA_WM_NAME)) - updatestatus(); - else if (ev->state == PropertyDelete) - return; /* ignore */ - else if ((c = wintoclient(ev->window))) { - switch(ev->atom) { - default: break; - case XA_WM_TRANSIENT_FOR: - if (!c->isfloating && (XGetTransientForHint(dpy, c->win, &trans)) && - (c->isfloating = (wintoclient(trans)) != NULL)) - arrange(c->mon); - break; - case XA_WM_NORMAL_HINTS: - updatesizehints(c); - break; - case XA_WM_HINTS: - updatewmhints(c); - drawbars(); - break; - } - 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); - } -} - -void -quit(const Arg *arg) -{ - running = 0; -} - -Monitor * -recttomon(int x, int y, int w, int h) -{ - Monitor *m, *r = selmon; - int a, area = 0; - - for (m = mons; m; m = m->next) - if ((a = INTERSECT(x, y, w, h, m)) > area) { - area = a; - r = m; - } - return r; -} - -void -resize(Client *c, int x, int y, int w, int h, int interact) -{ - if (applysizehints(c, &x, &y, &w, &h, interact)) - resizeclient(c, x, y, w, h); -} - -void -resizeclient(Client *c, int x, int y, int w, int h) -{ - XWindowChanges wc; - - 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; - XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); - configure(c); - XSync(dpy, False); -} - -void -resizemouse(const Arg *arg) -{ - int ocx, ocy, nw, nh; - Client *c; - Monitor *m; - XEvent ev; - Time lasttime = 0; - - if (!(c = selmon->sel)) - return; - if (c->isfullscreen) /* no support resizing fullscreen windows by mouse */ - return; - restack(selmon); - ocx = c->x; - ocy = c->y; - if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, - None, cursor[CurResize]->cursor, CurrentTime) != GrabSuccess) - return; - XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); - do { - XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); - switch(ev.type) { - case ConfigureRequest: - case Expose: - case MapRequest: - handler[ev.type](&ev); - break; - case MotionNotify: - if ((ev.xmotion.time - lasttime) <= (1000 / 60)) - continue; - lasttime = ev.xmotion.time; - - nw = MAX(ev.xmotion.x - ocx - 2 * c->bw + 1, 1); - nh = MAX(ev.xmotion.y - ocy - 2 * c->bw + 1, 1); - if (c->mon->wx + nw >= selmon->wx && c->mon->wx + nw <= selmon->wx + selmon->ww - && c->mon->wy + nh >= selmon->wy && c->mon->wy + nh <= selmon->wy + selmon->wh) - { - if (!c->isfloating && selmon->lt[selmon->sellt]->arrange - && (abs(nw - c->w) > snap || abs(nh - c->h) > snap)) - togglefloating(NULL); - } - if (!selmon->lt[selmon->sellt]->arrange || c->isfloating) - resize(c, c->x, c->y, nw, nh, 1); - break; - } - } while (ev.type != ButtonRelease); - XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); - XUngrabPointer(dpy, CurrentTime); - while (XCheckMaskEvent(dpy, EnterWindowMask, &ev)); - if ((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) { - sendmon(c, m); - selmon = m; - focus(NULL); - } -} - -void -restack(Monitor *m) -{ - Client *c; - XEvent ev; - XWindowChanges wc; - - drawbar(m); - if (!m->sel) - return; - if (m->sel->isfloating || !m->lt[m->sellt]->arrange) - XRaiseWindow(dpy, m->sel->win); - if (m->lt[m->sellt]->arrange) { - wc.stack_mode = Below; - wc.sibling = m->barwin; - for (c = m->stack; c; c = c->snext) - if (!c->isfloating && ISVISIBLE(c)) { - XConfigureWindow(dpy, c->win, CWSibling|CWStackMode, &wc); - wc.sibling = c->win; - } - } - XSync(dpy, False); - while (XCheckMaskEvent(dpy, EnterWindowMask, &ev)); -} - -void -run(void) -{ - XEvent ev; - /* main event loop */ - XSync(dpy, False); - while (running && !XNextEvent(dpy, &ev)) - if (handler[ev.type]) - handler[ev.type](&ev); /* call handler */ -} - -void -scan(void) -{ - unsigned int i, num; - Window d1, d2, *wins = NULL; - XWindowAttributes wa; - - if (XQueryTree(dpy, root, &d1, &d2, &wins, &num)) { - for (i = 0; i < num; i++) { - if (!XGetWindowAttributes(dpy, wins[i], &wa) - || wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1)) - continue; - if (wa.map_state == IsViewable || getstate(wins[i]) == IconicState) - manage(wins[i], &wa); - } - for (i = 0; i < num; i++) { /* now the transients */ - if (!XGetWindowAttributes(dpy, wins[i], &wa)) - continue; - if (XGetTransientForHint(dpy, wins[i], &d1) - && (wa.map_state == IsViewable || getstate(wins[i]) == IconicState)) - manage(wins[i], &wa); - } - if (wins) - XFree(wins); - } -} - -void -sendmon(Client *c, Monitor *m) -{ - if (c->mon == m) - return; - unfocus(c, 1); - detach(c); - detachstack(c); - c->mon = m; - c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */ - attach(c); - attachstack(c); - focus(NULL); - arrange(NULL); -} - -void -setclientstate(Client *c, long state) -{ - long data[] = { state, None }; - - XChangeProperty(dpy, c->win, wmatom[WMState], wmatom[WMState], 32, - PropModeReplace, (unsigned char *)data, 2); -} - -int -sendevent(Client *c, Atom proto) -{ - int n; - Atom *protocols; - int exists = 0; - XEvent ev; - - if (XGetWMProtocols(dpy, c->win, &protocols, &n)) { - while (!exists && n--) - exists = protocols[n] == proto; - XFree(protocols); - } - if (exists) { - ev.type = ClientMessage; - ev.xclient.window = c->win; - ev.xclient.message_type = wmatom[WMProtocols]; - ev.xclient.format = 32; - ev.xclient.data.l[0] = proto; - ev.xclient.data.l[1] = CurrentTime; - XSendEvent(dpy, c->win, False, NoEventMask, &ev); - } - return exists; -} - -void -setfocus(Client *c) -{ - if (!c->neverfocus) { - XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); - XChangeProperty(dpy, root, netatom[NetActiveWindow], - XA_WINDOW, 32, PropModeReplace, - (unsigned char *) &(c->win), 1); - } - sendevent(c, wmatom[WMTakeFocus]); -} - -void -setfullscreen(Client *c, int fullscreen) -{ - if (fullscreen && !c->isfullscreen) { - XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, - PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1); - c->isfullscreen = 1; - c->oldstate = c->isfloating; - c->oldbw = c->bw; - c->bw = 0; - c->isfloating = 1; - resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh); - XRaiseWindow(dpy, c->win); - } else if (!fullscreen && c->isfullscreen){ - XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, - PropModeReplace, (unsigned char*)0, 0); - c->isfullscreen = 0; - c->isfloating = c->oldstate; - c->bw = c->oldbw; - c->x = c->oldx; - c->y = c->oldy; - c->w = c->oldw; - c->h = c->oldh; - resizeclient(c, c->x, c->y, c->w, c->h); - arrange(c->mon); - } -} - -void -setlayout(const Arg *arg) -{ - if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) - selmon->sellt ^= 1; - if (arg && arg->v) - selmon->lt[selmon->sellt] = (Layout *)arg->v; - strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol); - if (selmon->sel) - arrange(selmon); - else - drawbar(selmon); -} - -/* arg > 1.0 will set mfact absolutely */ -void -setmfact(const Arg *arg) -{ - float f; - - if (!arg || !selmon->lt[selmon->sellt]->arrange) - return; - f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0; - if (f < 0.05 || f > 0.95) - return; - selmon->mfact = f; - arrange(selmon); -} - -void -setup(void) -{ - int i; - XSetWindowAttributes wa; - Atom utf8string; - - /* clean up any zombies immediately */ - sigchld(0); - - /* init screen */ - screen = DefaultScreen(dpy); - sw = DisplayWidth(dpy, screen); - sh = DisplayHeight(dpy, screen); - root = RootWindow(dpy, screen); - drw = drw_create(dpy, screen, root, sw, sh); - if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) - die("no fonts could be loaded."); - lrpad = drw->fonts->h; - bh = drw->fonts->h + 2; - updategeom(); - /* init atoms */ - utf8string = XInternAtom(dpy, "UTF8_STRING", False); - wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False); - wmatom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False); - wmatom[WMState] = XInternAtom(dpy, "WM_STATE", False); - wmatom[WMTakeFocus] = XInternAtom(dpy, "WM_TAKE_FOCUS", False); - netatom[NetActiveWindow] = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False); - netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); - netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", 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); - netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False); - netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False); - netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False); - /* init cursors */ - cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr); - cursor[CurResize] = drw_cur_create(drw, XC_sizing); - cursor[CurMove] = drw_cur_create(drw, XC_fleur); - /* init appearance */ - scheme = ecalloc(LENGTH(colors), sizeof(Clr *)); - for (i = 0; i < LENGTH(colors); i++) - scheme[i] = drw_scm_create(drw, colors[i], 3); - /* init bars */ - updatebars(); - updatestatus(); - /* supporting window for NetWMCheck */ - wmcheckwin = XCreateSimpleWindow(dpy, root, 0, 0, 1, 1, 0, 0, 0); - XChangeProperty(dpy, wmcheckwin, netatom[NetWMCheck], XA_WINDOW, 32, - PropModeReplace, (unsigned char *) &wmcheckwin, 1); - XChangeProperty(dpy, wmcheckwin, netatom[NetWMName], utf8string, 8, - PropModeReplace, (unsigned char *) "dwm", 3); - XChangeProperty(dpy, root, netatom[NetWMCheck], XA_WINDOW, 32, - PropModeReplace, (unsigned char *) &wmcheckwin, 1); - /* EWMH support per view */ - XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32, - PropModeReplace, (unsigned char *) netatom, NetLast); - XDeleteProperty(dpy, root, netatom[NetClientList]); - /* select events */ - wa.cursor = cursor[CurNormal]->cursor; - wa.event_mask = SubstructureRedirectMask|SubstructureNotifyMask - |ButtonPressMask|PointerMotionMask|EnterWindowMask - |LeaveWindowMask|StructureNotifyMask|PropertyChangeMask; - XChangeWindowAttributes(dpy, root, CWEventMask|CWCursor, &wa); - XSelectInput(dpy, root, wa.event_mask); - grabkeys(); - focus(NULL); -} - - -void -seturgent(Client *c, int urg) -{ - XWMHints *wmh; - - c->isurgent = urg; - if (!(wmh = XGetWMHints(dpy, c->win))) - return; - wmh->flags = urg ? (wmh->flags | XUrgencyHint) : (wmh->flags & ~XUrgencyHint); - XSetWMHints(dpy, c->win, wmh); - XFree(wmh); -} - -void -showhide(Client *c) -{ - if (!c) - return; - if (ISVISIBLE(c)) { - /* show clients top down */ - XMoveWindow(dpy, c->win, c->x, c->y); - if ((!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) && !c->isfullscreen) - resize(c, c->x, c->y, c->w, c->h, 0); - showhide(c->snext); - } else { - /* hide clients bottom up */ - showhide(c->snext); - XMoveWindow(dpy, c->win, WIDTH(c) * -2, c->y); - } -} - -void -sigchld(int unused) -{ - if (signal(SIGCHLD, sigchld) == SIG_ERR) - die("can't install SIGCHLD handler:"); - while (0 < waitpid(-1, NULL, WNOHANG)); -} - -void -spawn(const Arg *arg) -{ - if (arg->v == dmenucmd) - dmenumon[0] = '0' + selmon->num; - if (fork() == 0) { - if (dpy) - close(ConnectionNumber(dpy)); - setsid(); - execvp(((char **)arg->v)[0], (char **)arg->v); - fprintf(stderr, "dwm: execvp %s", ((char **)arg->v)[0]); - perror(" failed"); - exit(EXIT_SUCCESS); - } -} - -void -tag(const Arg *arg) -{ - if (selmon->sel && arg->ui & TAGMASK) { - selmon->sel->tags = arg->ui & TAGMASK; - focus(NULL); - arrange(selmon); - } -} - -void -tagmon(const Arg *arg) -{ - if (!selmon->sel || !mons->next) - return; - sendmon(selmon->sel, dirtomon(arg->i)); -} - -void -tile(Monitor *m) -{ - unsigned int i, n, h, mw, my, ty; - Client *c; - - for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); - if (n == 0) - return; - - if (n > m->nmaster) - mw = m->nmaster ? m->ww * m->mfact : 0; - else - mw = m->ww; - for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) - if (i < m->nmaster) { - h = (m->wh - my) / (MIN(n, m->nmaster) - i); - resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0); - if (my + HEIGHT(c) < m->wh) - my += HEIGHT(c); - } else { - h = (m->wh - ty) / (n - i); - resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), 0); - if (ty + HEIGHT(c) < m->wh) - ty += HEIGHT(c); - } -} - -void -togglebar(const Arg *arg) -{ - selmon->showbar = !selmon->showbar; - updatebarpos(selmon); - XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); - arrange(selmon); -} - -void -togglefloating(const Arg *arg) -{ - if (!selmon->sel) - return; - if (selmon->sel->isfullscreen) /* no support for fullscreen windows */ - return; - selmon->sel->isfloating = !selmon->sel->isfloating || selmon->sel->isfixed; - if (selmon->sel->isfloating) - resize(selmon->sel, selmon->sel->x, selmon->sel->y, - selmon->sel->w, selmon->sel->h, 0); - arrange(selmon); -} - -void -toggletag(const Arg *arg) -{ - unsigned int newtags; - - if (!selmon->sel) - return; - newtags = selmon->sel->tags ^ (arg->ui & TAGMASK); - if (newtags) { - selmon->sel->tags = newtags; - focus(NULL); - arrange(selmon); - } -} - -void -toggleview(const Arg *arg) -{ - unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK); - - if (newtagset) { - selmon->tagset[selmon->seltags] = newtagset; - focus(NULL); - arrange(selmon); - } -} - -void -unfocus(Client *c, int setfocus) -{ - if (!c) - return; - grabbuttons(c, 0); - XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel); - if (setfocus) { - XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); - XDeleteProperty(dpy, root, netatom[NetActiveWindow]); - } -} - -void -unmanage(Client *c, int destroyed) -{ - Monitor *m = c->mon; - XWindowChanges wc; - - detach(c); - detachstack(c); - if (!destroyed) { - wc.border_width = c->oldbw; - XGrabServer(dpy); /* avoid race conditions */ - XSetErrorHandler(xerrordummy); - XConfigureWindow(dpy, c->win, CWBorderWidth, &wc); /* restore border */ - XUngrabButton(dpy, AnyButton, AnyModifier, c->win); - setclientstate(c, WithdrawnState); - XSync(dpy, False); - XSetErrorHandler(xerror); - XUngrabServer(dpy); - } - free(c); - focus(NULL); - updateclientlist(); - arrange(m); -} - -void -unmapnotify(XEvent *e) -{ - Client *c; - XUnmapEvent *ev = &e->xunmap; - - if ((c = wintoclient(ev->window))) { - if (ev->send_event) - setclientstate(c, WithdrawnState); - else - unmanage(c, 0); - } -} - -void -updatebars(void) -{ - Monitor *m; - XSetWindowAttributes wa = { - .override_redirect = True, - .background_pixmap = ParentRelative, - .event_mask = ButtonPressMask|ExposureMask - }; - XClassHint ch = {"dwm", "dwm"}; - for (m = mons; m; m = m->next) { - if (m->barwin) - continue; - m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen), - CopyFromParent, DefaultVisual(dpy, screen), - CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); - XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); - XMapRaised(dpy, m->barwin); - XSetClassHint(dpy, m->barwin, &ch); - } -} - -void -updatebarpos(Monitor *m) -{ - m->wy = m->my; - m->wh = m->mh; - if (m->showbar) { - m->wh -= bh; - m->by = m->topbar ? m->wy : m->wy + m->wh; - m->wy = m->topbar ? m->wy + bh : m->wy; - } else - m->by = -bh; -} - -void -updateclientlist() -{ - Client *c; - Monitor *m; - - XDeleteProperty(dpy, root, netatom[NetClientList]); - for (m = mons; m; m = m->next) - for (c = m->clients; c; c = c->next) - XChangeProperty(dpy, root, netatom[NetClientList], - XA_WINDOW, 32, PropModeAppend, - (unsigned char *) &(c->win), 1); -} - -int -updategeom(void) -{ - int dirty = 0; - -#ifdef XINERAMA - if (XineramaIsActive(dpy)) { - int i, j, n, nn; - Client *c; - Monitor *m; - XineramaScreenInfo *info = XineramaQueryScreens(dpy, &nn); - XineramaScreenInfo *unique = NULL; - - for (n = 0, m = mons; m; m = m->next, n++); - /* only consider unique geometries as separate screens */ - unique = ecalloc(nn, sizeof(XineramaScreenInfo)); - for (i = 0, j = 0; i < nn; i++) - if (isuniquegeom(unique, j, &info[i])) - memcpy(&unique[j++], &info[i], sizeof(XineramaScreenInfo)); - XFree(info); - nn = j; - if (n <= nn) { /* new monitors available */ - for (i = 0; i < (nn - n); i++) { - for (m = mons; m && m->next; m = m->next); - if (m) - m->next = createmon(); - else - mons = createmon(); - } - for (i = 0, m = mons; i < nn && m; m = m->next, i++) - if (i >= n - || unique[i].x_org != m->mx || unique[i].y_org != m->my - || unique[i].width != m->mw || unique[i].height != m->mh) - { - dirty = 1; - m->num = i; - m->mx = m->wx = unique[i].x_org; - m->my = m->wy = unique[i].y_org; - m->mw = m->ww = unique[i].width; - m->mh = m->wh = unique[i].height; - updatebarpos(m); - } - } else { /* less monitors available nn < n */ - for (i = nn; i < n; i++) { - for (m = mons; m && m->next; m = m->next); - while ((c = m->clients)) { - dirty = 1; - m->clients = c->next; - detachstack(c); - c->mon = mons; - attach(c); - attachstack(c); - } - if (m == selmon) - selmon = mons; - cleanupmon(m); - } - } - free(unique); - } else -#endif /* XINERAMA */ - { /* default monitor setup */ - if (!mons) - mons = createmon(); - if (mons->mw != sw || mons->mh != sh) { - dirty = 1; - mons->mw = mons->ww = sw; - mons->mh = mons->wh = sh; - updatebarpos(mons); - } - } - if (dirty) { - selmon = mons; - selmon = wintomon(root); - } - return dirty; -} - -void -updatenumlockmask(void) -{ - unsigned int i, j; - XModifierKeymap *modmap; - - numlockmask = 0; - modmap = XGetModifierMapping(dpy); - for (i = 0; i < 8; i++) - for (j = 0; j < modmap->max_keypermod; j++) - if (modmap->modifiermap[i * modmap->max_keypermod + j] - == XKeysymToKeycode(dpy, XK_Num_Lock)) - numlockmask = (1 << i); - XFreeModifiermap(modmap); -} - -void -updatesizehints(Client *c) -{ - long msize; - XSizeHints size; - - if (!XGetWMNormalHints(dpy, c->win, &size, &msize)) - /* size is uninitialized, ensure that size.flags aren't used */ - size.flags = PSize; - if (size.flags & PBaseSize) { - c->basew = size.base_width; - c->baseh = size.base_height; - } else if (size.flags & PMinSize) { - c->basew = size.min_width; - c->baseh = size.min_height; - } else - c->basew = c->baseh = 0; - if (size.flags & PResizeInc) { - c->incw = size.width_inc; - c->inch = size.height_inc; - } else - c->incw = c->inch = 0; - if (size.flags & PMaxSize) { - c->maxw = size.max_width; - c->maxh = size.max_height; - } else - c->maxw = c->maxh = 0; - if (size.flags & PMinSize) { - c->minw = size.min_width; - c->minh = size.min_height; - } else if (size.flags & PBaseSize) { - c->minw = size.base_width; - c->minh = size.base_height; - } else - c->minw = c->minh = 0; - if (size.flags & PAspect) { - c->mina = (float)size.min_aspect.y / size.min_aspect.x; - c->maxa = (float)size.max_aspect.x / size.max_aspect.y; - } else - c->maxa = c->mina = 0.0; - c->isfixed = (c->maxw && c->maxh && c->maxw == c->minw && c->maxh == c->minh); -} - -void -updatestatus(void) -{ - if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) - strcpy(stext, "dwm-"VERSION); - drawbar(selmon); -} - -void -updatetitle(Client *c) -{ - if (!gettextprop(c->win, netatom[NetWMName], c->name, sizeof c->name)) - gettextprop(c->win, XA_WM_NAME, c->name, sizeof c->name); - if (c->name[0] == '\0') /* hack to mark broken clients */ - strcpy(c->name, broken); -} - -void -updatewindowtype(Client *c) -{ - Atom state = getatomprop(c, netatom[NetWMState]); - Atom wtype = getatomprop(c, netatom[NetWMWindowType]); - - if (state == netatom[NetWMFullscreen]) - setfullscreen(c, 1); - if (wtype == netatom[NetWMWindowTypeDialog]) - c->isfloating = 1; -} - -void -updatewmhints(Client *c) -{ - XWMHints *wmh; - - if ((wmh = XGetWMHints(dpy, c->win))) { - if (c == selmon->sel && wmh->flags & XUrgencyHint) { - wmh->flags &= ~XUrgencyHint; - XSetWMHints(dpy, c->win, wmh); - } else - c->isurgent = (wmh->flags & XUrgencyHint) ? 1 : 0; - if (wmh->flags & InputHint) - c->neverfocus = !wmh->input; - else - c->neverfocus = 0; - XFree(wmh); - } -} - -void -view(const Arg *arg) -{ - if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) - return; - selmon->seltags ^= 1; /* toggle sel tagset */ - if (arg->ui & TAGMASK) - selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; - focus(NULL); - arrange(selmon); -} - -Client * -wintoclient(Window w) -{ - Client *c; - Monitor *m; - - for (m = mons; m; m = m->next) - for (c = m->clients; c; c = c->next) - if (c->win == w) - return c; - return NULL; -} - -Monitor * -wintomon(Window w) -{ - int x, y; - Client *c; - Monitor *m; - - if (w == root && getrootptr(&x, &y)) - return recttomon(x, y, 1, 1); - for (m = mons; m; m = m->next) - if (w == m->barwin) - return m; - if ((c = wintoclient(w))) - return c->mon; - return selmon; -} - -/* There's no way to check accesses to destroyed windows, thus those cases are - * ignored (especially on UnmapNotify's). Other types of errors call Xlibs - * default error handler, which may call exit. */ -int -xerror(Display *dpy, XErrorEvent *ee) -{ - if (ee->error_code == BadWindow - || (ee->request_code == X_SetInputFocus && ee->error_code == BadMatch) - || (ee->request_code == X_PolyText8 && ee->error_code == BadDrawable) - || (ee->request_code == X_PolyFillRectangle && ee->error_code == BadDrawable) - || (ee->request_code == X_PolySegment && ee->error_code == BadDrawable) - || (ee->request_code == X_ConfigureWindow && ee->error_code == BadMatch) - || (ee->request_code == X_GrabButton && ee->error_code == BadAccess) - || (ee->request_code == X_GrabKey && ee->error_code == BadAccess) - || (ee->request_code == X_CopyArea && ee->error_code == BadDrawable)) - return 0; - fprintf(stderr, "dwm: fatal error: request code=%d, error code=%d\n", - ee->request_code, ee->error_code); - return xerrorxlib(dpy, ee); /* may call exit */ -} - -int -xerrordummy(Display *dpy, XErrorEvent *ee) -{ - return 0; -} - -/* Startup Error handler to check if another window manager - * is already running. */ -int -xerrorstart(Display *dpy, XErrorEvent *ee) -{ - die("dwm: another window manager is already running"); - return -1; -} - -void -zoom(const Arg *arg) -{ - Client *c = selmon->sel; - - if (!selmon->lt[selmon->sellt]->arrange - || (selmon->sel && selmon->sel->isfloating)) - return; - if (c == nexttiled(selmon->clients)) - if (!c || !(c = nexttiled(c->next))) - return; - pop(c); -} - -int -main(int argc, char *argv[]) -{ - if (argc == 2 && !strcmp("-v", argv[1])) - die("dwm-"VERSION); - else if (argc != 1) - die("usage: dwm [-v]"); - if (!setlocale(LC_CTYPE, "") || !XSupportsLocale()) - fputs("warning: no locale support\n", stderr); - if (!(dpy = XOpenDisplay(NULL))) - die("dwm: cannot open display"); - checkotherwm(); - setup(); -#ifdef __OpenBSD__ - if (pledge("stdio rpath proc exec", NULL) == -1) - die("pledge"); -#endif /* __OpenBSD__ */ - scan(); - run(); - cleanup(); - XCloseDisplay(dpy); - return EXIT_SUCCESS; -} diff --git a/dwm.o b/dwm.o index 0aefdd0e0467e2698fb58bfd4e667caba52e4120..8f612b0d492eda3b0b061fbf44624f5e9acc4c3f 100644 GIT binary patch literal 60904 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 C4b}nx literal 59256 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 diff --git a/patches/dwm-alpha-20180613-b69c870.diff b/patches/dwm-alpha-20180613-b69c870.diff new file mode 100644 index 0000000..558b2f3 --- /dev/null +++ b/patches/dwm-alpha-20180613-b69c870.diff @@ -0,0 +1,289 @@ +From f699934b8c8a9c15988ad359bf8fedd6c55abd53 Mon Sep 17 00:00:00 2001 +From: Thomas Oltmann +Date: Wed, 13 Jun 2018 19:46:26 +0200 +Subject: [PATCH] Allow dwm to have translucent bars, while keeping all the + text on it opaque, just like the alpha-patch for st. Updated for b69c870. + +--- + config.def.h | 7 ++++++ + config.mk | 2 +- + drw.c | 26 ++++++++++++----------- + drw.h | 9 +++++--- + dwm.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++------ + 5 files changed, 82 insertions(+), 22 deletions(-) + +diff --git a/config.def.h b/config.def.h +index 1c0b587..4f68fe8 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -12,11 +12,18 @@ 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 unsigned int baralpha = 0xd0; ++static const unsigned int borderalpha = OPAQUE; + static const char *colors[][3] = { + /* fg bg border */ + [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, + [SchemeSel] = { col_gray4, col_cyan, col_cyan }, + }; ++static const unsigned int alphas[][3] = { ++ /* fg bg border */ ++ [SchemeNorm] = { OPAQUE, baralpha, borderalpha }, ++ [SchemeSel] = { OPAQUE, baralpha, borderalpha }, ++}; + + /* tagging */ + static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; +diff --git a/config.mk b/config.mk +index 25e2685..bef8de0 100644 +--- a/config.mk ++++ b/config.mk +@@ -22,7 +22,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} -lXrender + + # flags + CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=2 -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} +diff --git a/drw.c b/drw.c +index c638323..77fc113 100644 +--- a/drw.c ++++ b/drw.c +@@ -61,7 +61,7 @@ utf8decode(const char *c, long *u, size_t clen) + } + + Drw * +-drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h) ++drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h, Visual *visual, unsigned int depth, Colormap cmap) + { + Drw *drw = ecalloc(1, sizeof(Drw)); + +@@ -70,8 +70,11 @@ drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h + drw->root = root; + drw->w = w; + drw->h = h; +- drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen)); +- drw->gc = XCreateGC(dpy, root, 0, NULL); ++ drw->visual = visual; ++ drw->depth = depth; ++ drw->cmap = cmap; ++ drw->drawable = XCreatePixmap(dpy, root, w, h, depth); ++ drw->gc = XCreateGC(dpy, drw->drawable, 0, NULL); + XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter); + + return drw; +@@ -87,7 +90,7 @@ drw_resize(Drw *drw, unsigned int w, unsigned int h) + drw->h = h; + if (drw->drawable) + XFreePixmap(drw->dpy, drw->drawable); +- drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen)); ++ drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, drw->depth); + } + + void +@@ -180,21 +183,22 @@ drw_fontset_free(Fnt *font) + } + + void +-drw_clr_create(Drw *drw, Clr *dest, const char *clrname) ++drw_clr_create(Drw *drw, Clr *dest, const char *clrname, unsigned int alpha) + { + if (!drw || !dest || !clrname) + return; + +- if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen), +- DefaultColormap(drw->dpy, drw->screen), ++ if (!XftColorAllocName(drw->dpy, drw->visual, drw->cmap, + clrname, dest)) + die("error, cannot allocate color '%s'", clrname); ++ ++ dest->pixel = (dest->pixel & 0x00ffffffU) | (alpha << 24); + } + + /* Wrapper to create color schemes. The caller has to call free(3) on the + * returned color scheme when done using it. */ + Clr * +-drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) ++drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int alphas[], size_t clrcount) + { + size_t i; + Clr *ret; +@@ -204,7 +208,7 @@ drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) + return NULL; + + for (i = 0; i < clrcount; i++) +- drw_clr_create(drw, &ret[i], clrnames[i]); ++ drw_clr_create(drw, &ret[i], clrnames[i], alphas[i]); + return ret; + } + +@@ -260,9 +264,7 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp + } else { + XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel); + XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); +- d = XftDrawCreate(drw->dpy, drw->drawable, +- DefaultVisual(drw->dpy, drw->screen), +- DefaultColormap(drw->dpy, drw->screen)); ++ d = XftDrawCreate(drw->dpy, drw->drawable, drw->visual, drw->cmap); + x += lpad; + w -= lpad; + } +diff --git a/drw.h b/drw.h +index 4bcd5ad..a56f523 100644 +--- a/drw.h ++++ b/drw.h +@@ -20,6 +20,9 @@ typedef struct { + Display *dpy; + int screen; + Window root; ++ Visual *visual; ++ unsigned int depth; ++ Colormap cmap; + Drawable drawable; + GC gc; + Clr *scheme; +@@ -27,7 +30,7 @@ typedef struct { + } Drw; + + /* Drawable abstraction */ +-Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h); ++Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h, Visual *visual, unsigned int depth, Colormap cmap); + void drw_resize(Drw *drw, unsigned int w, unsigned int h); + void drw_free(Drw *drw); + +@@ -38,8 +41,8 @@ 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); + + /* Colorscheme abstraction */ +-void drw_clr_create(Drw *drw, Clr *dest, const char *clrname); +-Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount); ++void drw_clr_create(Drw *drw, Clr *dest, const char *clrname, unsigned int alpha); ++Clr *drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int alphas[], size_t clrcount); + + /* Cursor abstraction */ + Cur *drw_cur_create(Drw *drw, int shape); +diff --git a/dwm.c b/dwm.c +index 4465af1..20f8309 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -57,6 +57,8 @@ + #define TAGMASK ((1 << LENGTH(tags)) - 1) + #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) + ++#define OPAQUE 0xffU ++ + /* enums */ + enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ + enum { SchemeNorm, SchemeSel }; /* color schemes */ +@@ -232,6 +234,7 @@ static Monitor *wintomon(Window w); + static int xerror(Display *dpy, XErrorEvent *ee); + static int xerrordummy(Display *dpy, XErrorEvent *ee); + static int xerrorstart(Display *dpy, XErrorEvent *ee); ++static void xinitvisual(); + static void zoom(const Arg *arg); + + /* variables */ +@@ -268,6 +271,11 @@ static Drw *drw; + static Monitor *mons, *selmon; + static Window root, wmcheckwin; + ++static int useargb = 0; ++static Visual *visual; ++static int depth; ++static Colormap cmap; ++ + /* configuration, allows nested code to access above variables */ + #include "config.h" + +@@ -1541,7 +1549,8 @@ setup(void) + sw = DisplayWidth(dpy, screen); + sh = DisplayHeight(dpy, screen); + root = RootWindow(dpy, screen); +- drw = drw_create(dpy, screen, root, sw, sh); ++ xinitvisual(); ++ drw = drw_create(dpy, screen, root, sw, sh, visual, depth, cmap); + if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) + die("no fonts could be loaded."); + lrpad = drw->fonts->h; +@@ -1569,7 +1578,7 @@ setup(void) + /* init appearance */ + scheme = ecalloc(LENGTH(colors), sizeof(Clr *)); + for (i = 0; i < LENGTH(colors); i++) +- scheme[i] = drw_scm_create(drw, colors[i], 3); ++ scheme[i] = drw_scm_create(drw, colors[i], alphas[i], 3); + /* init bars */ + updatebars(); + updatestatus(); +@@ -1804,16 +1813,18 @@ updatebars(void) + Monitor *m; + XSetWindowAttributes wa = { + .override_redirect = True, +- .background_pixmap = ParentRelative, ++ .background_pixel = 0, ++ .border_pixel = 0, ++ .colormap = cmap, + .event_mask = ButtonPressMask|ExposureMask + }; + XClassHint ch = {"dwm", "dwm"}; + for (m = mons; m; m = m->next) { + if (m->barwin) + continue; +- m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen), +- CopyFromParent, DefaultVisual(dpy, screen), +- CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); ++ m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, depth, ++ InputOutput, visual, ++ CWOverrideRedirect|CWBackPixel|CWBorderPixel|CWColormap|CWEventMask, &wa); + XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); + XMapRaised(dpy, m->barwin); + XSetClassHint(dpy, m->barwin, &ch); +@@ -2110,6 +2121,43 @@ xerrorstart(Display *dpy, XErrorEvent *ee) + return -1; + } + ++void ++xinitvisual() ++{ ++ XVisualInfo *infos; ++ XRenderPictFormat *fmt; ++ int nitems; ++ int i; ++ ++ XVisualInfo tpl = { ++ .screen = screen, ++ .depth = 32, ++ .class = TrueColor ++ }; ++ long masks = VisualScreenMask | VisualDepthMask | VisualClassMask; ++ ++ infos = XGetVisualInfo(dpy, masks, &tpl, &nitems); ++ visual = NULL; ++ for(i = 0; i < nitems; i ++) { ++ fmt = XRenderFindVisualFormat(dpy, infos[i].visual); ++ if (fmt->type == PictTypeDirect && fmt->direct.alphaMask) { ++ visual = infos[i].visual; ++ depth = infos[i].depth; ++ cmap = XCreateColormap(dpy, root, visual, AllocNone); ++ useargb = 1; ++ break; ++ } ++ } ++ ++ XFree(infos); ++ ++ if (! visual) { ++ visual = DefaultVisual(dpy, screen); ++ depth = DefaultDepth(dpy, screen); ++ cmap = DefaultColormap(dpy, screen); ++ } ++} ++ + void + zoom(const Arg *arg) + { +-- +2.17.0 + diff --git a/patches/dwm-attachbottom-6.2.diff b/patches/dwm-attachbottom-6.2.diff new file mode 100644 index 0000000..5e83e3e --- /dev/null +++ b/patches/dwm-attachbottom-6.2.diff @@ -0,0 +1,71 @@ +From 5db9b0d2860948ff42cbdae4031c90b3aa9c7d2f Mon Sep 17 00:00:00 2001 +From: bakkeby +Date: Thu, 23 Apr 2020 10:06:18 +0200 +Subject: [PATCH] attachbottom patch + +New clients attach at the bottom of the stack instead of the top. +--- + dwm.c | 19 ++++++++++++++++--- + 1 file changed, 16 insertions(+), 3 deletions(-) + +diff --git a/dwm.c b/dwm.c +index 4465af1..bf13d15 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -147,6 +147,7 @@ static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interac + static void arrange(Monitor *m); + static void arrangemon(Monitor *m); + static void attach(Client *c); ++static void attachbottom(Client *c); + static void attachstack(Client *c); + static void buttonpress(XEvent *e); + static void checkotherwm(void); +@@ -406,6 +407,18 @@ attach(Client *c) + c->mon->clients = c; + } + ++void ++attachbottom(Client *c) ++{ ++ Client *below = c->mon->clients; ++ for (; below && below->next; below = below->next); ++ c->next = NULL; ++ if (below) ++ below->next = c; ++ else ++ c->mon->clients = c; ++} ++ + void + attachstack(Client *c) + { +@@ -1062,7 +1075,7 @@ manage(Window w, XWindowAttributes *wa) + c->isfloating = c->oldstate = trans != None || c->isfixed; + if (c->isfloating) + XRaiseWindow(dpy, c->win); +- attach(c); ++ attachbottom(c); + attachstack(c); + XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend, + (unsigned char *) &(c->win), 1); +@@ -1417,7 +1430,7 @@ sendmon(Client *c, Monitor *m) + detachstack(c); + c->mon = m; + c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */ +- attach(c); ++ attachbottom(c); + attachstack(c); + focus(NULL); + arrange(NULL); +@@ -1897,7 +1910,7 @@ updategeom(void) + m->clients = c->next; + detachstack(c); + c->mon = mons; +- attach(c); ++ attachbottom(c); + attachstack(c); + } + if (m == selmon) +-- +2.17.1 +