From 3f2aa9d37faf42b90d8c34873b7ab82f0c96c0fc Mon Sep 17 00:00:00 2001 From: bjarke-cachy-btw Date: Thu, 2 Jul 2026 22:42:48 +0200 Subject: [PATCH] remove games/actualfullscreenpatch use fullscreen compilation and add ewmhtags --- config.def.h | 4 +- config.def.h.rej | 23 +- config.h | 35 +- config.mk | 3 +- config.mk.orig | 3 +- dwm | Bin 100840 -> 96288 bytes dwm.c | 469 +++++++------------- dwm.c.orig | 311 ++----------- dwm.c.rej | 45 +- dwm.o | Bin 93648 -> 91360 bytes patches/dwm-ewmhtags-6.2.diff | 161 +++++++ patches/dwm-fullscreen-compilation-6.3.diff | 357 +++++++++++++++ patches/dwm-games-6.6.diff | 173 -------- 13 files changed, 760 insertions(+), 824 deletions(-) create mode 100644 patches/dwm-ewmhtags-6.2.diff create mode 100644 patches/dwm-fullscreen-compilation-6.3.diff delete mode 100644 patches/dwm-games-6.6.diff diff --git a/config.def.h b/config.def.h index 7d612e6..6fff8ea 100644 --- a/config.def.h +++ b/config.def.h @@ -140,10 +140,12 @@ static const Key keys[] = { { MODKEY, XK_Tab, view, {0} }, { MODKEY|ShiftMask, XK_c, killclient, {0} }, { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, - { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, + { MODKEY, XK_e, setlayout, {.v = &layouts[1]} }, { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, { MODKEY, XK_space, setlayout, {0} }, { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, + { MODKEY, XK_f, togglefullscreen, {0} }, + { MODKEY|ShiftMask, XK_f, togglefakefullscreen, {0} }, { MODKEY, XK_0, view, {.ui = ~0 } }, { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, { MODKEY, XK_comma, focusmon, {.i = -1 } }, diff --git a/config.def.h.rej b/config.def.h.rej index 668347e..3deca19 100644 --- a/config.def.h.rej +++ b/config.def.h.rej @@ -1,19 +1,10 @@ --- config.def.h +++ config.def.h -@@ -42,6 +42,7 @@ static const Layout layouts[] = { - { "[]=", tile }, /* first entry is default */ - { "><>", NULL }, /* no layout function means floating behavior */ - { "[M]", monocle }, -+ { NULL, NULL }, - }; +@@ -35,7 +35,6 @@ static const Rule rules[] = { + static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ + static const int nmaster = 1; /* number of clients in master area */ + static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ +-static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */ - /* key definitions */ -@@ -85,6 +86,8 @@ static Key keys[] = { - { MODKEY, XK_period, focusmon, {.i = +1 } }, - { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, - { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, -+ { MODKEY|ControlMask, XK_comma, cyclelayout, {.i = -1 } }, -+ { MODKEY|ControlMask, XK_period, cyclelayout, {.i = +1 } }, - TAGKEYS( XK_1, 0) - TAGKEYS( XK_2, 1) - TAGKEYS( XK_3, 2) + static const Layout layouts[] = { + /* symbol arrange function */ diff --git a/config.h b/config.h index 2b0fb22..54a41cf 100644 --- a/config.h +++ b/config.h @@ -14,7 +14,6 @@ static const unsigned int gappiv = 10; /* vert inner gap between window static const unsigned int gappoh = 10; /* horiz outer gap between windows and screen edge */ static const unsigned int gappov = 30; /* vert outer gap between windows and screen edge */ static int smartgaps = 0; /* 1 means no outer gap when there is only one window */ -static const int swallowfloating = 0; /* 1 means swallow floating windows by default */ static const int showbar = 1; /* 0 means no bar */ static const int topbar = 1; /* 0 means bottom bar */ static const char *fonts[] = { "JetBrainsMono Nerd Font Mono:style=Bold:size=16",}; @@ -35,7 +34,7 @@ typedef struct { const void *cmd; } Sp; const char *spcmd1[] = {"alacritty", "--class", "spterm", NULL }; -const char *spcmd2[] = {"alacritty", "--class", "spfm", NULL }; +const char *spcmd2[] = {"alacritty", "--class", "spfm", "-e", "ranger", NULL }; const char *spcmd3[] = {"keepassxc", NULL }; static Sp scratchpads[] = { /* name cmd */ @@ -52,28 +51,24 @@ static const Rule rules[] = { * WM_CLASS(STRING) = instance, class * WM_NAME(STRING) = title */ - /* class instance title tags mask isfloating isterminal isswallow monitor isgame */ - { "Playground", NULL, NULL, 0, 1, 0, -1 -1 }, + /* class instance title tags mask isfloating isterminal monitor */ + { "Playground", NULL, NULL, 0, 1, -1 }, - { "steam", NULL, NULL, 1 << 1, 0, 0, -1 -1 }, - { "Firefox", NULL, NULL, 1 << 2, 0, 0, -1 -1 }, - { "brave-browser", NULL, NULL, 1 << 3, 0, 0, -1 -1 }, - { "discord", NULL, NULL, 1 << 4, 0, 0, -1 -1 }, - { "feishin", NULL, NULL, 1 << 5, 0, 0, -1 -1 }, - { NULL, "spterm", NULL, SPTAG(0), 1, 0, 0, -1 }, - { NULL, "spfm", NULL, SPTAG(1), 1, 0, 0, -1 }, - { NULL, "keepassxc", NULL, SPTAG(2), 0, 0, 0, -1 }, - - { "Steam", NULL, NULL, 0, 0, 0, -1 -1, 1 }, - { "steam_app", NULL, NULL, 0, 0, 0, -1 -1, 1 }, + { "steam", NULL, NULL, 1 << 1, 0, -1 }, + { "Firefox", NULL, NULL, 1 << 2, 0, -1 }, + { "brave-browser", NULL, NULL, 1 << 3, 0, -1 }, + { "discord", NULL, NULL, 1 << 4, 0, -1 }, + { "feishin", NULL, NULL, 1 << 5, 0, -1 }, + { NULL, "spterm", NULL, SPTAG(0), 1, 0 }, + { NULL, "spfm", NULL, SPTAG(1), 1, 0 }, + { NULL, "keepassxc", NULL, SPTAG(2), 0, 0 }, }; /* layout(s) */ static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ static const int nmaster = 1; /* number of clients in master area */ static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ -static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */ -static const int refreshrate = 120; /* refresh rate (per second) for client move/resize */ +static const int refreshrate = 144; /* refresh rate (per second) for client move/resize */ #define FORCE_VSPLIT 1 /* nrowgrid layout: force two clients to always split vertically */ #include "vanitygaps.c" @@ -125,14 +120,18 @@ static const char *mediaprevcmd[] = { "playerctl", "previous", NULL }; static const char *brightupcmd[] = { "ddcutil", "-b", "2", "setvcp", "10", "+", "10", NULL }; static const char *brightdowncmd[] = { "ddcutil", "-b", "2", "setvcp", "10", "-", "10", NULL }; +static const char *screenshotcmd[] = { "/bin/sh", "-c", "maim -s | xclip -selection clipboard -t image/png", NULL }; + static const Key keys[] = { /* modifier key function argument */ { MODKEY, XK_d, spawn, {.v = roficmd } }, { MODKEY, XK_Return, spawn, {.v = termcmd } }, { MODKEY, XK_b, spawn, {.v = ffcmd } }, { MODKEY|ShiftMask, XK_n, spawn, {.v = nmroficmd } }, + { ControlMask, XK_Print, spawn, {.v = screenshotcmd } }, { MODKEY|ShiftMask, XK_Return, togglescratch, {.ui = 0 } }, + { MODKEY, XK_e, togglescratch, {.ui = 1 } }, { MODKEY, XK_i, incnmaster, {.i = +1 } }, { MODKEY, XK_p, incnmaster, {.i = -1 } }, @@ -193,6 +192,8 @@ static const Key keys[] = { { MODKEY, XK_space, setlayout, {0} }, { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, + { MODKEY, XK_f, togglefullscreen, {0} }, + { MODKEY|ShiftMask, XK_f, togglefakefullscreen, {0} }, { MODKEY, XK_0, view, {.ui = ~0 } }, { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, { MODKEY, XK_comma, focusmon, {.i = -1 } }, diff --git a/config.mk b/config.mk index 49b3c6c..982dc21 100644 --- a/config.mk +++ b/config.mk @@ -20,11 +20,10 @@ FREETYPEINC = /usr/include/freetype2 # OpenBSD (uncomment) #FREETYPEINC = ${X11INC}/freetype2 #MANPREFIX = ${PREFIX}/man -#KVMLIB = -lkvm # includes and libs INCS = -I${X11INC} -I${FREETYPEINC} -LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} -lX11-xcb -lxcb -lxcb-res ${KVMLIB} +LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} # flags CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} diff --git a/config.mk.orig b/config.mk.orig index 982dc21..49b3c6c 100644 --- a/config.mk.orig +++ b/config.mk.orig @@ -20,10 +20,11 @@ FREETYPEINC = /usr/include/freetype2 # OpenBSD (uncomment) #FREETYPEINC = ${X11INC}/freetype2 #MANPREFIX = ${PREFIX}/man +#KVMLIB = -lkvm # includes and libs INCS = -I${X11INC} -I${FREETYPEINC} -LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} +LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} -lX11-xcb -lxcb -lxcb-res ${KVMLIB} # flags CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} diff --git a/dwm b/dwm index 2615628027b395d44f347a6c70448b7fdbdcedc3..742cdc0a7717268d1ba495eb846cb99513b50cdb 100755 GIT binary patch literal 96288 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 literal 100840 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%0AS3h>$nnOn?l4|F#HPfBZ#il}C?Zbc%93i< zLAr`Pc95=AQ~C?&+A(#It`pI%NcvFwmLmS%yZ)&KsXt>9BZTfU*_d%0=s@!1$AR#1 zz|F!c^m^4`)+3u2aiZ8fk9f_~cqrC$zkfiGqGdszNFnCWrhpY(jkc!5N5Hx1)w(hDB9B62^T3BA2qo=?&K z?*yOp+`#gGW%+K#_4+(@W$0OlfAVL#9OCuG!_5*uLDU)a{{}eeU+cpQp4Ezo&7h=b zH^-+A@BNIwY``A{PI`vR)fRPzg;YJo_ALi z_?*c25d(fE<6j%_Nvyv#EY%B&M|#Q_|2yM1DOfCId{smNFETy~K_Y)vwkm+~A3e)h z{&$xvv%IqguM}>Q*ZUvjy)(eCVO;N{kax%cKXR;+*ZVExeK5eIEdL%&O5l-qyMX?j zalL;--p>O3H;i8wC20)IIl*YONdCElGAf=SiijwP179q_*x*ZWQ6y(zFm13=QF z4ie#v7wdV2alKwF?>+(VUB=gQ1XEv_o`b+CKNNF%adr{^VEMrtl$_3oKQcaralK48 z2)%joPk^SJ@W?w&K zg|a2Gfs=p2w3ZPG5#?8M^7>1Ob$9Mie8zgtVf^xk6;R3eJgFyBWPYmv-5xDs`4?E8t6g~yBKbf5h?1B0 zW8k$_>N!zla{1EblEjA$Wc*pi_5LS$9|d^37;l$r6}WeR<@YeI_j^rX`~$`tpHYCk7Xq*Qfm6L?<9g{j zmOsdN=eeq2Y5WlD`TAKU_$13)QdRssxJ?00#z!))_j$>?9>5#Nc(^+2cubrh}kvL-d zSl$7g>Q8z3EUGc-N>+_WI?gGgFh4G8tQtrw-2k`n=spkX{nA_j~2N*AAT*vbviJvI8 z8u~fkv3`9{q)a&@PDxYYDt}i2@{Rz!(w&jWy!Fu$*N8OJ) zf%WX;_}ArSEXyzdt5hT88GgLxFs}Dg(!4J{g^cU{mg^NPN~C_o57(cWj4xtbpXanO zelFwsoTiqqW?Y}o)c6IA>vMxStjERpHtq;$+{bvQ0qJRfN2wjr=l?YR1mpVLpN-{TXM8!2qc#4C#52Xd!%8rp<-cHD?>Erpi0&yh zVVOzqN6@$#4GrOX|AEGbGOqV2XnYjodLM(v#{wT{{^WGvR31AoVh=JolkqJE{2ay) z8SurxDW6}*<%o-^a7uiX(ECrdE7!3eeI8rm8>IY5q4%?D{1M;-`Tud&Gvi_70~^XkG3RqF?}9wFF~%pH1Yey5|78;Vz9jg=N$_Wq;B;T?K>nofYYc?{JqeyN zcwqU-h@WFoj`Tv^sT?80lgQ&+wFA0KchC;xpQ%akg%Y=la;I{zjorOCi9FpwJCOcc zli-_^;7}5y3O(H*d$iU$`j&O5^ z(39EPuVbXVRs48~LiBuWK@vU1N${E^ctaBWnk4v!B=}uP@JEv1&m_TjCc)oLf`66- zPZ>(_Y!!`M-)`av&5*c`-99=F_;A!4`uvHm4^K}be-?0CpY`6ink4egQa`jFQlh%v zZc8G6Z4!KA68!f`@U2PkSCZg+li(jq+$z4{@>|Uz{xXStJPCfRte<-95|6zXDKu2ZsUR4ySya$EY`D#)A4TBQ<_A+HVN)Xg0Dz|Uzr47 z51i^x!RcaS|NK0O{Jlx=KP17QPlCT8ajSTM<9{r>`#}=KG`Qv0aq%Tx>{WwQlQR$!Zuz-q z`3k5JU&{@NOCz4J2;$4s*l{NG*QJBl1sL{Y^Pa$e2w%(f(mVECs?W-{(RW_48??#g z^|-Nj5wBr?;ye4vgPnt-U48(&A=1*)AsAPxBLVD%bkp}^@yS~Fq#@8D@L5`KM;{bw z!&XUA-z->G1(nn`x&1AO7GI;MDH3#30HBAx;DVprL3e}PKnh>BIPuNfpwKWIefV~6 zQxKa{>t$48`>N+Me#aMn>-|2b%jLm0OYtdg+87$}1f5<%@yU+WJA>f$`GG(1O`jH4 z{=hy%?28Q0H-()Dv2X_ECw65_;#ON>j@#f{Qj`a18~7D+OW?O?!W^PY~4h5BviLe?R71L2@bc*2xR2ni%3!H_>lxfkDQ#)pIz%NJ?E zr-AWd<K*e?CA1w=2D-T))|mIq9RhbIuMimu7s4bfV0h~J|pdFX;3d5*OV(LALYqy zxbiKZV;q>vhZAualt7nOA@aRG%Q1F9G%ywjrbB z>FA-VnDReJ1&Ra*N_s~@?;ElOFjt3@YEZ>2?0uU| z8-_#SNMj?K!3I?2O{nbLK}Wd7;lcq0#FxX-;CD26{q;_-qaln4b~q#Lu-_8!y2I`U z>7xN89F1sU9aLF#IFR_k4$&CIW`2iiog9t?6AmGG!u>>1N5ebq6d(w?-Prr=^#nqm zkVCe;dDBn1~yOC=Db4Tb^Agn1*k-^m%7P8)gV$C874>vF5q3CAC)(s7DIUMDS?DNYUWeZ9j4w!J9!%FSXf?OQ&#J!wU<= zK1WsMb>$S=y7}<#QdwF>-CTFLZcfP@6c}}0Ku8&u5BUN?wCIh+bE_&#<~Szfa58rB zqo?9&=m*s`hNUZBs&e`~7YTShE^5!}pkKA`>?}@(V5j+v8IHz~%jxUWe-^c$j*tu4 zL;4*htKNYk>bR5whCD;P6r4W^sej6}$TOmDksIk4YM$rrsP{XA4f9nKgwUZ;s&NOA zIx?h7=P&RFTb$ks*-ddcs0L8yX^<{B#G$%Ff(|gW2Kt52-R=qZ1L}|*b11x}D4Fwd z{sEqFdO|v0W&V_bpK&PkCgQ~$9=#7Qm z@H>z_BX0GJYAE3L_4iz3xD@@7nlMtYX>qu5x{8TjCzTHnTS5iH846L9=p4g|)SK;8 zJ`!~;^|h#Bv^Q)0WU8Xx3ndyS7-zZ~4;5fm6r##!il|!%f0lYeRA=E3M(uo@w9z#} z?R-S0&t2=JvpcPg17thHsg1gtNPtd`gsS{5C+r{#Qqd@Dhkwv~1tMWrzbK({-Vdl_ zpCA@oNIn!76=}UiYK}k9VMi|P&62XJs4GQJKJ33m8w0AGKB5}@<(FK>cWf~$=MR1 zMl9rasP2Q5Q@skA4MY9)+G)Tg!=N5hraB4`(M#v63X6`)IlcY$ zA=^{Ggw(ng&}leX*d~iMrzadRR@15=Q;O6e7rVlhK9mz#2gtW_+0~(&^73psqi~U zscVJ9)w}|y_&j|BVUKOvUZ1c^^crDqbY%2PJ^hcq$a~>r@nt9I#8khr5PUf9pz)$B^V&WxCbHX zR7hlqs3KHNMTs2MsYX-QEQW%BLe8~}j7XO^s2czrGDDW>7eq89vi(Oj6~agdrHOJp z>X^Q2RJPRciOeHq!Jt1_!JTngiBx;qQTL#w3$Ey=870Eq5(sy|JNC#_no`)CB&x-d zIiOZn&mKx%ci2z}<&24(L6L0|*EZ#{KB>k`04&Wz!!Sq95n-5%flf%uYY!jQJqx-q z{e!6hjFM#kTPL`RrG(6sSXFQ@SBN|mt+2BmG#pg4S-)Wf<<7&&*Svu4E#>t>^7wQv zCW7*0*D4^SASTh8MP5UPkIJj0nD3ArbPGeMiTW8F;9;`PNrL=?HlfJ}>V;l~J zW8^3hI&GYX`c`08prwV{z`O=`eWVHYsU!hcMtQVbv+CHQo%)qv)Z``u_*Pi4&X+rM-gcskZc|#f)pB*E6&^4=;)K=`IU;G|g7V-e0|sLj!ia znDDRNf0XTOs@K`HJjo_Ll`tH}-HzJ+Znm#!4hv&@uY8RDuK|i#=3e*peVCd~$9gqA z*v2XSsqO3isTTq#C$;%}rdzk5HjWadopLM_!?c3O%rUC6B+s`ym+J~KJe?6~5Xlk(D>wk^kZm_S{F*IFD z9!z+&`x@GemqhpVel|_9Ew0~V4F3acU#FkmFQsV?70!gmmheumkKv!(*Y@>(QcZUn z95fik3kLf~z5{?q(=b&q36G994ZVh!#QH;@8`spP1(_P%e;>FN|6J^Q_ZR1%NTKS> zZ_t2bEEzy8?x+sS7zP7LT=Pu_1 zEY+Max_oGV>wNTU(ve_)%Q-6CTj(G%o*enx_oMA=Is{^g_VvEu7~7|dml7XsPg8Zy zy3hZ5A8|2Vk%VWu4j3!3G1cUFh>8vhCbqEqhYSoI?;4(##J>Ix$`!ieWDDATZNDUm{gY-Z$sU6RgHco`v40Qe zgVzlf3`TjLoG@ejb=Z|8ogYkmw0%vR@IvoK`?GkX-(W4sO0-eaHoWNfM0ZO0yh=$T zhPZ-etudY;* L*BUGsjN< #endif /* XINERAMA */ #include -#include -#include -#ifdef __OpenBSD__ -#include -#include -#endif /* __OpenBSD */ #include "drw.h" #include "util.h" @@ -57,7 +51,6 @@ * 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 MINIMIZED(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) @@ -118,12 +111,10 @@ struct Client { int basew, baseh, incw, inch, maxw, maxh, minw, minh, hintsvalid; int bw, oldbw; unsigned int tags; - int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen, isterminal, noswallow; - int isgame; - pid_t pid; + int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; + int fakefullscreen; Client *next; Client *snext; - Client *swallowing; Monitor *mon; Window win; }; @@ -171,10 +162,7 @@ typedef struct { const char *title; unsigned int tags; int isfloating; - int isterminal; - int noswallow; int monitor; - int isgame; } Rule; typedef struct Systray Systray; @@ -224,10 +212,10 @@ static void grabkeys(void); static void incnmaster(const Arg *arg); static void keypress(XEvent *e); static void killclient(const Arg *arg); +static void losefullscreen(Client *next); static void manage(Window w, XWindowAttributes *wa); static void mappingnotify(XEvent *e); static void maprequest(XEvent *e); -static void minimize(Client *c); static void monocle(Monitor *m); static void motionnotify(XEvent *e); static void movemouse(const Arg *arg); @@ -246,6 +234,7 @@ static void resizemouse(const Arg *arg); static void resizerequest(XEvent *e); static void restack(Monitor *m); static void run(void); +static void runAutostart(void); static void scan(void); static int sendevent(Window w, Atom proto, int m, long d0, long d1, long d2, long d3, long d4); static void sendmon(Client *c, Monitor *m); @@ -266,14 +255,15 @@ static Monitor *systraytomon(Monitor *m); static void tag(const Arg *arg); static void tagmon(const Arg *arg); static void togglebar(const Arg *arg); +static void togglefakefullscreen(const Arg *arg); static void togglefloating(const Arg *arg); +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 unfocus(Client *c, int setfocus); static void unmanage(Client *c, int destroyed); static void unmapnotify(XEvent *e); -static void unminimize(Client *c); static void updatebarpos(Monitor *m); static void updatebars(void); static void updateclientlist(void); @@ -301,12 +291,6 @@ static void combotag(const Arg *arg); static void comboview(const Arg *arg); -static pid_t getparentprocess(pid_t p); -static int isdescprocess(pid_t p, pid_t c); -static Client *swallowingclient(Window w); -static Client *termforwin(const Client *c); -static pid_t winpid(Window w); - /* variables */ static Systray *systray = NULL; static const char broken[] = "broken"; @@ -346,8 +330,6 @@ static Drw *drw; static Monitor *mons, *selmon; static Window root, wmcheckwin; -static xcb_connection_t *xcon; - /* configuration, allows nested code to access above variables */ #include "config.h" @@ -413,11 +395,8 @@ applyrules(Client *c) && (!r->class || strstr(class, r->class)) && (!r->instance || strstr(instance, r->instance))) { - c->isterminal = r->isterminal; - c->noswallow = r->noswallow; c->isfloating = r->isfloating; c->tags |= r->tags; - c->isgame = r->isgame; if ((r->tags & SPTAGMASK) && r->isfloating) { c->x = c->mon->wx + (c->mon->ww / 2 - WIDTH(c) / 2); c->y = c->mon->wy + (c->mon->wh / 2 - HEIGHT(c) / 2); @@ -550,53 +529,6 @@ attachstack(Client *c) c->mon->stack = c; } -void -swallow(Client *p, Client *c) -{ - - if (c->noswallow || c->isterminal) - return; - if (c->noswallow && !swallowfloating && c->isfloating) - return; - - detach(c); - detachstack(c); - - setclientstate(c, WithdrawnState); - XUnmapWindow(dpy, p->win); - - p->swallowing = c; - c->mon = p->mon; - - Window w = p->win; - p->win = c->win; - c->win = w; - updatetitle(p); - XMoveResizeWindow(dpy, p->win, p->x, p->y, p->w, p->h); - arrange(p->mon); - configure(p); - updateclientlist(); -} - -void -unswallow(Client *c) -{ - c->win = c->swallowing->win; - - free(c->swallowing); - c->swallowing = NULL; - - /* unfullscreen the client */ - setfullscreen(c, 0); - updatetitle(c); - arrange(c->mon); - XMapWindow(dpy, c->win); - XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); - setclientstate(c, NormalState); - focus(NULL); - arrange(c->mon); -} - void buttonpress(XEvent *e) { @@ -760,9 +692,12 @@ clientmessage(XEvent *e) return; if (cme->message_type == netatom[NetWMState]) { if (cme->data.l[1] == netatom[NetWMFullscreen] - || cme->data.l[2] == netatom[NetWMFullscreen]) + || cme->data.l[2] == netatom[NetWMFullscreen]) { + if (c->fakefullscreen == 2 && c->isfullscreen) + c->fakefullscreen = 3; 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); @@ -806,7 +741,7 @@ configurenotify(XEvent *e) updatebars(); for (m = mons; m; m = m->next) { for (c = m->clients; c; c = c->next) - if (c->isfullscreen) + if (c->isfullscreen && c->fakefullscreen != 1) resizeclient(c, m->mx, m->my, m->mw, m->mh); resizebarwin(m); } @@ -914,8 +849,6 @@ destroynotify(XEvent *e) if ((c = wintoclient(ev->window))) unmanage(c, 1); - else if ((c = swallowingclient(ev->window))) - unmanage(c->swallowing, 1); else if ((c = wintosystrayicon(ev->window))) { removesystrayicon(c); resizebarwin(selmon); @@ -1057,8 +990,10 @@ focus(Client *c) { if (!c || !ISVISIBLE(c)) for (c = selmon->stack; c && !ISVISIBLE(c); c = c->snext); - if (selmon->sel && selmon->sel != c) + if (selmon->sel && selmon->sel != c) { + losefullscreen(c); unfocus(selmon->sel, 0); + } if (c) { if (c->mon != selmon) selmon = c->mon; @@ -1172,7 +1107,7 @@ focusstack(const Arg *arg) { Client *c = NULL, *i; - if (!selmon->sel || (selmon->sel->isfullscreen && lockfullscreen)) + if (!selmon->sel || (selmon->sel->isfullscreen && selmon->sel->fakefullscreen != 1)) return; if (arg->i > 0) { for (c = selmon->sel->next; c && !ISVISIBLE(c); c = c->next); @@ -1379,16 +1314,25 @@ killclient(const Arg *arg) } } +void +losefullscreen(Client *next) +{ + Client *sel = selmon->sel; + if (!sel || !next) + return; + if (sel->isfullscreen && sel->fakefullscreen != 1 && ISVISIBLE(sel) && sel->mon == next->mon && !next->isfloating) + setfullscreen(sel, 0); +} + void manage(Window w, XWindowAttributes *wa) { - Client *c, *t = NULL, *term = NULL; + Client *c, *t = NULL; Window trans = None; XWindowChanges wc; c = ecalloc(1, sizeof(Client)); c->win = w; - c->pid = winpid(w); /* geometry */ c->x = c->oldx = wa->x; c->y = c->oldy = wa->y; @@ -1404,7 +1348,6 @@ manage(Window w, XWindowAttributes *wa) } else { c->mon = selmon; applyrules(c); - term = termforwin(c); } if (c->x + WIDTH(c) > c->mon->wx + c->mon->ww) @@ -1454,13 +1397,13 @@ manage(Window w, XWindowAttributes *wa) (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) + if (c->mon == selmon) { + losefullscreen(c); unfocus(selmon->sel, 0); + } c->mon->sel = c; arrange(c->mon); XMapWindow(dpy, c->win); - if (term) - swallow(term, c); focus(NULL); } @@ -1493,29 +1436,6 @@ maprequest(XEvent *e) manage(ev->window, &wa); } -void -minimize(Client *c) -{ - if (!c || MINIMIZED(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 monocle(Monitor *m) { @@ -1559,7 +1479,7 @@ movemouse(const Arg *arg) if (!(c = selmon->sel)) return; - if (c->isfullscreen) /* no support moving fullscreen windows by mouse */ + if (c->isfullscreen && c->fakefullscreen != 1) /* no support moving fullscreen windows by mouse */ return; restack(selmon); ocx = c->x; @@ -1864,7 +1784,7 @@ resizemouse(const Arg *arg) if (!(c = selmon->sel)) return; - if (c->isfullscreen) /* no support resizing fullscreen windows by mouse */ + if (c->isfullscreen && c->fakefullscreen != 1) /* no support resizing fullscreen windows by mouse */ return; restack(selmon); ocx = c->x; @@ -1946,6 +1866,17 @@ run(void) handler[ev.type](&ev); /* call handler */ } +void +runAutostart(void) { + + int ret; + + ret = system("cd ~/.config/dwm; ./autostart_blocking.sh"); + ret = system("cd ~/.config/dwm; ./autostart.sh &"); + + if (ret); // ignore, hide compilation warnings +} + void scan(void) { @@ -2045,38 +1976,85 @@ setfocus(Client *c) (unsigned char *) &(c->win), 1); } - if (c->isgame && c->isfullscreen) - unminimize(c); - sendevent(c->win, wmatom[WMTakeFocus], NoEventMask, wmatom[WMTakeFocus], CurrentTime, 0, 0, 0); } 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); + XEvent ev; + int savestate = 0, restorestate = 0, restorefakefullscreen = 0; + + if ((c->fakefullscreen == 0 && fullscreen && !c->isfullscreen) // normal fullscreen + || (c->fakefullscreen == 2 && fullscreen)) // fake fullscreen --> actual fullscreen + savestate = 1; // go actual fullscreen + else if ((c->fakefullscreen == 0 && !fullscreen && c->isfullscreen) // normal fullscreen exit + || (c->fakefullscreen >= 2 && !fullscreen)) // fullscreen exit --> fake fullscreen + restorestate = 1; // go back into tiled + + /* If leaving fullscreen and the window was previously fake fullscreen (2), then restore + * that while staying in fullscreen. The exception to this is if we are in said state, but + * the client itself disables fullscreen (3) then we let the client go out of fullscreen + * while keeping fake fullscreen enabled (as otherwise there will be a mismatch between the + * client and the window manager's perception of the client's fullscreen state). */ + if (c->fakefullscreen == 2 && !fullscreen && c->isfullscreen) { + restorefakefullscreen = 1; c->isfullscreen = 1; - c->oldstate = c->isfloating; + fullscreen = 1; + } + + if (fullscreen != c->isfullscreen) { // only send property change if necessary + if (fullscreen) + XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, + PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1); + else + XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, + PropModeReplace, (unsigned char*)0, 0); + } + + c->isfullscreen = fullscreen; + + /* Some clients, e.g. firefox, will send a client message informing the window manager + * that it is going into fullscreen after receiving the above signal. This has the side + * effect of this function (setfullscreen) sometimes being called twice when toggling + * fullscreen on and off via the window manager as opposed to the application itself. + * To protect against obscure issues where the client settings are stored or restored + * when they are not supposed to we add an additional bit-lock on the old state so that + * settings can only be stored and restored in that precise order. */ + if (savestate && !(c->oldstate & (1 << 1))) { c->oldbw = c->bw; + c->oldstate = c->isfloating | (1 << 1); 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; + } else if (restorestate && (c->oldstate & (1 << 1))) { c->bw = c->oldbw; - c->x = c->oldx; - c->y = c->oldy; - c->w = c->oldw; - c->h = c->oldh; + c->isfloating = c->oldstate = c->oldstate & 1; + if (restorefakefullscreen || c->fakefullscreen == 3) + c->fakefullscreen = 1; + /* The client may have been moved to another monitor whilst in fullscreen which if tiled + * we address by doing a full arrange of tiled clients. If the client is floating then the + * height and width may be larger than the monitor's window area, so we cap that by + * ensuring max / min values. */ + if (c->isfloating) { + c->x = MAX(c->mon->wx, c->oldx); + c->y = MAX(c->mon->wy, c->oldy); + c->w = MIN(c->mon->ww - c->x - 2*c->bw, c->oldw); + c->h = MIN(c->mon->wh - c->y - 2*c->bw, c->oldh); + resizeclient(c, c->x, c->y, c->w, c->h); + restack(c->mon); + } else + arrange(c->mon); + } else resizeclient(c, c->x, c->y, c->w, c->h); - arrange(c->mon); - } + + /* Exception: if the client was in actual fullscreen and we exit out to fake fullscreen + * mode, then the focus would sometimes drift to whichever window is under the mouse cursor + * at the time. To avoid this we ask X for all EnterNotify events and just ignore them. + */ + if (!c->isfullscreen) + while (XCheckMaskEvent(dpy, EnterWindowMask, &ev)); } void @@ -2312,9 +2290,19 @@ tag(const Arg *arg) void tagmon(const Arg *arg) { - if (!selmon->sel || !mons->next) + Client *c = selmon->sel; + if (!c || !mons->next) return; - sendmon(selmon->sel, dirtomon(arg->i)); + if (c->isfullscreen) { + c->isfullscreen = 0; + sendmon(c, dirtomon(arg->i)); + c->isfullscreen = 1; + if (c->fakefullscreen != 1) { + resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh); + XRaiseWindow(dpy, c->win); + } + } else + sendmon(c, dirtomon(arg->i)); } void @@ -2337,18 +2325,51 @@ togglebar(const Arg *arg) arrange(selmon); } +void +togglefakefullscreen(const Arg *arg) +{ + Client *c = selmon->sel; + if (!c) + return; + + if (c->fakefullscreen != 1 && c->isfullscreen) { // exit fullscreen --> fake fullscreen + c->fakefullscreen = 2; + setfullscreen(c, 0); + } else if (c->fakefullscreen == 1) { + setfullscreen(c, 0); + c->fakefullscreen = 0; + } else { + c->fakefullscreen = 1; + setfullscreen(c, 1); + } +} + void togglefloating(const Arg *arg) { - if (!selmon->sel) + Client *c = selmon->sel; + if (!c) return; - if (selmon->sel->isfullscreen) /* no support for fullscreen windows */ + if (c->isfullscreen && c->fakefullscreen != 1) /* 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); + c->isfloating = !c->isfloating || c->isfixed; + if (c->isfloating) + resize(c, c->x, c->y, c->w, c->h, 0); + arrange(c->mon); +} + +void +togglefullscreen(const Arg *arg) +{ + Client *c = selmon->sel; + if (!c) + return; + + if (c->fakefullscreen == 1) { // fake fullscreen --> fullscreen + c->fakefullscreen = 2; + setfullscreen(c, 1); + } else + setfullscreen(c, !c->isfullscreen); } void @@ -2410,10 +2431,6 @@ unfocus(Client *c, int setfocus) { if (!c) return; - - if (c->isgame && c->isfullscreen) - minimize(c); - grabbuttons(c, 0); XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel); if (setfocus) { @@ -2428,20 +2445,6 @@ unmanage(Client *c, int destroyed) Monitor *m = c->mon; XWindowChanges wc; - if (c->swallowing) { - unswallow(c); - return; - } - - Client *s = swallowingclient(c->win); - if (s) { - free(s->swallowing); - s->swallowing = NULL; - arrange(m); - focus(NULL); - return; - } - detach(c); detachstack(c); if (!destroyed) { @@ -2457,12 +2460,9 @@ unmanage(Client *c, int destroyed) XUngrabServer(dpy); } free(c); - - if (!s) { - arrange(m); - focus(NULL); - updateclientlist(); - } + focus(NULL); + updateclientlist(); + arrange(m); } void @@ -2485,16 +2485,6 @@ unmapnotify(XEvent *e) } } -void -unminimize(Client *c) -{ - if (!c || !MINIMIZED(c)) - return; - - XMapWindow(dpy, c->win); - setclientstate(c, NormalState); -} - void updatebars(void) { @@ -2867,136 +2857,6 @@ view(const Arg *arg) arrange(selmon); } -pid_t -winpid(Window w) -{ - - pid_t result = 0; - -#ifdef __linux__ - xcb_res_client_id_spec_t spec = {0}; - spec.client = w; - spec.mask = XCB_RES_CLIENT_ID_MASK_LOCAL_CLIENT_PID; - - xcb_generic_error_t *e = NULL; - xcb_res_query_client_ids_cookie_t c = xcb_res_query_client_ids(xcon, 1, &spec); - xcb_res_query_client_ids_reply_t *r = xcb_res_query_client_ids_reply(xcon, c, &e); - - if (!r) - return (pid_t)0; - - xcb_res_client_id_value_iterator_t i = xcb_res_query_client_ids_ids_iterator(r); - for (; i.rem; xcb_res_client_id_value_next(&i)) { - spec = i.data->spec; - if (spec.mask & XCB_RES_CLIENT_ID_MASK_LOCAL_CLIENT_PID) { - uint32_t *t = xcb_res_client_id_value_value(i.data); - result = *t; - break; - } - } - - free(r); - - if (result == (pid_t)-1) - result = 0; - -#endif /* __linux__ */ - -#ifdef __OpenBSD__ - Atom type; - int format; - unsigned long len, bytes; - unsigned char *prop; - pid_t ret; - - if (XGetWindowProperty(dpy, w, XInternAtom(dpy, "_NET_WM_PID", 0), 0, 1, False, AnyPropertyType, &type, &format, &len, &bytes, &prop) != Success || !prop) - return 0; - - ret = *(pid_t*)prop; - XFree(prop); - result = ret; - -#endif /* __OpenBSD__ */ - return result; -} - -pid_t -getparentprocess(pid_t p) -{ - unsigned int v = 0; - -#ifdef __linux__ - FILE *f; - char buf[256]; - snprintf(buf, sizeof(buf) - 1, "/proc/%u/stat", (unsigned)p); - - if (!(f = fopen(buf, "r"))) - return 0; - - fscanf(f, "%*u %*s %*c %u", &v); - fclose(f); -#endif /* __linux__*/ - -#ifdef __OpenBSD__ - int n; - kvm_t *kd; - struct kinfo_proc *kp; - - kd = kvm_openfiles(NULL, NULL, NULL, KVM_NO_FILES, NULL); - if (!kd) - return 0; - - kp = kvm_getprocs(kd, KERN_PROC_PID, p, sizeof(*kp), &n); - v = kp->p_ppid; -#endif /* __OpenBSD__ */ - - return (pid_t)v; -} - -int -isdescprocess(pid_t p, pid_t c) -{ - while (p != c && c != 0) - c = getparentprocess(c); - - return (int)c; -} - -Client * -termforwin(const Client *w) -{ - Client *c; - Monitor *m; - - if (!w->pid || w->isterminal) - return NULL; - - for (m = mons; m; m = m->next) { - for (c = m->clients; c; c = c->next) { - if (c->isterminal && !c->swallowing && c->pid && isdescprocess(c->pid, w->pid)) - return c; - } - } - - return NULL; -} - -Client * -swallowingclient(Window w) -{ - Client *c; - Monitor *m; - - for (m = mons; m; m = m->next) { - for (c = m->clients; c; c = c->next) { - if (c->swallowing && c->swallowing->win == w) - return c; - } - } - - return NULL; -} - Client * wintoclient(Window w) { @@ -3112,15 +2972,14 @@ main(int argc, char *argv[]) fputs("warning: no locale support\n", stderr); if (!(dpy = XOpenDisplay(NULL))) die("dwm: cannot open display"); - if (!(xcon = XGetXCBConnection(dpy))) - die("dwm: cannot get xcb connection\n"); checkotherwm(); setup(); #ifdef __OpenBSD__ - if (pledge("stdio rpath proc exec ps", NULL) == -1) + if (pledge("stdio rpath proc exec", NULL) == -1) die("pledge"); #endif /* __OpenBSD__ */ scan(); + runAutostart(); run(); if(restart) execvp(argv[0], argv); cleanup(); diff --git a/dwm.c.orig b/dwm.c.orig index b3d821f..06a2ee9 100644 --- a/dwm.c.orig +++ b/dwm.c.orig @@ -40,12 +40,6 @@ #include #endif /* XINERAMA */ #include -#include -#include -#ifdef __OpenBSD__ -#include -#include -#endif /* __OpenBSD */ #include "drw.h" #include "util.h" @@ -57,7 +51,6 @@ * 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 MINIMIZED(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) @@ -118,12 +111,9 @@ struct Client { int basew, baseh, incw, inch, maxw, maxh, minw, minh, hintsvalid; int bw, oldbw; unsigned int tags; - int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen, isterminal, noswallow; - int isgame; - pid_t pid; + int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; Client *next; Client *snext; - Client *swallowing; Monitor *mon; Window win; }; @@ -171,10 +161,7 @@ typedef struct { const char *title; unsigned int tags; int isfloating; - int isterminal; - int noswallow; int monitor; - int isgame; } Rule; typedef struct Systray Systray; @@ -200,6 +187,7 @@ static void configure(Client *c); static void configurenotify(XEvent *e); static void configurerequest(XEvent *e); static Monitor *createmon(void); +static void cyclelayout(const Arg *arg); static void destroynotify(XEvent *e); static void detach(Client *c); static void detachstack(Client *c); @@ -226,7 +214,6 @@ 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 minimize(Client *c); static void monocle(Monitor *m); static void motionnotify(XEvent *e); static void movemouse(const Arg *arg); @@ -245,6 +232,7 @@ static void resizemouse(const Arg *arg); static void resizerequest(XEvent *e); static void restack(Monitor *m); static void run(void); +static void runAutostart(void); static void scan(void); static int sendevent(Window w, Atom proto, int m, long d0, long d1, long d2, long d3, long d4); static void sendmon(Client *c, Monitor *m); @@ -272,7 +260,6 @@ 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 unminimize(Client *c); static void updatebarpos(Monitor *m); static void updatebars(void); static void updateclientlist(void); @@ -300,12 +287,6 @@ static void combotag(const Arg *arg); static void comboview(const Arg *arg); -static pid_t getparentprocess(pid_t p); -static int isdescprocess(pid_t p, pid_t c); -static Client *swallowingclient(Window w); -static Client *termforwin(const Client *c); -static pid_t winpid(Window w); - /* variables */ static Systray *systray = NULL; static const char broken[] = "broken"; @@ -345,8 +326,6 @@ static Drw *drw; static Monitor *mons, *selmon; static Window root, wmcheckwin; -static xcb_connection_t *xcon; - /* configuration, allows nested code to access above variables */ #include "config.h" @@ -412,11 +391,8 @@ applyrules(Client *c) && (!r->class || strstr(class, r->class)) && (!r->instance || strstr(instance, r->instance))) { - c->isterminal = r->isterminal; - c->noswallow = r->noswallow; c->isfloating = r->isfloating; c->tags |= r->tags; - c->isgame = r->isgame; if ((r->tags & SPTAGMASK) && r->isfloating) { c->x = c->mon->wx + (c->mon->ww / 2 - WIDTH(c) / 2); c->y = c->mon->wy + (c->mon->wh / 2 - HEIGHT(c) / 2); @@ -549,53 +525,6 @@ attachstack(Client *c) c->mon->stack = c; } -void -swallow(Client *p, Client *c) -{ - - if (c->noswallow || c->isterminal) - return; - if (c->noswallow && !swallowfloating && c->isfloating) - return; - - detach(c); - detachstack(c); - - setclientstate(c, WithdrawnState); - XUnmapWindow(dpy, p->win); - - p->swallowing = c; - c->mon = p->mon; - - Window w = p->win; - p->win = c->win; - c->win = w; - updatetitle(p); - XMoveResizeWindow(dpy, p->win, p->x, p->y, p->w, p->h); - arrange(p->mon); - configure(p); - updateclientlist(); -} - -void -unswallow(Client *c) -{ - c->win = c->swallowing->win; - - free(c->swallowing); - c->swallowing = NULL; - - /* unfullscreen the client */ - setfullscreen(c, 0); - updatetitle(c); - arrange(c->mon); - XMapWindow(dpy, c->win); - XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); - setclientstate(c, NormalState); - focus(NULL); - arrange(c->mon); -} - void buttonpress(XEvent *e) { @@ -888,6 +817,23 @@ createmon(void) return m; } +void +cyclelayout(const Arg *arg) { + Layout *l; + for(l = (Layout *)layouts; l != selmon->lt[selmon->sellt]; l++); + if(arg->i > 0) { + if(l->symbol && (l + 1)->symbol) + setlayout(&((Arg) { .v = (l + 1) })); + else + setlayout(&((Arg) { .v = layouts })); + } else { + if(l != layouts && (l - 1)->symbol) + setlayout(&((Arg) { .v = (l - 1) })); + else + setlayout(&((Arg) { .v = &layouts[LENGTH(layouts) - 2] })); + } +} + void destroynotify(XEvent *e) { @@ -896,8 +842,6 @@ destroynotify(XEvent *e) if ((c = wintoclient(ev->window))) unmanage(c, 1); - else if ((c = swallowingclient(ev->window))) - unmanage(c->swallowing, 1); else if ((c = wintosystrayicon(ev->window))) { removesystrayicon(c); resizebarwin(selmon); @@ -1364,13 +1308,12 @@ killclient(const Arg *arg) void manage(Window w, XWindowAttributes *wa) { - Client *c, *t = NULL, *term = NULL; + Client *c, *t = NULL; Window trans = None; XWindowChanges wc; c = ecalloc(1, sizeof(Client)); c->win = w; - c->pid = winpid(w); /* geometry */ c->x = c->oldx = wa->x; c->y = c->oldy = wa->y; @@ -1386,7 +1329,6 @@ manage(Window w, XWindowAttributes *wa) } else { c->mon = selmon; applyrules(c); - term = termforwin(c); } if (c->x + WIDTH(c) > c->mon->wx + c->mon->ww) @@ -1441,8 +1383,6 @@ manage(Window w, XWindowAttributes *wa) c->mon->sel = c; arrange(c->mon); XMapWindow(dpy, c->win); - if (term) - swallow(term, c); focus(NULL); } @@ -1475,29 +1415,6 @@ maprequest(XEvent *e) manage(ev->window, &wa); } -void -minimize(Client *c) -{ - if (!c || MINIMIZED(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 monocle(Monitor *m) { @@ -1928,6 +1845,17 @@ run(void) handler[ev.type](&ev); /* call handler */ } +void +runAutostart(void) { + + int ret; + + ret = system("cd ~/.config/dwm; ./autostart_blocking.sh"); + ret = system("cd ~/.config/dwm; ./autostart.sh &"); + + if (ret); // ignore, hide compilation warnings +} + void scan(void) { @@ -2027,9 +1955,6 @@ setfocus(Client *c) (unsigned char *) &(c->win), 1); } - if (c->isgame && c->isfullscreen) - unminimize(c); - sendevent(c->win, wmatom[WMTakeFocus], NoEventMask, wmatom[WMTakeFocus], CurrentTime, 0, 0, 0); } @@ -2392,10 +2317,6 @@ unfocus(Client *c, int setfocus) { if (!c) return; - - if (c->isgame && c->isfullscreen) - minimize(c); - grabbuttons(c, 0); XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel); if (setfocus) { @@ -2410,20 +2331,6 @@ unmanage(Client *c, int destroyed) Monitor *m = c->mon; XWindowChanges wc; - if (c->swallowing) { - unswallow(c); - return; - } - - Client *s = swallowingclient(c->win); - if (s) { - free(s->swallowing); - s->swallowing = NULL; - arrange(m); - focus(NULL); - return; - } - detach(c); detachstack(c); if (!destroyed) { @@ -2439,12 +2346,9 @@ unmanage(Client *c, int destroyed) XUngrabServer(dpy); } free(c); - - if (!s) { - arrange(m); - focus(NULL); - updateclientlist(); - } + focus(NULL); + updateclientlist(); + arrange(m); } void @@ -2467,16 +2371,6 @@ unmapnotify(XEvent *e) } } -void -unminimize(Client *c) -{ - if (!c || !MINIMIZED(c)) - return; - - XMapWindow(dpy, c->win); - setclientstate(c, NormalState); -} - void updatebars(void) { @@ -2849,136 +2743,6 @@ view(const Arg *arg) arrange(selmon); } -pid_t -winpid(Window w) -{ - - pid_t result = 0; - -#ifdef __linux__ - xcb_res_client_id_spec_t spec = {0}; - spec.client = w; - spec.mask = XCB_RES_CLIENT_ID_MASK_LOCAL_CLIENT_PID; - - xcb_generic_error_t *e = NULL; - xcb_res_query_client_ids_cookie_t c = xcb_res_query_client_ids(xcon, 1, &spec); - xcb_res_query_client_ids_reply_t *r = xcb_res_query_client_ids_reply(xcon, c, &e); - - if (!r) - return (pid_t)0; - - xcb_res_client_id_value_iterator_t i = xcb_res_query_client_ids_ids_iterator(r); - for (; i.rem; xcb_res_client_id_value_next(&i)) { - spec = i.data->spec; - if (spec.mask & XCB_RES_CLIENT_ID_MASK_LOCAL_CLIENT_PID) { - uint32_t *t = xcb_res_client_id_value_value(i.data); - result = *t; - break; - } - } - - free(r); - - if (result == (pid_t)-1) - result = 0; - -#endif /* __linux__ */ - -#ifdef __OpenBSD__ - Atom type; - int format; - unsigned long len, bytes; - unsigned char *prop; - pid_t ret; - - if (XGetWindowProperty(dpy, w, XInternAtom(dpy, "_NET_WM_PID", 0), 0, 1, False, AnyPropertyType, &type, &format, &len, &bytes, &prop) != Success || !prop) - return 0; - - ret = *(pid_t*)prop; - XFree(prop); - result = ret; - -#endif /* __OpenBSD__ */ - return result; -} - -pid_t -getparentprocess(pid_t p) -{ - unsigned int v = 0; - -#ifdef __linux__ - FILE *f; - char buf[256]; - snprintf(buf, sizeof(buf) - 1, "/proc/%u/stat", (unsigned)p); - - if (!(f = fopen(buf, "r"))) - return 0; - - fscanf(f, "%*u %*s %*c %u", &v); - fclose(f); -#endif /* __linux__*/ - -#ifdef __OpenBSD__ - int n; - kvm_t *kd; - struct kinfo_proc *kp; - - kd = kvm_openfiles(NULL, NULL, NULL, KVM_NO_FILES, NULL); - if (!kd) - return 0; - - kp = kvm_getprocs(kd, KERN_PROC_PID, p, sizeof(*kp), &n); - v = kp->p_ppid; -#endif /* __OpenBSD__ */ - - return (pid_t)v; -} - -int -isdescprocess(pid_t p, pid_t c) -{ - while (p != c && c != 0) - c = getparentprocess(c); - - return (int)c; -} - -Client * -termforwin(const Client *w) -{ - Client *c; - Monitor *m; - - if (!w->pid || w->isterminal) - return NULL; - - for (m = mons; m; m = m->next) { - for (c = m->clients; c; c = c->next) { - if (c->isterminal && !c->swallowing && c->pid && isdescprocess(c->pid, w->pid)) - return c; - } - } - - return NULL; -} - -Client * -swallowingclient(Window w) -{ - Client *c; - Monitor *m; - - for (m = mons; m; m = m->next) { - for (c = m->clients; c; c = c->next) { - if (c->swallowing && c->swallowing->win == w) - return c; - } - } - - return NULL; -} - Client * wintoclient(Window w) { @@ -3094,15 +2858,14 @@ main(int argc, char *argv[]) fputs("warning: no locale support\n", stderr); if (!(dpy = XOpenDisplay(NULL))) die("dwm: cannot open display"); - if (!(xcon = XGetXCBConnection(dpy))) - die("dwm: cannot get xcb connection\n"); checkotherwm(); setup(); #ifdef __OpenBSD__ - if (pledge("stdio rpath proc exec ps", NULL) == -1) + if (pledge("stdio rpath proc exec", NULL) == -1) die("pledge"); #endif /* __OpenBSD__ */ scan(); + runAutostart(); run(); if(restart) execvp(argv[0], argv); cleanup(); diff --git a/dwm.c.rej b/dwm.c.rej index aaafc5a..9d85e24 100644 --- a/dwm.c.rej +++ b/dwm.c.rej @@ -1,37 +1,12 @@ --- dwm.c +++ 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 MINIMIZED(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) -@@ -92,6 +93,7 @@ struct Client { - int bw, oldbw; - unsigned int tags; - int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; -+ int isgame; - Client *next; - Client *snext; - Monitor *mon; -@@ -301,6 +306,7 @@ applyrules(Client *c) - { - c->isfloating = r->isfloating; - c->tags |= r->tags; -+ c->isgame = r->isgame; - for (m = mons; m && m->num != r->monitor; m = m->next); - if (m) - c->mon = m; -@@ -1501,6 +1530,10 @@ setfocus(Client *c) - XA_WINDOW, 32, PropModeReplace, - (unsigned char *) &(c->win), 1); - } -+ -+ if (c->isgame && c->isfullscreen) -+ unminimize(c); -+ - sendevent(c, wmatom[WMTakeFocus]); - } - +@@ -213,7 +215,9 @@ static void tag(const Arg *arg); + static void tagmon(const Arg *arg); + static void tile(Monitor *); + static void togglebar(const Arg *arg); ++static void togglefakefullscreen(const Arg *arg); + static void togglefloating(const Arg *arg); ++static void togglefullscreen(const Arg *arg); + static void toggletag(const Arg *arg); + static void toggleview(const Arg *arg); + static void unfocus(Client *c, int setfocus); diff --git a/dwm.o b/dwm.o index cf4e0a77fc831298b4a7d4001af11f1ec0da8a55..384ff0b0a32167b7487f9e204a1f3fc359bf66cd 100644 GIT binary patch literal 91360 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 bqQ~XB&@X*Ie|)*oRr!KTef+q;6Dt3I2qB0n literal 93648 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 K52eCdD)oOLZt7+L diff --git a/patches/dwm-ewmhtags-6.2.diff b/patches/dwm-ewmhtags-6.2.diff new file mode 100644 index 0000000..32abb8c --- /dev/null +++ b/patches/dwm-ewmhtags-6.2.diff @@ -0,0 +1,161 @@ +From e5f0eefa921e6bad1e6f75faced0c3ae519995b3 Mon Sep 17 00:00:00 2001 +From: Ryan Kes +Date: Thu, 28 Mar 2019 14:49:28 +0100 +Subject: [PATCH] dwm-ewhmtags-6.2 + +--- + dwm.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 48 insertions(+), 1 deletion(-) + +diff --git a/dwm.c b/dwm.c +index 4465af1..92022a1 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -55,6 +55,7 @@ + #define WIDTH(X) ((X)->w + 2 * (X)->bw) + #define HEIGHT(X) ((X)->h + 2 * (X)->bw) + #define TAGMASK ((1 << LENGTH(tags)) - 1) ++#define TAGSLENGTH (LENGTH(tags)) + #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) + + /* enums */ +@@ -62,7 +63,7 @@ enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ + enum { SchemeNorm, SchemeSel }; /* color schemes */ + enum { NetSupported, NetWMName, NetWMState, NetWMCheck, + NetWMFullscreen, NetActiveWindow, NetWMWindowType, +- NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ ++ NetWMWindowTypeDialog, NetClientList, NetDesktopNames, NetDesktopViewport, NetNumberOfDesktops, NetCurrentDesktop, NetLast }; /* EWMH atoms */ + enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ + enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, + ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ +@@ -197,11 +198,15 @@ 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 setcurrentdesktop(void); ++static void setdesktopnames(void); + 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 setnumdesktops(void); + static void setup(void); ++static void setviewport(void); + static void seturgent(Client *c, int urg); + static void showhide(Client *c); + static void sigchld(int unused); +@@ -216,6 +221,7 @@ 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 updatecurrentdesktop(void); + static void updatebarpos(Monitor *m); + static void updatebars(void); + static void updateclientlist(void); +@@ -1431,6 +1437,16 @@ setclientstate(Client *c, long state) + XChangeProperty(dpy, c->win, wmatom[WMState], wmatom[WMState], 32, + PropModeReplace, (unsigned char *)data, 2); + } ++void ++setcurrentdesktop(void){ ++ long data[] = { 0 }; ++ XChangeProperty(dpy, root, netatom[NetCurrentDesktop], XA_CARDINAL, 32, PropModeReplace, (unsigned char *)data, 1); ++} ++void setdesktopnames(void){ ++ XTextProperty text; ++ Xutf8TextListToTextProperty(dpy, tags, TAGSLENGTH, XUTF8StringStyle, &text); ++ XSetTextProperty(dpy, root, &text, netatom[NetDesktopNames]); ++} + + int + sendevent(Client *c, Atom proto) +@@ -1457,6 +1473,12 @@ sendevent(Client *c, Atom proto) + return exists; + } + ++void ++setnumdesktops(void){ ++ long data[] = { TAGSLENGTH }; ++ XChangeProperty(dpy, root, netatom[NetNumberOfDesktops], XA_CARDINAL, 32, PropModeReplace, (unsigned char *)data, 1); ++} ++ + void + setfocus(Client *c) + { +@@ -1562,6 +1584,10 @@ setup(void) + 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); ++ netatom[NetDesktopViewport] = XInternAtom(dpy, "_NET_DESKTOP_VIEWPORT", False); ++ netatom[NetNumberOfDesktops] = XInternAtom(dpy, "_NET_NUMBER_OF_DESKTOPS", False); ++ netatom[NetCurrentDesktop] = XInternAtom(dpy, "_NET_CURRENT_DESKTOP", False); ++ netatom[NetDesktopNames] = XInternAtom(dpy, "_NET_DESKTOP_NAMES", False); + /* init cursors */ + cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr); + cursor[CurResize] = drw_cur_create(drw, XC_sizing); +@@ -1584,6 +1610,10 @@ setup(void) + /* EWMH support per view */ + XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32, + PropModeReplace, (unsigned char *) netatom, NetLast); ++ setnumdesktops(); ++ setcurrentdesktop(); ++ setdesktopnames(); ++ setviewport(); + XDeleteProperty(dpy, root, netatom[NetClientList]); + /* select events */ + wa.cursor = cursor[CurNormal]->cursor; +@@ -1595,6 +1625,11 @@ setup(void) + grabkeys(); + focus(NULL); + } ++void ++setviewport(void){ ++ long data[] = { 0, 0 }; ++ XChangeProperty(dpy, root, netatom[NetDesktopViewport], XA_CARDINAL, 32, PropModeReplace, (unsigned char *)data, 2); ++} + + + void +@@ -1732,6 +1767,7 @@ toggletag(const Arg *arg) + focus(NULL); + arrange(selmon); + } ++ updatecurrentdesktop(); + } + + void +@@ -1744,6 +1780,7 @@ toggleview(const Arg *arg) + focus(NULL); + arrange(selmon); + } ++ updatecurrentdesktop(); + } + + void +@@ -1846,6 +1883,15 @@ updateclientlist() + XA_WINDOW, 32, PropModeAppend, + (unsigned char *) &(c->win), 1); + } ++void updatecurrentdesktop(void){ ++ long rawdata[] = { selmon->tagset[selmon->seltags] }; ++ int i=0; ++ while(*rawdata >> i+1){ ++ i++; ++ } ++ long data[] = { i }; ++ XChangeProperty(dpy, root, netatom[NetCurrentDesktop], XA_CARDINAL, 32, PropModeReplace, (unsigned char *)data, 1); ++} + + int + updategeom(void) +@@ -2042,6 +2088,7 @@ view(const Arg *arg) + selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; + focus(NULL); + arrange(selmon); ++ updatecurrentdesktop(); + } + + Client * +-- +2.21.0 + diff --git a/patches/dwm-fullscreen-compilation-6.3.diff b/patches/dwm-fullscreen-compilation-6.3.diff new file mode 100644 index 0000000..c7213cb --- /dev/null +++ b/patches/dwm-fullscreen-compilation-6.3.diff @@ -0,0 +1,357 @@ +From 4d2fb76ca3024447fd06407bdc87c09e726f6c27 Mon Sep 17 00:00:00 2001 +From: Bakkeby +Date: Mon, 1 Jul 2024 22:14:32 +0200 +Subject: [PATCH] Compilation of fullscreen patches for dwm. + +This aims to provide a comprehensive fullscreen solution with the following features: + - toggle fullscreen for any window using a single keybinding rather than having + to rely on per-application keybindings + - the ability to have windows go fullscreen within the size and position the + window is currently in (fake fullscreen) + - allow a fullscreen window to be moved to an adjacent monitor while remaining + fullscreen + - make fullscreen windows lose fullscreen if another (e.g. new) window on the + same monitor receives focus, while still allowing dialog boxes to show while + in fullscreen + - allow seamless transition between the two fullscreen modes + +The default keybindings are: + - MOD+f to make a window fullscreen + - MOD+Shift+f to make a window fake fullscreen + +This incorporates, and expands on, the following patches: + - fakefullscreenclient + - togglefullscreen (a.k.a. actualfullscreen) + - tagmonfixfs + - losefullscreen +--- + config.def.h | 5 +- + dwm.c | 176 ++++++++++++++++++++++++++++++++++++++++++--------- + 2 files changed, 148 insertions(+), 33 deletions(-) + +diff --git a/config.def.h b/config.def.h +index a2ac963..5f28f2c 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -35,7 +35,6 @@ static const Rule rules[] = { + static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ + static const int nmaster = 1; /* number of clients in master area */ + static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ +-static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */ + + static const Layout layouts[] = { + /* symbol arrange function */ +@@ -75,10 +74,12 @@ static Key keys[] = { + { MODKEY, XK_Tab, view, {0} }, + { MODKEY|ShiftMask, XK_c, killclient, {0} }, + { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, +- { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, ++ { MODKEY, XK_e, setlayout, {.v = &layouts[1]} }, + { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, + { MODKEY, XK_space, setlayout, {0} }, + { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, ++ { MODKEY, XK_f, togglefullscreen, {0} }, ++ { MODKEY|ShiftMask, XK_f, togglefakefullscreen, {0} }, + { MODKEY, XK_0, view, {.ui = ~0 } }, + { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, + { MODKEY, XK_comma, focusmon, {.i = -1 } }, +diff --git a/dwm.c b/dwm.c +index a96f33c..53f0bd4 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -93,6 +93,7 @@ struct Client { + int bw, oldbw; + unsigned int tags; + int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; ++ int fakefullscreen; + Client *next; + Client *snext; + Monitor *mon; +@@ -178,6 +179,7 @@ static void grabkeys(void); + static void incnmaster(const Arg *arg); + static void keypress(XEvent *e); + static void killclient(const Arg *arg); ++static void losefullscreen(Client *next); + static void manage(Window w, XWindowAttributes *wa); + static void mappingnotify(XEvent *e); + static void maprequest(XEvent *e); +@@ -211,7 +213,9 @@ static void tag(const Arg *arg); + static void tagmon(const Arg *arg); + static void tile(Monitor *); + static void togglebar(const Arg *arg); ++static void togglefakefullscreen(const Arg *arg); + static void togglefloating(const Arg *arg); ++static void togglefullscreen(const Arg *arg); + static void toggletag(const Arg *arg); + static void toggleview(const Arg *arg); + static void unfocus(Client *c, int setfocus); +@@ -520,9 +524,12 @@ clientmessage(XEvent *e) + return; + if (cme->message_type == netatom[NetWMState]) { + if (cme->data.l[1] == netatom[NetWMFullscreen] +- || cme->data.l[2] == netatom[NetWMFullscreen]) ++ || cme->data.l[2] == netatom[NetWMFullscreen]) { ++ if (c->fakefullscreen == 2 && c->isfullscreen) ++ c->fakefullscreen = 3; + 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); +@@ -566,7 +573,7 @@ configurenotify(XEvent *e) + updatebars(); + for (m = mons; m; m = m->next) { + for (c = m->clients; c; c = c->next) +- if (c->isfullscreen) ++ if (c->isfullscreen && c->fakefullscreen != 1) + resizeclient(c, m->mx, m->my, m->mw, m->mh); + XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh); + } +@@ -789,8 +796,10 @@ focus(Client *c) + { + if (!c || !ISVISIBLE(c)) + for (c = selmon->stack; c && !ISVISIBLE(c); c = c->snext); +- if (selmon->sel && selmon->sel != c) ++ if (selmon->sel && selmon->sel != c) { ++ losefullscreen(c); + unfocus(selmon->sel, 0); ++ } + if (c) { + if (c->mon != selmon) + selmon = c->mon; +@@ -838,7 +847,7 @@ focusstack(const Arg *arg) + { + Client *c = NULL, *i; + +- if (!selmon->sel || (selmon->sel->isfullscreen && lockfullscreen)) ++ if (!selmon->sel || (selmon->sel->isfullscreen && selmon->sel->fakefullscreen != 1)) + return; + if (arg->i > 0) { + for (c = selmon->sel->next; c && !ISVISIBLE(c); c = c->next); +@@ -1018,6 +1027,16 @@ killclient(const Arg *arg) + } + } + ++void ++losefullscreen(Client *next) ++{ ++ Client *sel = selmon->sel; ++ if (!sel || !next) ++ return; ++ if (sel->isfullscreen && sel->fakefullscreen != 1 && ISVISIBLE(sel) && sel->mon == next->mon && !next->isfloating) ++ setfullscreen(sel, 0); ++} ++ + void + manage(Window w, XWindowAttributes *wa) + { +@@ -1072,8 +1091,10 @@ manage(Window w, XWindowAttributes *wa) + (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) ++ if (c->mon == selmon) { ++ losefullscreen(c); + unfocus(selmon->sel, 0); ++ } + c->mon->sel = c; + arrange(c->mon); + XMapWindow(dpy, c->win); +@@ -1147,7 +1168,7 @@ movemouse(const Arg *arg) + + if (!(c = selmon->sel)) + return; +- if (c->isfullscreen) /* no support moving fullscreen windows by mouse */ ++ if (c->isfullscreen && c->fakefullscreen != 1) /* no support moving fullscreen windows by mouse */ + return; + restack(selmon); + ocx = c->x; +@@ -1302,7 +1323,7 @@ resizemouse(const Arg *arg) + + if (!(c = selmon->sel)) + return; +- if (c->isfullscreen) /* no support resizing fullscreen windows by mouse */ ++ if (c->isfullscreen && c->fakefullscreen != 1) /* no support resizing fullscreen windows by mouse */ + return; + restack(selmon); + ocx = c->x; +@@ -1476,29 +1497,79 @@ setfocus(Client *c) + 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); ++ XEvent ev; ++ int savestate = 0, restorestate = 0, restorefakefullscreen = 0; ++ ++ if ((c->fakefullscreen == 0 && fullscreen && !c->isfullscreen) // normal fullscreen ++ || (c->fakefullscreen == 2 && fullscreen)) // fake fullscreen --> actual fullscreen ++ savestate = 1; // go actual fullscreen ++ else if ((c->fakefullscreen == 0 && !fullscreen && c->isfullscreen) // normal fullscreen exit ++ || (c->fakefullscreen >= 2 && !fullscreen)) // fullscreen exit --> fake fullscreen ++ restorestate = 1; // go back into tiled ++ ++ /* If leaving fullscreen and the window was previously fake fullscreen (2), then restore ++ * that while staying in fullscreen. The exception to this is if we are in said state, but ++ * the client itself disables fullscreen (3) then we let the client go out of fullscreen ++ * while keeping fake fullscreen enabled (as otherwise there will be a mismatch between the ++ * client and the window manager's perception of the client's fullscreen state). */ ++ if (c->fakefullscreen == 2 && !fullscreen && c->isfullscreen) { ++ restorefakefullscreen = 1; + c->isfullscreen = 1; +- c->oldstate = c->isfloating; ++ fullscreen = 1; ++ } ++ ++ if (fullscreen != c->isfullscreen) { // only send property change if necessary ++ if (fullscreen) ++ XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, ++ PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1); ++ else ++ XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, ++ PropModeReplace, (unsigned char*)0, 0); ++ } ++ ++ c->isfullscreen = fullscreen; ++ ++ /* Some clients, e.g. firefox, will send a client message informing the window manager ++ * that it is going into fullscreen after receiving the above signal. This has the side ++ * effect of this function (setfullscreen) sometimes being called twice when toggling ++ * fullscreen on and off via the window manager as opposed to the application itself. ++ * To protect against obscure issues where the client settings are stored or restored ++ * when they are not supposed to we add an additional bit-lock on the old state so that ++ * settings can only be stored and restored in that precise order. */ ++ if (savestate && !(c->oldstate & (1 << 1))) { + c->oldbw = c->bw; ++ c->oldstate = c->isfloating | (1 << 1); + 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; ++ } else if (restorestate && (c->oldstate & (1 << 1))) { + c->bw = c->oldbw; +- c->x = c->oldx; +- c->y = c->oldy; +- c->w = c->oldw; +- c->h = c->oldh; ++ c->isfloating = c->oldstate = c->oldstate & 1; ++ if (restorefakefullscreen || c->fakefullscreen == 3) ++ c->fakefullscreen = 1; ++ /* The client may have been moved to another monitor whilst in fullscreen which if tiled ++ * we address by doing a full arrange of tiled clients. If the client is floating then the ++ * height and width may be larger than the monitor's window area, so we cap that by ++ * ensuring max / min values. */ ++ if (c->isfloating) { ++ c->x = MAX(c->mon->wx, c->oldx); ++ c->y = MAX(c->mon->wy, c->oldy); ++ c->w = MIN(c->mon->ww - c->x - 2*c->bw, c->oldw); ++ c->h = MIN(c->mon->wh - c->y - 2*c->bw, c->oldh); ++ resizeclient(c, c->x, c->y, c->w, c->h); ++ restack(c->mon); ++ } else ++ arrange(c->mon); ++ } else + resizeclient(c, c->x, c->y, c->w, c->h); +- arrange(c->mon); +- } ++ ++ /* Exception: if the client was in actual fullscreen and we exit out to fake fullscreen ++ * mode, then the focus would sometimes drift to whichever window is under the mouse cursor ++ * at the time. To avoid this we ask X for all EnterNotify events and just ignore them. ++ */ ++ if (!c->isfullscreen) ++ while (XCheckMaskEvent(dpy, EnterWindowMask, &ev)); + } + + void +@@ -1669,9 +1740,19 @@ tag(const Arg *arg) + void + tagmon(const Arg *arg) + { +- if (!selmon->sel || !mons->next) ++ Client *c = selmon->sel; ++ if (!c || !mons->next) + return; +- sendmon(selmon->sel, dirtomon(arg->i)); ++ if (c->isfullscreen) { ++ c->isfullscreen = 0; ++ sendmon(c, dirtomon(arg->i)); ++ c->isfullscreen = 1; ++ if (c->fakefullscreen != 1) { ++ resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh); ++ XRaiseWindow(dpy, c->win); ++ } ++ } else ++ sendmon(c, dirtomon(arg->i)); + } + + void +@@ -1711,18 +1792,51 @@ togglebar(const Arg *arg) + arrange(selmon); + } + ++void ++togglefakefullscreen(const Arg *arg) ++{ ++ Client *c = selmon->sel; ++ if (!c) ++ return; ++ ++ if (c->fakefullscreen != 1 && c->isfullscreen) { // exit fullscreen --> fake fullscreen ++ c->fakefullscreen = 2; ++ setfullscreen(c, 0); ++ } else if (c->fakefullscreen == 1) { ++ setfullscreen(c, 0); ++ c->fakefullscreen = 0; ++ } else { ++ c->fakefullscreen = 1; ++ setfullscreen(c, 1); ++ } ++} ++ + void + togglefloating(const Arg *arg) + { +- if (!selmon->sel) ++ Client *c = selmon->sel; ++ if (!c) + return; +- if (selmon->sel->isfullscreen) /* no support for fullscreen windows */ ++ if (c->isfullscreen && c->fakefullscreen != 1) /* 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); ++ c->isfloating = !c->isfloating || c->isfixed; ++ if (c->isfloating) ++ resize(c, c->x, c->y, c->w, c->h, 0); ++ arrange(c->mon); ++} ++ ++void ++togglefullscreen(const Arg *arg) ++{ ++ Client *c = selmon->sel; ++ if (!c) ++ return; ++ ++ if (c->fakefullscreen == 1) { // fake fullscreen --> fullscreen ++ c->fakefullscreen = 2; ++ setfullscreen(c, 1); ++ } else ++ setfullscreen(c, !c->isfullscreen); + } + + void +-- +2.45.2 + diff --git a/patches/dwm-games-6.6.diff b/patches/dwm-games-6.6.diff deleted file mode 100644 index ce4bbdb..0000000 --- a/patches/dwm-games-6.6.diff +++ /dev/null @@ -1,173 +0,0 @@ -From d06cefd6e1f8b5cd9bdfe694b7dc16da1f00d83e Mon Sep 17 00:00:00 2001 -From: Bakkeby -Date: Mon, 1 Jul 2024 22:19:15 +0200 -Subject: [PATCH] Game rule patch - -This patch adds a rule identifying clients as a "game" such that -if the client is in fullscreen and it loses focus (e.g. by moving -to another tag) then it will automatically be minimized (set to -IconicState and unmapped). - -When the client receives focus again (e.g. by going back to its -tag) then it will automaticaly be unminimized (set to NormalState -and mapped). This should address many of the black screen or window -is tiny after having moved to another tag and back again. - -This may conflict with the awesomebar patch which skips hidden -(iconic) windows when selecting which client to focus on, i.e. it -would be there but minimized and will not automatically unminimize. - -The function names are minimize and unminimize compared to the same -functions hide and show in the awesomebar patch. The name change is -due to two reasons; 1) because hide and show do something very -different compared to the showhide function and 2) because when -minimizing and unminimizing we do not want to trigger arrange or -a change in focus (which would affect the stacking order and thus -prevent the window receiving focus when we move back to the previous -tag). ---- - config.def.h | 4 +++- - dwm.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 50 insertions(+), 1 deletion(-) - -diff --git a/config.def.h b/config.def.h -index 9efa774..9df3c97 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -26,9 +26,11 @@ static const Rule rules[] = { - * WM_CLASS(STRING) = instance, class - * WM_NAME(STRING) = title - */ -- /* class instance title tags mask isfloating monitor */ -+ /* class instance title tags mask isfloating monitor isgame */ - { "Gimp", NULL, NULL, 0, 1, -1 }, - { "Firefox", NULL, NULL, 1 << 8, 0, -1 }, -+ { "Steam", NULL, NULL, 0, 0, -1, 1 }, -+ { "steam_app",NULL, NULL, 0, 0, -1, 1 }, - }; - - /* layout(s) */ -diff --git a/dwm.c b/dwm.c -index 1443802..29de39a 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 MINIMIZED(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) -@@ -92,6 +93,7 @@ struct Client { - int bw, oldbw; - unsigned int tags; - int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; -+ int isgame; - Client *next; - Client *snext; - Monitor *mon; -@@ -138,6 +140,7 @@ typedef struct { - unsigned int tags; - int isfloating; - int monitor; -+ int isgame; - } Rule; - - /* function declarations */ -@@ -180,6 +183,7 @@ 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 minimize(Client *c); - static void monocle(Monitor *m); - static void motionnotify(XEvent *e); - static void movemouse(const Arg *arg); -@@ -215,6 +219,7 @@ 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 unminimize(Client *c); - static void updatebarpos(Monitor *m); - static void updatebars(void); - static void updateclientlist(void); -@@ -298,6 +303,7 @@ applyrules(Client *c) - { - c->isfloating = r->isfloating; - c->tags |= r->tags; -+ c->isgame = r->isgame; - for (m = mons; m && m->num != r->monitor; m = m->next); - if (m) - c->mon = m; -@@ -1109,6 +1115,29 @@ maprequest(XEvent *e) - manage(ev->window, &wa); - } - -+void -+minimize(Client *c) -+{ -+ if (!c || MINIMIZED(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 - monocle(Monitor *m) - { -@@ -1475,6 +1504,10 @@ setfocus(Client *c) - XA_WINDOW, 32, PropModeReplace, - (unsigned char *) &(c->win), 1); - } -+ -+ if (c->isgame && c->isfullscreen) -+ unminimize(c); -+ - sendevent(c, wmatom[WMTakeFocus]); - } - -@@ -1766,6 +1799,10 @@ unfocus(Client *c, int setfocus) - { - if (!c) - return; -+ -+ if (c->isgame && c->isfullscreen) -+ minimize(c); -+ - grabbuttons(c, 0); - XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel); - if (setfocus) { -@@ -1814,6 +1851,16 @@ unmapnotify(XEvent *e) - } - } - -+void -+unminimize(Client *c) -+{ -+ if (!c || !MINIMIZED(c)) -+ return; -+ -+ XMapWindow(dpy, c->win); -+ setclientstate(c, NormalState); -+} -+ - void - updatebars(void) - { --- -2.50.1 -