Repository navigation
Conversation
3 tasks done
3 tasks done
Owner
|
I'm going to pass on the batch switch. One click that turns off every external screen is more than I want behind a single control, and with #218 each display gets its own switch, so two displays are two clicks. The backend is the same as in #210, and my reply there covers it. Reading it also showed me a few timeout cases in the disconnect path that I'm looking at separately. |
3 tasks done
3 tasks done
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.
What & why
Manage physical external displays from one compact item in Tools, between Auto-Disconnect Built-in and Virtual Displays. The item has a native master switch and display names underneath: 1-4 names occupy one row, 5-8 occupy two rows, with four columns rather than a device-count cap. Connected names use the normal foreground; held-disconnected names are gray. Each name can be toggled individually, and tooltips preserve long names.
The master switch is on when any controllable external display is connected. Turning it off disconnects externals only. In a mixed setup, the same-row reconnect button restores all available held externals without adding permanent duplicate action rows. The menu icon is two equal 16:9 screens arranged diagonally, as a transparent monochrome template SVG; the application icon is unchanged.
Batch operations never target the built-in for disconnection. If it was intentionally disconnected, restore it before the external shutdown. If no usable built-in is available, retain a viewable physical keeper and label the item Other External Displays. Virtual or inactive screens cannot act as keepers, and unavailable unplugged records cannot be reconnected.
A shared transaction gate protects the last physical screen until the blocking operation truly finishes, including after a UI timeout. Queued disconnects pin their UUID and recheck safety after DDC drains. Late results retain recovery/input state, stop further batch changes and clear timeout messages only when the actual online list matches the requested state. Release and local dev deployment bundle the compiled vector asset catalog.
The physical-configuration safeguards are shared with #210. Both branches are independently buildable; after either merges, the other can be rebased to remove those shared backend portions.
How tested
d7137e289676e48ebc9891ce0d1458942ad30b1bpassed localmake check: strict SwiftLint, unit tests, x86_64 typecheck and all 283 extracted localization keys../scripts/release.sh v0.0.0-cipassed with Xcode 27.0 (27A266a) / SDK 27.0. App and CLI are universal; deep signature and DMG integrity checks passed.Checklist
./scripts/release.sh v0.0.0-ci, exact source above)Crisp/Resources/Localizable.xcstringsNative SwiftUI fixtures with mocked display services, not live-monitor screenshots: