plwm: The Complete Guide to the Prolog-Powered X11 Window Manager
What is plwm?
plwm is a dynamic tiling window manager for the X Window System, uniquely built using the Prolog programming language. This innovative approach redefines window management through logical programming paradigms, offering a fresh alternative to traditional C-based managers like dwm.
Core Features
-
Logic Programming Framework: Define window rules using Prolog’s declarative syntax -
Dynamic Layout System: 12+ predefined layouts including stacks, grids, and master-slave configurations -
Lightweight Performance: 10-15MB memory usage with instant responsiveness -
Runtime Customization: Modify configurations without recompiling

Key Features Explained
1. Dynamic Layout Engine
plwm offers 12 ready-to-use layouts accessible via keyboard shortcuts:
Layout Type | Hotkey | Ideal Use Case |
---|---|---|
Left Master | Super+Shift+L | Code + Reference |
Grid | Super+Shift+G | Multitasking |
Floating | Super+Shift+F | Graphic Design |
Monocle | Super+Shift+M | Fullscreen Focus |
Pro Tips:
-
Super+H/L
: Adjust master area width in 5% increments -
Super+I/D
: Modify number of master windows -
Super+Space
: Toggle window floating state
2. Workspace Management
Independent workspace systems per monitor (default: 9 workspaces):
% Custom workspace names
workspaces(['Dev', 'Web', 'Docs', 'Chat', 'Media', 'Term', 'Test', 'Temp', 'Misc']).
Advanced Operations:
-
Dynamic workspace creation ( Alt+C
) -
Cross-monitor window transfer ( Super+Shift+,/.
) -
Hide empty workspaces ( Super+Shift+Tab
)
3. Rule-Based Automation
Define window rules using Prolog predicates:
rules([
(_ , "Firefox" , _ -> "HDMI-1", 'Web' , fullscreen),
("GIMP", _ , _ -> _ , _ , [center, center, 0.8, 0.8]),
(_ , "Alacritty", "cmus" -> _ , 'Media', managed)
]).
Installation & Configuration
System Requirements
-
Xorg server -
SWI-Prolog 8.0+ -
Development libraries: libx11, libxft, libxrandr
Ubuntu/Debian Setup:
sudo apt install xorg-dev swi-prolog
git clone https://github.com/Seeker04/plwm
cd plwm
make && sudo make install
First-Time Setup
-
Add to ~/.xinitrc
:exec plwm
-
Launch with startx: echo "if [ -z \"\$DISPLAY\" ] && [ \"\$(tty)\" = \"/dev/tty1\" ]; then exec startx; fi" >> ~/.bash_profile
UI Customization Example
% Border and gap settings
border_width(2),
border_color_focused("#458588"),
outer_gaps(24),
inner_gaps(12),
% Animation parameters
animation_enabled(true),
animation_time(0.3),
animation_granularity(40),
Productivity Workflows
Window Navigation Mastery
Action | Hotkey | Use Case |
---|---|---|
Cross-workspace search | Alt+W | Locate scattered apps |
Bulk window movement | Alt+Shift+P | Organize task groups |
Close non-essential apps | Alt+Shift+Q | Workspace cleanup |
Status Bar Integration
Sample polybar configuration:
[module/workspaces]
type = internal/plwm
format = <label-state>
label-active = %name%
label-occupied = ▘%name%
Script Automation
Control plwm via FIFO pipeline:
# Create temporary workspace
echo "create_workspace(temp), switch_workspace(temp)." > /tmp/plwm_fifo
# Batch workspace creation
seq 1 5 | xargs -I{} echo "create_workspace('{}')." > /tmp/plwm_fifo
Technical Deep Dive
Architectural Overview
-
Event Handling: Xlib-based event loop -
Layout Engine: Prolog-powered geometry calculations -
State Management: Dynamic database for window states
Performance Optimization
-
Window state caching -
Batch geometry processing -
Recursion safety mechanisms
Comparative Analysis
Feature | plwm | dwm | i3 |
---|---|---|---|
Configuration | Prolog | C | Dedicated |
Layouts | 12+ | 6 | 9 |
Memory Footprint | 10-15MB | 5-8MB | 20-30MB |
Multi-Monitor | ✔️ | ✔️ | ✔️ |
Live Configuration | ✔️ | ❌ | Partial |
Advanced Customization
Custom Layout Development
-
Add new predicate in layout.pl
-
Implement geometry logic -
Bind to hotkey:
keymaps([
super+shift+"Y" -> layout:set_layout(custom_layout)
]).
Event Hook Implementation
hooks([
window_create_post -> (
get_window_class(Class),
(Class == "TelegramDesktop" -> move_to_workspace('Chat'))
]).
FAQ: Expert Answers
Q: Java applications display blank windows
Add to .xinitrc
:
export _JAVA_AWT_WM_NONREPARENTING=1
Q: Debugging configuration errors
Validate configs with:
plwm --check -c ~/.config/plwm/config.pl
Q: Multi-monitor support details
-
Super+,/.
switches monitors -
Super+Shift+,/.
moves windows across displays
Q: plwm vs i3/dwm?
-
✔️ Ideal for declarative configuration lovers -
✔️ Excellent Prolog learning tool -
❌ Not for Wayland users
Project Roadmap
Current (0.x) features:
-
Core window management -
Multi-monitor support -
External bar integration
Planned for 1.0:
-
Enhanced EWMH compliance -
Expanded test coverage -
Migration tools for dwm users
Final Thoughts
plwm revolutionizes window management by merging logical programming with practical workflow design. While requiring initial Prolog familiarity, it offers unparalleled customization depth for power users. For developers seeking full environment control or Prolog enthusiasts exploring real-world applications, plwm presents a compelling platform worth mastering.