๐จ REPOSITORY MIGRATION NOTICE
This repository has moved to Codeberg
- Primary repository: https://codeberg.org/justaguylinux/dwm-setup
- This GitHub repository: Mirror only (read-only)
- Migration deadline: December 15, 2025 - GitHub mirror will be archived
Please update your bookmarks and git remotes:
git remote set-url origin https://codeberg.org/justaguylinux/dwm-setup.git
A minimal suckless DWM 6.6 setup for Debian-based systems.
Following the suckless philosophy with carefully selected patches โ simple, efficient, and hackable.
Part of the JustAGuy Linux window manager collection.
This setup adheres to the suckless philosophy:
- Simplicity - Minimal code, maximum functionality
- Clarity - Configuration through clean C header files
- Hackability - Easy to understand, modify, and extend
Configuration follows the suckless way: edit config.def.h
, remove config.h
, then recompile โ no bloated config systems.
git clone https://codeberg.org/justaguylinux/dwm-setup.git
cd dwm-setup
chmod +x install.sh
./install.sh
The installer follows the suckless principle of simplicity:
./install.sh [OPTIONS]
Options:
--only-config Only copy config files (perfect for non-Debian distros)
--export-packages Export package lists for different distros and exit
--help Show usage information
โ ๏ธ UNSUPPORTED: Instructions for other distributions (click to expand)
IMPORTANT: These instructions are provided as-is for advanced users. Non-Debian distributions are NOT officially supported. Package names and availability may vary. Use at your own risk.
Quick Package Export:
# Export package lists for all supported distros
./install.sh --export-packages
This will display properly formatted package lists for:
- Debian/Ubuntu (apt)
- Arch Linux (pacman)
- Fedora (dnf)
Manual Installation Process:
- Run
./install.sh --export-packages
to see package equivalents - Install the packages using your distro's package manager
- Run
./install.sh --only-config
to copy configuration files - Compile and install suckless tools manually:
cd ~/.config/suckless/dwm && sudo make clean install cd ~/.config/suckless/slstatus && sudo make clean install cd ~/.config/suckless/st && sudo make clean install
Note: Some packages may have different names or may not be available in all distributions. You may need to find equivalents or install from source.
# Export package lists for manual installation
./install.sh --export-packages
# Update only configuration files (no packages)
./install.sh --only-config
# Standard installation with optional tools prompt
./install.sh
Note: The script can be run from any location - it automatically detects its directory.
The installer follows the suckless approach - only what's necessary:
- System Update - Updates package lists and upgrades existing packages
- Core Packages - Essential X11, build tools, and suckless dependencies
- UI Components - Window manager utilities (rofi, dunst, etc.)
- System Tools - File manager, audio controls, power management
- Suckless Builds - Compiles and installs dwm, slstatus, and st
- External Tools - Via butterscripts:
- FT-Labs picom (compositor)
- WezTerm (terminal emulator)
- Nerd Fonts collection
- Orchis theme & Colloid icons
- LightDM display manager
- Bashrc enhancements
- Optional Tools - Additional browsers, editors, and utilities (prompted)
Component | Purpose |
---|---|
dwm |
Tiling window manager (patched) |
sxhkd |
Keybinding daemon |
slstatus |
Status bar for DWM |
st |
Patched for scratchpad with transparency, scrollback, and clipboard support |
xorg & tools |
Display server and utilities |
build-essential |
Compilation tools |
Component | Purpose |
---|---|
rofi |
App launcher + keybind viewer |
dunst |
Lightweight notifications |
feh |
Wallpaper setter |
lxappearance |
GTK theme manager |
network-manager |
Network management applet |
thunar |
File Manager (+plugins) |
pavucontrol |
Audio control GUI |
xfce4-power-manager |
Power management |
flameshot |
Screenshot tool |
qimgv |
Lightweight image viewer |
firefox-esr |
Default web browser |
Component | Purpose |
---|---|
picom (FT-Labs) |
Compositor with transparency |
wezterm |
Main terminal emulator |
Nerd Fonts | Icon-enabled fonts |
Orchis & Colloid | GTK theme and icons |
LightDM | Display manager |
Additional browsers, editors, and utilities available through the optional tools script.
๐ก Special thanks to vinceliuice for the excellent GTK and icon themes.
Keybindings are split between two systems:
~/.config/suckless/dwm/config.def.h
for DWM-specific keybindings (window management, layout control, tag switching)~/.config/suckless/sxhkd/sxhkdrc
for application launchers and system commands (programs, scripts, media keys)
This separation keeps DWM's core window management bindings in the source while allowing hot-reloadable keybinds for launching applications via sxhkd.
Launch the keybind cheatsheet anytime with:
~/.config/suckless/scripts/help
Shortcut | Action |
---|---|
Super + Enter |
Launch terminal (WezTerm) |
Super + Space |
Launch rofi |
Super + H |
Open keybind help via Rofi |
Super + Q |
Close focused window |
Super + S |
Toggle window sticky |
Super + Shift + R |
Restart DWM |
Super + Shift + L |
Launch layout selector (rofi) |
Super + Shift + F |
Toggle fullscreen mode |
Super + Shift + T |
Toggle scratchpad terminal |
Super + Shift + A |
Toggle audio mixer (pulsemixer) |
Super + R |
Toggle ranger file manager |
Super + F |
Launch file manager (Thunar) |
Super + B |
Launch Firefox browser |
Super + E |
Launch text editor (Geany) |
Super + M |
Toggle audio mute |
Super + Insert |
Increase volume |
Super + Delete |
Decrease volume |
Super + Shift + Space |
Toggle floating/tiled |
Super + 1โ= |
Switch to tag |
Super + Shift + 1โ= |
Move window to tag |
Select layouts using:
Super + Shift + L
This launches a rofi menu where you can select from available layouts.
Click to expand layout descriptions
These are the layouts included in this build, in the exact order from config.def.h
:
- ๓ฐด Dwindle โ Fibonacci-style dwindle layout (default)
- ๓ฐ Tile โ Classic master-stack
- ๓ฐฌ Column Layout โ Vertical column view
- ๓ฐฏ Centered Master โ Centered master, tiled sides
- ๓ฐฐ Floating โ Free window placement
- ๓ฑ Bstack โ Master on top, stack below
- ๓ฐญ N-Row Grid โ Grid with fixed rows
- ๓ฑ Deck โ Master with tabbed stack
- ๓ฐซ Gapless Grid โ Even, gapless grid
- ๓ฐชท Spiral โ Spiral Fibonacci layout
- ๓ฐฎ Monocle โ Fullscreen stacked windows
- ๓ฐ Grid โ Even grid
~/.config/suckless/
โโโ dwm/
โ โโโ config.def.h # Main DWM configuration (edit this)
โโโ st/
โ โโโ config.def.h # ST terminal configuration (scratchpad terminal)
โโโ slstatus/
โ โโโ config.def.h # Status bar configuration
โโโ sxhkd/
โ โโโ sxhkdrc # Keybindings for sxhkd
โโโ dunst/
โ โโโ dunstrc # Notification settings
โโโ picom/
โ โโโ picom.conf # Compositor configuration
โโโ rofi/
โ โโโ keybinds.rasi # Rofi keybinding cheatsheet
โโโ scripts/
โโโ autostart.sh # Startup script
โโโ help # Launches keybind viewer
~/.config/wezterm/
โโโ wezterm.lua # Terminal configuration
Patch | Category | Version |
---|---|---|
alwayscenter | Floating windows | 6.2 |
attachbottom | Window order | 6.3 |
cool_autostart | Autostart | 6.5 |
focusadjacenttag | Navigation | 6.3 |
focusedontop | Floating windows | 6.6 |
focusonnetactive | Compatibility | 6.2 |
fullscreen | Window management | 6.2 |
movestack | Window management | 6.2 |
pertag | Layout memory | 6.2 |
preserveonrestart | Session persistence | 6.3 |
restartsig | Restart ability | 6.2 |
namedscratchpads | Multiple scratchpads | 6.5 |
status2d-systray | Bar features | 6.4 |
sticky | Window management | 6.5 |
togglefloatingcenter | Floating windows | 6.2 |
vanitygaps | Visual spacing | 6.2 |
windowfollow | Navigation | 6.2 |
Click to expand Patch Documenation
What it does:
Ensures that floating windows (new ones) always appear centered on the screen.
Why it's useful:
Prevents floating windows from opening at weird edges or offsets, especially useful for dialogs or apps you want neatly centered (like file pickers or floating terminal windows).
What it does:
Newly spawned windows are added at the bottom of the stack instead of at the top.
Why it's useful:
This can help keep your active window in focus instead of being immediately pushed out when new windows are created. Provides a more "natural" stacking order for some users.
What it does:
Adds an autostart mechanism to DWM without using .xinitrc
.
Why it's useful:
You can easily manage startup scripts directly in DWMโs codebase, making it more portable (especially when using login managers instead of startx
). This patch also gracefully re-runs your autostart scripts if DWM is restarted.
What it does:
Adds keybindings to quickly switch to the next or previous tag.
Why it's useful:
Great for workflows where you spread work across multiple tags. Makes it easier to quickly switch to adjacent tags without a numeric jump.
Usage: Press Control + Shift + Left/Right
to switch to adjacent tags, or Alt + Control + Left/Right
to move windows to adjacent tags.
What it does:
Forces the currently focused floating window to always be on top.
Why it's useful:
Prevents floating windows from accidentally being covered by tiled windows when they lose focus.
This is a patch created by Bakkeby for dwm-flexipatch
What it does:
Ensures DWM correctly focuses windows that request focus via _NET_ACTIVE_WINDOW (like some app popups).
Why it's useful:
Improves compatibility with external programs and scripts (e.g., notification popups, some dialogs, and xdg-open behavior).
What it does:
Adds the ability for windows to be faked fullscreen, which is basically just a borderless, statusbar-less window that fits the entire screen.
Why it's useful:
Some applications (like browsers, video players, and games) expect to be able to go fullscreen. This patch allows DWM to handle fullscreen requests properly while maintaining window management control. Unlike true fullscreen modes that bypass the window manager entirely, this keeps DWM in control while giving applications the fullscreen experience they expect.
Usage: Press Super + Shift + F
to toggle fullscreen mode for the focused window.
What it does:
Allows you to move windows up/down the stack.
Why it's useful:
Essential for organizing windows in the master-stack layout, letting you reorder windows directly instead of closing/reopening them.
What it does:
Each tag remembers its own layout, master count, and gaps settings.
Why it's useful:
This is one of the most essential DWM patches if you use multiple tags. It allows each workspace (tag) to have its own independent configuration instead of all tags sharing the same layout.
What it does:
Preserves window positions when restarting DWM.
Why it's useful:
Critical if you like to restart DWM to reload config changes, keeping windows in place instead of resetting them.
What it does:
Adds a restart signal handler so you can restart DWM without logging out.
Why it's useful:
Allows easy config reloads and minor changes without logging out, pairing well with preserveonrestart
.
Usage: Press Super + Shift + R
to restart DWM.
What it does: Implements named scratchpads, allowing you to create multiple independent scratchpad windows that can be toggled individually.
Why it's useful: An enhanced version of the classic scratchpad feature. Unlike traditional scratchpad that only supports one window, named scratchpads let you have multiple floating windows (terminals, file managers, etc.) that can be summoned with different keybindings. Perfect for quick access to commonly used tools without cluttering your workspace.
Usage:
Super + Shift + T
- Toggle scratchpad terminalSuper + Shift + A
- Toggle audio mixer (pulsemixer)Super + R
- Toggle ranger file manager
What it does:
Adds support for color-embedded status text and a systray in DWMโs status bar.
Why it's useful:
Combines two essential features:
- Colored status text for aesthetic and information clarity.
- Systray support for handling system tray icons (volume, network, etc.), which is not natively supported in DWM.
What it does:
Adds a "sticky" flag to windows, making them visible on all tags.
Why it's useful:
Perfect for windows you want to always have accessible, like music players, system monitors, or communication apps. Sticky windows follow you across all workspaces.
Usage: Press Super + S
to toggle sticky mode for the focused window.
What it does:
Toggles a window between floating and tiled while centering it if floating.
Why it's useful:
Combines two useful actions into one โ not only toggling float, but also ensuring floating windows are neatly centered.
Usage: Press Super + Shift + Space
to toggle floating/tiled mode for the focused window.
What it does:
Adds support for customizable outer and inner gaps between windows.
Why it's useful:
Essential for those who like cleaner layouts with space between windows. Especially good for aesthetic "rice" setups.
What it does:
Makes it so that when you move a window to another tag, DWM will follow you to that tag.
Why it's useful:
Enhances workflow โ instead of moving a window to another tag and then manually switching to that tag, DWM follows automatically.
If this setup has been helpful, consider buying me a coffee:
Want to see how it looks and works?
๐ฅ Check out JustAGuy Linux on YouTube