From 5a0c5e617f4854e5fb64884d15d6f584c8f72b81 Mon Sep 17 00:00:00 2001 From: bakkeby Date: Fri, 22 Dec 2023 10:42:16 +0100 Subject: [PATCH] Adding the do-not-die-on-color-allocation-failure patch ref. #404 --- README.md | 6 ++++++ drw.c | 8 ++++++++ patches.def.h | 12 ++++++++++++ 3 files changed, 26 insertions(+) diff --git a/README.md b/README.md index fc6f331..38741c0 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,8 @@ Browsing patches? There is a [map of patches](https://coggle.it/diagram/X9IiSSM6 ### Changelog: +2023-12-22 - Added the do-not-die-on-color-allocation-failure patch + 2023-12-01 - Added the sendmoncenter patch 2023-11-12 - Added the focusmaster-return patch variant @@ -359,6 +361,10 @@ Browsing patches? There is a [map of patches](https://coggle.it/diagram/X9IiSSM6 - i.e. if topbar is 0 then dmenu will appear at the bottom and if 1 then dmenu will appear at the top + - do-not-die-on-color-allocation-failure + - avoids dwm terminating (dying) on color allocation failures + - useful for the xrdb (xresources) and status2d patches + - [dragcfact](https://github.com/bakkeby/patches/wiki/dragcfact/) - lets you resize clients' size (i.e. modify cfact) by holding modkey + shift + right-click and dragging the mouse diff --git a/drw.c b/drw.c index 2e74b20..8f81439 100644 --- a/drw.c +++ b/drw.c @@ -337,14 +337,22 @@ drw_clr_create( #if BAR_ALPHA_PATCH if (!XftColorAllocName(drw->dpy, drw->visual, drw->cmap, clrname, dest)) + #if DO_NOT_DIE_ON_COLOR_ALLOCATION_FAILURE_PATCH + fprintf(stderr, "warning, cannot allocate color '%s'", clrname); + #else die("error, cannot allocate color '%s'", clrname); + #endif // DO_NOT_DIE_ON_COLOR_ALLOCATION_FAILURE_PATCH dest->pixel = (dest->pixel & 0x00ffffffU) | (alpha << 24); #else if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen), DefaultColormap(drw->dpy, drw->screen), clrname, dest)) + #if DO_NOT_DIE_ON_COLOR_ALLOCATION_FAILURE_PATCH + fprintf(stderr, "warning, cannot allocate color '%s'", clrname); + #else die("error, cannot allocate color '%s'", clrname); + #endif // DO_NOT_DIE_ON_COLOR_ALLOCATION_FAILURE_PATCH #if NO_TRANSPARENT_BORDERS_PATCH dest->pixel |= 0xff << 24; diff --git a/patches.def.h b/patches.def.h index 4ec5351..90cedf9 100644 --- a/patches.def.h +++ b/patches.def.h @@ -572,6 +572,18 @@ */ #define DISTRIBUTETAGS_PATCH 0 +/* By default dwm will terminate on color allocation failure and the behaviour is intended to + * catch and inform the user of color configuration issues. + * + * Some patches like status2d and xresources / xrdb can change colours during runtime, which + * means that if a color can't be allocated at this time then the window manager will abruptly + * terminate. + * + * This patch will ignore color allocation failures and continue on as normal. The effect of + * this is that the existing color, that was supposed to be replaced, will remain as-is. + */ +#define DO_NOT_DIE_ON_COLOR_ALLOCATION_FAILURE_PATCH 0 + /* Similarly to the dragmfact patch this allows you to click and drag clients to change the * cfact to adjust the client's size in the stack. This patch depends on the cfacts patch. */