<p>A lot of people when they move into linux will learn of the magic of tiling window managers. </p>
<p>Generally,
they are curious, and some find it as a waste of time, others die by it.
And people will even wonder why in the hell someone would take the time to configure one of these things.</p>
<p>However, I’m not here to debate whether or not it’s a waste of time, or if it’s worth it. I’m here to help out people who have heard of <ahref="https://dwm.suckless.org/">dwm</a> and want to try it out.
Whether you’ve heard it from a friend, a youtuber, a random, or whomever, people at first find dwm as a scary thing that’s <strong>IMPOSSIBLE</strong> to configure.</p>
<p>But fret not! For your neighborhood suckless shill is here to help!</p>
<h2id="prerequisites">Prerequisites</h2>
<p>Before you start going ham on the configuring/ricing, this isn’t your average joe i3, Hyprland, or whatever.
You’ve probably heard that dwm is a “compile from source” configuration, and this just means that
every change you’re going to make has to be compiled all over again.</p>
<p>“Woah, woah, woah!” you might be saying. “Compile? Like C code? H4x0r like stuff?”</p>
<p>Yep, that’s the ticket! But don’t let it scare you off. It’s simpler than it sounds. Think of it like baking a cake.
You have a recipe (<strong>config.h</strong>), you mix your ingredients (the source code and your changes), and then you bake it (<strong>make</strong>).
Each time you want a different flavor (a new feature or keybinding), you tweak the recipe and bake it again.
You will need to kill dwm and re-run it again since the binary that runs is loaded in memory, it doesn’t change in real time.</p>
<p>A common misconception is an over exaggeration on how tedious the reconfiguration is. Whilst it can be a bit annoying,
especially in the beginning when you are getting it tailored towards your preferences, it’s definitely overblown.
See, once you have a working system, there isn’t a need to keep on configuring onwards, a necessary process I would say.</p>
<p>So, what do you actually <em>need</em>?</p>
<h1id="a-c-compiler"><strong>A C Compiler:</strong></h1>
<p>Most likely, you’ll want <code>gcc</code>. It’s the most common C compiler everyone gets.</p>
<p>If you’re on a Debian-based system (like Mint), you can usually get this and other essential tools by installing <code>build-essential</code>.</p>
<p>This is a build automation tool that will, well, “<em>make</em>” dwm for you. It usually comes with the <code>build-essential</code> or <code>base-devel</code> packages.</p>
<h1id="libx11-development-files"><strong>LibX11 development files:</strong></h1>
<p>DWM interacts with the X Window System, so you’ll need the development headers for it. Often called something like <code>libx11-dev</code> or <code>libX11-devel</code>.</p>
<p><em>(Note: <code>libxft-dev</code> is for font rendering and <code>libxinerama-dev</code> is handy for multi-monitor setups, which you’ll probably want later on!)</em></p>
<p>Got all that? Sweet!</p>
<h2id="getting-the-goods-the-source-code">Getting the Goods (The Source Code!)</h2>
<p>Alright, let’s grab the dwm source code. The suckless crew hosts their code on their own git server.
However I recommend personally to get their official <ahref="https://dl.suckless.org/dwm/dwm-6.5.tar.gz">tarball releases</a> (this links to the latest of the time of writing this: 6.5) their <ahref="https://dwm.suckless.org/">page</a>.</p>
<li>Save the source code to where you want to keep it. A common spot is something like ~/.config/ or ~/.local/suckless/, just anywhere to hide it out of sight.</li>
<p>This is where the magic happens, folks. <code>config.def.h</code> is the <em>default</em> configuration. You’re not supposed to edit this directly. Instead, you copy it to <code>config.h</code>:</p>
<p>Now, config.h is <strong>your</strong> personal configuration file. Open it up with your favorite text editor. You’ll see C arrays defining your keys, your tags, your fonts, your colors.
<p>If all your prerequisites were met, this should complete without errors. You’ll now have a dwm executable file in the directory (and runnable in your terminal if
you ran the system wide installation)!</p>
<p>To run dwm, you’ll typically need to configure your .xinitrc file to launch it.
For example, you could add this line to your ~/.xinitrc:</p>
<p>For the people who run a Display Manager which is more likely (i.e gdm, sddm, lightdm, etc.). You’ll need to create a .desktop file.
This file basically has the information and stuff for the thing to see and run it. You’ll need to create one in the /usr/share/xsessions/.
And here’s an example <strong>dwm.desktop</strong> for reference:</p>
<p>The default keybinding for the Terminal is <em>Alt+Shift+Return</em>. Any other keybindings can be found in config.h, it shouldn’t be hard to
understand the giant struct declaration. Comments left by the suckless team are your friends! Read them!</p>
<h2id="uh-oh-its-plain-time-for-patches">Uh Oh, It’s Plain! Time for Patches!</h2>
<p>“Okay,” you say, “this is cool and all, but it’s a bit… barebones. My buddy’s dwm has gaps, a cool status bar, and fancy tag names!”</p>
<p>Aha! You’ve stumbled upon the next layer of the suckless philosophy: patching.</p>
<p>Instead of bloating the core dwm code with every feature under the sun, the suckless community maintains a collection of <ahref="https://dwm.suckless.org/patches/">patches</a>.
These are .diff files that you apply to your source code to add specific functionalities.</p>
<p>This is where the “do it yourself” ethos really shines. You pick and choose exactly what you want. However it might be daunting for some people.
And unfortunately, many patches don’t really like to work together. If you want a nice dwm patching experience, I would use <ahref="https://github.com/bakkeby/dwm-flexipatch">this one</a>,
he’s the same creator as <ahref="https://github.com/bakkeby/st-flexipatch">st-flexipatch</a> and other “flexipatch” series. Basically, all you do is edit the <strong>patches.h</strong> file
and you can basically get all the patches you want without too much hassle.</p>
<p>For those who are the tinkers, continue on…</p>
<h2id="how-to-patch-the-basics">How to Patch (The Basics)</h2>
<p>First of all, you’ll need to download the patch utility if you don’t have it. You can probably guess what it’ll be called when you install it using a
package manager. Once you’ve done that here are the general steps:</p>
<ol>
<li><p>Find a Patch: Head over to the dwm patches page. Find a patch you like. Let’s say you want the autostart patch,
which allows you to run commands automatically when dwm starts (I highly reccomend this especially if you’re running from a display manager!).</p></li>
<li><p>Download the Patch: Download the .diff file for the patch. Save it somewhere, perhaps in a patches subdirectory within your dwm source folder.</p></li>
<li><p>Resolve Conflicts (If Any): Sometimes, patches might conflict, especially if they modify the same lines of code or if you’re applying a patch meant
for an older version of dwm. This will result in .rej (rejected) files. You’ll need to manually edit the source files to resolve these conflicts, looking
at the .rej files to see what couldn’t be applied. This is the trickiest part, but it gets easier with practice. Start with simple, popular patches.</p></li>
<p>And that’s the patching dance! It can be a bit fiddly, especially when patches conflict, but it gives you incredible control over your window manager.
Also, a quick note! Some patches might change the config.def.h, add these new changes to your config.h since they are default configs for the new patches.</p>
<h2id="next-steps-the-suckless-mentality">Next Steps & The Suckless Mentality</h2>
<p>From here, the world is your oyster:</p>
<ul>
<li><strong>Explore config.h:</strong> Seriously, dive in. Change your mod key (Alt is default, many prefer the Super/Windows key, just change the MODKEY definition from Mod1Mask to Mod4Mask).
Change your fonts, colors, and tag names. Recompile after every change.</li>
<li><strong>Browse More Patches:</strong> Get those gaps (vanitygaps), add a systray, try different layouts (fibonacci, centeredmaster).</li>
<li><strong>Status Bar:</strong> Dwm’s status bar is typically populated by setting the root window’s name. You’ll often use a separate shell script or program (like slstatus or a custom script)
that periodically updates this. The autostart patch is great for launching such scripts. You can also decide to change out the bar to something like <ahref="https://polybar.github.io/">polybar</a> or something.</li>
<li><strong>Embrace Simplicity:</strong> The core idea of suckless is to keep things simple and understandable. If a patch seems overly complex or breaks things too often, maybe it’s not for you.
The beauty is in building your ideal, minimal environment.</li>
</ul>
<p>Don’t be afraid to break things! If you mess up your config.h or a patch goes horribly wrong, you can always run a <em>patch -R -i file.patch</em>. And for the config.h, the config.def.h
will always be there as the default to save you.</p>
<p>It’s a journey, not a race. You’ll learn a bit about C, a bit about how window managers work, and a lot about what you really want from your desktop.</p>
<p>So go forth, compile, patch, and make dwm your own! It’s less about having a flashy setup (though you can certainly make it look nice) and more about having a tool that’s perfectly
tailored to you. Less is indeed more, especially when you’re the one deciding what that “less” consists of.</p>