https://github.com/Jappie3/wayfreeze
Tool to freeze the screen of a wlroots compositor
https://github.com/Jappie3/wayfreeze
hyprland wayland wayland-client
Last synced: 14 days ago
JSON representation
Tool to freeze the screen of a wlroots compositor
- Host: GitHub
- URL: https://github.com/Jappie3/wayfreeze
- Owner: Jappie3
- License: agpl-3.0
- Created: 2024-03-05T07:10:56.000Z (about 1 year ago)
- Default Branch: master
- Last Pushed: 2024-05-23T09:27:34.000Z (11 months ago)
- Last Synced: 2024-05-23T09:28:13.039Z (11 months ago)
- Topics: hyprland, wayland, wayland-client
- Language: Rust
- Homepage:
- Size: 46.9 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-hyprland - Wayfreeze
README
# Wayfreeze
A small CLI tool to freeze the screen of a wlroots compositor, this can be useful to, for example, take a screenshot. Supports multiple monitors & fractional scaling.
## Usage
Run `wayfreeze`, click or press escape to exit.
```bash
Usage: wayfreeze [OPTIONS]Options:
--hide-cursor
Hide cursor when freezing the screen
--before-freeze-cmd
Command to run before freezing the screen
--before-freeze-timeout
Amount of milliseconds to wait between before-freeze-cmd and freezing the screen
--after-freeze-cmd
Command to run after freezing the screen
--after-freeze-timeout
Amount of milliseconds to wait between freezing the screen and running after-freeze-cmd
-h, --help
Print help
-V, --version
Print version
```Example usage with [Grim](https://git.sr.ht/~emersion/grim) & [Slurp](https://github.com/emersion/slurp):
```bash
# for e.g. Hyprland or Sway (as of Sway 1.10-rc4):
wayfreeze & PID=$!; sleep .1; grim -g "$(slurp)" - | wl-copy; kill $PID
# or:
wayfreeze --after-freeze-cmd 'grim -g "$(slurp)" - | wl-copy; killall wayfreeze'# for compositors that order layer surfaces the other way around:
wayfreeze --before-freeze-cmd 'grim -g "$(slurp)" - | wl-copy; killall wayfreeze' --before-freeze-timeout 10
```> Note: the Wayland specification [states the following](https://wayland.app/protocols/wlr-layer-shell-unstable-v1#zwlr_layer_shell_v1:enum:layer): "Multiple surfaces can share a single layer, and ordering within a single layer is undefined." This means that compositors can put new layer surfaces **over or under** existing layer surfaces (given they're on the same layer), and **both of those options are compliant to the spec**. Compositors like e.g. Hyprland and Sway (since Sway 1.10-rc4) put new layer surfaces over older ones, while e.g. Sway (before 1.10-rc4) put new layer surfaces underneath already existing ones. If you're unsure how your compositor handles this, just try both commands while playing a video or something. One will work, the other one won't.
## Installing
Wayfreeze can be installed either by using nixpkgs-unstable or flake.
### Nixpkgs:
Add this to your configuration and rebuild your system:
```nix
environment.systemPackages = [ pkgs.wayfreeze ];
```### Flake:
Add this repository as a flake to your inputs:
```nix
wayfreeze.url = "github:jappie3/wayfreeze";
```Define the package and then rebuild your system:
```nix
environment.systemPackages = [ inputs.wayfreeze.packages.${pkgs.system}.wayfreeze ];
```### AUR
There is an AUR package available at https://aur.archlinux.org/packages/wayfreeze-git.
Note: I do not maintain this package myself.
### From source:
Firstly, ensure you have Rust, Cargo, and the libxkbcommon development headers.
Then, you can either run the following command to build the project:
```
cargo build --release
```And your binary will be located at `./target/release/wayfreeze`.
Or, you can run the following command to install it (as your user):
```
cargo install --path .
```## Technical
The following protocols should be supported by your compositor:
- `wlr-layer-shell-unstable-v1` -> used for creating & rendering a layer surface
- `wlr-screencopy-unstable-v1` -> used for copying the current output to a client buffer
- `wp-fractional-scale-v1` -> to support fractional scaling
- `wp-viewporter` -> for scaling the surface## Credits
In no particular order, here are some resources that were helpful when creating this tool & learning about the Wayland protocol:
- https://wayland.app/protocols/wayland
- https://github.com/hiasen/wayland-rust-client-experiment/
- https://github.com/Smithay/wayland-window/blob/master/examples/simple_window.rs
- https://github.com/rafaelrc7/wayland-pipewire-idle-inhibit/
- https://levans.fr/rust_wayland_1.html
- https://bugaevc.gitbooks.io/writing-wayland-clients/content/black-square/allocating-a-buffer.html
- https://danyspin97.org/talks/writing-a-wayland-wallpaper-daemon-in-rust
- https://docs.rs/wayland-client/latest/wayland_client
- https://wayland-book.com