diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..fc6ce16 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,16 @@ +# Changelog + +## 0.1.0 (2026-04-07) + +Initial release. + +### Features + +- GPU-rendered ring light overlay using wgpu/WGSL fragment shader +- Rounded rectangle SDF with gaussian glow falloff +- Full desktop input passthrough via dynamic `wl_region` cursor hole +- Cursor avoidance with rounded-square soft fade +- Color temperature support: presets (warm, cool, studio, daylight, golden) and custom Kelvin +- Toggle on/off via PID lock file and SIGUSR1 signaling +- Works on any wlroots-based Wayland compositor (Sway, Hyprland, niri, river, etc.) +- MangoHUD suppression for clean Vulkan overlay diff --git a/Cargo.lock b/Cargo.lock index 760b3d4..6263f91 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -345,12 +345,6 @@ dependencies = [ "hashbrown 0.16.1", ] -[[package]] -name = "itoa" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" - [[package]] name = "jni-sys" version = "0.3.1" @@ -498,16 +492,6 @@ dependencies = [ "jni-sys 0.3.1", ] -[[package]] -name = "niri-ipc" -version = "25.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12bd9eb4e437f5282ce853cf66837658379cb537b4b6bae687da59246005329a" -dependencies = [ - "serde", - "serde_json", -] - [[package]] name = "nix" version = "0.29.0" @@ -747,7 +731,6 @@ version = "0.1.0" dependencies = [ "anyhow", "bytemuck", - "niri-ipc", "nix", "pollster", "raw-window-handle", @@ -824,19 +807,6 @@ dependencies = [ "syn", ] -[[package]] -name = "serde_json" -version = "1.0.149" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" -dependencies = [ - "itoa", - "memchr", - "serde", - "serde_core", - "zmij", -] - [[package]] name = "shlex" version = "1.3.0" @@ -1396,9 +1366,3 @@ dependencies = [ "quote", "syn", ] - -[[package]] -name = "zmij" -version = "1.0.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/Cargo.toml b/Cargo.toml index fd52d61..4325f63 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,14 +2,19 @@ name = "ringa" version = "0.1.0" edition = "2021" -description = "Wayland ring light overlay" +license = "MIT" +description = "GPU-rendered ring light overlay for Wayland" +repository = "https://github.com/swaits/ringa" +homepage = "https://github.com/swaits/ringa" +readme = "README.md" +keywords = ["wayland", "ring-light", "overlay", "wgpu", "camera"] +categories = ["command-line-utilities", "multimedia"] authors = ["Stephen Waits "] rust-version = "1.85" [dependencies] anyhow = "1.0" bytemuck = { version = "1", features = ["derive"] } -niri-ipc = "25.11.0" nix = { version = "0.29", features = ["signal", "process", "poll"] } pollster = "0.4" raw-window-handle = "0.6" diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..1c20050 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Stephen Waits + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..d68bff7 --- /dev/null +++ b/README.md @@ -0,0 +1,83 @@ +# ringa + +GPU-rendered ring light overlay for Wayland. Simulates a monitor-mounted ring light by drawing a bright glowing border around your screen during video calls. + +## Features + +- **GPU-rendered** via wgpu/WGSL fragment shader -- smooth gaussian glow, no banding +- **Full desktop passthrough** -- clicks, scrolls, and keyboard input pass through to your desktop +- **Cursor avoidance** -- the ring fades near your mouse so you can see and interact with UI elements +- **Color temperature** -- pure white default, or warm/cool/custom Kelvin presets +- **Toggle on/off** -- bind to a hotkey; running it again kills the existing instance +- **Works on any wlroots-based Wayland compositor** (Sway, Hyprland, niri, river, etc.) + +## Install + +### From source + +```sh +git clone https://github.com/swaits/ringa.git +cd ringa +cargo install --path . +``` + +### From crates.io + +```sh +cargo install ringa +``` + +### With mise + +```sh +mise use cargo:ringa +``` + +## Usage + +```sh +# Pure white (default) +ringa + +# Color temperature presets +ringa warm # 3200K tungsten +ringa golden # 2700K golden hour +ringa studio # 5000K neutral studio +ringa daylight # 5600K daylight balanced +ringa cool # 6500K cool daylight + +# Custom Kelvin (1000-40000) +ringa 4200 +``` + +Run it again to toggle off. + +### Hotkey binding + +Bind `ringa` to a key in your compositor config. Examples: + +**Sway / i3** +``` +bindsym $mod+F12 exec ringa +``` + +**Hyprland** +``` +bind = $mainMod, F12, exec, ringa +``` + +**niri** +```kdl +binds { + Mod+F12 { spawn "ringa"; } +} +``` + +## Requirements + +- Wayland compositor with `wlr-layer-shell-unstable-v1` support +- Vulkan-capable GPU + +## License + +[MIT](LICENSE)