mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-10-26 13:07:49 -04:00
Third review round.
- `Config` is copied by value all over the manager, but `ICCProfiles` and
`OutputTemps` are maps, so every copy aliased the ones the manager writes under
`configMutex`. `updateStateFromSchedule` stored such a copy in `m.state` and it
was marshalled on the connection writer goroutine while `ApplyICC` stored a
profile from the IPC goroutine (`fatal error: concurrent map iteration and map
write`, which no `recover()` catches); `SaveConfig` marshalled its copy after
the unlock, and `loadConfiguredICC`/`attachConfiguredICC` indexed the maps after
releasing the lock. Every copy that outlives the lock is cloned now
(`cloneConfig`/`configSnapshot`), so a value copy is a snapshot again.
- `SetOutputTemp` never created the gamma controls. On a default install (night
light off, gamma 1.0, contrast 1.0, no profile, no override) they do not exist,
so the `Range` over `m.outputs` matched nothing: the value was written to
`wayland.json`, no ramp was applied, and the settings slider snapped back to
"Default" until a daemon restart. It now persists first, creates the controls
through `ensureOutputControls` (shared with `ApplyICC`), and pushes the state
from the actor, and the published temperatures report the configured value even
before an output is known.
- A TRC is not a video card gamma ramp: `rTRC`/`gTRC`/`bTRC` describe the
display's own transfer function, so a gamma-2.2 profile was written as
`t^(1/2.2)` — mid gray 0.5 became 47909/65535 — washing the display out instead
of correcting it. `ApplyICC` refuses a profile without `vcgt`, the attach path
skips one with a warning, and `GenerateGammaRamp` returns an error instead of
falling back to the TRC or to an identity ramp. TRC stays profile metadata
(`dms icc info`, the settings dialog).
- `icc: applied ICC ramp` was logged at Info on every 25 K animation step; it is
Debug now, which is where a per-step message belongs.
- `I18n.tr("No information available")` in the profile info modal passes its
translator context, like every other string this PR adds.
Covered by TestManager_ConfigSnapshotOwnsItsMaps,
TestManager_ConfigSnapshotConcurrentMarshal (the previous commit dies with
`fatal error: concurrent map iteration and map write`),
TestManager_SetOutputTempWithoutControlsPublishesValue (the previous commit
reports 0 for the value it just stored), TestGenerateGammaRampRequiresVCGT, and
the updated TestProfileRampWithTemp, whose fixture now carries an identity vcgt
table instead of relying on an empty profile.