Find a file
Ottatop 4261b6e60f
Merge pull request #45 from Ottatop/layer_shell
Add wlr-layer-shell support
2023-08-07 18:36:08 -05:00
.github/workflows Add paths to ldoc workflow 2023-08-02 19:49:23 -05:00
api/lua Add SOCKET_DIR env var 2023-08-07 11:53:56 -05:00
assets See if README image works 2023-06-20 13:52:50 -05:00
resources Merged crates, more work on api 2023-06-17 18:55:04 -05:00
src Send pointer events to layer surfaces 2023-08-07 18:28:41 -05:00
.gitignore Remove @overloads 2023-07-22 17:53:28 -05:00
Cargo.toml Change MPL to GPL 2023-08-02 20:18:08 -05:00
CONTRIBUTING.md Add CONTRIBUTING 2023-08-03 20:54:22 -05:00
LICENSE Relicense to GPL 3.0 2023-08-01 11:18:08 -05:00
README.md Update README again again 2023-08-07 18:31:06 -05:00
rustfmt.toml Update rustfmt.toml and stylua.toml 2023-08-04 09:36:40 -05:00
shell.nix Improve error handling 2023-08-06 19:41:48 -05:00

Pinnacle

Cool logo
A very, VERY WIP Smithay-based wayland compositor

News

  • Wlr-layer-shell support is now here! Now you can use stuff like swaybg so you don't have to look at an ugly gray background and eww for widgets (until I implement a widget system, that is). As always, if you find any issues, submit a bug report!
Older stuff
  • We now have XWayland support as of #34! It's currently not that polished right now because I got bored of working on it and I want to work on other aspects of Pinnacle, but it should be at least usable.

Features

  • Winit backend
  • Udev backend
    • This is currently just a copy of Anvil's udev backend.
  • Basic tags
  • 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 that's not already listed in GitHub issues, feel free to submit it!
  • 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 👍

Info

Why Pinnacle?

Well, I currently use Awesome. And I really like it! Unfortunately, Awesome doesn't exist for Wayland (anymore). There doesn't seem to be any Wayland compositor out there that has all of the following:

  • Tags for window management
  • Configurable in Lua (or any other programming language for that matter)
  • Has a bunch of batteries included (widget system, systray, etc)

So, this is my attempt at making an Awesome-esque Wayland compositor.

Dependencies

You'll need the following packages, as specified by Smithay: libwayland libxkbcommon libudev libinput libgdm libseat

  • Arch:
    sudo pacman -S wayland wayland-protocols libxkbcommon systemd-libs libinput mesa seatd
    
  • Debian:
    sudo apt install libwayland-dev libxkbcommon-dev libudev-dev libinput-dev libgdm-dev libseat-dev
    
  • 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. It should work, but if it doesn't, please raise an issue. flake soon™️

Running

After building, run the executable located in either:

./target/debug/pinnacle --<backend>     # without --release
./target/release/pinnacle --<backend>   # with --release

Or, run the project directly with

cargo run [--release] -- --<backend>

backend can be one of two values:

  • winit: run Pinnacle as a window in your graphical environment
  • udev: run Pinnacle in a tty. NOTE: I tried running udev in Awesome and some things broke so uh, don't do that

When running in debug mode, the compositor will drastically slow down if there are too many windows on screen. If you don't want this to happen, use release mode.

IMPORTANT: Read the following before you launch the udev backend:

If you successfully enter the udev backend but none of the controls work, this means either Pinnacle failed to find your config, or the config process crashed.

I have not yet implemented VT switching, so to enable you to exit the compositor if this happens,

Ctrl + Alt + Shift + Escape

has been hardcoded in to kill the compositor.

Pinnacle will open a socket in the /tmp directory.

If for whatever reason you need the socket to be in a different place, run Pinnacle with the SOCKET_DIR environment variable:

SOCKET_DIR=/path/to/new/dir/ cargo run -- --<backend>

⚠️ Don't run Pinnacle as root.

This will open the socket with root-only permissions, and future non-root invocations of Pinnacle will fail when trying to remove the socket until it is removed manually.

Configuration

Please note: this is WIP and has few options.

Pinnacle supports configuration through Lua (and hopefully more languages if it's not too unwieldy 🦀).

Run Pinnacle with the PINNACLE_CONFIG environment variable set to the path of your config file. If not specified, Pinnacle will look for the following:

$XDG_CONFIG_HOME/pinnacle/init.lua
~/.config/pinnacle/init.lua         # if XDG_CONFIG_HOME isn't set

The following will use the example config file in api/lua:

PINNACLE_CONFIG="./api/lua/example_config.lua" cargo run -- --<backend>
The config is an external process.

If it crashes for whatever reason, all of your keybinds will stop working. Again, you can exit the compositor with Ctrl + Alt + Shift + Escape.

Config reloading soon™️

API Documentation

There is a preliminary doc website generated with LDoc. 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://ottatop.github.io/pinnacle/<branch name>.

Autocomplete and that cool stuff

It is highly recommended to use the Lua language server and set it up to have the api/lua directory as a library, as I'll be using its doc comments to 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
        }
    }
}

Controls

The following controls are currently hardcoded:

  • Ctrl + Left Mouse: Move a window
  • Ctrl + Right Mouse: Resize a window
  • Ctrl + Alt + Shift + Esc: Kill Pinnacle. This is for when the compositor inevitably locks up because I did a dumb thing 👍

You can find the rest of the controls in the example_config.

Feature Requests, Bug Reports, Contributions, and Questions

See CONTRIBUTING.md.