Glitch is a minimal X11 window manager controlled by keyboard shortcuts.
[!IMPORTANT] I built this window manager for personal use. There are no guarantees of stability. Main purpose is to learn X11 and also to have a window manager that is simple and that I can easily modify to my liking.
Key Features
- Window Movement: Move windows by pixel values
- Window Resizing: Resize windows
- Desktop Management: Multiple desktops and moving windows between them
- Window Control: Kill, fullscreen, PiP, and always-on-top
- Maximization: Vertical and horizontal maximization
- Edge Snapping: Snap windows to screen edges
- Window Centering: Center windows on screen
- Audio Control: Toggle microphone mute with on-screen status
- Tiling Layout: Toggle between floating and tiling layouts per desktop
- Application Launcher: Integrated .desktop-aware launcher with usage-based sorting
- On-screen Indicators: Live status for desktop, layout, mic, and clock
- Live Reload: Reload configuration without restart
Technical Details
- Built on X11/Xlib for low-level window management
- Uses EWMH (Extended Window Manager Hints) for fullscreen and state functionality
- Integrated PulseAudio support for real-time microphone status tracking
- Uses GIO/GLib for standard-compliant .desktop file parsing and application discovery
- Persistent usage tracking for applications to provide "most used" sorting
- Xft-based on-screen widgets for system status (Clock, Mic, Layout, Desktop)
- Maintains state for maximized windows to enable toggle behavior
- Implements proper X11 event handling and window attribute management
Requirements
- C compiler (GCC or Clang)
- GNU Make
- pkg-config
- X11 and Freetype development libraries
- libXft development library
- PulseAudio development library
- GLib/GIO development libraries
Installing Dependencies
Void Linux:
sudo xbps-install libX11-devel freetype-devel libXft-devel pulseaudio-devel glib-devel pkg-config
Compilation
# Build normally
make
# Use a specific compiler
CC=clang make
CC=gcc make
# Build with debug symbols
DEBUG=1 make
# Compile with optimization levels
OPTIMIZE=2 make
# Clean build
make clean && make
Testing in Virtual Display
For safe testing without affecting your main session:
# Start Xephyr virtual display (requires Xephyr installed)
make virt
# In another terminal, run the window manager in the virtual display
DISPLAY=:69 ./glitch
Installation
# Install to /usr/local/bin by default
sudo make install
Running Glitch
Starting the Window Manager
From a display manager (login screen):
- Add Glitch to your display manager's session list
- Select it from the session menu
# Exit current window manager first, then:
./glitch
# Start X server and window manager
startx ./glitch
Configuration
Glitch uses a simple configuration system based on C header files. The configuration is compiled into the binary, so you need to recompile after making changes.
Setting Up Configuration
Copy the default configuration:
cp config.def.h config.hEdit your configuration:
vim config.h # or your preferred editorRecompile the window manager:
make clean && makeRestart or Reload:
- Quit and restart, or
- Use
Mod+Shift+rto reload in-place
You can also sen
SIGUSR1to trigger restart withkill -s SIGUSR1 $(pidof glitch)
Configuration Structure
The configuration uses two main arrays:
shortcuts[]- Maps keys to shell commandskeybinds[]- Maps keys to window manager functions
Default Key Bindings
Modifier key: Mod4 (Super/Windows key)
Window Movement
{ MODKEY, XK_Left, move_window_x, { .i = -75 } },
{ MODKEY, XK_Right, move_window_x, { .i = +75 } },
{ MODKEY, XK_Up, move_window_y, { .i = -75 } },
{ MODKEY, XK_Down, move_window_y, { .i = +75 } },
{ MODKEY, XK_c, center_window, { 0 } },
Window Resizing
{ MODKEY | ShiftMask, XK_Left, resize_window_x, { .i = -75 } },
{ MODKEY | ShiftMask, XK_Right, resize_window_x, { .i = +75 } },
{ MODKEY | ShiftMask, XK_Up, resize_window_y, { .i = -75 } },
{ MODKEY | ShiftMask, XK_Down, resize_window_y, { .i = +75 } },
Desktop Management
// Switch to desktop
{ MODKEY, XK_1, goto_desktop, { .i = 1 } },
// ... up to XK_9
// Move window to desktop
{ MODKEY | ShiftMask, XK_1, send_window_to_desktop, { .i = 1 } },
// ... up to XK_9
Window Control
{ MODKEY, XK_f, toggle_fullscreen, { 0 } },
{ MODKEY, XK_q, close_window, { 0 } },
{ MODKEY, XK_m, toggle_mic_mute, { 0 } },
{ MODKEY, XK_p, toggle_launcher, { 0 } },
{ MODKEY, XK_space, toggle_layout, { 0 } },
{ MODKEY | ShiftMask, XK_q, quit, { 0 } },
{ MODKEY | ShiftMask, XK_r, reload, { 0 } },
{ MODKEY | ShiftMask, XK_s, toggle_pip, { 0 } },
{ MODKEY | ShiftMask, XK_t, toggle_always_on_top,{ 0 } },
{ Mod1Mask, XK_Tab, cycle_active_window, { .i = 0 } },
{ Mod1Mask | ShiftMask, XK_Tab, cycle_active_window, { .i = 1 } },
Window Maximization
{ MODKEY, XK_x, window_hmaximize, { 0 } },
{ MODKEY, XK_z, window_vmaximize, { 0 } },
Window Snapping
{ MODKEY | ControlMask, XK_Up, window_snap_up, { 0 } },
{ MODKEY | ControlMask, XK_Down, window_snap_down, { 0 } },
{ MODKEY | ControlMask, XK_Right, window_snap_right, { 0 } },
{ MODKEY | ControlMask, XK_Left, window_snap_left, { 0 } },
Shell Commands
Defined in shortcuts[] array:
Mod+Return: Terminal (st)Mod+p: Internal application launcherMod+w: Browser (brave)Mod+e: File Manager (thunar)Mod+s: Screen magnifier (xmagnify)Mod+r: Screen recorder (SSR)Mod+l: Screen lock (xlock)Control+Escape: Screenshot (maim)
Function Reference
| Function | Category | Parameters | Description |
|---|---|---|---|
move_window_x |
Movement | arg->i (pixels) |
Move window horizontally (positive = right) |
move_window_y |
Movement | arg->i (pixels) |
Move window vertically (positive = down) |
resize_window_x |
Resize | arg->i (pixels) |
Resize window width (positive = wider) |
resize_window_y |
Resize | arg->i (pixels) |
Resize window height (positive = taller) |
center_window |
Movement | None | Center window on screen |
window_snap_up |
Snap | None | Snap window to top edge |
window_snap_down |
Snap | None | Snap window to bottom edge |
window_snap_left |
Snap | None | Snap window to left edge |
window_snap_right |
Snap | None | Snap window to right edge |
goto_desktop |
Desktop | arg->i (desktop #) |
Switch to specified desktop |
send_window_to_desktop |
Desktop | arg->i (desktop #) |
Move window to specified desktop |
cycle_active_window |
Focus | arg->i (0=fwd, 1=back) |
Cycle focus through windows |
close_window |
Control | None | Gracefully close active window |
quit |
Control | None | Exit the window manager |
toggle_fullscreen |
Control | None | Toggle fullscreen mode |
toggle_pip |
Control | None | Toggle Picture-in-Picture mode |
toggle_always_on_top |
Control | None | Toggle Always-on-Top status |
window_hmaximize |
Maximize | None | Toggle horizontal maximize |
window_vmaximize |
Maximize | None | Toggle vertical maximize |
toggle_mic_mute |
Audio | None | Toggle microphone mute state |
toggle_launcher |
Control | None | Toggle integrated app launcher |
toggle_layout |
Layout | None | Toggle between floating/tiling |
reload |
System | None | Reload configuration/restart WM |
