Name uncontrolled displays in diagnostics, keep scheduled updates out of the way, refuse a second copy, and gate the accessibility prompt on a prior grant - #92
Merged
Conversation
…the Protection pane A crash or force-quit while a lock dim was engaged left a display's DDC register dimmed with the slider showing full brightness, and on a write-only display nothing could tell. A per-display marker is now written before the dim's first submit and cleared after the restoring one; at the next launch a surviving marker runs the restore pass's own memo reset and reassert, gated on Safe Mode directly. The launch readback holds off while a marker stands, because on a display that answers reads it would otherwise import the dim as the user's value. The startup caption names the one exception it makes. Idle dim and blackout entries now fade in over about 400 milliseconds on the overlay's content view; every decrease and every removal still lands in one write, so restore timing is unchanged. A nudge from the care loop's verify pass declines while a fade toward the same state is in flight, bounded in time so a completion that never arrives cannot park the loop, and the declined nudge counts as settling rather than a mismatch. The Protection pane opens with a Dimming row that reveals OLED Care and says how many displays are enrolled, or Paused while Safe Mode holds the care loop, with one sentence on what the other half of the pillar does.
… of the way, refuse a second copy, and gate the accessibility prompt on a prior grant Display discovery now surveys every online display and the diagnostics report lists the ones Candela is not controlling, by vendor and model with a reason word and no serial number, beside an online count and lines for the media-key tap and Screen Recording. A scheduled update no longer raises its dialog over the person's work: the menu-bar panel shows a reminder row, frozen for each open, and choosing it brings the dialog forward. A second Candela process alerts, names both paths and quits before any display work starts. The launch-time accessibility prompt runs only when a machine-scoped marker records a grant observed before, so a reset or a fresh install gets the panel banner and the Keyboard pane instead of a bare system dialog.
…zation # Conflicts: # CandelaAppTests/InterruptedDimRecoveryTests.swift
7 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #57.
What changed
The diagnostics report names what Candela is not controlling. Display discovery now surveys every online display and classifies each one it leaves out of the DDC pool with a reason: built in, no DDC service, or beyond the slot cap. The report carries an online count beside the controlled count and a section listing the uncontrolled displays by vendor and model with the reason word, never a serial number. The same report states whether the media-key tap is running and whether Screen Recording is granted, so the two most common "it stopped working" reports can be read off one paste. The format number moves to 3 because a section heading changed.
Scheduled updates never take focus. A scheduled check that finds an update no longer raises the dialog over whatever the person is doing. The updater records that an update is waiting, the menu-bar panel shows a reminder row, and choosing the row brings the update dialog forward. The row's state is frozen when the menu is about to open, before it lays out, so the panel's height is settled before it is shown. The marker clears when the update session ends, installed or declined. A manual Check for Updates is unchanged and still comes to the front at once.
A second copy quits itself. Two Candela processes on one machine are two DDC writers on one bus. A launching copy that finds another running instance now alerts, naming both paths, and quits, before any display work starts. Instances already terminating are ignored so the updater's own relaunch is not mistaken for a duplicate. The virtual display helper is not an instance and is unaffected.
No bare accessibility dialog after a reset. The launch-time prompt for the media-key grant now runs only when a machine-scoped marker records that the grant was observed on this machine before. A fresh install, or a preferences domain whose grant was reset out from under it, gets the panel banner and the Keyboard pane instead of a system dialog it did not ask for; changing the key mode in the Keyboard pane still prompts. The marker is a file under Application Support bound to this Mac’s machine identity. A copied marker, legacy timestamp, corrupt file, or unavailable identity cannot authorize the launch prompt. Observing a real grant upgrades the record. The identifier stays local and is never logged or exported.
Hardware verification
Verified locally with the Dell U2725QE and MSI MAG 341C OLED on a signed Release build combining the five pending fixes.
The branch includes the shared-identity recovery fix from #90 and must merge after it. The final combined build passed 2,632 engine tests and 762 app tests, plus the Release marker gate. Required CI checks passed on this branch, and independent review found no actionable issues.