A minimal but powerful DWM setup script for Debian-based systems.
Includes custom patches, layout enhancements, and smart keybindings β ready to roll out of the box.
Part of the JustAGuy Linux window manager collection.
git clone https://github.com/drewgrif/dwm-setup.git
cd dwm-setup
chmod +x install.sh
./install.sh
This assumes a fresh Debian or Debian-based install with sudo
access.
Component | Purpose |
---|---|
dwm |
Tiling window manager (patched) |
sxhkd |
Keybinding daemon |
slstatus |
Status bar for DWM |
thunar |
File Manager (+plugins) |
picom (FT-Labs) |
Compositor with transparency |
dunst |
Lightweight notifications |
rofi |
App launcher + keybind viewer |
dmenu |
Minimal app launcher alternative |
wezterm |
Main terminal emulator |
tilix |
Quake-style terminal option |
firefox-esr |
Default web browser |
geany + plugins |
Lightweight IDE |
fastfetch |
System info for screenshots |
nala |
Better apt frontend |
pipewire |
Audio handling |
flameshot , |
Screenshot tools |
micro |
Terminal text editor |
redshift |
Night light |
qimgv |
Lightweight image viewer |
fzf , etc. |
Utilities & enhancements |
π Need help with Geany? See the full guide at justaguylinux.com/documentation/software/geany
π‘ Special thanks to vinceliuice for the excellent GTK and icon themes.
Keybindings are stored in:
~/.config/suckless/dwm/config.def.h
for DWM keybindings~/.config/suckless/sxhkd/sxhkdrc
for sxhkd keybindings
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 + Shift + R |
Restart DWM |
Super + Shift + L |
Cycle through layouts |
Super + 1β= |
Switch to tag |
Super + Shift + 1β= |
Move window to tag |
Cycle layouts using:
Super + Shift + L
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-stackcolumnlayout
([C]
) β Vertical column viewcenteredmaster
(|M|
) β Centered master, tiled sides- Floating (
><>
) β Free window placement bstack
(TTT
) β Master on top, stack belownrowgrid
(###
) β Grid with fixed rowsdeck
(H[]
) β Master with tabbed stackgaplessgrid
(:::
) β Even, gapless gridspiral
([@]
) β Spiral Fibonacci layoutmonocle
([M]
) β Fullscreen stacked windowsgrid
(HHH
) β Even gridbstackhoriz
(===
) β Horizontal bstackcenteredfloatingmaster
(>M>
) β Centered floating masterhorizgrid
(---
) β Wide-monitor horizontal grid
~/.config/suckless/
βββ dwm/
β βββ config.h # Main DWM configuration
βββ st/
β βββ config.h # Barely Patched st terminal configuration
βββ slstatus/
β βββ config.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 |
---|---|
alwayscenter | Floating windows |
attachbottom | Window order |
cool-autostart | Autostart |
fixborders | Visual fix |
focusadjacenttag | Navigation |
focusedontop | Floating windows |
focusonnetactive | Compatibility |
movestack | Window management |
pertag | Layout memory |
preserveonrestart | Session persistence |
restartsig | Restart ability |
scratchpads | Workflow |
status2d-systray | Bar features |
togglefloatingcenter | Floating windows |
vanitygaps | Visual spacing |
windowfollow | Navigation |
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:
Fixes a bug where border width may be incorrect after switching between floating and tiled layouts.
Why it's useful:
Prevents graphical glitches and ensures windows always have the correct borders, especially on tiling/floating transitions.
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.
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:
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
.
What it does:
Implements scratchpads, allowing you to spawn hidden windows (like a drop-down terminal).
Why it's useful:
A classic feature from workflows like i3 and bspwm. Scratchpads are great for terminals, music players, or quick note apps.
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:
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.
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.
Want to see how it looks and works?
π₯ Check out JustAGuy Linux on YouTube