Skip to content

fix(sender): make receiver names readable on the unselected row card - #35

Merged
Developer1010x merged 1 commit into
masterfrom
fix/receiver-row-contrast
Aug 26, 2026
Merged

fix(sender): make receiver names readable on the unselected row card#35
Developer1010x merged 1 commit into
masterfrom
fix/receiver-row-contrast

Conversation

@snadahalli

Copy link
Copy Markdown
Owner

The bug

Receiver names are effectively invisible on unselected rows when the app runs in light mode.

The rows paint a hardcoded dark card — Color32::from_gray(30) when unselected, a dark blue when selected — but the name label carried no explicit colour, so it inherited the theme's default text colour. eframe follows the system theme and nothing in the app overrides it, so on a Mac in light mode that default is near-black. Near-black text on a near-black card.

The selected row escaped only because mid blue gives dark text more contrast than near-black does, which is why the bug presents as "only the unselected ones are broken" rather than as an obviously global problem.

The fix

Pair the fill and the text colour in a single binding so the two cannot drift apart again, and set the name explicitly: white on the selected card, gray(235) on the unselected one.

The subtitle already sets its own colour and is left alone — GRAY on gray(30) is roughly 6.5:1, comfortably past the 4.5:1 needed at that size.

What this does not fix

The rest of the window follows the system theme while these cards are hardcoded dark, which is why the app reads as half-light/half-dark. Making the cards theme-aware is a design decision rather than a contrast fix, so it is left alone here.

Verified locally on macOS arm64: fmt --check clean, clippy -D warnings clean, and the sender runs and lists receivers without errors.

The receiver rows paint a hardcoded dark card — `from_gray(30)` when
unselected, a dark blue when selected — but the name label carried no
explicit colour, so it inherited the theme's default text colour. eframe
follows the system theme and nothing in the app overrides it, so on a Mac
in light mode the default is near-black: near-black text on a near-black
card, effectively invisible. The selected row escaped only because mid
blue gives dark text more contrast than near-black does, which is why the
bug reads as "only the unselected ones are broken".

Pair the fill and the text colour in one binding so the two cannot drift
apart again, and set the name explicitly to white on the selected card
and gray(235) on the unselected one. The subtitle already sets its own
colour (GRAY on gray(30) is about 6.5:1) and is left alone.

This fixes the contrast on the fixed-dark cards; it does not address the
wider point that the rest of the window follows the system theme while
these cards do not.
@snadahalli
snadahalli force-pushed the fix/receiver-row-contrast branch from 3d1b6ec to 5f6ebd8 Compare August 26, 2026 09:38
@Developer1010x
Developer1010x merged commit a31bc01 into master Aug 26, 2026
5 checks passed
Developer1010x pushed a commit that referenced this pull request Aug 26, 2026
…43)

#42 was merged twelve seconds after #41, into `fix/airplay-hkp-header` —
which #41 had just merged into master and left behind. The merge succeeded,
so nothing looked wrong, but the commits landed on a branch nothing points at
and master never received them.

Master therefore has the `X-Apple-HKP` header from #41 and none of what it was
a prerequisite for: the SRP proof still hashes g padded, transient pairing
still runs M5/M6 and gets the connection closed, and there is no encrypted
control channel. Pairing is broken on master in exactly the way #42 fixed.

This restores #42's own diff — the eight `openplay-airplay` files it actually
touched — on top of current master.

Deliberately *not* a merge of `fix/airplay-hkp-header`. That branch was cut
before #35, #36, #37, #39 and #40 merged, so a diff against it reads as
deleting `openplay-discovery/src/address.rs` and reverting 244 lines of
`openplay-sender/src/app.rs`. Merging it would silently undo five landed
fixes. Only the range between #42 and its own parent is safe to replay, and
that range touches nothing outside `openplay-airplay`.

Verified after the replay: 233 tests pass, clippy and fmt clean, and the work
from #35/#36/#37/#40 is still in the tree.

Co-authored-by: Sandeepa Nadahalli <1698507+snadahalli@users.noreply.github.com>
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.

2 participants