The crash error was:
dwm: fatal error: request code=12, error code=11
X Error of failed request: BadAlloc (insufficient resources for operation)
Major opcode of failed request: 12 (X_ConfigureWindow)
Serial number of failed request: 3333
Current serial number in output stream: 3338
This was backtracked to function updatesystray where XConfigureWindow was
called with large negative X positions (e.g. -836585). The large number
coming from the width of the systray icon.
w += i->w;
The systray icon width is set through the updatesystrayicongeom function
and this is called by resizerequest, clientmessage and propertynotify.
The height and width would appear to come from the X window attributes and
sometimes have random values (e.g. height 32708 and width 1369918222).
updatesystrayicongeom restricts the height of the icon to that of the bar,
but did not have any restictions on the icon width. This fix limits the
icon width to that of the bar height if it is greater than twice the bar
height, leaving room for systray icons that are slightly wider than they
are tall.
Text from original patch:
Using pango markup for status text
Use a single font. Removed some code utf8 code from drw.
Created for pango 1.44. Older versions might not have getter
for font height, ascent + descent can be used instead.
All texts are rendered with pango but only status is with
markup. Increased stext size (in case a lot of markup is used).
MIN/MAX is already defined (didn't redefine them).
Text width calculations when using status2d strings resulted in
statuscmd button placement calculations to be way off. Fixed by
introducing a separate function status2dtextlength to get an
approximate correct text width.
This is an updated version of the statuscolors patch that fixes the
computation of the text width. The previous version of the patch
inculded all the byte codes that are used to select the color schemes
when computing the width, obaining a width that is larger than the real
width. This patch fixes that by adding up the widths of the individual
chunks, separated by the codes that select the color schemes.
This patch enables multiple scratchpads, each with one assigned window.
This enables the same scratchpad workflow that you have in i3.
Scratchpads are implemented as special tags, whose mask does not
apply to new spawned windows. To assign a window to a scratchpad you
have to set up a rule, as you do with regular tags.
Windows tagged with scratchpad tags can be set floating or not in the
rules array. Most users would probably want them floating (i3 style),
but having them tiled does also perfectly work and might fit better the
DWM approach. In case they are set floating, the patch moves them to the
center of the screen whenever the are shown. The patch can easily be
modified to make this last feature configurable in the rules array (see
the center patch).
The togglescratch function, borrowed from the previous scratchpad patch
and slightly modified, can be used to spawn a registered scratchpad
process or toggle its view. This function looks for a window tagged on
the selected scratchpad. If it is found its view is toggled. If it is
not found the corresponding registered command is spawned. The
config.def.h shows three examples of its use to spawn a terminal in the
first scratchpad tag, a second terminal running ranger on the second
scratchpad tag and the keepassxc application to manage passwords on a
third scratchpad tag.
If you prefer to spawn your scratchpad applications from the startup
script, you might opt for binding keys to toggleview instead, as
scratchpads are just special tags (you may even extend the TAGKEYS macro
to generalize the key bindings).