ITADN
nferhat/fht-compositor

版本发布 6

25.10.1
? · 2025-10-19

# v25.10.1 This is a hotfix release for [`fht-compositor` v25.10](https://github.com/nferhat/fht-compositor/releases/tag/25.10) ## Bug fixes - 3e9b9fca90f36e1b1a0ba4478aed05f732549d5d Update `fht-share-picker` to `v25.10`, to use the latest version of the IPC types

25.10
? · 2025-10-19

# v25.10 Finally, after quite a while (7 months!), we are finally pushing out a release! Bringing a wave of improvements and polishes to the compositor experience, while also bringing new features to integrate `fht-compositor` into your environment! > [!NOTE] > Due to the very aggresive internet filters of Algeria Telecom (the **ONLY** ISP in Algeria), I do not have access to the Matrix, and it's been like that for the past 6 months. After hoping for them to fix it, there's nothing that has been done. Due to this, I decided to maintain a community over Discord, which (so far) isn't blocked, https://discord.gg/H58C8AdU7x. > [!NOTE] > For packagers: > - The minimum supported Rust version is now `1.85.1` > - `libdisplay-info>=0.3.0` is required to build the compositor. ## No more UWSM Yeah, I've decided to get rid of it. While it does handle a lot of edge cases for more complicated sessions (like KDE's), I couldn't justify keeping it, especially with the many hacks I employed to get it to work properly with the custom portal. Now `fht-compositor` ships with its own sets of session scripts, located under [`res/systemd`](https://github.com/nferhat/fht-compositor/tree/main/res/systemd) ## Documentation There's nothing more frustrating that trying to understand and use a program without having a reliable source of truth *documenting* how the program works and behaves. With such an extensive configuration, and the sheer complexity of Wayland compositors in general, the lack of documentation in `fht-compositor` was really painful, especially to newcomers. No more! I've finally put myself to the task and wrote down a pretty good documentation, formatted and published using [Vitepress](https://vitepress.dev/) under Github Pages. <img width="2559" height="1439" alt="Documentation website screenshot" src="https://github.com/user-attachments/assets/e6608fa1-9d31-4d1d-a995-fb1242e4767c" /> Check it out at https://nferhat.github.io/fht-compositor! ## IPC The defining feature of this release is the introduction of a Inter-process communication system. This allows you, either through the CLI (using `fht-compositor ipc`) or through a direct connection using a UNIX domain socket, to query data from the compositor, and ask the compositor to-do things for you... like focusing a window, running a command, etc. It opens the door for scripting, creating custom Wofi menus, writing custom shells, etc... The sky's the limit. ### IPC subscribing With the generous help of @Byson94, the compositor also has a subscribing mode, where it will send events to you. This is even more useful for writing shells, by getting quick partial upgrades to replicate as soon as possible. You can integrate this system into Quickshell, Flutter, EWW, or just native Rust code! Check out crate documentation for `fht-compositor-ipc` for more information! ## Better tile swapping There was an initial implementation of an interactive tile swap that relied on the mouse, it went like the following - You grab a tile using the designated mouse bind (generally `Super+Left`) - You start moving your move, the workspace will *on purpose* not update the layout to make you see where the tile you will swap with will be placed - You drop the tile on another one, swapping them around This approach was fairly simple and *very* limiting: - You can only swap two tiles, IE just a swap in of indices, which may not fit all cases - The swap was limited to a single workspace, on a single output. Hence, with the initial help of @Nyx (the account is now gone), a better implementation was programmed and merge in #42, which many improvements: https://github.com/user-attachments/assets/563eae7c-96d6-4c15-8265-0fc939203e99 Notably: - You can slide windows seamlessly around outputs - You have much more control in where you will insert the window, since the new implementation allows you insert before/after any window, altering the layout properties accordingly (like the number of master clients). This implementation works seamlessly with all the layouts provided in `fht-compositor`, and any future ones will also strive to have this smooth integration ## `ontop` Window rule A pretty straightfoward window rule to understand. Paired with the new match criteria `is-floating`, this allows you to make certain (if not all) floating windows render above the tiled windows, simulating the behavior of most other Wayland compositor, which separate both tiled and floating windows into different layers. You this can be especially useful for firefox's Picture-in-Picture video player <img width="2559" height="1439" alt="pip" src="https://github.com/user-attachments/assets/879cc4a4-3cd9-4de4-b128-eb7fba0c3111" /> ## Variable-Refresh-Rate support VRR is an essential part to having a smooth gaming experience. You may know it better as NVidia GSync or AMD FreeSync on your monitor's spec sheet. In short, allows the monitor to change its refresh rate live, allowing for smooth continuous frame output. Check out [`output.<name>.vrr`](https://nferhat.github.io/fht-compositor/configuration/outputs.html#vrr) on thw wiki for more information! ## Improvements - 27cf9920ba2df0bf1d8f3c8756bb7a639f517306 Add custom mode support in udev backend (generated by CVT calculation) - 3a93e52f16172973cee2322e8538b38d61bc3c39..144ea9ac623f89a2a31e43e759d499a00694fee8 Support `wlr-output-management-v1` - 2440ba7a31a85f839bccb348d30e6b564df1fb08 Add `general.focus-follows-mouse` option - 823e849af39b2b3a614a323831a1f176860bbf15 Allow users to define environment variables inside their configurations - f455bdb0d26acd33af1edcfa5741b108035a1880 Support `xdg-dialog-v1` protocol - 639f236c4805288b9bda463224e9296f1b591780 Break up `input.mouse` into different categories - 61afbcbddab0caa2049b20df56fa72f932d019ff RUSTSEC-2022-0040 vulnerability fix. Thanks @id3v1669! - @LeVraiArdox added support for scrolling mousebindings in #80, thank you! - Applying the home-manager configuration now automatically reloads the config in #67 ## Bug fixes - Actually create `wp_pointer_global_v1`, - `animations.disable` will now correctly disable all space related animations (workspace switching, fullscreening, etc...) - e5d1f64b932b88db2d0469374b5c7b88d74c2be9 Account for `open-on-workspace` in window rules - 11798d15f74f41385ca7d9f62a686569b8c662ac Fix udev backend only rendering the active output - aa70329b9a8bb8bbd14ef9baa51b2b0dfd26a583 Make layer-shell use the active output instead of the first one - This behaviour works better with programs like launchers, that (often) don't specify which output to open on - 922576809670448221213381f36d9bbf159c6cb5 Focus the correct window when using `focus-next/previous-output` - 8b9c9aa66545debebf5f17fe9db028408f67df04 Clamp swapped and resized tiles to output geometry - 2440ba7a31a85f839bccb348d30e6b564df1fb08 Don't panic winit backend when `buffer_age==None` - 0069552da1888b17b021dd027475852c5dd532ca Don't exit fullscreen state when setting active tile - f1ec368bfe4260c8bfe741a8f9bce09eea078348 Fix `center-floating-window` action - d3fd94108c0780c8952c83d9aeeb9bbfe95acf61 Show config UI on currently active output instead of the first one it opened on - 61f5f6546650e7a034f76ac651b17523b966819e Fix XDG toplevel popup positioning - 00a620ebb4560d51daa9165bc9a29c79c931d2c4 Clamp argument in `focus-workspace` - 9f70f065d087e53cad8b91a6969acec795e570f6 Make the home-manager module cleanly print the config error, thanks @isabelroses - Updated smithay *several* times, https://github.com/smithay/smithay/compare/3219a0f02a30de359f460ab165682a51cb13b7a5...9ccbd35f51842934f22b5a85ca0e3be1b99b27f2 **Full Changelog**: https://github.com/nferhat/fht-compositor/compare/25.03.1...25.10

25.03.1
? · 2025-03-03

This is a quick hotfix update for 25.03 - Fixed declaring UWSM startup script without `--uwsm` command line argument - Make `GIT_HASH` available when building the compositor using the nix flake - Properly format the version string in `fht-compositor -V` - Fix `Cargo.lock` file still having the compositor version as `0.1.1`

25.03
? · 2025-03-01

Finally, a new release. It's been, a while... Well mostly due to entering college I do not have much free time and when I do work on the compositor, I just work on some small features, until, well, yeah, you get a release that changes more-or-less everything :sweat_smile: Regardless, fht-compositor is a dynamic tiling Wayland compositor that also looks nice! ![preview](https://github.com/user-attachments/assets/31e53789-d2a8-4c82-af4d-1c5352df01ab) Such a big version jump mandates a new preview video! https://github.com/user-attachments/assets/4ea9b294-85a8-49ab-9f42-2f76111f063b --- ## Versioning scheme change The previous release was `0.1.1`, and this is `25.03`, what!? Well, the compositor switched from sem/zero-ver to CalVer since: - It's very difficult to quantify changes with semver, especially since when working on a compositor, some *major* refactors and changes might not affect the end user, just some backend/logic work. - I am very much not consistent with releases, making using semver really cumbersome. However, this change will help keep (hopefully) a more consistent releasing cycle, with a new release every maybe 1-3 months, with releases marked with `YY.MM.minor` for patches and fixes. New releases will drop whenever there are enough features to make up one. --- ## Migration to TOML configuration Initially, `fht-compositor` was configured using [RON](https://github.com/ron-rs/ron). While the language integrates very nicely with Rust, I found that writing configuration is pretty cumbersome with it, and some quirks of it make it pretty annoying to work with. This is why I decided to switch the configuration to [TOML](https://toml.io), while also making heavy use of tagged union structs to make writing configuration easy. Some parts like window rules became extremely easier to write in the new configuration format, which is a win for me. The new configuration system also introduces live-configuration reloading with a new configuration message UI: https://github.com/user-attachments/assets/ee83a488-b6f1-4f11-88b2-a730cbf28e74 --- ## Nix, nix, nix everywhere! This repository is now a [Nix flake](https://nixos.wiki/wiki/flakes)! Allowing you to install, configure (via home-manager), and run `fht-compositor` in Nix(OS) environment easily. Wiki for it coming soon! In the mean time, check out my [dotfiles](https://github.com/nferhat/dotfiles/blob/main/home/desktop/fht-compositor.nix) to see how the home-manager is. --- ## Better session support `fht-compositor` now integrates nicely in a desktop session with [Universal Wayland Session Manager](https://github.com/Vladimir-csp/uwsm). Use the provided `fht-compositor-uwsm.desktop` session file to start it. If you are from a TTY, you can use ```sh uwsm start -- fht-compositor --uwsm ``` To start a session. This is much better UWSM will automatically bind Systemd targets (`graphical-session(-pre).target`, `wayland-session.target`, etc.) to make stuff like autostart work seamlessly. It is now recommended to use autostart with systemd units instead of using the `autostart` field in the configuration. --- ## Floating window support Since the last refactor in `workspace-logic-v2` branch, a lot of essential stuff like floating windows was removed. With yet another refactor later (introduction of the `Space` and `Monitor`s), floating window are now back, and better than ever! ![floating window preview](https://github.com/user-attachments/assets/26bb0dd6-e65f-48da-9ef9-97472a33dd4a) I implemented many heuristics to: - Detect when a window should be floating, this should cover about 90% of the cases like popups, prompts, etc. - Center a child window in its parent. For example, going to OBS' settings opens a child window that will automatically centered and placed above the OBS window. If these do not over your case, you can still make extensive window rules to float specific windows by filtering with workspace, output, class, title, etc. Nothing is impossible! Implementing floating windows also needs care and attention. The compositor should make sure that the stacking order is kept coherent between parent/children windows, avoid placing/moving windows out of the monitor's bounds, and implement window movement using keybindings with `move/resize-floating-window`. --- ## Output configuration Finally, you can configure your outputs with the compositor, a feature that was very missing in the previous releases. ```toml # Internal laptop display [outputs."eDP-1"] disable = false # Keep it on, since its the only one available. mode = "1920x1080@60.005" scale = 2 # position = [0, 0] ``` Nothing fancy, but was very much needed --- ## Window/Layer-shell rules ### Window rules Window rules have been massively reworked to be **dynamic** (IE. they update continuously and can match live window state, like being focused) and much easier to write/manage (with the introduction of the TOML config rewrite) ```toml # Window rule to always center-float games. # My gaming workspace is the 6th one (index 5) [[rules]] centered = true floating = true match-app-id = [ "Celeste.bin.x86_64", "steam_app_*", "osu!.exe", "Etterna", "Quaver", "Steam", "love", "org.prismlauncher.PrismLauncher" ] on-workspace = 5 # Floating programs that behave better when they are # Mostly gnome applications and transient windows. [[rules]] centered = true floating = true match-app-id = [ "^(org.gnome.*)$", # gnome programs "file_progress", "confirm", "dialog", "download", "pinentry", "splash" ] match-title = [ ".*KeePassXC.*", ".*QEMU.*", "Virtual Machine Manager", "Bluetooth Devicecs" ] # Dyanmic window rules # For example make unfocused windows less opaque [[rules]] is-focused = false opacity = 0.95 ``` ### Layer-shell rules In the same vein as window rules, you can enable optional effects onto layer shells ```toml # Enable blur, rounded corners and shadow for wofi # You can of course tweak individual settings [[layer-rules]] corner-radius = 25 match-namespace = ["wofi"] shadow.disable = false blur.disable = false ``` --- ## Decorations and effects One of the biggest and most noticeable improvements of the compositor are the visual. In order to make my vision of the compositor possible, I've leveled up the graphics in the compositor by implementing many niceties. ### Animations More animations have been implemented, and a lot of them have been seriously polished out. The highlight are of course the window resize animations. https://github.com/user-attachments/assets/110f4e44-0592-4dd5-9f5e-5263bd446cbf The window resize animations were particularly hard to implement, until I found a solution (from [Niri](https://github.com/YalTeR/Niri)): Draw the window in a temporary texture and apply a custom shader on it. This allows for seamless rounded corners and smooth scaling/cropping, neat! There are also many other cases to handle, like fullscreening a window should make other windows fade out gracefully, and unfullscreening should do the same. Moreover, animation logic in the compositor have now been reworked for them to be cancellable, IE. you can stop them and revert them before they finish. This is most noticeable with workspace switch animations, you can now switch back and forth between different workspaces without having to wait for the current switch to end. https://github.com/user-attachments/assets/24c850bf-3de0-44ce-a76b-4424823a6e55 ### Shadows Drop shadows are quite a necessity when you support floating windows. Shadows are tweakable and can complement the look of your environment very well! | No shadow | Basic black drop shadow | Colored via window rules | Even layer-shells | |- | ------------------------------------ | ------------------------------------ | - | | ![no shadow](https://github.com/user-attachments/assets/4118a381-d7e2-42bc-856a-6e7ed3e4a39a) | ![basic shadow](https://github.com/user-attachments/assets/1158de99-7953-4399-8a89-c9aacad6bdb8) | ![color via rules](https://github.com/user-attachments/assets/e6fe4ae2-b58e-4f27-9338-7574bd7252ef) | <img src="https://github.com/user-attachments/assets/fcd84189-2ca3-47e0-b4cb-16cd9e0d0ea4" style="horizontal-align:middle"> ### Blurring *"What is a good Wayland compositor without that heckin' blur!?"*... More seriously, I always loved the look and aspect of blur. The actual implementation in the compositor is the infamous dual-kawase blur, giving you a result very close to a gaussian but with much better performance. ![image](https://github.com/user-attachments/assets/93086115-f57e-4465-85d4-d05008e0590e) | Blur disabled | `radius=10`, `passes=2` | `radius=4`, `passes=4` | | - | - | - | | ![image](https://github.com/user-attachments/assets/bb4202bc-9cf5-4ca7-9aea-72208dfe91b8) | ![image](https://github.com/user-attachments/assets/9c126acf-9856-4e6d-940a-5f67fe43c6c6) | ![image](https://github.com/user-attachments/assets/8f501785-f9bc-40d5-970b-01876b659384) | The blur settings are tweakable, you can have more passes, different blur radius, or even add noise to the final blur, giving a glassy look that is very similar to what Windows 11 has. --- ## Better XDG screencast portal You can now screencast individual windows and workspaces! https://github.com/user-attachments/assets/8eeefc28-fcce-45a0-b56d-91b793379e66 Moreover, the screencast portal now supports modifier-aware screencast buffers, allowing the screencast client to negociate the best DMA-buf format to get the best performance. The previous implementation only supported modifier-less. Programs like [gpu-screen-recorder](https://git.dec05eba.com/gpu-screen-recorder/about/) will now work properly in `fht-compositor`. Other changes to the portal are better handling of passed-in parameters from clients, and (yet another) rewrite of [`fht-share-picker`](https://github.com/nferhat/fht-share-picker) in GTK4 and libadwaita. Overall, everything is just better! --- ## Repeating key bindings 8459b50a09c8f783d0cba0094da39456f1f1be3a added support for repeating key binds. Nothing fancy, you can mark them like so: ```toml [keybinds] Super-j = { action = "focus-next-window", repeat = true } ``` --- ## Additional protocols ### Session lock You can finally have proper session locking in `fht-compositor` through the [ext-session-lock-v1](https://wayland.app/protocols/ext-session-lock-v1) protocol. You can now bring your [gtklock](https://github.com/jovanlanik/gtklock) or your [Hyprlock](https://github.com/hyprwm/Hyprlock). https://github.com/user-attachments/assets/0dbf78a6-8d4e-4c42-bb5f-4a3a9246d806 By default, when there's an active session locker, you cannot use any keyactions. However, you can mark specific ones to be allowed even when the session is locked, for example ```toml [keybinds] # Make raising volume work even when locked. XF86AudioRaiseVolume.action = "run-command" XF86AudioRaiseVolume.arg = "wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+" XF86AudioRaiseVolume.allow-while-locked = true # Example with a simple key action Super-Ctrl-j = { action = "focus-next-output", allow-while-locked = true } ``` ### Explicit sync Using the [linux-drm-syncobj-v1](https://wayland.app/protocols/linux-drm-syncobj-v1) protocol, the compositor now supports explicit synchronization. This is mostly useful for NVIDIA graphic devices as they do not support implicit sync. ### Other miscellaneous protocols - [content-type-v1](https://wayland.app/protocols/content-type-v1) - [xdg-foreign](https://wayland.app/protocols/xdg-foreign-unstable-v2) - [foreign-toplevel-list](https://wayland.app/protocols/ext-foreign-toplevel-list-v1): there was previously a stub implementation. - [alpha-modifier-v1](https://wayland.app/protocols/alpha-modifier-v1) --- ## Other changes in this release > These are not in any order! - Bump minimum supported rust version to 1.80 - Implement `wp-pointer-constraints-v1` with account for window position 4d781b47ae8e6f3eb1fab326888cfc919559ac4c: - Previous implementation that was ripped from Anvil was apparently wrong, and I quickly noticed this when using blender - Remove `x11-backend` in favor of `winit-backend` e8a04ecc616efd81e6f0491c4f2b592c3784c896 - Keep in mind that the windowed backends are only meant for dev purposes! They are very much incomplete and are just here when I want to test a feature that doesn't mandate another instance of the compositor in another TTY - Implement a proper CLI interface for the compositor 3a7888cbde0623055d820b7211ce63b618c0b7e2 - Fix broken vertical scrolling 0a4c12dd9397ae0c27a3ee3fb803f1b7b9956fc7 - Do not allow interactive swap for fullscreeened/maximized windows 3a850e44a32a5fc30dc765d826726a1da0b51314 - Implement interactive window resizing for floating windows only. Keeping it for tiled was too complicated and cumbersome. - Do not allow the user to build a useless compositor (IE. with no backend enabled) ef8c918195f32513604ac77a25f99cd70ab47ec6 - Implement damage tracking for decorations (border and shadow) 336a7da18494cb03260059eb77c576ea0b1fd54a - Switch profiling from puffin to Tracy 84f1a990e880a5dffd3749ab65eeb079d7fc494a: Tracy is overall more powerful and gives me better tools for profiling the compositor - Fix a crash that could occur when closing the last window of a workspace with `Workspace::close_window` 8c1fcaec4b952a860b753981ad12920a36f62f73 - Fix new configuration changes not taking effect immediately by forcing a redraw 6ff5cc0032173c9e8aac741e817a35d03d0d2a72 - Reset overlay planes on VT switch e134d1d86591460d4e602e6f433e629db53b91dc: Some other compositors that don't make use of them will display them as is, for example switching from `fht-compositor` to sway with a window scanned out to overlay will make the window display under sway since the plane is still dirty. **Full Changelog**: https://github.com/nferhat/fht-compositor/compare/0.1.1...25.03

v0.1.10.1.1
? · 2024-07-11

`fht-compositor` is a Wayland compositor that aims to have simple window management inspired by X11 window managers, mainly DWM and AwesomeWM. Not a lot of groundbreaking stuff, but still some improvements over the previous release. # `fht-share-picker` moved out Due to dependency conflicts (between `egui` and `iced` dependencies), [`fht-share-picker`](https://github.com/nferhat/fht-share-picker) moved out to a different repository, and with it got a rewrite! I personally really like it, since it describes what output you are going to use better. ![image](https://github.com/nferhat/fht-compositor/assets/104871514/1e4b3c81-6155-42ca-8589-b6762d32c171) # `xdg-activation` support I actually forgot to implement this protocol, and left a TODO message in the implementation. Well, now its working! Example here is with pcmanfm focusing its child window. https://github.com/nferhat/fht-compositor/assets/104871514/a6d500e7-27da-46cb-91ef-f9bd46ba34df # Interactive window resizing For quite some time, we supported *dragging* a tile out of its usual area in order to swap it with another one, in this release, I am really happy to announce that we now have the *resizing* of tiles! This was quite a tricky to implement, as we are in a tiled environment, meaning that every other window that is managed by the workspace layout needs to adapt. Another challenge is to actually make resizing any tile, in any direction, be sensible and logical for the user. A tile can only grow its own stack (in our case, we have the master and slave stack(s)). This is possibly by tweaking both the master width factor (commonly known as mwfact) and the cfact (a proportion of how much the tile should take space relative to its siblings) On the actual implementation, I wrote custom code that adapts the mouse delta position to make this happen, but it was 100% worth it! Take a look at the result: https://github.com/nferhat/fht-compositor/assets/104871514/5dd1e6f7-bfcf-421e-825e-19e55f1402e6 # Other fixes and improvements - New `insert_window_strategy` option, to decide where should we insert a window inside a workspace 5a462e300fb6cbe51cc59a0ccc0c2b3ff7847b5c - New `focused_window_opacity` and `normal_window_opacity` options. 2d386b979fd2bb62a058fc9adf60d99af61e54c6 - Various fixes to focusing, on cases where a layer-shell/window dies 0c27ad78717586f2c67e207d9a3dec75cce5a8c2, 26c638d4c6b804bb12f5494202d1b8369167fbaa - Fix parent workspace detection db206cfb4927918f3774c7333be85c333cb63f46 - Re-implement fullscreening 651d27a16bdc8fb729fb5954da0616390fcb6ddd - Re-implement some xdg-shell requests for maximizing/fullscreening ac6279b - Egui can now gets the `GL_MAX_TEXTURE_SIZE` value b151c01d71ca1d7103eada425c79c6eba8cecfc0 - Remove egui's ability to get keyboard input, as this could lock up input 186456e031e265b840ca8905d2b16ce1ec6f3164

0.1.0
? · 2024-05-29

The *first* official release of fht-compositor, finally! `fht-compositor` is a Wayland compositor built using the rust language, with a window management system inspired by [DWM](https://dwm.suckless.org) and [AwesomeWM](https://awesomewm.org); in other words, we have *static* workspaces managed in a single set. Each output has its own workspace set. Each workspace tiles *dynamically* its windows based on a layout, and some parameters like the size percentage of the master width area, and the number of master clients ![example of a tiled layout using the `Tile` layout](https://github.com/nferhat/fht-compositor/assets/104871514/7f0047f6-8dcf-4599-8848-8cace86ba35c) Even though this is the first release, we got quite a good part of the basics down - Can be spawned nested into another compositor (using an X11 window), or from a TTY - Core protocols supported + Additional wp/wlr ones: - `wlr_screencopy` for legacy screen recording/screen shotting clients - `xdg_decoration` to force clients to use SSD/CSD - `wlr_layer_shell` for your beautiful panels and overlays - Very preliminary `wp_fractional_scale` support - `wp_security_context` + `wlr_data_control` - In addition to these protocols, we have some nice-to-have features - Output recording support via the [XDG screen cast portal](https://flatpak.github.io/xdg-desktop-portal/docs/doc-org.freedesktop.portal.ScreenCast.html) (version 5 is supported, restore tokens soon) - Customizable window borders, with rounded corner support, and gradient borders! - Window rules to organize your workspace(s) - Other debugging features: debug overlay, damage drawing, etc. --- With this said, I'd like to thank the following projects for code and helping me figure out how to handle Wayland stuff properly: - [pop-os/cosmic-comp](https://github.com/pop-os/cosmic-comp): Mainly for udev backend and some rendering logic - [YaLTeR/niri](https://github.com/yalter/niri): PipeWire code for screencast portal + some rendering logic - [pinnacle-comp/pinnacle](https://github.com/pinnacle-comp/pinnacle/): `wlr_screencopy` stuff (the good way)