Skip to content

chore: synchronize main with TargetBridge 3.5.2 - #204

Merged
swellweb merged 58 commits into
mainfrom
maint-3.5
Oct 1, 2026
Merged

swellweb merged 58 commits into
mainfrom
maint-3.5

Conversation

@swellweb

@swellweb swellweb commented Oct 1, 2026

Copy link
Copy Markdown
Owner

Synchronizes main with the tested 3.5 maintenance line through v3.5.2.

Includes the published 3.5.1 and 3.5.2 maintenance fixes, with no additional feature work. This restores main as the correct baseline for future development branches.

freebo and others added 30 commits July 28, 2026 11:51
…click-v3.3

Preserve mouse click count in receiver-master mode
Surfaces per-session Brightness and Volume sliders directly in the menu
bar status menu, so the receiver's real brightness/volume can be adjusted
without opening the main window. Each slider pushes its value live to the
existing session.brightness / session.volume path (already forwarded to
the receiver), so it works reliably regardless of keyboard or input
routing — no event taps, no cursor/media-key handling.

Sliders appear only for connected sessions; the volume slider only when
audio is enabled. Also tidies the menu: the verbose interface/IP and
per-session status lines move into a "Connection info" submenu, keeping
the default menu focused on the status summary, sliders, and actions.
Localized en/it/de/zh.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Adds Control-Center-style toggles to the menu bar for the receiver's Night Shift
and True Tone, and drops the volume slider — with an audio device selected,
macOS's own Sound slider already drives the receiver's hardware volume, so a
second control here can only disagree with the system one.

Two-way: changing either on the receiver itself (Control Centre, System
Settings) propagates back, so the toggles never show a stale state.

## Notes

Both live in the private CoreBrightness framework, reached by dlopen and the
Objective-C runtime — the same approach this app already uses for DisplayServices
brightness — so a missing class or renamed selector degrades to "unsupported"
rather than breaking the build or crashing on a future macOS. The receiver
advertises supportsNightShift / supportsTrueTone in its profile and the toggles
appear only when it does.

CBTrueToneClient exposes both activate/deactivate and setEnabled:. The first
pair looks like the on/off switch and is not — measured against the live
framework, after deactivate the panel is unchanged and `enabled` still reports 1.
They activate the client *session*. setEnabled: is the real switch, with
activate/deactivate kept only as a fallback.

One deliberately fragile spot: CBBlueLightClient has no `enabled` getter, only
getBlueLightStatus:, which fills a private struct. It is read into an oversized
zeroed buffer so a larger struct on a future macOS cannot overflow, and a
changed layout misreports the toggle rather than crashing.

## Panel styling

The panel was ~240 pt against Control Center's ~340 and the symbols were wrong.
Width now comes from one constant; note the row width and the visible panel
width differ, because a menu draws chrome around the item.

Symbols were checked by rendering every plausible SF Symbol and comparing with
Control Center rather than picking by name. Apple's family is half-circle ->
half-sun -> full-sun for Dark Mode, Night Shift and True Tone, so Night Shift is
a *sun with a dark half*, not a moon. True Tone's real glyph has lines through
the disc and no SF Symbol does — Control Center appears to use a private asset —
so sun.max.fill is the closest public match.

The slider track stays grey, and the comment now records why: trackFillColor is
set and menus ignore it, and overriding NSSliderCell.drawBar produces the accent
fill but opts the cell out of AppKit's modern rendering, costing the knob its
pressed-state translucency. A control that feels wrong beats one that looks
plain.

Accessibility: the slider carries its name (previously only its decorative
glyphs did), the toggles use the checkbox role with a value that follows the
state, and the captions are out of the accessibility tree rather than read as
extra elements.

Includes #143, which this builds on, rebased onto current main — that also
required filling in the French labels it predates.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
# Conflicts:
#	TargetBridge-Sender/TBDisplaySender/TBDisplaySenderBuildInfo.swift
Keep fullscreen Receiver video above local notifications
Add stable Retina 4K 60 fps capture
Merged after local Sender/Receiver tests, live Thunderbolt session verification, retry/stop validation, and successful Apple Silicon + Intel CI builds.
swellweb and others added 28 commits August 18, 2026 03:04
# Conflicts:
#	TargetBridge-Receiver/TBReceiverC/Makefile
fix(maint-3.5): integrate idle lifecycle, watchdog and monitor shielding fixes
# Conflicts:
#	TargetBridge-Sender/TBDisplaySender/TBDisplaySenderService.swift
fix: integrate video queue, capture health and permission probes
@swellweb
swellweb merged commit 6efd068 into main Oct 1, 2026
13 checks passed
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.

5 participants