Repository navigation
Conversation
A macOS target in iOSClient/Sill.xcodeproj that shows a window of one Mac on another, used with the second Mac's mouse, trackpad and keyboard. It reuses the iOS app's client unchanged where it can (StreamClient and its extensions, pairing, discovery, settings) behind small shims, with new AppKit/SwiftUI views in MacClient/: - A Devices window: every paired Mac as a tile (its last picture, how it is reached), the unpaired Macs on the network, Add a Mac. - One session window per Mac, each with a client of its own, so several Macs stream at once. Pairing by typed code in the same window. - The stream: mouse, right click, drags, trackpad scrolling with its own phases and momentum, every key by its position (MacKeyboard, matching the host's HID table), the streamed Mac's cursor shape, the streamed app's menus mirrored into the menu bar, Text Size fitting the remote window. Shared iOS files only gain import switches and #if os(macOS) branches, plus one fix that matters on iPad too: clients of one process now reload the saved Macs another one writes, so a second window can no longer drop a pairing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A Cargo workspace in hosts/ speaking the same protocol as Sill for Mac, so the existing iPhone, iPad and Mac clients connect to a PC: - sill-protocol: the wire format (kinds 0-28, hvcC framing), TLS 1.3 with pinned self-signed P-256 keys, identities and pairing. - sill-host-core: the host without an OS (doors, sessions, pacing, settings, pairing and trust list, an FFmpeg-subprocess HEVC encoder, a synthetic backend) behind one Platform trait. - sill-host-windows: Windows.Graphics.Capture, Media Foundation HEVC, SendInput, Win32 windows, DNS-SD. Builds to an .exe; not yet run on Windows. - sill-host-linux: X11 (XComposite, MIT-SHM, XTest, EWMH), FFmpeg (VAAPI, NVENC, libx265), Avahi. Verified end to end in Docker with Xvfb. Each crate's NOTES-*.md says what is verified and what is not. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Upstream main had moved 112 commits (the clipboard, hardware keyboards, Larger Picture, restoring sized windows, reconnecting after sleep, the Settings window's height). Only StreamClient.init conflicted: both sides added an observer there, both kept. For the Mac viewer: the Mac target now compiles StreamClient+Clipboard too, through shims for UIPasteboard, the app's activation notifications and the panel's VoiceOver check; the iOS ClipboardChip is iOS-styled, so the viewer has MacClipboardChip (the system's Paste button, Dismiss, the note) and a Share Clipboard switch in its settings popover. The Mac target's project IDs moved to an unused range (5A, 5D, 5F), since main's HardwareKeyboardPolicy took AC01/FC01. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
From a pass over all the open pull requests (nothing is decided yet): #66 (with #72 and #73 built on it) is another macOS client also named Sill Viewer, sharing the same |
…f canImport(UIKit) Mac client targets (Saffsanity#66, Saffsanity#128) compile StreamClient.swift without UIKit's protectedDataWillBecomeUnavailableNotification.
…ished): kept as above 9b59e0d and 34872a5 arrived on addhumal:goodbye-sleep while the commits above were made from 485149e. Merged, not rebased, and every conflict resolved to the commits above, whose tree this is, because each change in them is done there in the way the maintainer's triage and task ask: - 9b59e0d guards the protected-data observer for the Mac clients (Saffsanity#66, Saffsanity#128): that observer left with the background wording (7425327), so nothing needs the guard. - 34872a5 closes each connection after the sleep and shutdown goodbyes and keeps a "quit" from following a "shutdown" (saidPowerOffGoodbye, set by willPowerOff): here every connection gets one goodbye, the first (StreamServer's `told`), the sleep's closes the connections, and the Quit takes restart or shut down from the quit's own Apple event, so a log out another app cancels sends nothing early and leaves no flag behind. - It gives "sleep" and "shutdown" the quit's 3 s before a row listed at the goodbye is dialled, and a note on the Reconnecting line: here a Mac that said it went to sleep counts as asleep (Saffsanity#77's rule, its first dial 20 s later, Saffsanity#69's lines from then on, the goodbye's words until it), and after a shut down or a restart a row listed at the goodbye is never dialled, only one listed afresh, so a sleep proxy's record is not dialled 3 s after the Mac went to sleep. The note grew from the background wording's, which is out of this pull request. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Expanded on this with Aileuxe#1 |
Two additions that let Sill go beyond iPhone and iPad: a Mac client (show a window of one Mac on another), and Rust hosts for Windows and Linux that speak Sill's protocol, so the existing clients can stream from a PC. Main is merged in (one merge commit, not rebased).
Heads-up on the repo's conventions: the Mac client is Swift and Apple frameworks only, like the rest. The Rust hosts are a separate Cargo workspace in
hosts/with permissively licensed crates (rustls, x11rb, windows-rs, …), which goes against "Apple frameworks only, no third-party dependencies". If you'd rather not have them here, the Mac client stands on its own and I can split the PR.Sill Viewer (macOS)
A new target, Sill Viewer, in
iOSClient/Sill.xcodeproj. It reuses the iOS client as it is (StreamClient and its extensions, pairing, discovery, settings, the clipboard) behind small UIKit→AppKit shims, with new views inMacClient/.MacKeyboard, matchingKeyStrokes.virtualKeysexactly: all 82, plus keypad Enter as Return); repeats; keys let go on focus loss. ⌘ shortcuts go to the other Mac while the stream has the keyboard (Stream › Send Keyboard Shortcuts, ⌃⌥⌘K, keeps them local); ⌃⌥⌘ chords stay with the viewer.Shared iOS files change only by import switches and
#if os(macOS)branches, with one exception that also helps on iPad: each StreamClient wrote the whole saved-Macs list, so a second window or client working from an older copy could drop a pairing. Clients now reload the list when another one in the process writes it (storeSavedMacs/savedMacsChangedElsewhere).Verified (Mac, Xcode 27.0/27.1):
generic/platform=iOS Simulator, arm64, unsigned): both succeed, only the knownStreamClientwarning.SillHost --syntheticon loopback (software encoder, test pasteboard), main's host included:Scripts/menufixture.swift: its menus listed in the viewer's menu bar.Not tested: clicks and typing driven from the viewer's own UI (no UI automation was allowed here); the TLS home door and pairing from the viewer against a real Sill.app; copying from the remote Mac into this Mac's clipboard (kept off this machine's real clipboard).
Rust hosts for Windows and Linux (
hosts/, work in progress)sill-protocol: the wire format.SillHost.sill/1/sill-pair/1, unpaired keys refused in the handshake.sill://pairlinks.sill-host-core: the host without an OS, behind onePlatformtrait.sill-host-windows:DnsServiceRegister.sill-host-linux(X11):.desktopapps.Verified:
cargo test --workspace: 116 tests pass; clippy clean.Scripts/sillclient.py:sillrelay.pyat 2 Mbit/s and +150 ms.StreamProtocol's RemoteTLS: pairing, pinning, kind 18 verification..exe(x86_64-pc-windows-gnu); 45 unit tests;Not tested:
hosts/NOTES-windows.mdhas a 15-step checklist.Decisions open (in the NOTES files):
SillHostdoes now, which Release builds of the apps refuse.Builds:
Scripts/make-app.shis unchanged. For the viewer, pick the Sill Viewer scheme and set a team (it usesme.saffer.sill.viewer). For the hosts, seehosts/README.mdand eachNOTES-*.md.🤖 Generated with Claude Code