Skip to content

Tiles, Virtual Display and Send Audio on by default; no virtual display under 800 points - #236

Merged
Saffsanity merged 11 commits into
mainfrom
defaults-tiles-vd
Oct 27, 2026
Merged

Saffsanity merged 11 commits into
mainfrom
defaults-tiles-vd

Conversation

@Saffsanity

@Saffsanity Saffsanity commented Oct 27, 2026 •

Copy link
Copy Markdown
Owner

Noah's two defaults of 2026-10-27, as one pull request after #117 merged: "make tiles not list the default behavior of the app. Also have Virtual Desktop on by default. Of course, if a user changes a setting remember their choice for future sessions as you do now. Make this a separate PR after #117 merges."

What changes

The device: tiles by default. ConnectionList.defaultStyle is .tiles, and storedStyle reads a stored Sill.connectionStyle ("list" or "tiles") as it is: a choice made with the switch beside "Connect to a Mac" or a saved Mac's menu always wins, so only an install that never toggled sees the change. Nothing stored, or a value no build writes, reads as tiles. ConnectScreen now keeps the key optional (@AppStorage … String?), so the rule alone decides the default (StreamClient's connectionStyle already read it that way).

  • Consequences that come with tiles: a picture of each saved Mac's screen is kept on the device as its sessions end unless the list is chosen (takesPreview unchanged: only with tiles), and Disconnect asks for its fresh keyframe first (300 ms at most before the connect screen with Sill for Mac 0.5.1, which skips kind 44). The privacy page says so.
  • One rule changes with it: the switch beside the title always shows, whichever style is on and whether or not a Mac is listed (Noah, 2026-10-27: "The list/tiles switch should always show"); only the Add a Mac card and a link's confirmation leave it out. Connect screen: tiles with each saved Mac's last picture, and groups #117 showed it whenever tiles were on (its way back from tiles while the list was the default); with tiles the default, that took it away under the finger of anyone with no saved Mac who chose the list. The list's rule is Connect screen: tiles with each saved Mac's last picture, and groups #117's as it was, so the list looks exactly as before. To undo: put style == .tiles || back in ContentView's overlay.
  • DEBUG: -SillStyleToggleAt <s>[,<s>…] toggles the style as the switch does (toggleStyle), for gates with no finger; the console's connect: lines say the style and what is stored.

The Mac: Virtual Display and Send Audio on by default in Sill.app. HostConfig.app is Sill.app's defaults: the CLI's standard with the virtual display and Send Audio on (Noah, 2026-10-27, testing #235: "Send Audio should be on by default, and mute should be off by default"; Mute on the device was off by default already; the CLI's --audio still opts in). HostSettings registers it, never writes it: a virtualDisplay key set from the menu, Settings › Virtual Display or a device (saved like a menu click, as now) always wins, so a Mac that turned it off stays off; -virtualDisplay 0 turns it off for one run. The CLI keeps standard: --virtual-display is still opt-in and its output is unchanged. The menu's checkmark and the pane's switch follow config; nothing on screen names the default.

Why the virtual display came up at 1x. Not in the session of 2026-10-26/27: every staged capture that night, beside the 2560×1440 display at 1x, read "scale 2.0" (filter (1456.0, 1486.0), (2560.0, 1486.0), (2560.0, 2264.0)); its "scale 1.0" captures were real windows and the Desktop on that display (#233's case). Sill.log's 1x virtual displays were five earlier ones (2026-09-26, 09-28, 10-08 twice, 10-15), all asked with both sides under 800 points, 754×784 or 762×792: an iPhone held upright (its 377- or 381-point picture, doubled for Aa's smallest step) plus the menu bar, beside the Mac's own Retina display too, so the main display's scale played no part. macOS listed the 2x mode asked for, waitUntilOnline asked for it every half second, and the display stayed at 800×832 points at 1x until the stage's 3 s wait ran out: the pick waited 3 s more, and the staged window was captured at 2x from a 1x display (eleven captures filter (800.0, 832.0) scale 1.0). Every display with a side of 800 or more came up at 2x (754×979, 838×792, 900×800, 1000×784, 848×878 and larger). So VirtualDisplaySize (pure, in CaptureScale.swift) holds every side to 800…4096 points: an iPhone held upright now gets 800×830. The creation line said "@2×" whatever came up; it now prints the mode it came up at, and --virtual-display-selftest takes a size (60 800x830).

Words: README (the connect screen's tiles; On iPhone, Text size and the virtual display with it on by default; Good to know), the support page (a section, "A window left your Mac’s screen", whose sentence on the default is marked <!-- Virtual Display for the release; "It says Not paired" for tiles and rows alike), the privacy page (the tiles' items: kept unless the list is chosen; dated October 27, 2026; the virtual display needs no word there: Accessibility "so Sill can move and size the window it shows" already says it), the release checklist (the marker, its perl line and grep), the App Store drafts (the description's "Your Mac shows up.", the next What's New's tiles paragraph), DEVELOPMENT.md, CLAUDE.md, the checks README.

Checks

  • swift build -c release: only the CaptureProbe warning. Tests/checks/run-all.sh: all 55 pass.
  • Mutants of every check whose files changed, every one caught: connection-list (162 checks) 76 of 76, capture-scale (148) 39 of 39, away-quality (88) 27 of 27, virtual-display-api 17 of 17.
  • H2, the CLI against main at 3b54637 built from git archive, --synthetic on loopback with the software encoder: idle 35 s identical masked and sorted (8 lines); with sillclient.py PORT 8 desktop identical (23 lines; a first pair differed only in which counters three stats lines listed, cursor.shape among them, as base against base).
  • The bare SillMenuBar --synthetic (its defaults domain deleted before and after): no key → "Virtual display: private CGVirtualDisplay API present…" and "✓ Virtual Display" in the menu; -SillSetAfter '2 virtualDisplay=0' → one "Settings: virtual display on → off" and the key saved as 0; a relaunch → off; -virtualDisplay 1 → on for that run, the key still 0. Main's binary with no key: off.
  • Previews (-SillRenderPreviews) from main's and this bare binary at one path: 146 files each, and only menu.txt (the update-available sample's ✓ Virtual Display and ✓ Send Audio (Beta)), pane-virtualDisplay-light.png, pane-virtualDisplay-dark.png, pane-streaming-light.png and pane-streaming-dark.png differ, each pane only in its switch.
  • The iOS app with Xcode 27.1 (27A9275): Debug for the generic simulator as CI builds it, Release for the simulator, Debug for a generic device. Only the known StreamClient capture warning (StreamClient.swift:4067).
  • Harness photos on a private iPhone Duo simulator on iOS 27.1 (created and deleted), its cover display: all 29 -SillConnectCase cases at 466×678 and 951×669 against main's Debug build. This build with list stored against main with nothing stored: 58 of 58 pixel for pixel. This build with nothing stored against main with tiles stored: 43 of 58; the other 15 are the switch beside the title, now absent with no saved Mac listed (denied, hint, looking, methods, nearby, notice, update at both sizes), and the pairing case's spinner, which differs from itself between takes.
  • The normal app on the same simulator, against a synthetic host registered as _silltest._tcp so the screen has a row: a fresh install shows tiles; -SillStyleToggleAt 5 (the switch's own action) stores list; a relaunch shows the list; toggled back it stores tiles; a relaunch shows tiles. The key was read from the app's container plist (xcrun simctl spawn … defaults read <container>/Library/Preferences/me.saffer.sill.plist): the domain read by name is somewhere else.
  • SillHost --virtual-display-selftest 60 800x830, run once while this Mac had been idle 601 s and no device was connected to Sill.app: up at the requested mode in 446 ms, 1600×1660 px (@2×), a 30-point menu bar, gone 158 ms later (its HID move reset the Mac's idle time).
  • Not run: Sill.app itself, anything with a device, a window actually staged on an 800×830 display.

What Noah tests

  • Send Audio on a Mac that never set the key (another Mac or user account, or defaults delete me.saffer.sill.mac sendAudio with Sill quit; this Mac has it saved on by hand already): the menu shows ✓ Send Audio (Beta) and a connected device hears the Mac's sound at once; a device beside the Mac doubles every sound a moment late until its Mute is on.

  • The iPad, a fresh install (delete Sill first): the connect screen shows tiles, with the switch beside "Connect to a Mac" there from the start; switch to the list, quit Sill from the app switcher and reopen it: still the list. Switch back to tiles and reopen: tiles. An install that had chosen the list keeps the list.

  • A Mac that never set the key: your own Mac has virtualDisplay saved as 0 (read today), so it stays off there, as it should. To see the new default: another Mac or user account, or quit Sill and run defaults delete me.saffer.sill.mac virtualDisplay. Then the menu shows ✓ Virtual Display, and a window picked on the device moves onto the virtual display (Sill.log: "Virtual display … @2× id …: created", "Moved …", "Capturing … of virtual display") and comes back where it was on Disconnect. Turn it off from the menu and relaunch: still off.

  • The iPhone held upright with the virtual display on: the first window picked makes "Virtual display 800×830 pt @2×" with no "online but not at" line before it, and the window's text is crisp.

🤖 Generated with Claude Code

Saffsanity and others added 11 commits October 27, 2026 04:46
Noah, 2026-10-27: "make tiles not list the default behavior of the app.
... Of course, if a user changes a setting remember their choice for
future sessions as you do now." ConnectionList.defaultStyle is .tiles
and storedStyle reads a stored Sill.connectionStyle, "list" or "tiles",
as it is; nothing stored, or a value no build writes, reads as the
default. ConnectScreen keeps the key optional (@AppStorage String?), so
the rule alone decides, as StreamClient's connectionStyle already did;
the switch and a saved Mac's menu write it through toggleStyle, as
before. Only an install that never toggled changes.

With tiles the default, a picture of each saved Mac's screen is kept as
its sessions end unless the list is chosen (takesPreview is unchanged:
only with tiles), and Disconnect asks for the fresh keyframe first.

The switch beside the title now shows once a saved Mac is listed,
whichever style is on. #117 also showed it whenever tiles were on, its
way back from tiles while the list was the default; with tiles the
default that showed it on a fresh install and took it away under the
finger of someone with no saved Mac who chose the list, with no way back
until they paired one. The list's rule is #117's as it was.

DEBUG: -SillStyleToggleAt <s>[,<s>...] toggles the style as the switch
does, for the gates that have no finger; the console's connect: lines
say the style and what is stored.

Tests/checks/connection-list: 162 checks (154 before), 76 of 76 mutants.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Noah, 2026-10-27: "Also have Virtual Desktop on by default. Of course, if
a user changes a setting remember their choice for future sessions as
you do now." HostConfig.app is Sill.app's defaults: the CLI's standard
with the virtual display on. HostSettings registers it, so the default
is never written: a virtualDisplay key set from the menu, Settings ›
Virtual Display or a device (saved like a menu click, as before) always
wins, a Mac that turned it off keeps it off, and -virtualDisplay 0 turns
it off for one run. Only an install that never set the key changes.

The CLI keeps standard: --virtual-display stays opt-in, and its output
is what it was. The menu's checkmark and Settings › Virtual Display's
switch follow config; no pane says what the default is.

Tests/checks/away-quality: 88 checks (83 before), 27 of 27 mutants:
standard off, app on, app standard but for the virtual display.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sill.log had five virtual displays at 1x (2026-09-26, 09-28, 10-08 twice,
10-15), each asked with both sides under 800 points: 754×784 or 762×792,
the envelope of an iPhone held upright (its 377- or 381-point picture,
doubled for Aa's smallest step) with the menu bar. macOS listed the 2x
mode asked for ("754×784 pt @ 1508×1568 px"), waitUntilOnline asked for
it every half second, and the display stayed at 800×832 points at 1x
until the stage's 3 s wait ran out ("online 3312 ms"): the pick waited
3 s more, and the staged window was captured at 2x from a 1x display
(eleven captures "filter (800.0, 832.0) scale 1.0"). Every display with
a side of 800 points or more came up at 2x, one side under 800 or not
(754×979, 838×792, 1000×784, 900×800, 848×878, and larger). It never
followed the main display's scale: those five were made beside the
Mac's own Retina display, and on 2026-10-27, beside an external
2560×1440 display at 1x, every staged capture read "scale 2.0".

VirtualDisplaySize (pure, in CaptureScale.swift beside
CaptureScale.virtualDisplay, which it keeps true): every side 800 to
4096 points, so an iPhone held upright gets an 800×830 display.
VirtualStage's envelope and ensureDisplay use it in place of their own
floor of 320, VirtualDisplay's.

The creation line said "@2×" whatever came up; it now prints the mode
the display came up at (VirtualDisplay.currentScale), and
--virtual-display-selftest takes a size after the flag (`800x830`) as it
takes a refresh rate.

Tests/checks/capture-scale: 148 checks (122 before), 39 of 39 mutants.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… at 1x

README: the connect screen's tiles (a paired Mac's picture kept until
removed or forgotten, the list a tap away and remembered); On iPhone,
Text size and the virtual display with it on unless turned off; Good to
know, the window off the Mac's screen while it streams.

The site: support.html gains "A window left your Mac’s screen" (true of
0.5.1's Virtual Display too), its sentence on the default marked
<!-- Virtual Display for the release that turns it on, and says "It
says Not paired" for tiles and rows alike. privacy.html's tiles items
say the pictures are kept unless the list is chosen, "touch and hold it"
forgets a Mac, dated October 27, 2026; the virtual display needs no word
there (Accessibility, "so Sill can move and size the window it shows").
The release checklist lists the new marker, its perl line and grep.

The App Store drafts: the description's "Your Mac shows up." (3,032
characters), the next What's New's tiles paragraph (232; the draft
1,805). DEVELOPMENT.md: Sill.app's default and how to go back to it,
the connect screen's default and the switch's rule, the harness's
-Sill.connectionStyle list and -SillStyleToggleAt, the self-test's size.
The checks README: connection-list, capture-scale and away-quality.
CLAUDE.md: the Current step entry with what was verified and what waits
for Noah.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ker and the checklist

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Noah, 2026-10-27: "The list/tiles switch should always show", whichever style
is on and whether or not a Mac is listed. #117 showed it for tiles alone, and
this branch's first rule only once a saved Mac was listed; both left someone
with no saved Mac a way to lose it. Only the card, which takes the title's
place, and a link's confirmation leave it out.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Noah, 2026-10-27, testing #235: "Send Audio should be on by default, and mute
should be off by default." HostConfig.app, the app's registered defaults,
sets sendAudio too; the CLI's --audio still opts in and a saved key wins.
README, the support and privacy pages, DEVELOPMENT.md and the Current step
entry say so. Mute on the device was off by default already.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… too (#236)

The check asserted the virtual display was the one knob HostConfig.app
changes; with Send Audio on by default there are two. Two checks more (90),
and a mutant that turns the app's Send Audio off again (AQ28, 28 caught).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
CLAUDE.md's Current step conflicted (both branches added an entry at the
top); both kept, this branch's first.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Eight files met: CLAUDE.md's Current step (both entries, this branch's first);
README, the support and privacy pages, DEVELOPMENT.md and the App Store
drafts, where #235's words (Send Audio from a device, Mute in its panel) now
carry this branch's default (on); the checks README's away-quality row and
mutants.py (#235's acceptance mutants AQ25–AQ26 and this branch's app-defaults
mutants, now AQ27–AQ30; 96 checks).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…h always shown, the numbers at the head (#236)

The review of #236: three source comments, BRIEF.md, the App Store drafts
(the description's sound bullet, the review notes' sound line at the same
byte length), docs/audio-plan.md's Q1 and the lines premised on off by
default, the Current step entry's numbers (away-quality 96 and 30 of 30, five
previews, the warning's line, the photos under the always-shown switch, this
Mac's saved keys), the simulator instruction (a simctl spawn defaults write
never reaches the app: plutil on the container's plist instead), README's
virtual display bullet (a device's panel turns it off too).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@Saffsanity Saffsanity changed the title Tiles and Virtual Display on by default; no virtual display under 800 points Tiles, Virtual Display and Send Audio on by default; no virtual display under 800 points Oct 27, 2026
@Saffsanity
Saffsanity merged commit 6c5b5d2 into main Oct 27, 2026
2 checks passed
addhumal added a commit to addhumal/sill that referenced this pull request Oct 27, 2026
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.

1 participant