Pinnacle is a Wayland compositor built in Rust using Smithay. It's my attempt at creating something like AwesomeWM for Wayland.
Pinnacle comes integrated with Snowcap, a very, very WIP widget system. Currently it's only being used for the builtin quit prompt and keybind overlay. In the future, Snowcap will be used for everything Awesome uses its widget system for: a taskbar, system tray, etc.
You will need:
libwayland
libxkbcommon
libudev
libinput
libgbm
libseat
libEGL
libsystemd
libdisplay-info
for monitor display informationxwayland
for Xwayland supportprotoc
for the APIThe following are optional dependencies:
just
to automate installation of libraries and files
The following are required to use the Lua API:
Arch and derivatives:
sudo pacman -S wayland libxkbcommon libinput mesa seatd systemd-libs libdisplay-info xorg-xwayland protobuf
# And optionally
sudo pacman -S just lua luarocks
Debian and derivatives:
sudo apt install libwayland-dev libxkbcommon-dev libudev-dev libinput-dev libgbm-dev libseat-dev libsystemd-dev protobuf-compiler xwayland libegl-dev libdisplay-info-dev
# And optionally
sudo apt install just lua5.4 luarocks
just
is only available in apt from Debian 13.Nix and NixOS:
flake.nix
with a devShell. It also
includes the other tools needed for the build and sets up the
LD_LIBRARY_PATH
so the dynamically loaded libraries are found.
Luarocks currently doesn't install the Lua library and its dependencies due to openssh directory shenanigans. Fix soon, hopefully. In the meantime you can use the Rust API.
TODO: other distros
Clone this repository and, if building with Snowcap integration, update the snowcap
submodule:
git clone https://github.com/pinnacle-comp/pinnacle
git submodule update --init
[!NOTE] For all following
cargo
/just
commands, if you would like to build without Snowcap integration, run with--no-default-features
.
Build the project with:
cargo build [--release]
To additionally install the default configs, protobuf definitions, and Lua API, run:
just install build [--release] # Order matters, put build/run/test last to pass through arguments
[!TIP] Before running, read the information in Configuration.
[!IMPORTANT] If you are going to use a Lua config, you must run
just install
to install the protobuf definitions and Lua library.
After building, run the executable located in either:
./target/debug/pinnacle # without --release
./target/release/pinnacle # with --release
[!IMPORTANT] When compiling with Snowcap integration, if you do not have Vulkan set up properly, Pinnacle will crash on startup.
For those using Nix outside of NixOS, you will need to run the built binary with nixGL using both GL and Vulkan wrappers, nested inside one another:
nix run --impure github:nix-community/nixGL -- nix run --impure github:nix-community/nixGL#nixVulkanIntel -- ./target/debug/pinnacle
Or, run the project directly with
cargo run [--release]
# With installation:
just install run [--release]
See flags Pinnacle accepts by running cargo run -- --help
(or -h
).
Pinnacle is configured in your choice of Lua or Rust.
Pinnacle embeds the default Rust config into the binary. If you would like to use the Lua or Rust default configs standalone, run one of the following in the crate root:
# For a Lua configuration
just install run -- -c ./api/lua/examples/default
# For a Rust configuration
cargo run -- -c ./api/rust/examples/default_config
When running without compiled Snowcap integration, use the following directories instead:
# Lua
just install run -- -c ./api/lua/examples/default_no_snowcap
# Rust
cargo run -- -c ./api/rust/examples/default_config_no_snowcap
[!IMPORTANT] Pinnacle is under development, and there will be major breaking changes to these APIs until I release version 0.1, at which point there will be an API stability spec in place.
Run the following command to open up the interactive config generator:
just install-configs run -- config gen
This will prompt you to choose a language (Lua or Rust) and directory to put the config in. It will then generate a config at that directory. If Lua is chosen and there are conflicting files in the directory, the generator will prompt to rename them to a backup before continuing. If Rust is chosen, the directory must be manually emptied to continue.
Note that this currently copies default configs with Snowcap integration.
Run cargo run -- config gen --help
for information on the command.
Pinnacle is configured purely through IPC using gRPC. This is done through configuration clients that use the Lua and Rust interface libraries.
As the compositor has no direct integration with these clients, it must know what it needs to run
through a separate file, aptly called the metaconfig.toml
file.
To start a config, Pinnacle will search for a metaconfig.toml
file in the first directory
that exists from the following:
--config-dir
/-c
$PINNACLE_CONFIG_DIR
$XDG_CONFIG_HOME/pinnacle
~/.config/pinnacle
if $XDG_CONFIG_HOME
is not definedIf there is no metaconfig.toml
file in that directory, Pinnacle will start the embedded
Rust config.
Additionally, if your config crashes, Pinnacle will also start the embedded Rust config.
[!NOTE] If you have not run
eval $(luarocks path --lua-version <your-lua-version>)
, Pinnacle will fallback to the embedded Rust config.
metaconfig.toml
fileA metaconfig.toml
file must contain the following entries:
command
: An array denoting the program and arguments Pinnacle will run to start a config.reload_keybind
: A table denoting a keybind that Pinnacle will hardcode to restart your config.kill_keybind
: A table denoting a keybind that Pinnacle will hardcode to quit the compositor.
It also has the following optional entries:
socket_dir
: A directory that Pinnacle will place its IPC socket in (this defaults to $XDG_RUNTIME_DIR
,
falling back to /tmp
if that doesn't exist).[envs]
: A table of environment variables that Pinnacle will start the config with.For the specifics, see the default metaconfig.toml
file.
A .luarc.json
file is included with the default Lua config
and will set the correct workspace library files for use with the
Lua language server.
Lua: https://pinnacle-comp.github.io/lua-reference/main.
Rust: https://pinnacle-comp.github.io/rust-reference/main.
Documentation for other branches can be reached by replacing
main
with the branch you want.
Yes, ctrl is a bad mod key I know, this will be changed to Awesome keybinds soon
The following are the default controls in the default_config . |
Binding | Action |
---|---|---|
Ctrl + s | Show the keybind overlay | |
Ctrl + Mouse left drag | Move window | |
Ctrl + Mouse right drag | Resize window | |
CtrlAlt + q | Quit Pinnacle | |
CtrlAlt + c | Close window | |
Ctrl + Return | Spawn Alacritty (you can change this in the config) | |
CtrlAlt + Space | Toggle between floating and tiled | |
Ctrl + f | Toggle fullscreen | |
Ctrl + m | Toggle maximized | |
Ctrl + Space | Cycle to the next layout | |
CtrlShift + Space | Cycle to the previous layout | |
Ctrl + 1 to 5 | Switch to tag 1 to 5 |
|
CtrlShift + 1 to 5 | Toggle tag 1 to 5 |
|
CtrlAlt + 1 to 5 | Move a window to tag 1 to 5 |
|
CtrlAltShift + 1 to 5 | Toggle tag 1 to 5 on a window |
See CONTRIBUTING.md
.
See CHANGELOG.md
.