Requirements:
- One of the compositors:
- YaLTeR/niri, a scrollable-tiling Wayland compositor.
- hyprwm/Hyprland, an independent, highly customizable, dynamic tiling Wayland compositor.
- ignis-sh/ignis, a widget framework for building desktop shells.
- Currently the latest main branch should be installed.
- Blueprint, a markup language for GTK user interfaces.
- libadwaita, building blocks for modern GNOME applications.
- Tela icon theme, a flat colorful design icon theme.
- Without tela installed, some icons might be missing.
- Adw is initialized in
config.pyand is required for ui styles, light/dark color schemes, and is used in some widgets. - Blueprint is used in most views and widgets, so can be tweaked as wish. They are built during class declarations.
- An example is to use grid layout in AppLauncher by replacing
ListViewbyGridViewin its.blpfile. Some declarations in the.pyfile should also be replaced accordingly. - Don't forget to run
ignis reloadafter editing blueprints.
- An example is to use grid layout in AppLauncher by replacing
- AppLauncher is initialized in
config.pyand can be disabled by commenting it out.- Don't forget to also edit the launcher command in topbar buttons.
- Notification service is required in
NotificationPopupsandControlCenter.NotificationPopupscan be disabled by commenting it out inconfig.py.NotificationCentercan be removed fromControlCenter's blueprint file.
WallpaperWindows are initialized inconfig.py, and can be commented out if other wallpaper services are used.- For niri, an extra
WallpaperWindowis initialized as the overview backdrop, which should also be configured in niri (example below).
- For niri, an extra
- OSD displays changes of volumes, backlight, and optionally caps lock state.
- libevdev is required for caps lock state detection, installed via system package manager and pip.
- Install libevdev:
pacman -S libevdev. - Install Python bindings:
pacman -S python-libevdevorpip install libevdev.
- Install libevdev:
- User should also be a member of group
inputfor libevdev to work.
- libevdev is required for caps lock state detection, installed via system package manager and pip.
- As is stated, this project works under niri and Hyprland, and synchronizes windows and workspaces in addition to their focus states. These functions are designed as three widgets: a workspaces pill, a focused window indicator, and a dock.
- Recommended keybindings (which should be configured in niri or Hyprland):
- Toggle App Launcher:
ignis toggle-window ignis-applauncher.- It is recommended to also have a fallback launcher, since we are unstable now.
- Toggle Control Center:
ignis toggle-window ignis-controlcenter. - Run custom commands with
ignis run-command:- Start/stop Screen Recorder:
ignis run-command toggle-recording. - Toggle Dock Auto Hide:
ignis run-command toggle-dock. - List all available commands:
ignis list-commands.
- Start/stop Screen Recorder:
- Note: if the
ignisCLI is slow for you, trygoignis.
- Toggle App Launcher:
- Layer window rules:
- Under niri,
layer-rulecan matchnamespacewithignis-applauncher,ignis-controlcenter,ignis-topbarandignis-appdock. - Under Hyprland,
layerruleis used instead. - Hyprland should disable window enter animations for App Launcher and Control Center, as they already have a Revealer transition inside.
- Window shadow often cares the border radius, which is defined as
var(--window-border-radius), which is provided by libadwaita.
- Under niri,
-
Shortcuts in App Launcher:
- Toggle search bar:
Control-f. - Close launcher window:
Esc, orControl-[. - Select next:
Down,Control-j, orControl-n. - Select previous:
Up,Control-k, orControl-p. - Page Up/Down:
PageUp,PageDown.
- Toggle search bar:
-
Styles:
- CSS variables and classes from libadwaita can be used in
.blpfiles. - Some css classes are also generated in TailWindCSS style to be used in
.blpdesigns, e.g.px-2,m-1. - If that's not enough, more style definitions can be added into
styles.scss.
- CSS variables and classes from libadwaita can be used in
-
Designs:
- It should be easy to read and edit
.blpfiles, but don't break widget names and callbacks that are needed in widgets' codes.
- It should be easy to read and edit
-
Widgets:
- Some widgets are designed to be used and customized in anywhere of
.blpfiles. CommandPill: aGtk.Buttonthat accepts an additionalclick-commandproperty to be run upon clicked.ControlSwitchCmd: aControlSwitchthat are used to toggle service up and down inControlCenter, e.g.wlsunset.
- Some widgets are designed to be used and customized in anywhere of
-
Configure
BackdropWallpaperin niri:layer-rule { match namespace="^ignis_wallpaper_backdrop_.*$" place-within-backdrop true opacity 0.5 } layer-rule { match namespace="^ignis_wallpaper_service_.*$" baba-is-float true }
I personally use neovim for coding.
With pyright, ruff, blueprint-compiler installed, and with typing stubs, LSP, code formatter configured, it should be easy to work with.
An example pyproject.toml:
[tool.pyright]
# ignis is installed at venv "/path/to/venv/lib/ignis"
venvPath = "/path/to/venv/lib"
venv = "ignis"
[tool.ruff]
line-length = 120
target-version = "py313"
[tool.ruff.format]
skip-magic-trailing-comma = true
docstring-code-format = true