From a3bca752daebd86f2ef2929876709d7675c732d5 Mon Sep 17 00:00:00 2001 From: bjarke-cachy-btw Date: Wed, 15 Jul 2026 22:33:00 +0200 Subject: [PATCH] use games patch --- config.def.h.orig | 2 - config.def.h.rej | 44 ++----- config.h | 35 ++--- dwm | Bin 100872 -> 100936 bytes dwm.c | 86 ++++++++---- dwm.c.orig | 263 +++++++++---------------------------- dwm.c.rej | 49 ++----- dwm.o | Bin 97640 -> 98624 bytes patches/dwm-games-6.6.diff | 173 ++++++++++++++++++++++++ patches/dwm-steam-6.6.diff | 72 ---------- 10 files changed, 338 insertions(+), 386 deletions(-) create mode 100644 patches/dwm-games-6.6.diff delete mode 100644 patches/dwm-steam-6.6.diff diff --git a/config.def.h.orig b/config.def.h.orig index d749030..96e3ebc 100644 --- a/config.def.h.orig +++ b/config.def.h.orig @@ -15,8 +15,6 @@ static const unsigned int gappov = 30; /* vert outer gap between window static int smartgaps = 0; /* 1 means no outer gap when there is only one window */ static const int showbar = 1; /* 0 means no bar */ static const int topbar = 1; /* 0 means bottom bar */ -static int iconsize = 16; /* icon size */ -static int iconspacing = 5; /* space between icon and title */ static const char *fonts[] = { "monospace:size=10" }; static const char dmenufont[] = "monospace:size=10"; static const char col_gray1[] = "#222222"; diff --git a/config.def.h.rej b/config.def.h.rej index ee73f24..36b8c7c 100644 --- a/config.def.h.rej +++ b/config.def.h.rej @@ -1,33 +1,15 @@ --- config.def.h +++ config.def.h -@@ -67,8 +68,10 @@ static const Key keys[] = { - { MODKEY, XK_p, spawn, {.v = dmenucmd } }, - { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, - { MODKEY, XK_b, togglebar, {0} }, -- { MODKEY, XK_j, focusstack, {.i = +1 } }, -- { MODKEY, XK_k, focusstack, {.i = -1 } }, -+ { MODKEY, XK_j, focusstackvis, {.i = +1 } }, -+ { MODKEY, XK_k, focusstackvis, {.i = -1 } }, -+ { MODKEY|ShiftMask, XK_j, focusstackhid, {.i = +1 } }, -+ { MODKEY|ShiftMask, XK_k, focusstackhid, {.i = -1 } }, - { MODKEY, XK_i, incnmaster, {.i = +1 } }, - { MODKEY, XK_d, incnmaster, {.i = -1 } }, - { MODKEY, XK_h, setmfact, {.f = -0.05} }, -@@ -87,6 +90,9 @@ static const Key keys[] = { - { MODKEY, XK_period, focusmon, {.i = +1 } }, - { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, - { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, -+ { MODKEY, XK_s, show, {0} }, -+ { MODKEY|ShiftMask, XK_s, showall, {0} }, -+ { MODKEY, XK_h, hide, {0} }, - TAGKEYS( XK_1, 0) - TAGKEYS( XK_2, 1) - TAGKEYS( XK_3, 2) -@@ -105,6 +111,7 @@ static const Button buttons[] = { - /* click event mask button function argument */ - { ClkLtSymbol, 0, Button1, setlayout, {0} }, - { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, -+ { ClkWinTitle, 0, Button1, togglewin, {0} }, - { ClkWinTitle, 0, Button2, zoom, {0} }, - { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, - { ClkClientWin, MODKEY, Button1, movemouse, {0} }, +@@ -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/config.h b/config.h index 99f12f7..286db91 100644 --- a/config.h +++ b/config.h @@ -49,20 +49,23 @@ static char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; static const Rule rules[] = { /* xprop(1): - * WM_CLASS(STRING) = instance, class - * WM_NAME(STRING) = title + * WM_CLASS(STRING) = instance, class + * WM_NAME(STRING) = title */ - /* class instance title tags mask isfloating isterminal monitor */ - { "Playground", NULL, NULL, 0, 1, -1 }, + /* class instance title tags mask isfloating monitor isgame */ + { "Playground", NULL, NULL, 0, 1, -1, 0 }, - { "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 }, + { "Steam", NULL, NULL, 1 << 1, 0, -1, 1 }, + { "steam_app", NULL, NULL, 0, 0, -1, 1 }, + + { "Firefox", NULL, NULL, 1 << 2, 0, -1, 0 }, + { "brave-browser", NULL, NULL, 1 << 3, 0, -1, 0 }, + { "discord", NULL, NULL, 1 << 4, 0, -1, 0 }, + { "feishin", NULL, NULL, 1 << 5, 0, -1, 0 }, + + { NULL, "spterm", NULL, SPTAG(0), 1, -1, 0 }, + { NULL, "spfm", NULL, SPTAG(1), 1, -1, 0 }, + { NULL, "keepassxc", NULL, SPTAG(2), 0, -1, 0 }, }; /* layout(s) */ @@ -164,9 +167,9 @@ static const Key keys[] = { /* cycle layouts */ { MODKEY, XK_n, cyclelayout, {.i = +1 } }, - { MODKEY|ShiftMask, XK_h, setcfact, {.f = +0.25} }, - { MODKEY|ShiftMask, XK_l, setcfact, {.f = -0.25} }, - { MODKEY|ShiftMask, XK_o, setcfact, {.f = 0.00} }, + { MODKEY|Mod1Mask, XK_h, setcfact, {.f = +0.25} }, + { MODKEY|Mod1Mask, XK_l, setcfact, {.f = -0.25} }, + { MODKEY|Mod1Mask, XK_o, setcfact, {.f = 0.00} }, { MODKEY|Mod1Mask, XK_u, incrgaps, {.i = +1 } }, { MODKEY|Mod1Mask|ShiftMask, XK_u, incrgaps, {.i = -1 } }, { MODKEY|Mod1Mask, XK_i, incrigaps, {.i = +1 } }, @@ -194,7 +197,7 @@ static const Key keys[] = { { MODKEY, XK_s, show, {0} }, { MODKEY|ShiftMask, XK_s, showall, {0} }, - { MODKEY|ShiftMask, XK_h, hide, {0} }, + { MODKEY|ShiftMask, XK_v, hide, {0} }, { MODKEY, XK_space, setlayout, {0} }, { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, diff --git a/dwm b/dwm index a3ccd6c983d840ad9d9f24700ecffb6dacd82e88..cf4538b68407ba2ded805c99cfb36ecc520ef087 100755 GIT binary patch delta 30266 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śSEUX7R0Ry5BG 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 delta 29791 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 diff --git a/dwm.c b/dwm.c index ca16a6a..1a1b86b 100644 --- a/dwm.c +++ b/dwm.c @@ -51,6 +51,7 @@ * MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy))) #define ISVISIBLEONTAG(C, T) ((C->tags & T)) #define ISVISIBLE(C) ISVISIBLEONTAG(C, C->mon->tagset[C->mon->seltags]) +#define MINIMIZED(C) ((getstate(C->win) == IconicState)) #define HIDDEN(C) ((getstate(C->win) == IconicState)) #define MOUSEMASK (BUTTONMASK|PointerMotionMask) #define WIDTH(X) ((X)->w + 2 * (X)->bw) @@ -114,7 +115,7 @@ struct Client { int bw, oldbw; unsigned int tags; int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; - int issteam; + int isgame; int fakefullscreen; Client *next; Client *snext; @@ -169,6 +170,7 @@ typedef struct { unsigned int tags; int isfloating; int monitor; + int isgame; } Rule; typedef struct Systray Systray; @@ -226,6 +228,7 @@ 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); @@ -282,6 +285,7 @@ static void togglewin(const Arg *arg); static void unfocus(Client *c, int setfocus); static void unmanage(Client *c, int destroyed); static void unmapnotify(XEvent *e); +static void unminimize(Client *c); static void updatecurrentdesktop(void); static void updatebarpos(Monitor *m); static void updatebars(void); @@ -408,9 +412,6 @@ applyrules(Client *c) class = ch.res_class ? ch.res_class : broken; instance = ch.res_name ? ch.res_name : broken; - if (strstr(class, "Steam") || strstr(class, "steam_app_")) - c->issteam = 1; - for (i = 0; i < LENGTH(rules); i++) { r = &rules[i]; if ((!r->title || strstr(c->name, r->title)) @@ -419,6 +420,7 @@ applyrules(Client *c) { 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); @@ -800,15 +802,13 @@ configurerequest(XEvent *e) c->bw = ev->border_width; else if (c->isfloating || !selmon->lt[selmon->sellt]->arrange) { m = c->mon; - if (!c->issteam) { - if (ev->value_mask & CWX) { - c->oldx = c->x; - c->x = m->mx + ev->x; - } - if (ev->value_mask & CWY) { - c->oldy = c->y; - c->y = m->my + ev->y; - } + if (ev->value_mask & 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; @@ -1566,6 +1566,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) { @@ -1832,17 +1855,19 @@ propertynotify(XEvent *e) void quit(const Arg *arg) { - // fix: reloading dwm keeps all the hidden clients hidden - Monitor *m; - Client *c; - for (m = mons; m; m = m->next) { - if (m) { - for (c = m->stack; c; c = c->next) - if (c && HIDDEN(c)) showwin(c); + if(arg->i) restart = 1; + if (!restart) { + // fix: reloading dwm keeps all the hidden clients hidden + Monitor *m; + Client *c; + for (m = mons; m; m = m->next) { + if (m) { + for (c = m->stack; c; c = c->next) + if (c && HIDDEN(c)) showwin(c); + } } } - if(arg->i) restart = 1; running = 0; } @@ -2134,8 +2159,9 @@ setfocus(Client *c) XA_WINDOW, 32, PropModeReplace, (unsigned char *) &(c->win), 1); } - if (c->issteam) - setclientstate(c, NormalState); + + if (c->isgame && c->isfullscreen) + unminimize(c); sendevent(c->win, wmatom[WMTakeFocus], NoEventMask, wmatom[WMTakeFocus], CurrentTime, 0, 0, 0); } @@ -2662,6 +2688,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) { @@ -2716,6 +2746,16 @@ unmapnotify(XEvent *e) } } +void +unminimize(Client *c) +{ + if (!c || !MINIMIZED(c)) + return; + + XMapWindow(dpy, c->win); + setclientstate(c, NormalState); +} + void updatebars(void) { diff --git a/dwm.c.orig b/dwm.c.orig index a24e352..4fbf4c0 100644 --- a/dwm.c.orig +++ b/dwm.c.orig @@ -25,7 +25,6 @@ #include #include #include -#include #include #include #include @@ -52,6 +51,7 @@ * MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy))) #define ISVISIBLEONTAG(C, T) ((C->tags & T)) #define ISVISIBLE(C) ISVISIBLEONTAG(C, C->mon->tagset[C->mon->seltags]) +#define MINIMIZED(C) ((getstate(C->win) == IconicState)) #define HIDDEN(C) ((getstate(C->win) == IconicState)) #define MOUSEMASK (BUTTONMASK|PointerMotionMask) #define WIDTH(X) ((X)->w + 2 * (X)->bw) @@ -79,7 +79,7 @@ /* enums */ enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ enum { SchemeNorm, SchemeSel, SchemeHid }; /* color schemes */ -enum { NetSupported, NetWMName, NetWMIcon, NetWMState, NetWMCheck, +enum { NetSupported, NetWMName, NetWMState, NetWMCheck, NetSystemTray, NetSystemTrayOP, NetSystemTrayOrientation, NetSystemTrayOrientationHorz, NetWMFullscreen, NetActiveWindow, NetWMWindowType, NetWMWindowTypeDialog, NetClientList, NetClientInfo, NetDesktopNames, NetDesktopViewport, NetNumberOfDesktops, NetCurrentDesktop, NetLast }; /* EWMH atoms */ @@ -115,9 +115,8 @@ struct Client { int bw, oldbw; unsigned int tags; int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; - unsigned int icw, ich; - Picture icon; int issteam; + int isgame; int fakefullscreen; Client *next; Client *snext; @@ -172,6 +171,7 @@ typedef struct { unsigned int tags; int isfloating; int monitor; + int isgame; } Rule; typedef struct Systray Systray; @@ -188,7 +188,6 @@ static void arrangemon(Monitor *m); static void attach(Client *c); static void attachaside(Client *c); static void attachstack(Client *c); -static uint32_t *bilinear_scale(const uint32_t *src, int sw, int sh, uint32_t dw, uint32_t dh); static void buttonpress(XEvent *e); static void checkotherwm(void); static void cleanup(void); @@ -214,11 +213,9 @@ static void focusmon(const Arg *arg); static void focusstackvis(const Arg *arg); static void focusstackhid(const Arg *arg); static void focusstack(int inc, int vis); -static void freeicon(Client *c); static Atom getatomprop(Client *c, Atom prop); static int getrootptr(int *x, int *y); static long getstate(Window w); -static Picture geticonprop(Display *dpy, Window w, int iconsize, unsigned int *icw, unsigned int *ich); static unsigned int getsystraywidth(); static int gettextprop(Window w, Atom atom, char *text, unsigned int size); static void grabbuttons(Client *c, int focused); @@ -232,6 +229,7 @@ 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); @@ -239,7 +237,6 @@ static Client *nexttagged(Client *c); static Client *nexttiled(Client *c); static void placedir(const Arg *arg); static void pop(Client *c); -static uint32_t prealpha(uint32_t p); static void propertynotify(XEvent *e); static void quit(const Arg *arg); static Monitor *recttomon(int x, int y, int w, int h); @@ -289,12 +286,12 @@ static void togglewin(const Arg *arg); static void unfocus(Client *c, int setfocus); static void unmanage(Client *c, int destroyed); static void unmapnotify(XEvent *e); +static void unminimize(Client *c); static void updatecurrentdesktop(void); static void updatebarpos(Monitor *m); static void updatebars(void); static void updateclientlist(void); static int updategeom(void); -static void updateicon(Client *c); static void updatenumlockmask(void); static void updatesizehints(Client *c); static void updatestatus(void); @@ -427,6 +424,7 @@ applyrules(Client *c) { 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); @@ -559,57 +557,6 @@ attachstack(Client *c) c->mon->stack = c; } -uint32_t * -bilinear_scale(const uint32_t *src, int sw, int sh, unsigned int dw, unsigned int dh) -{ - uint32_t *dst = calloc(dw * dh, sizeof(uint32_t)); - if (!dst) return NULL; - - for (int y = 0; y < dh; y++) { - /* Source position (in fixed-point) */ - float sy = (y + 0.5f) * sh / (float)dh - 0.5f; - int y0 = (sy < 0) ? (int)(sy - 1) : (int)(sy);; - int y1 = y0 + 1; - float fy = sy - y0; - if (y0 < 0) { y0 = 0; y1 = 0; fy = 0; } - if (y1 >= sh) { y1 = sh-1; y0 = y1; fy = 0; } - - for (int x = 0; x < dw; x++) { - float sx = (x + 0.5f) * sw / (float)dw - 0.5f; - int x0 = (sx < 0) ? (int)(sx - 1) : (int)(sx); - int x1 = x0 + 1; - float fx = sx - x0; - if (x0 < 0) { x0 = 0; x1 = 0; fx = 0; } - if (x1 >= sw) { x1 = sw-1; x0 = x1; fx = 0; } - - uint32_t p00 = prealpha(src[y0*sw + x0]); - uint32_t p10 = prealpha(src[y0*sw + x1]); - uint32_t p01 = prealpha(src[y1*sw + x0]); - uint32_t p11 = prealpha(src[y1*sw + x1]); - - /* Extract premultiplied channels */ - int a00 = p00 >> 24, r00 = (p00 >> 16) & 0xFF, g00 = (p00 >> 8) & 0xFF, b00 = p00 & 0xFF; - int a10 = p10 >> 24, r10 = (p10 >> 16) & 0xFF, g10 = (p10 >> 8) & 0xFF, b10 = p10 & 0xFF; - int a01 = p01 >> 24, r01 = (p01 >> 16) & 0xFF, g01 = (p01 >> 8) & 0xFF, b01 = p01 & 0xFF; - int a11 = p11 >> 24, r11 = (p11 >> 16) & 0xFF, g11 = (p11 >> 8) & 0xFF, b11 = p11 & 0xFF; - - /* Bilinear weights */ - float w00 = (1.0f - fx) * (1.0f - fy); - float w10 = fx * (1.0f - fy); - float w01 = (1.0f - fx) * fy; - float w11 = fx * fy; - - int a = (int)(a00*w00 + a10*w10 + a01*w01 + a11*w11 + 0.5f); - int r = (int)(r00*w00 + r10*w10 + r01*w01 + r11*w11 + 0.5f); - int g = (int)(g00*w00 + g10*w10 + g01*w01 + g11*w11 + 0.5f); - int b = (int)(b00*w00 + b10*w10 + b01*w01 + b11*w11 + 0.5f); - - dst[y*dw + x] = (a << 24) | (r << 16) | (g << 8) | b; - } - } - return dst; -} - void buttonpress(XEvent *e) { @@ -1057,12 +1004,7 @@ drawbar(Monitor *m) } remainder--; } - if (c->icon) { - drw_text(drw, x, 0, w > m->ww - tw - stw - x ? m->ww - tw - stw - x : w, bh, lrpad / 2 + c->ich + iconspacing, c->name, 0); - drw_pic(drw, x + lrpad / 2, (bh - c->ich) / 2, c->icw, c->ich, c->icon); - } else { - drw_text(drw, x, 0, tabw > m->ww - tw - stw - x ? m->ww - tw - stw - x : tabw, bh, lrpad / 2, c->name, 0); - } + drw_text(drw, x, 0, tabw > m->ww - tw - stw - x ? m->ww - tw - stw - x : tabw, bh, lrpad / 2, c->name, 0); x += tabw; } } else { @@ -1290,15 +1232,6 @@ focusstack(int inc, int hid) } } -void -freeicon(Client *c) -{ - if (c->icon) { - XRenderFreePicture(dpy, c->icon); - c->icon = None; - } -} - Atom getatomprop(Client *c, Atom prop) { @@ -1361,104 +1294,6 @@ getstate(Window w) return result; } -/* geticonprop: read, scale, and return an XRender Picture */ -Picture -geticonprop(Display *dpy, Window win, int iconsize, unsigned int *icw, unsigned int *ich) { - Atom net_wm_icon = XInternAtom(dpy, "_NET_WM_ICON", False); - Atom actual_type; - int actual_format; - unsigned long nitems, bytes_after; - unsigned char *data = NULL; - Picture pict = None; - - if (XGetWindowProperty(dpy, win, net_wm_icon, 0, LONG_MAX, False, AnyPropertyType, - &actual_type, &actual_format, &nitems, &bytes_after, &data) != Success || !data) { - return None; - } - - unsigned long *p = (unsigned long *)data; - unsigned long *end = p + nitems; - - /* Pick icon closest to desired size */ - unsigned long *best = NULL; - unsigned long best_w = 0, best_h = 0; - unsigned long best_diff = ~0UL; - - while (p + 2 < end) { - unsigned long w0 = *p++; - unsigned long h0 = *p++; - if (w0 == 0 || h0 == 0 || p + w0*h0 > end) break; - - unsigned long diff = (w0 > (unsigned long)iconsize ? w0 - iconsize : iconsize - w0) - + (h0 > (unsigned long)iconsize ? h0 - iconsize : iconsize - h0); - - if (diff < best_diff) { - best_diff = diff; - best_w = w0; - best_h = h0; - best = p; - } - p += w0 * h0; - } - - if (!best) { - XFree(data); - return None; - } - - /* Copy into fixed 32-bit array */ - uint32_t *src = malloc(best_w * best_h * sizeof(uint32_t)); - for (size_t i = 0; i < best_w * best_h; i++) - src[i] = (uint32_t)best[i]; - - /* Scale */ - int dst_w, dst_h; - if (best_w > best_h) { - dst_w = iconsize; - dst_h = best_h * iconsize / best_w; - } else { - dst_h = iconsize; - dst_w = best_w * iconsize / best_h; - } - - uint32_t *scaled = bilinear_scale(src, best_w, best_h, dst_w, dst_h); - free(src); - XFree(data); - if (!scaled) return None; - - /* Create pixmap and upload pixels */ - Pixmap pm = XCreatePixmap(dpy, root, dst_w, dst_h, 32); - - XImage img; - memset(&img, 0, sizeof img); - img.width = dst_w; - img.height = dst_h; - img.format = ZPixmap; - img.data = (char*)scaled; - img.byte_order = LSBFirst; - img.bitmap_unit = 32; - img.bitmap_bit_order = LSBFirst; - img.bitmap_pad = 32; - img.depth = 32; - img.bits_per_pixel = 32; - img.bytes_per_line = dst_w * 4; - - XInitImage(&img); - GC gc = XCreateGC(dpy, pm, 0, NULL); - XPutImage(dpy, pm, gc, &img, 0, 0, 0, 0, dst_w, dst_h); - XFreeGC(dpy, gc); - - XRenderPictFormat *fmt = XRenderFindStandardFormat(dpy, PictStandardARGB32); - pict = XRenderCreatePicture(dpy, pm, fmt, 0, NULL); - XFreePixmap(dpy, pm); - - free(scaled); - - *icw = dst_w; - *ich = dst_h; - return pict; -} - int gettextprop(Window w, Atom atom, char *text, unsigned int size) { @@ -1640,7 +1475,6 @@ manage(Window w, XWindowAttributes *wa) c->oldbw = wa->border_width; c->cfact = 1.0; - updateicon(c); updatetitle(c); if (XGetTransientForHint(dpy, w, &trans) && (t = wintoclient(trans))) { c->mon = t->mon; @@ -1738,6 +1572,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) { @@ -1953,14 +1810,6 @@ pop(Client *c) arrange(c->mon); } -uint32_t -prealpha(uint32_t p) { - uint8_t a = p >> 24u; - uint32_t rb = (a * (p & 0xFF00FFu)) >> 8u; - uint32_t g = (a * (p & 0x00FF00u)) >> 8u; - return (rb & 0xFF00FFu) | (g & 0x00FF00u) | (a << 24u); -} - void propertynotify(XEvent *e) { @@ -2004,11 +1853,6 @@ propertynotify(XEvent *e) if (c == c->mon->sel) drawbar(c->mon); } - if (ev->atom == netatom[NetWMIcon]) { - updateicon(c); - if (c == c->mon->sel) - drawbar(c->mon); - } if (ev->atom == netatom[NetWMWindowType]) updatewindowtype(c); } @@ -2017,17 +1861,19 @@ propertynotify(XEvent *e) void quit(const Arg *arg) { - // fix: reloading dwm keeps all the hidden clients hidden - Monitor *m; - Client *c; - for (m = mons; m; m = m->next) { - if (m) { - for (c = m->stack; c; c = c->next) - if (c && HIDDEN(c)) showwin(c); + if(arg->i) restart = 1; + if (!restart) { + // fix: reloading dwm keeps all the hidden clients hidden + Monitor *m; + Client *c; + for (m = mons; m; m = m->next) { + if (m) { + for (c = m->stack; c; c = c->next) + if (c && HIDDEN(c)) showwin(c); + } } } - if(arg->i) restart = 1; running = 0; } @@ -2319,6 +2165,10 @@ setfocus(Client *c) XA_WINDOW, 32, PropModeReplace, (unsigned char *) &(c->win), 1); } + + if (c->isgame && c->isfullscreen) + unminimize(c); + if (c->issteam) setclientstate(c, NormalState); @@ -2494,7 +2344,6 @@ setup(void) netatom[NetSystemTrayOrientation] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_ORIENTATION", False); netatom[NetSystemTrayOrientationHorz] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_ORIENTATION_HORZ", False); netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); - netatom[NetWMIcon] = XInternAtom(dpy, "_NET_WM_ICON", False); netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False); netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", False); netatom[NetWMFullscreen] = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False); @@ -2848,6 +2697,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) { @@ -2864,7 +2717,6 @@ unmanage(Client *c, int destroyed) detach(c); detachstack(c); - freeicon(c); if (!destroyed) { wc.border_width = c->oldbw; XGrabServer(dpy); /* avoid race conditions */ @@ -2903,6 +2755,16 @@ unmapnotify(XEvent *e) } } +void +unminimize(Client *c) +{ + if (!c || !MINIMIZED(c)) + return; + + XMapWindow(dpy, c->win); + setclientstate(c, NormalState); +} + void updatebars(void) { @@ -2967,13 +2829,6 @@ void updatecurrentdesktop(void){ XChangeProperty(dpy, root, netatom[NetCurrentDesktop], XA_CARDINAL, 32, PropModeReplace, (unsigned char *)data, 1); } -void -updateicon(Client *c) -{ - freeicon(c); - c->icon = geticonprop(dpy, c->win, iconsize, &c->icw, &c->ich); -} - int updategeom(void) { diff --git a/dwm.c.rej b/dwm.c.rej index e8b02c3..660493a 100644 --- a/dwm.c.rej +++ b/dwm.c.rej @@ -1,46 +1,19 @@ --- dwm.c +++ dwm.c -@@ -59,7 +58,7 @@ - /* enums */ - enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ - enum { SchemeNorm, SchemeSel }; /* color schemes */ --enum { NetSupported, NetWMName, NetWMIcon, NetWMState, NetWMCheck, -+enum { NetSupported, NetWMName, NetWMState, NetWMCheck, - NetWMFullscreen, NetActiveWindow, NetWMWindowType, - NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ - enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ -@@ -92,8 +91,6 @@ struct Client { +@@ -92,7 +92,6 @@ struct Client { int bw, oldbw; unsigned int tags; int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; -- unsigned int icw, ich; -- Picture icon; +- int issteam; Client *next; Client *snext; Monitor *mon; -@@ -170,11 +166,9 @@ static void focus(Client *c); - static void focusin(XEvent *e); - static void focusmon(const Arg *arg); - static void focusstack(const Arg *arg); --static void freeicon(Client *c); - static Atom getatomprop(Client *c, Atom prop); - static int getrootptr(int *x, int *y); - static long getstate(Window w); --static Picture geticonprop(Display *dpy, Window w, int iconsize, unsigned int *icw, unsigned int *ich); - static int gettextprop(Window w, Atom atom, char *text, unsigned int size); - static void grabbuttons(Client *c, int focused); - static void grabkeys(void); -@@ -740,12 +681,7 @@ drawbar(Monitor *m) - if ((w = m->ww - tw - x) > bh) { - if (m->sel) { - drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); -- if (m->sel->icon) { -- drw_text(drw, x, 0, w, bh, lrpad / 2 + m->sel->icw + iconspacing, m->sel->name, 0); -- drw_pic(drw, x + lrpad / 2, (bh - m->sel->ich) / 2, m->sel->icw, m->sel->ich, m->sel->icon); -- } else { -- drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); -- } -+ 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 { +@@ -1476,8 +1470,6 @@ setfocus(Client *c) + XA_WINDOW, 32, PropModeReplace, + (unsigned char *) &(c->win), 1); + } +- if (c->issteam) +- setclientstate(c, NormalState); + sendevent(c, wmatom[WMTakeFocus]); + } + diff --git a/dwm.o b/dwm.o index 9ec1f01f3e771e5272b66bb9a4fddecb739a94d9..f4392cd97d2bf0187708dbd65145a10b2311ef76 100644 GIT binary patch delta 36102 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 delta 35045 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 JOWkJc{|Cn0GdlnP diff --git a/patches/dwm-games-6.6.diff b/patches/dwm-games-6.6.diff new file mode 100644 index 0000000..ce4bbdb --- /dev/null +++ b/patches/dwm-games-6.6.diff @@ -0,0 +1,173 @@ +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 + diff --git a/patches/dwm-steam-6.6.diff b/patches/dwm-steam-6.6.diff deleted file mode 100644 index c6f5fd7..0000000 --- a/patches/dwm-steam-6.6.diff +++ /dev/null @@ -1,72 +0,0 @@ -From df7d9a685f38b64b8087faa3c72f05acf0190383 Mon Sep 17 00:00:00 2001 -From: Bakkeby -Date: Wed, 26 Jun 2024 23:06:37 +0200 -Subject: [PATCH] Steam patch - -Steam, and steam windows (games), trigger a ConfigureNotify request every time the window -gets focus. More so, the configure event passed along from Steam tends to have the wrong -x and y co-ordinates which can make the window, if floating, jump around the screen. - -This patch works around this age-old issue by ignoring the x and y co-ordinates for -ConfigureNotify requests relating to Steam windows. ---- - dwm.c | 22 +++++++++++++++------- - 1 file changed, 15 insertions(+), 7 deletions(-) - -diff --git a/dwm.c b/dwm.c -index 1443802..d99a6fb 100644 ---- a/dwm.c -+++ b/dwm.c -@@ -92,6 +92,7 @@ struct Client { - int bw, oldbw; - unsigned int tags; - int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; -+ int issteam; - Client *next; - Client *snext; - Monitor *mon; -@@ -290,6 +291,9 @@ applyrules(Client *c) - class = ch.res_class ? ch.res_class : broken; - instance = ch.res_name ? ch.res_name : broken; - -+ if (strstr(class, "Steam") || strstr(class, "steam_app_")) -+ c->issteam = 1; -+ - for (i = 0; i < LENGTH(rules); i++) { - r = &rules[i]; - if ((!r->title || strstr(c->name, r->title)) -@@ -590,13 +594,15 @@ configurerequest(XEvent *e) - c->bw = ev->border_width; - else if (c->isfloating || !selmon->lt[selmon->sellt]->arrange) { - m = c->mon; -- if (ev->value_mask & CWX) { -- c->oldx = c->x; -- c->x = m->mx + ev->x; -- } -- if (ev->value_mask & CWY) { -- c->oldy = c->y; -- c->y = m->my + ev->y; -+ if (!c->issteam) { -+ if (ev->value_mask & CWX) { -+ c->oldx = c->x; -+ c->x = m->mx + ev->x; -+ } -+ if (ev->value_mask & CWY) { -+ c->oldy = c->y; -+ c->y = m->my + ev->y; -+ } - } - if (ev->value_mask & CWWidth) { - c->oldw = c->w; -@@ -1475,6 +1481,8 @@ setfocus(Client *c) - XA_WINDOW, 32, PropModeReplace, - (unsigned char *) &(c->win), 1); - } -+ if (c->issteam) -+ setclientstate(c, NormalState); - sendevent(c, wmatom[WMTakeFocus]); - } - --- -2.50.1 -