vladbiber/gluewc

C

5

32 commits

updated Oct 4, 2026

See the code

See what people are saying

SourceMessageScoreDate

[gluewc] I made macros for my own wc (r/unixporn)

I had showed only the autoclicker but you can make more complex macros. You can aces them very easy if you get the wc with the bar. Here if you want to check out my wc [https://github.com/vladbiber/gluewc](https://github.com/vladbiber/gluewc)

2

Oct 4, 2026

README

gluewc

build license: GPL-3.0 wlroots 0.20

gluewc is a compact, animated Wayland compositor built around automatic BSP tiling. It combines a dwl-sized C codebase with workspaces, a GNOME-style overview, touchpad gestures, runtime configuration and SceneFX visuals.

It is a fork of dwl 0.8, using wlroots 0.20 and SceneFX 0.5.

The overview opening, then the scroll and drift layouts

The overview, then a cycle through the scroll and drift layouts.

BSP tiling with three windows and the bar

Automatic BSP tiling. The bar is glueqs.

The overview, with the neighbouring workspaces either side

The overview: the workspace scaled down with its neighbours either side, and the shell's dash along the bottom.

There is a longer clip in docs/media/glue-demo.mp4; GitHub hands mp4 files over as downloads instead of playing them in the page.

Highlights

  • Automatic BSP tiling with per-split direction and ratio control
  • Nine independent workspaces on every monitor
  • Animated window open, close, retile and workspace transitions, with configurable type, duration and cubic-bezier easing
  • GNOME-style overview with neighboring workspaces, live windows (a video keeps playing, a terminal keeps scrolling) and the wallpaper underneath; the session can open straight onto it, and every keybinding keeps working while it is up
  • Every window and overview card is cut at the edge of its own monitor, so a strip that hangs off screen or a workspace sliding in never shows up on the monitor next door
  • Niri-style scrolling layout per monitor (Mod-N): columns on an endless strip, vertical workspace slides and a vertical overview over the wallpaper
  • driftwm-style drift layout (Mod-N again): windows keep their native size on an infinite canvas with edge snapping, per-workspace camera pan and zoom, and trackpad gestures for both
  • Drag windows between workspaces directly from the overview
  • Three-finger workspace and overview gestures
  • Directional keyboard focus; crossing the left or right edge changes workspace
  • Insert and normal keyboard modes inspired by modal window managers
  • Runtime config and keybind reload without recompiling, applied as soon as the file is saved and reported on screen when a line does not parse
  • Monitors set up from the same file and applied live: mode, position, scale, rotation, on/off, and mirroring one screen onto another or onto all of them
  • Rounded corners, blur and optional transparency through SceneFX
  • XWayland, layer-shell, session lock and output power-management support
  • dwl IPC and foreign-toplevel support for bars and desktop shells
  • Black fallback background when no wallpaper program is running

Install

One script covers all four cases. It detects the distribution, installs the build dependencies and audio, builds a compatible wlroots/SceneFX pair when the distribution does not package one, and installs the session entry. It asks for administrator privileges for the packages and the system install, and it never writes to ~/.config/gluewc/config.conf.

Just the compositor:

curl -fsSL https://raw.githubusercontent.com/vladbiber/gluewc/main/install.sh | sh

With the bar — glueqs, a quickshell bar built for gluewc. Installs Quickshell from the distribution, or builds it where there is no package (Chimera, Alpine, openSUSE), adds the tools its panels use, clones the bar into ~/.config/quickshell/glueqs and starts it from the session:

curl -fsSL https://raw.githubusercontent.com/vladbiber/gluewc/main/install.sh | sh -s -- --with-bar

Update an existing checkout — pulls the newest source, rebuilds, installs, and finishes by listing what the defaults gained that your own config does not have. Your config is left alone; you copy across whatever you want:

cd gluewc && ./install.sh --update          # add --with-bar to update that too
./install.sh --check-config                 # only the list, no rebuild

By hand, to read the script first or to build without it:

git clone https://github.com/vladbiber/gluewc.git
cd gluewc
less install.sh
./install.sh          # or: make && sudo make install

The dependency resolver covers current releases of:

FamilyTarget
ArchArch Linux, EndeavourOS, Manjaro, CachyOS, Garuda, Artix, ArcoLinux
DebianDebian 13+, Devuan
UbuntuUbuntu 25.10+, Mint, Pop!_OS, elementary, Zorin, Kali, Raspberry Pi OS
FedoraFedora 43+, Nobara, RHEL, CentOS Stream, Rocky, AlmaLinux
SUSEopenSUSE Tumbleweed and Leap
GentooGentoo Linux
AlpineAlpine Edge, postmarketOS
ChimeraChimera Linux (clang, musl, dinit; doas is used when there is no sudo)
VoidVoid Linux rolling
NixOSthrough the flake in this repository, finix included

A distribution outside the list still works: the installer falls back to whichever package manager it finds on PATH and uses that family's package set. Gentoo is hardware-tested and the Arch path is exercised by CI. The remaining resolvers target their current package sets. Older distributions may not have the Wayland, libdrm and Pixman versions required by wlroots 0.20; see the installation guide for manual and troubleshooting instructions.

Sound is set up along the way: PipeWire, WirePlumber and the ALSA and PulseAudio bridges are installed and, where there are systemd user units, enabled. Pass --no-audio to keep your own audio stack.

NixOS

nix run github:vladbiber/gluewc          # try it without installing

Permanently, add the flake as an input and enable the module, which registers the session and sets up PipeWire, the portals and Xwayland:

imports = [ inputs.gluewc.nixosModules.default ];
programs.gluewc.enable = true;
programs.gluewc.bar.enable = true;   # the glueqs bar, with Quickshell from nixpkgs

From source

git clone https://github.com/vladbiber/gluewc.git
cd gluewc
./install.sh --deps-only     # or install the dependencies yourself
make
sudo make install

The installation guide covers PREFIX, DESTDIR, config.h, building against a private wlroots and staying up to date.

After installation, log out and select gluewc in the display manager. From a TTY, run:

gluewc-session

The default bindings expect alacritty, rofi, grim and slurp for screenshots, wl-clipboard to put one on the clipboard, playerctl for the media keys, and for volume and backlight either wpctl/pactl and brightnessctl/light. The installer brings them in; they stay optional and every command can be replaced in the runtime config.

First steps

The session wrapper creates ~/.config/gluewc/config.conf on first login. Saving it applies it: the file is watched and reloaded on the spot, and anything the parser rejects raises a red strip across the top of the screen and a notification naming the line. Super+Shift+R still reloads by hand.

BindingAction
Super tapToggle overview
Super+Return or Super+QOpen terminal
Super+SpaceOpen Rofi
Super+1 … Super+9Change workspace
Super+Ctrl+1 … Super+Ctrl+9Move window and follow
Super+Arrow or Super+H/J/K/LDirectional focus
Super+Shift+ArrowSwap windows (nudge them in the drift layout)
Super+NCycle BSP, scroll and drift layouts
Super+Ctrl+ArrowMove the window that way: swap with the neighbour, or on to the next workspace when there is none
Super+Alt+ArrowPan the drift canvas
Print / Shift+PrintScreenshot the screen / a selected area
Ctrl+Print / Super+Shift+SThe same, onto the clipboard
Super+dragSwap the window with the tile it is dropped on
Super+right-dragResize the window against its neighbours
Super+Shift+dragDrag the drift canvas around with the mouse
Super+W, Super+±, Super+0Drift: fit, zoom, 1:1
Super+wheel / Super+Ctrl+wheelChange workspace / take the window along
Super+Shift+wheelZoom the drift camera
Super+FWorkspace-area fullscreen
Super+Shift+FReal fullscreen
Super+VToggle centered floating
Super+CClose window
Super+OToggle configured transparency
Super+EscapeEnter normal mode; I returns to insert mode
Super+Shift+RReload config in place (it also reloads itself when saved)
Super+M or Super+Shift+QQuit gluewc

Media, volume and backlight sit on the function row, so they work on keyboards without media keys or with them behind Fn. The media keys themselves keep doing the same thing, and in normal mode the same keys need no Super.

BindingAction
Super+F1Play / pause
Super+F2 / Super+F3Previous / next track
Super+Shift+F2 / Super+Shift+F3Seek 10s back / forward
Super+F4 / Super+Shift+F4Mute output / microphone
Super+F5 / Super+F6Volume down / up
Super+F7 / Super+F8Backlight down / up

Playback needs playerctl. Volume goes through wpctl (part of WirePlumber, so it is there on any PipeWire system) and falls back to pactl; the backlight goes through gluewc-backlight, which drives brightnessctl (or light) in 5% steps down to 10% and 1% steps below that, so it reaches 0 and turns the panel off. Every one of these is a plain spawn: line in the config, so they can be pointed at anything else.

In the overview, use arrows, workspace numbers, the mouse wheel or a two-finger horizontal swipe to navigate. Click a window to focus it, or drag it onto the left, center or right workspace. Every Super binding still works while it is up — open a terminal, close a window, switch layouts — and the cards follow; Super+1…9 and the workspace bindings move the overview instead of switching underneath it. start_in_overview = true opens the session on it. A three-finger horizontal swipe changes the workspace from the desktop; a three-finger vertical swipe opens or closes the overview. Super+wheel also changes workspace. In the drift layout three fingers pan the canvas and a pinch zooms it, so four fingers take over workspaces and the overview there.

Desktop components

gluewc deliberately does not bundle a bar, launcher or wallpaper daemon. Layer-shell clients reserve their own space, and wallpaper layers are included in the overview.

Examples for ~/.config/gluewc/config.conf:

autostart = swaybg -i ~/Pictures/wallpaper.jpg -m fill
autostart = waybar

With no wallpaper program, root_color = 000000 keeps the background black. Waybar can use its dwl workspaces module; desktop shells can also consume the foreign-toplevel protocol. For shells without a dwl-ipc module gluewc keeps $XDG_STATE_HOME/gluewc/workspaces up to date (one line per output: name, active, workspace, window counts, layout) and installs gluewc-msg, which speaks the same protocol from the command line:

gluewc-msg status                        # one line per output
gluewc-msg outputs                       # geometry, modes, mirror of each monitor
gluewc-msg -o eDP-1 workspace 3          # view workspace 3 there
gluewc-msg move 2                        # send the focused window to 2
gluewc-msg layout scroll

glueqs

glueqs is a Quickshell desktop shell written alongside gluewc: a dot-matrix bar with workspaces, tray, media, network, weather and notifications, plus OSDs, a launcher, the wallpaper (it paints it itself, with a picker on Super+W) and a dash that appears over the overview. It is the shell in the video above. It runs on upstream Quickshell, so it works with whatever quickshell your distribution packages.

It is entirely optional — gluewc runs with waybar, any other layer-shell bar, or none at all — but it is the combination the compositor is developed against:

autostart = qs -c glueqs

Configuration and building

Manual build, once dependencies are installed:

make
sudo make install

Compiled defaults remain in config.def.h; normal users only need the runtime config. Run man gluewc for command-line and environment details.

License and credits

gluewc is GPL-3.0-or-later. It is derived from dwl, which grew from the wlroots TinyWL example and carries code influenced by dwm and sway. See LICENSE* and the Git history for the complete notices.

vladbiber/gluewc

C

5

32 commits

updated Oct 4, 2026

See the code

See what people are saying

SourceMessageScoreDate

[gluewc] I made macros for my own wc (r/unixporn)

I had showed only the autoclicker but you can make more complex macros. You can aces them very easy if you get the wc with the bar. Here if you want to check out my wc [https://github.com/vladbiber/gluewc](https://github.com/vladbiber/gluewc)

2

Oct 4, 2026

README

gluewc

build license: GPL-3.0 wlroots 0.20

gluewc is a compact, animated Wayland compositor built around automatic BSP tiling. It combines a dwl-sized C codebase with workspaces, a GNOME-style overview, touchpad gestures, runtime configuration and SceneFX visuals.

It is a fork of dwl 0.8, using wlroots 0.20 and SceneFX 0.5.

The overview opening, then the scroll and drift layouts

The overview, then a cycle through the scroll and drift layouts.

BSP tiling with three windows and the bar

Automatic BSP tiling. The bar is glueqs.

The overview, with the neighbouring workspaces either side

The overview: the workspace scaled down with its neighbours either side, and the shell's dash along the bottom.

There is a longer clip in docs/media/glue-demo.mp4; GitHub hands mp4 files over as downloads instead of playing them in the page.

Highlights

  • Automatic BSP tiling with per-split direction and ratio control
  • Nine independent workspaces on every monitor
  • Animated window open, close, retile and workspace transitions, with configurable type, duration and cubic-bezier easing
  • GNOME-style overview with neighboring workspaces, live windows (a video keeps playing, a terminal keeps scrolling) and the wallpaper underneath; the session can open straight onto it, and every keybinding keeps working while it is up
  • Every window and overview card is cut at the edge of its own monitor, so a strip that hangs off screen or a workspace sliding in never shows up on the monitor next door
  • Niri-style scrolling layout per monitor (Mod-N): columns on an endless strip, vertical workspace slides and a vertical overview over the wallpaper
  • driftwm-style drift layout (Mod-N again): windows keep their native size on an infinite canvas with edge snapping, per-workspace camera pan and zoom, and trackpad gestures for both
  • Drag windows between workspaces directly from the overview
  • Three-finger workspace and overview gestures
  • Directional keyboard focus; crossing the left or right edge changes workspace
  • Insert and normal keyboard modes inspired by modal window managers
  • Runtime config and keybind reload without recompiling, applied as soon as the file is saved and reported on screen when a line does not parse
  • Monitors set up from the same file and applied live: mode, position, scale, rotation, on/off, and mirroring one screen onto another or onto all of them
  • Rounded corners, blur and optional transparency through SceneFX
  • XWayland, layer-shell, session lock and output power-management support
  • dwl IPC and foreign-toplevel support for bars and desktop shells
  • Black fallback background when no wallpaper program is running

Install

One script covers all four cases. It detects the distribution, installs the build dependencies and audio, builds a compatible wlroots/SceneFX pair when the distribution does not package one, and installs the session entry. It asks for administrator privileges for the packages and the system install, and it never writes to ~/.config/gluewc/config.conf.

Just the compositor:

curl -fsSL https://raw.githubusercontent.com/vladbiber/gluewc/main/install.sh | sh

With the bar — glueqs, a quickshell bar built for gluewc. Installs Quickshell from the distribution, or builds it where there is no package (Chimera, Alpine, openSUSE), adds the tools its panels use, clones the bar into ~/.config/quickshell/glueqs and starts it from the session:

curl -fsSL https://raw.githubusercontent.com/vladbiber/gluewc/main/install.sh | sh -s -- --with-bar

Update an existing checkout — pulls the newest source, rebuilds, installs, and finishes by listing what the defaults gained that your own config does not have. Your config is left alone; you copy across whatever you want:

cd gluewc && ./install.sh --update          # add --with-bar to update that too
./install.sh --check-config                 # only the list, no rebuild

By hand, to read the script first or to build without it:

git clone https://github.com/vladbiber/gluewc.git
cd gluewc
less install.sh
./install.sh          # or: make && sudo make install

The dependency resolver covers current releases of:

FamilyTarget
ArchArch Linux, EndeavourOS, Manjaro, CachyOS, Garuda, Artix, ArcoLinux
DebianDebian 13+, Devuan
UbuntuUbuntu 25.10+, Mint, Pop!_OS, elementary, Zorin, Kali, Raspberry Pi OS
FedoraFedora 43+, Nobara, RHEL, CentOS Stream, Rocky, AlmaLinux
SUSEopenSUSE Tumbleweed and Leap
GentooGentoo Linux
AlpineAlpine Edge, postmarketOS
ChimeraChimera Linux (clang, musl, dinit; doas is used when there is no sudo)
VoidVoid Linux rolling
NixOSthrough the flake in this repository, finix included

A distribution outside the list still works: the installer falls back to whichever package manager it finds on PATH and uses that family's package set. Gentoo is hardware-tested and the Arch path is exercised by CI. The remaining resolvers target their current package sets. Older distributions may not have the Wayland, libdrm and Pixman versions required by wlroots 0.20; see the installation guide for manual and troubleshooting instructions.

Sound is set up along the way: PipeWire, WirePlumber and the ALSA and PulseAudio bridges are installed and, where there are systemd user units, enabled. Pass --no-audio to keep your own audio stack.

NixOS

nix run github:vladbiber/gluewc          # try it without installing

Permanently, add the flake as an input and enable the module, which registers the session and sets up PipeWire, the portals and Xwayland:

imports = [ inputs.gluewc.nixosModules.default ];
programs.gluewc.enable = true;
programs.gluewc.bar.enable = true;   # the glueqs bar, with Quickshell from nixpkgs

From source

git clone https://github.com/vladbiber/gluewc.git
cd gluewc
./install.sh --deps-only     # or install the dependencies yourself
make
sudo make install

The installation guide covers PREFIX, DESTDIR, config.h, building against a private wlroots and staying up to date.

After installation, log out and select gluewc in the display manager. From a TTY, run:

gluewc-session

The default bindings expect alacritty, rofi, grim and slurp for screenshots, wl-clipboard to put one on the clipboard, playerctl for the media keys, and for volume and backlight either wpctl/pactl and brightnessctl/light. The installer brings them in; they stay optional and every command can be replaced in the runtime config.

First steps

The session wrapper creates ~/.config/gluewc/config.conf on first login. Saving it applies it: the file is watched and reloaded on the spot, and anything the parser rejects raises a red strip across the top of the screen and a notification naming the line. Super+Shift+R still reloads by hand.

BindingAction
Super tapToggle overview
Super+Return or Super+QOpen terminal
Super+SpaceOpen Rofi
Super+1 … Super+9Change workspace
Super+Ctrl+1 … Super+Ctrl+9Move window and follow
Super+Arrow or Super+H/J/K/LDirectional focus
Super+Shift+ArrowSwap windows (nudge them in the drift layout)
Super+NCycle BSP, scroll and drift layouts
Super+Ctrl+ArrowMove the window that way: swap with the neighbour, or on to the next workspace when there is none
Super+Alt+ArrowPan the drift canvas
Print / Shift+PrintScreenshot the screen / a selected area
Ctrl+Print / Super+Shift+SThe same, onto the clipboard
Super+dragSwap the window with the tile it is dropped on
Super+right-dragResize the window against its neighbours
Super+Shift+dragDrag the drift canvas around with the mouse
Super+W, Super+±, Super+0Drift: fit, zoom, 1:1
Super+wheel / Super+Ctrl+wheelChange workspace / take the window along
Super+Shift+wheelZoom the drift camera
Super+FWorkspace-area fullscreen
Super+Shift+FReal fullscreen
Super+VToggle centered floating
Super+CClose window
Super+OToggle configured transparency
Super+EscapeEnter normal mode; I returns to insert mode
Super+Shift+RReload config in place (it also reloads itself when saved)
Super+M or Super+Shift+QQuit gluewc

Media, volume and backlight sit on the function row, so they work on keyboards without media keys or with them behind Fn. The media keys themselves keep doing the same thing, and in normal mode the same keys need no Super.

BindingAction
Super+F1Play / pause
Super+F2 / Super+F3Previous / next track
Super+Shift+F2 / Super+Shift+F3Seek 10s back / forward
Super+F4 / Super+Shift+F4Mute output / microphone
Super+F5 / Super+F6Volume down / up
Super+F7 / Super+F8Backlight down / up

Playback needs playerctl. Volume goes through wpctl (part of WirePlumber, so it is there on any PipeWire system) and falls back to pactl; the backlight goes through gluewc-backlight, which drives brightnessctl (or light) in 5% steps down to 10% and 1% steps below that, so it reaches 0 and turns the panel off. Every one of these is a plain spawn: line in the config, so they can be pointed at anything else.

In the overview, use arrows, workspace numbers, the mouse wheel or a two-finger horizontal swipe to navigate. Click a window to focus it, or drag it onto the left, center or right workspace. Every Super binding still works while it is up — open a terminal, close a window, switch layouts — and the cards follow; Super+1…9 and the workspace bindings move the overview instead of switching underneath it. start_in_overview = true opens the session on it. A three-finger horizontal swipe changes the workspace from the desktop; a three-finger vertical swipe opens or closes the overview. Super+wheel also changes workspace. In the drift layout three fingers pan the canvas and a pinch zooms it, so four fingers take over workspaces and the overview there.

Desktop components

gluewc deliberately does not bundle a bar, launcher or wallpaper daemon. Layer-shell clients reserve their own space, and wallpaper layers are included in the overview.

Examples for ~/.config/gluewc/config.conf:

autostart = swaybg -i ~/Pictures/wallpaper.jpg -m fill
autostart = waybar

With no wallpaper program, root_color = 000000 keeps the background black. Waybar can use its dwl workspaces module; desktop shells can also consume the foreign-toplevel protocol. For shells without a dwl-ipc module gluewc keeps $XDG_STATE_HOME/gluewc/workspaces up to date (one line per output: name, active, workspace, window counts, layout) and installs gluewc-msg, which speaks the same protocol from the command line:

gluewc-msg status                        # one line per output
gluewc-msg outputs                       # geometry, modes, mirror of each monitor
gluewc-msg -o eDP-1 workspace 3          # view workspace 3 there
gluewc-msg move 2                        # send the focused window to 2
gluewc-msg layout scroll

glueqs

glueqs is a Quickshell desktop shell written alongside gluewc: a dot-matrix bar with workspaces, tray, media, network, weather and notifications, plus OSDs, a launcher, the wallpaper (it paints it itself, with a picker on Super+W) and a dash that appears over the overview. It is the shell in the video above. It runs on upstream Quickshell, so it works with whatever quickshell your distribution packages.

It is entirely optional — gluewc runs with waybar, any other layer-shell bar, or none at all — but it is the combination the compositor is developed against:

autostart = qs -c glueqs

Configuration and building

Manual build, once dependencies are installed:

make
sudo make install

Compiled defaults remain in config.def.h; normal users only need the runtime config. Run man gluewc for command-line and environment details.

License and credits

gluewc is GPL-3.0-or-later. It is derived from dwl, which grew from the wlroots TinyWL example and carries code influenced by dwm and sway. See LICENSE* and the Git history for the complete notices.

Languages

C

82.7%

Shell

11.0%

Nix

2.7%

Makefile

2.0%

Roff

1.6%