DEV Community

Cover image for Dwm: The Suckless Window Manager
Angad Sharma
Angad Sharma

Posted on

Dwm: The Suckless Window Manager

Dwm stands for Dynamic Window Manager. It is a minimalist tiling window manager designed specifically for X11. It is designed to be much smaller, faster and simpler than its alternatives.

The Suckless community claims that dwm's code is never intended to exceed 2000 SLOC (source lines of code). For those of you who are not familiar with the suckless philosophy, check out my blog on the same:

Dwm, like other suckless tools, is meant for the elitist, and suckless makes sure of that. There is no binary distribution of dwm. It is just a source file which you have to compile manually to get started. Customization requires editing the source directly and building it from scratch (which is easier than it looks, up ahead).


Features

  • Dwm is only a single binary, and its source code is intended to never exceed 2000 SLOC.

  • Customization is done by editing the source code, which is very easy to understand.

  • It uses a stack based system for managing windows, where the top of the stack is the master and the other windows are slaves.

  • It is extremely fast and packed with bare essentials. Additional layouts and functionalities can be added by patching, as is the suckless anti-bloat philosophy.


Setting Up

Execute the following commands to get started with dwm:

# clone the source repository
git clone git://git.suckless.org/dwm

# enter the directory
cd dwm

# run a clean installation
make clean install
Enter fullscreen mode Exit fullscreen mode

And you are good to go. As of Q1 2020, dwm 6.2 is the latest version. Now simply add the following line in your ~/.xinitrc:

exec dwm
Enter fullscreen mode Exit fullscreen mode

Now that you are all set, logout and log back in again. Once you do, you will see a blank screen with numbers on top. The screen is going to have your wallpaper on it by default. Something like this:

Alt Text


Getting Started

To spin up a terminal in dwm, just press the following: <Alt> + <shift> + <Enter>. If it doesn't work then checkout the changing keybindings section where I talk about remapping the key bindings and customizing which terminal should open up.

If you keep on opening terminals up then you will notice that the focus shifts to the newest terminal in the stack. A stack is a LIFO (last in first out) data structure. Dwm makes sure that the most attention goes to the recently opened program. You can choose between a lot of different layouts from dwm patches. The one I like to use is centeredmaster, which keeps the master terminal in the center of the screen.

Alt Text

If you want more than one master then you can even promote and demote master panes. <Alt> + i is used to promote the master and <Alt> + d is used for demoting it. Here is as example of two windows selected as master:

Alt Text


Tags

Notice that the top bar has a few numbers, starting from 1 to 9. These numbers are tags (workspaces) that we can switch between. To do so, simply hit <Alt> + [1-9]. For example <Alt> + 6 will take me to the 6th tag. Note that whatever was running on the previous tag keeps on running there as usual. The highlighted numbers indicate that there is something running on those tags.

You can move windows from to and from one or more tags. For example, for moving a window in tag 1 to tag 9, press the following commands in tag 1: <Alt> + <Shift> + 9.

To view all of the windows running in all of the tags at once, press <Alt> + 0. Tags are a very powerful way to switch between programs and view multiple programs at once.


Windows

Dwm is feature rich when it comes to managing windows, and has a lot of solutions to complex problems such as fixing a tag on all screens, promoting windows to master and demoting them to slaves.

Default key binding Action performed
<Alt> + [h/j/k/l] Move left-right-up an down windows
<Alt> + r Terminate current window
<Alt> + <Shift> + c Terminate the process running in the current window
<Alt> + <Shift> + q Logout
<Alt> + <Shift> + [1-9] Re-locate the current window to another tag
<Alt> + <Shift> + 0 To fix the current tag on all tags
<Alt> + p To spin up dmenu
<Alt> + i Promoting current window to master
<Alt> + d Demoting current window to slave

The default super (called a modifier in dwm, or Mod), <Alt> can be changed by editing the configuration.


Dmenu

Dmenu is a toolbar menu which can be used for easy access of programs. Simply press <Alt> + p to activate the menu, then type in the name of the program you want to execute.

Alt Text

Note that you do not have to have dwm to get dmenu. You can independently install it either by building it from source, or running the following command:

sudo apt install dmenu
Enter fullscreen mode Exit fullscreen mode

I started off with dmenu along with herbstluftwm, but now I use dmenu in very single window manager that I use.

You can even pass in arguments to programs using dmenu. Simply press spacebar after writing the name of the program you want to execute, then subsequently write the arguments that you want to pass in to the program.


Configuration and Patching

Configuring and patching dwm might be difficult for beginners. I will try to make it as simple as I can by taking two examples:

  • Changing the default keybinding of the terminal.
  • Installing centeredmaster layout patch.

The Dwm Source

Using your terminal, go to whichever folder you have cloned dwm in and type ls.

You may notice three configuration files in the directory. config.mk contains the build configuration. You won't have to touch it in the best case scenario.

config.h and config.def.h are the files that you will need to edit when you are configuring dwm. I suggest making the configuration changes on a different branch:

git checkout -b patches
Enter fullscreen mode Exit fullscreen mode

Once you are on a different branch, open the Makefile and edit clean recipe to add the following line of code in it:

rm config.h
Enter fullscreen mode Exit fullscreen mode

This will make sure that whenever you are configuring a patch, you won't have to make changes in both config.h as well as config.def.h.

Alt Text

Now whenever you make a change in the config.def.h, simply run make clean install for re-building dwm from scratch. Then logout and log back in again for the changes to take effect. Dwm requires its source to be rebuilt every time there is a configuration change, which is unlike other window managers like herbstluftwm and i3, where you can simply reload the configuration at runtime.


Changing Keybindings

Open the config.def.h in vim.

Alt Text

The Key_key array stores all of the keybindings. The modifier key ( by default) is named MODKEY. Shift is called ShiftMask. All other keys are prefixed by XK_. For example, if I am talking about the "i" key then I will write XK_i. If I am talking about then I will write XK_Return.

Now let us look at line 3, where the keybinding for opening up a terminal is defined. By default, this line is the following:

/* modifier            key       function        argument */
MODKEY|ShiftMask     XK_Return    spawn         {.v = termcmd}
Enter fullscreen mode Exit fullscreen mode

It means that for spawning a terminal, you would have to hit <Alt> + <Shift> + <Enter>. You can already see in the screenshot above, that I have removed ShiftMask from this line. So for opening up the terminal I simply do <Alt> + <Enter>.

In this way, by changing the modifier or keys, you can define custom keybindings. You can even add lines here to define some of your own keybindings.

Now by default dwm uses st (simple terminal) when someone hits the keybindings for opening the terminal up. That is why your terminal might not open up the first time you hit the default key binding for doing so (if st is not installed). However this can easily be changed to suit the terminal of your choice by simply editing the argument termcmd definition. Since I use terminator, I have changed it like this:

Alt Text

Now for the changes to take effect, simply compile the code again by running the following commands, log back in, and you are good to go:

make clean install
Enter fullscreen mode Exit fullscreen mode

Installing patches

In this example, I will be installing the centeredmaster patch. Download its source code and place it in the dwm directory.

Patches in dwm are tagged commit diffs in the upstream repository of the version control system. Therefore, for apply patches, you have to use git:

git apply dwm-centeredmaster-6.1.diff
Enter fullscreen mode Exit fullscreen mode

Once you do that, it will make changes in the dwm source code. Simply commit after doing so. Once the patch is successfully applied, build dwm again by running make clean install, logout and log back in again to see the changes in effect.

To activate centeredmaster, hit <Alt> + u. This way patches and different layouts can be installed for dwm.


Verdict

Dwm is an easy to use but hard to configure window manager, especially for beginners. It has a lot of useful patches which feel like they should've been shipped dwm source itself. The main drawback is the need to compile the source and log back in again after a change in configuration. Except for that, dwm is a really fun to use window manager. It is extremely fast, feature rich, and powerful.

Now some of the patches in dwm might not work out of the box. This is primarily due to the fact that you might have a version which is not yet supported by the patch. But the developer community is always doing changes on those patches. All in all, patching your own dwm configuration is a rewarding process.

Judgement Rubric Rating
Simplicity of use ❤️ ❤️ ❤️ ❤️
Simplicity of Configuration ❤️ ❤️
Learning curve (lesser is better) ❤️ ❤️ ❤️ ❤️
Productivity ❤️ ❤️ ❤️ ❤️
Fun ❤️ ❤️ ❤️ ❤️ ❤️

References

Top comments (5)

Collapse
 
charbelsako profile image
Charbel Sarkis

I didn't clone the repo I installed it with my package manager. couldn't find the config.h
file even with

find ~ -name config.h

Collapse
 
l04db4l4nc3r profile image
Angad Sharma

You can change the config.def.h in that case

Collapse
 
charbelsako profile image
Charbel Sarkis

Nevermind. I had to download the github repo and make install it from there.

Collapse
 
charbelsako profile image
Charbel Sarkis

...besides downloading from my package manager.

Thread Thread
 
l04db4l4nc3r profile image
Angad Sharma

With DWM, you should clone the repo and build it. If you download it using the package manager, you'll have to find where the source code is downloaded and configure it there only