.github/workflows | ||
api/lua | ||
assets | ||
resources | ||
src | ||
.gitignore | ||
Cargo.toml | ||
CHANGELOG.md | ||
CONTRIBUTING.md | ||
LICENSE | ||
README.md | ||
rustfmt.toml | ||
shell.nix |
https://github.com/Ottatop/pinnacle/assets/120758733/c175ba80-9796-4759-92c3-1d7a6639b0c9
Info
What is Pinnacle?
Pinnacle is a Wayland compositor built in Rust using Smithay. It's my attempt at creating something like AwesomeWM for Wayland.
It sports high configurability through a (soon to be) extensive Lua API, with plans for a Rust API in the future.
More video examples below!
Click me
All videos were recorded using Screenkey and the Winit backend.
https://github.com/Ottatop/pinnacle/assets/120758733/5b6b224b-3031-4a1c-9375-1143f1bfc0e3
https://github.com/Ottatop/pinnacle/assets/120758733/7a465983-2560-412e-9154-40b3dfd20488
(This video is very crunchy in my attempts to get under the 10mb limit)
Features
This is a non-exhaustive list.
- Winit backend (so you can run Pinnacle in your graphical environment)
- Udev backend (so you can run Pinnacle in a tty)
- Tag system
- Layout system
- Left master stack, corner, dwindle, spiral layouts
- Other three master stack directions, floating, magnifier, maximized, and fullscreen layouts
- Resizable layouts
- XWayland support
- This is currently somewhat buggy. If you find a problem, please submit an issue!
- Layer-shell support
- wlr-screencopy support
- wlr-output-management support
- Server-side decorations
- Animations and blur and all that pizazz
- Widget system
- The other stuff Awesome has
- Is very cool 👍
Dependencies
I have not tested these. If Pinnacle doesn't work properly with these packages installed, please submit an issue.
You'll need the following packages, as specified by Smithay:
libwayland libxkbcommon libudev libinput libgdm libseat
, as well as xwayland
.
- Arch:
sudo pacman -S wayland wayland-protocols libxkbcommon systemd-libs libinput mesa seatd xwayland
- Debian:
sudo apt install libwayland-dev libxkbcommon-dev libudev-dev libinput-dev libgdm-dev libseat-dev xwayland
- NixOS: Use the provided
shell.nix
. - TODO: other distros.
You'll also need Lua 5.4 for configuration. Older versions will not work. Check with your package manager to see which version you have.
Building
Build the project with:
cargo build [--release]
For NixOS users, there is a provided shell.nix
file that you can use for nix-shell
.
flake soon™️
Running
Important
Before running, read the information in Configuration.
After building, run the executable located in either:
./target/debug/pinnacle # without --release
./target/release/pinnacle # with --release
Or, run the project directly with
cargo run [--release]
Pinnacle will automatically initialize the correct backend for your environment.
However, there is an additional flag you can pass in: --<backend>
. You most likely do not need to use it.
backend
can be one of two values:
winit
: run Pinnacle as a window in your graphical environmentudev
: run Pinnacle in a tty.
If you try to run either in environments where you shouldn't be, you will get a warning requiring you to
pass in the --force
flag to continue. This is not recommended.
Important
Make sure
command
in yourmetaconfig.toml
is set to the right file. If it isn't, the compositor will open, but your config will not apply. In that case, kill the compositor using the keybind defined inkill_keybind
(default CtrlAltShift + Esc) and setcommand
properly.
Note
Pinnacle will open a socket in the
/tmp
directory. If for whatever reason you need the socket to be in a different place, setsocket_dir
in yourmetaconfig.toml
file to a directory of your choosing.
Configuration
Pinnacle is configured in Lua. Rust support is planned.
Pinnacle will search for a metaconfig.toml
file in the following directories, from top to bottom:
$PINNACLE_CONFIG_DIR
$XDG_CONFIG_HOME/pinnacle/
~/.config/pinnacle
The metaconfig.toml
file provides information on what config to run, kill and reload keybinds,
and any environment variables you want set. For more details, see the provided
metaconfig.toml
file.
To use the provided Lua config, run the following in the root of the Git project:
PINNACLE_CONFIG_DIR="./api/lua" cargo run
To run without the above environment variable, copy metaconfig.toml
and
example_config.lua
to $XDG_CONFIG_HOME/pinnacle/
(this will probably be ~/.config/pinnacle
).
If you rename
example_config.lua
to something likeinit.lua
, you will need to changecommand
inmetaconfig.toml
to reflect that.
ℹ️ Using the Lua Language Server
It is highly recommended to use the Lua language server
and set it up to have the api/lua
directory as a library.
This will provide documentation, autocomplete, and error checking.
For VS Code:
Install the Lua plugin, then go into
its settings and add the path to the api/lua
directory to Workspace: Library
.
For Neovim:
Pass this table into your Lua language server settings:
Lua = {
workspace = {
library = {
"/path/to/pinnacle/api/lua" -- Your path here
}
}
}
API Documentation
You can find online documentation for the Lua API here.
This documentation is auto-generated from the provided LuaLS annotation through ldoc_gen, so there may be some errors as I work the kinks out.
Note that there are some missing things like the Keys
table and Layout
enum
as well as any function overloads, but these should be autocompleted through the language server.
Documentation for other branches can be reached at https://pinnacle-comp.github.io/pinnacle/<branch name>
.
Controls
The following are the default controls in the example_config
.
Binding | Action |
---|---|
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 |
Feature Requests, Bug Reports, Contributions, and Questions
See CONTRIBUTING.md
.
Changelog
See CHANGELOG.md
.