A GTK4 + libadwaita application for switching GNOME desktop layouts, managing shell extensions, fonts, visual effects, and themes.
Community Layout Switcher is the appearance-management tool for BigCommunity Linux. It lets users reshape the GNOME desktop — panels, docks, extensions, fonts and themes — without editing dconf or logging out, while staying compatible with the distribution's comm-gnome-config sync services.
- Layouts — Apply curated desktop layouts (BigGnome, Desk UX, Hybrid, G-Unity, Classic, Minimal) with one click. Automatic pre-apply backup; per-layout user snapshots with a Plasma-style Resume your changes or Apply original prompt when revisiting a customized layout.
- Community Menu — Bundled GNOME Shell 50 menu used independently from ArcMenu: application list in Classic, application grid in Desk UX, and Mint-style categories in Hybrid.
- Fonts — Interface / document / monospace / legacy title selectors via
Gtk.FontDialog, plus hinting and antialiasing controls, a searchable list of installed families with live previews, and quick access to Google Fonts. - Themes — GTK, icon and shell themes with real previews (actual
foldericon from each icon theme; accent color parsed from each theme's CSS), search filter and one-click apply. - Effects — Dedicated page for visual extensions (Desktop Cube, Magic Lamp, Compiz Windows, Desktop Icons NG). Installs prefer
pacmanfor stability and fall back to extensions.gnome.org. - Extensions — Three sub-tabs:
- Featured — curated set with one-click install/toggle/remove.
- Browse — full search of extensions.gnome.org inside the app, with sort, compatibility filter, screenshots carousel, recent comments and direct install.
- Installed — every installed extension with toggle, remove, Update badge and Update all button when new versions are available. Optional auto-update is opt-in in the main menu.
- Backups — Every apply creates a timestamped dconf dump. A dedicated dialog lists all backups with restore/delete and a manual-snapshot button.
- Sync-aware — Cooperates with the
dconf-sync-gnome.servicefromcomm-gnome-config: the monitor is paused around each apply, user extensions are suspended to avoid transient error states, and the final state is persisted atomically to~/.config/dconf/settings.gnome.
Screenshots go in
docs/screenshots/and are referenced here.
- GNOME Shell 45+
- Python 3.10+
- PyGObject bindings for GTK 4 and libadwaita 1
dconf,gsettings,gnome-extensions(standard on GNOME systems)
sudo pacman -S layout-switchergit clone https://github.com/big-comm/layout-switcher.git
cd layout-switcher/pkgbuild
makepkg -sigit clone https://github.com/big-comm/layout-switcher.git
cd layout-switcher
sudo cp -r usr/ /Launch from the application grid or run layout-switcher from a terminal. The sidebar exposes the five sections:
Layouts Fonts Themes Effects Extensions
The hamburger menu gives access to Backups… (restore or snapshot the dconf state) and About.
# run from the checkout without installing
python usr/share/layout-switcher/main.py
# lint + format
ruff check .
ruff format .
# tests (235 unit tests, no display required)
python -m pytest tests/ -qusr/share/layout-switcher/
├── main.py # Adw.Application entry point
├── constants.py # APP_ID, LAYOUTS, i18n setup
├── utils.py # subprocess + gsettings helpers
├── backup_manager.py # timestamped dconf dumps
├── snapshot_manager.py # per-layout user snapshots
├── layout_applier.py # atomic apply orchestration
├── extension_manager.py # install / toggle / remove / update
├── shell_reloader.py # D-Bus cascade reload (no logout)
├── ego_client.py # extensions.gnome.org HTTP client
├── ego_cache.py # disk cache (JSON TTL + thumbs LRU)
├── update_checker.py # detect & apply EGO updates
├── theme_manager.py # GTK / icons / shell theme apply
├── theme_preview.py # folder icon + CSS color extraction
├── settings_store.py # JSON settings + GSettings watcher
└── ui/
├── window.py # main window, sidebar, menu
├── page_layouts.py # layout grid with Resume/Original
├── page_fonts.py # font selectors + installed list
├── page_themes.py # GTK / icons / shell with previews
├── page_effects.py # featured visual extensions
├── page_extensions.py # Featured / Browse / Installed
├── ext_browse_view.py # paginated EGO search + cards
├── ext_detail_view.py # carousel + comments + actions
├── dialog_backups.py # backup management dialog
├── widgets.py # shared custom widgets
└── styles.py # APP_CSS
usr/share/locale/ # .po sources + compiled .mo (28 languages)
tests/ # pytest unit tests
pkgbuild/ # Arch PKGBUILD
User-facing strings are wrapped with tr() and extracted to usr/share/locale/layout-switcher.pot. The catalog is compiled to .mo files for 29 languages:
bg · cs · da · de · el · en · es · et · fi · fr · he · hr · hu · is · it · ja · ko · nl · no · pl · pt · pt_BR · ro · ru · sk · sv · tr · uk · zh
# 1. Regenerate the POT from source
find usr/share/layout-switcher -name '*.py' | xargs xgettext \
--keyword=tr --language=Python --from-code=UTF-8 \
--output=usr/share/locale/layout-switcher.pot \
--package-name=layout-switcher
# 2. Create/merge a language catalog
msgmerge --update usr/share/locale/<lang>.po usr/share/locale/layout-switcher.pot
# 3. Translate the msgstr entries, then compile
msgfmt -o usr/share/locale/<lang>/LC_MESSAGES/layout-switcher.mo \
usr/share/locale/<lang>.poThe layout switcher is MIT. The bundled Community Menu is a modified
GPL-2.0-or-later derivative; see its COPYING and UPSTREAM.md files.