A macOS-style horizontal app switcher for the COSMIC desktop on Pop!_OS — replacing the default vertical Super+Tab list with a compact icon strip centered on screen.
![]() |
![]() |
| Super+Tab switcher overlay | Panel applet — theme & shortcut toggle |
One-line (no Rust required):
curl -fsSL https://raw.githubusercontent.com/j0rdiun/cosmic-ext-app-switcher/main/install.sh | bashOr build from source:
# Install dependencies (one-time)
sudo apt install libxkbcommon-dev
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y && source ~/.cargo/env
git clone https://github.com/j0rdiun/cosmic-ext-app-switcher
cd cosmic-ext-app-switcher
make installChanges take effect immediately — no logout required.
curl -fsSL https://raw.githubusercontent.com/j0rdiun/cosmic-ext-app-switcher/main/uninstall.sh | bashOr from the project directory:
make uninstall| Shortcut | Action |
|---|---|
| Super+Tab / Alt+Tab | Open switcher / cycle forward |
| Super+Shift+Tab / Alt+Shift+Tab | Cycle backward |
| Modifier release | Activate selected window |
| Escape | Cancel — return to original window |
| Click icon | Select |
| Release click | Activate |
Tip: After installing, right-click your COSMIC panel → Edit Panel → Add Applet → search for App Switcher Settings and add it. This gives you a one-click toggle and theme picker directly in your panel.
Add the App Switcher Settings applet to your COSMIC panel for quick access to:
- Super+Tab shortcut toggle — enable or disable without touching the terminal
- Theme picker — Dark, Light, Frosted, or Midnight
Via the panel applet toggle, or from the terminal:
make enable # register as COSMIC window switcher (live reload)
make disable # remove — restores COSMIC's default switcher
make status # show current state
make check-compat # verify COSMIC environment is compatibleCOSMIC's compositor (cosmic-comp) lets you override the WindowSwitcher action by pointing a config file at any binary. The scripts detect the config path automatically — if COSMIC updates and moves to a new config version, it still works.
Each key press launches the binary fresh. The first invocation creates a layer-shell overlay and binds a Unix socket. Subsequent presses (while the modifier is held) connect to that socket and send a next/prev signal — the running instance advances the selection and re-renders. Releasing the modifier triggers window activation via zcosmic_toplevel_manager_v1.
Wayland protocols used:
zcosmic_toplevel_info_v1— enumerate open windowszcosmic_toplevel_manager_v1— activate a windowzwlr_layer_shell_v1— overlay surface centered on screen
src/
main.rs # entry point: IPC check, then launch app
app.rs # libcosmic Application: state machine, socket subscription
ui.rs # horizontal icon strip view
wayland.rs # background thread: enumerate toplevels, activate window
icons.rs # app_id → icon name via .desktop file lookup
scripts/
find-config.sh # detects COSMIC shortcuts config path dynamically
enable.sh # writes WindowSwitcher entries to COSMIC config
disable.sh # removes them
status.sh # prints current state
install.sh # standalone installer (downloads binary, no Rust needed)
uninstall.sh # standalone uninstaller
.github/
workflows/
release.yml # builds x86_64 + aarch64 binaries on tag push
git tag v0.2.0
git push origin v0.2.0GitHub Actions will build binaries for x86_64 and aarch64 and publish a release automatically.
- Pop!_OS with COSMIC desktop
- x86_64 or aarch64 architecture
Building from source additionally requires libxkbcommon-dev and Rust.
GPL-3.0-only — see LICENSE

