- Rust 100%
| ctl | we're so back | |
| examples | we're so back | |
| ipc | we're so back | |
| man | we're so back | |
| wm | COMMANDS.md mostly written? I think? | |
| .gitignore | Complete rewrite of the node tree structure using arena indexing | |
| Cargo.lock | we're so back | |
| Cargo.toml | we're so back | |
| COMMANDS.md | COMMANDS.md mostly written? I think? | |
| LICENSE | Initial commit | |
| README.md | Update README.md | |
Lucid WM
(Yes I named it after the car)
A wlroots-less (very) bspwm-like hybrid-dynamic tiling compositor for Wayland, written in Rust. Started out as a learning project for Rust and it quickly spiraled out of control, because I despise every Wayland compositor in existence for different reasons (except for you, Sway, I love you bbgirl). But I missed the ability to have direction preselectors, an exposed node tree, and the option for rotation.
It's still in its infancy, and there are things I need to add (namely touchscreen support), but it is currently functional.
The build has two separate binaries-- lucid (the actual compositor) and lucidctl (ipc parser/commands). Keybinds follow sxhkd's formatting, but are part of the lucid binary.
lucidctl has four primary classes: config, monitor, desktop, and node.
"config" is for any configuration/appearance settings, "monitor" is for any command that references the physical output, "desktop" is for a command that is scoped to an individual virtual desktop/workspace, and "node" scopes all the way down to an individual node on the binary tree (typically a surface or leaf node, but arguments can sometimes be passed to higher branch nodes).
I need to write a help page.
Installation / Dependencies
Dependencies:
- cargo (required for compile, because I've never written a Makefile in my life)
- foot (terminal used by the default configuration)
- wofi (launcher used by the default configuration)
Optional Dependencies:
- grim (screencapture used by default configuration)
- slurp (same)
1.) Clone the git repo, and cd /path/to/dir/lucidwm/.
2.) Compile the binaries with cargo build --release
3.) This will create two binaries, "lucid" and "lucidctl". They need to be installed into /usr/bin: sudo install -m755 ./target/release/lucid /usr/bin/lucid && install -m755 ./target/release/lucidctl /usr/bin/lucidctl
// further instructions will be added as I go through the install process on a test machine
Why didn't you just stay on bspwm?
X11 suck.My daily workflow is a 3 different monitors, all with different resolutions and scaling factors, and X11 sucks at fractional scaling. Also I wanted better way to adopt orphaned desktops when hotplugging/unplugging monitors. bspwm's is okay but requires a lot of custom scripting.
Why no animations?
I don't use them, so I didn't want to add them. If someone wants to add them, feel free.
Known issues:
- moving Xwayland windows across monitors that have different scaling factors screws with them (xwayland window no longer fits in the surface drawn by lucid, so pointer gets screwy until you resize the surface).
- preselector edge drawing doesn't actually work (changes the full border color, not just the color of whatever edge is preselected)
- cursor gets drawn really big on some GTK applications, I haven't really looked into why.
- some dropdowns that extend past the surface edge (in any dir) when spawned from tiled windows lose pointer capture when they overlap another tiled surface.
- floating surfaces, because they're rendered on a unified supersurface, are sticky and not confined to one desktop (I broke this at some point and I'm not sure where).
Stuff I want to add:
- bspwm-style rules (allow things to spawn on specific desktops, floating, etc)
- touchscreen support
- ability to spawn stuff floating as a flag (coincides w/ rules)
- alternative layouts (master/stack, stacking/tabbed nodes, etc)