Repository navigation
The home screen as a board of blocks, a pointer a game can hold, and Windows on ARM - #72
Merged
Merged
Conversation
…s starting at setup
…e seen, and say when it cannot be built
…ld from a filtered one
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.
Fifty-two commits. The branch was started for the home screen, then went to a Windows on ARM
machine for the first time, and ends with Linux as a third platform that can watch and be
watched.
What is in it
The home screen is a board of blocks. A pegboard on a 32px lattice; a block spans hole to
hole, so its border always sits on the holes and its size is a count of them. Six kinds — one
machine, the list of machines, this computer, recent sessions, the terms this machine is shared
on, the state of the link. Editing shows the lattice, moves and resizes by dragging, and gives
each block a panel for its label, the fields it shows and its accent, flat or a gradient with
as many stops as are wanted. The board is kept in the settings file, and a file written before
blocks existed reads as an empty board rather than failing. Onboarding is untouched.
Blocks show what the application actually knows. A machine is being watched, shared or off —
there is no "connected" as distinct from "waiting", because nothing records the difference.
Around it. A profile menu — edit the board, language, settings, sign out. The header is one
fixed bar that drags the window and maximises on a double-click the way a title bar does; the
dock is held to the bottom of the window whether or not the page scrolls. Figures that change
are set in Geist Mono. The bitrate can be dragged where it is shown. A machine's name carries
the mark of what it runs, which is a new
platformcolumn ondevices— see below.A pointer a game can hold. A game that hides the cursor wants movement, not a position, and
never wants the movement to stop. The stream window's three states — watching, controlling,
aiming — are now one control; aiming puts SDL in relative mode and sends
MouseMove. The wiresays so with a
cagedflag, because the host has to know: it recentres its own pointer near anedge only for caged motion, and clamps everything else as before, so a turn never runs out of
screen and an ordinary pointer still stops at the edge.
vectors.jsonwas changed first, andboth sides test against the new vector.
The stream window. Titled after the machine it shows. Opened when there is a picture to put
in it rather than before. It no longer falls back to view-only while a session is open. It asks
for no more frames a second than the fastest screen here can show — with no ceiling it asked
for more than it could present and stuttered — and the shell bounds the setting to 1–240.
Settings. The scrollbar is visible. A released build does not offer a choice of build
channel.
macOS. These windows are no longer merged into tabs, which could not be dragged apart.
Windows on ARM builds locally.
publish-localfinds the bundle by what it ends in and bythis build's version, starts
pnpmand the approval link through a shell, and says up frontwhat the build would otherwise say late and badly: that there is no compiler on the path, or
that
ringwants clang on this target.And the shell runs there, which it did not. Four faults, found in the order they hid each
other:
connect-src, and Windows carries IPC overhttp://ipc.localhost, so nowindow could reach the shell at all.
invisible — on the one control that brings a closed window back or quits the application.
thread, and WebView2 cannot finish a web view while that thread is held. The window came up
black, had no web view to inspect, and could not be closed. The commands are
#[tauri::command(async)]now and the tray builds from a thread of its own. Confirmed fixedon a Windows 11 ARM machine.
A build that is not a release opens its inspector when
PRISM_INSPECTis set, which is how theabove was found.
And it can be watched, which it could not. Added after this was opened, from trying to
watch that machine from a Mac:
A Windows host encoded with NVENC or not at all. A machine with an AMD or Intel GPU, a
Snapdragon, or none could turn sharing on and then end every session as it opened — and the
client was told only that the host had disconnected. NVENC is still asked first; without it
the host now encodes through Media Foundation, on a vendor's hardware transform where there
is one, with the texture handed over as it is.
Where there is none it falls to Microsoft's software transform, and that path reads the
captured frame back into system memory — the one exception in the repository to "a captured
texture is never brought down to the CPU". Deliberate, and decided rather than slipped in:
the machines that reach it have no hardware encoder, so what the rule would give them instead
is no picture. It is said on standard error when it is taken. The software path is
confirmed working on a Windows 11 ARM virtual machine; the hardware path has not been run on
anything, and says so in its module documentation.
Windows kept no log.
keep_the_log()was empty there, and a windowed application has nostandard error, so every line a host writes about itself went nowhere. It now goes to
%USERPROFILE%\.prism\prism.log, as on macOS. A session that failed before it opened alsowrote nothing on any platform, and now says why.
Windows forgot who was signed in. The session token was kept only in the macOS keychain;
everywhere else the store was three empty functions, so every launch began at setup. It is
kept in Credential Manager now. Linux still keeps nothing.
Linux, both ends. Until now a Linux build was the shell and nothing else: no capture, no
encoder session (the VAAPI module is rate-control policy with no session behind it), no decoder,
no injector, no stream window. All of it is here now, behind one feature,
linux-desktop, andon for the shell and the stream window when they are built for Linux:
xdg-desktop-portal, a remote desktop session with the screen cast attached, sothe person at the machine sees one dialog. Asked for when sharing is switched on and
persisted with a restore token, so later sessions open without asking. Frames come over
PipeWire into memory.
exception to "a captured texture never goes to the CPU", and for the same reason as the
Windows software path: it is what every Linux machine has.
picture uploaded as BT.709 YUV; the stats panel uses SDL's debug font.
What it does not do yet is written down in
docs/linux-build.md: no sound from a Linux host,the pointer arrives in the picture rather than as its own layer, and VAAPI is still unwired.
Checked by a
linux/arm64Docker container on a Mac, where it builds natively: clippy with-D warnings, the unit tests, and two tests against a real PipeWire daemon with a GStreamersource standing in for the screen — frames arrive, and survive capture → I420 → encode → decode.
pnpm packageproduced an arm64.deband AppImage with the stream window inside, and theshell stays up under Xvfb. The portal itself has not been run: it asks a person, and no
container has one. The first real test is an Ubuntu desktop.
lint:crossnow leavesprism-streamandprism-cliout on Linux too, for the reason italready did on Windows — SDL builds C for the target — and CI's Linux jobs lint and test them.
Before the accounts worker is next deployed
The worker now selects
devices.platform. The column is added bypnpm --filter @prism/accounts migrate, and that has not been run against production.Merging this changes nothing that is running — the worker is deployed by hand — but the
migration has to go first when it is.
Checked
pnpm lint,pnpm lint:cross,pnpm typecheck,cargo test --workspace,pnpm test:ts.prism-tauriis outsidelint:cross, so the native jobs here are the first compile of theshell's changes on Linux; Windows has been built and run by hand.