Skip to content

feat(color): warmth and brightness filters with a tinted pointer (#288) - #300

Merged
Maxaubert merged 21 commits into
mainfrom
feat/288-colour-filters
Sep 30, 2026
Merged

Maxaubert merged 21 commits into
mainfrom
feat/288-colour-filters

Conversation

@Maxaubert

@Maxaubert Maxaubert commented Sep 30, 2026 •

Copy link
Copy Markdown
Owner

Closes #288.

Two sliders in a new Colour section: Warmth and Brightness, always applied while set (off by default).

  • Warmth follows Night light's scale: 6500 K at 0% to 1200 K at 100%, linear in Kelvin, using CIE 1931 blackbody gains. Under HDR the DWM colour effect works on LINEAR light (measured), so the gains are applied linearly there and encoded in SDR; the render engine's shader matches.
  • Brightness goes down to 1% (0 was completely black).
  • The hardware pointer is not reached by the DWM effect, so at 1x Wind swaps the system pointers for tinted copies (src/cursor_tint.*, pure pixel code tested) and restores the real scheme when idle; zoom-in swaps directly (about 1 ms).
  • The render engine's drawn pointer and outline are filtered too; the colour follows whichever engine is visible; HDR state is re-read at 1 Hz and on display changes.
  • Accepted trade-off (CLAUDE.md): while either slider is on, the Magnification runtime is held at 1x.

Research and measurements: docs/COLOUR-FILTER-FINDINGS.md (HDR linear light, Night light's registry scale, how f.lux/Iris/Night light tint, the RTSS crash). Spec and plan under docs/superpowers/.

The Settings crash recovery was split out and shipped as #298 (0.13.2); main is merged in, so this PR is the colour work only.

Tests: 375 unit, 72 Playwright. Verified on the owner's HDR display (Warmth 100%: green x0.074, blue 0; Brightness 50%: x0.214 linear; tinted pointer readback), and running in the owner's tested build since.
Version 0.14.0.

🤖 Generated with Claude Code

https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG

Maxaubert and others added 21 commits September 29, 2026 18:49
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
…path, toggle hotkey (#288)

Transform and 1x use the DWM colour effect; a render session clears it and
applies the same matrix in its pixel shader (its capture already contains
the effect). The controller dedupes and holds a runtime only while a filter
is on. Optional toggle hotkey (RegisterHotKey, hot-reloaded).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
…Kelvin), linear light under HDR, brightness to 0 (#288)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
…bout to get back

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
…and recovery

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
…n swaps copies (#288)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
…lows the visible engine, HDR re-read, tint scheme flag (#288)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
…ges left alone, no onboarding re-entry, controller failure recovered

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPUNAWcwghXdHCApcKKjSG
# Conflicts:
#	src/main.cpp
#	src/version.h
#	tests/test_config.cpp
#	ui/tests/settings.spec.js
@Maxaubert
Maxaubert merged commit 5abe4a1 into main Sep 30, 2026
1 check passed
@Maxaubert
Maxaubert deleted the feat/288-colour-filters branch September 30, 2026 15:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Colour filters: invert, greyscale, high contrast, custom tints

1 participant