Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
267 commits
Select commit Hold shift + click to select a range
d3567a4
chore(package): bump pkgrel to 10
QiE2035 Sep 9, 2026
46dcd4f
fix(linux): ask the compositor to enable the forced virtual connector
QiE2035 Sep 9, 2026
3be2fa6
chore(package): bump pkgrel to 11
QiE2035 Sep 9, 2026
fd948f7
fix(linux): 23172 client placeholder is an explicit VDD request; make…
QiE2035 Sep 9, 2026
6a124a0
chore(package): bump pkgrel to 12
QiE2035 Sep 9, 2026
ef442b7
feat(linux): compositor-agnostic CRTC assignment; exclusive-mode tear…
QiE2035 Sep 9, 2026
91db506
chore(package): bump pkgrel to 13
QiE2035 Sep 9, 2026
685a552
fix(linux): exclusive-session teardown sees forced-off physical conne…
QiE2035 Sep 9, 2026
45c0acd
chore(package): bump pkgrel to 14
QiE2035 Sep 9, 2026
d962bf8
fix(linux): connector_name_for_status returned the path basename
QiE2035 Sep 9, 2026
d6e50d9
chore(package): bump pkgrel to 15
QiE2035 Sep 9, 2026
e277996
feat(linux): map the extend-style prep modes to kscreen priorities
QiE2035 Sep 9, 2026
5015948
chore(package): bump pkgrel to 16
QiE2035 Sep 9, 2026
c0988e8
feat(linux): personalized virtual display EDID and mode ladder
QiE2035 Sep 10, 2026
b35d164
chore(package): bump pkgrel to 17
QiE2035 Sep 10, 2026
52329f9
feat(linux): desktop-environment dispatch for the primary hint; platf…
QiE2035 Sep 10, 2026
29ff643
chore(package): bump pkgrel to 18
QiE2035 Sep 10, 2026
3257b18
fix(linux): expose /api/vdd/status and real adapter names to the wizard
QiE2035 Sep 10, 2026
20be872
chore(package): bump pkgrel to 19
QiE2035 Sep 10, 2026
9f9c271
feat(linux): wire the wizard GPU selection to capture; fix the VDD st…
QiE2035 Sep 10, 2026
c232010
chore(package): bump pkgrel to 20
QiE2035 Sep 10, 2026
034207a
chore: ignore makepkg staging dirs and package artifacts
QiE2035 Sep 10, 2026
48b7c4b
build(arch): install to the global /usr prefix; align icons with the …
QiE2035 Sep 10, 2026
9ff89f9
docs: report progress through the native VDD backend and pkgrel 21
QiE2035 Sep 10, 2026
09a49cf
feat(linux): real display_device backend via kscreen-doctor
QiE2035 Sep 10, 2026
a926876
feat(linux): host-side clipboard sync via klipper D-Bus
QiE2035 Sep 10, 2026
db4e2f4
feat(linux): client microphone redirect via a virtual sink
QiE2035 Sep 10, 2026
a8bc4e7
docs: record the display-device, clipboard, and mic redirect ports
QiE2035 Sep 10, 2026
26f826e
fix(linux): tray restart after upgrades, service-env clipboard bus, b…
QiE2035 Sep 10, 2026
c0a3e00
chore(package): bump pkgrel to 25
QiE2035 Sep 10, 2026
c203f02
fix(linux): wake the tray event loop when shutdown is raised off the …
QiE2035 Sep 10, 2026
0af22b1
chore(package): bump pkgrel to 26
QiE2035 Sep 10, 2026
d504fa1
feat(linux): ABR foreground app detection via KWin scripting
QiE2035 Sep 10, 2026
5376dff
chore(package): bump pkgrel to 27
QiE2035 Sep 10, 2026
e49ae49
feat(linux): per-frame luminance analysis for HDR10+ dynamic metadata
QiE2035 Sep 10, 2026
aec0a57
chore(package): bump pkgrel to 28
QiE2035 Sep 10, 2026
24817d1
feat(linux): Dolby Vision P8.1 RPU on the avcodec encode path
QiE2035 Sep 10, 2026
a17ef2b
chore(package): bump pkgrel to 29
QiE2035 Sep 10, 2026
c846215
docs: mark DV P8.1 RPU as ported in the report
QiE2035 Sep 10, 2026
a406137
chore: ignore local log archive
QiE2035 Sep 10, 2026
3756caf
fix(tests): exclude the Linux-only vdd_edid test from Windows builds
QiE2035 Sep 10, 2026
387a97f
fix(linux): tray VDD menu reflects reality; adopt orphaned virtual di…
QiE2035 Sep 10, 2026
520b5e2
docs: add agent instructions and the port gap backlog
QiE2035 Sep 10, 2026
a2c2dee
feat(linux): tray message boxes via QMessageBox
QiE2035 Sep 10, 2026
4e186f4
feat(linux): configurable manual virtual display mode
QiE2035 Sep 11, 2026
7e1f04b
docs: mark the manual VDD mode gap as mostly resolved
QiE2035 Sep 11, 2026
2ce9987
refactor(linux): derive the manual VDD mode from the configured lists
QiE2035 Sep 11, 2026
1c46fb6
docs: note the manual VDD mode derivation in the gap backlog
QiE2035 Sep 11, 2026
89cd047
fix(linux): name the virtual display 'Zako HDR' to match Windows
QiE2035 Sep 11, 2026
e3d11b3
refactor(linux): reference ZAKO_NAME instead of re-spelling it; align…
QiE2035 Sep 11, 2026
49800f6
fix(linux): VDD mode ladder carries every configured refresh rate
QiE2035 Sep 11, 2026
2ff6ca9
docs: record the ladder cap policy and the blanking-model caveat
QiE2035 Sep 11, 2026
4ad74c9
feat(linux): full configured-combination mode table via chained CTA b…
QiE2035 Sep 11, 2026
fec6e8d
docs: record the chained-CTA full mode table in the gap backlog
QiE2035 Sep 11, 2026
fbb1b91
fix(linux): advertise every configured resolution/refresh combination
QiE2035 Sep 11, 2026
c4f3639
fix(linux): advertise every configured resolution/refresh combination
QiE2035 Sep 11, 2026
86640c3
docs: sync the report and gap backlog with pkgrel 38 / v0.9.1
QiE2035 Sep 11, 2026
f0f13e6
fix(linux): align the VDD backend and EDID test with the Windows sema…
QiE2035 Sep 11, 2026
b5e83d0
fix(linux): match Windows display semantics for the primary, refresh …
QiE2035 Sep 11, 2026
45e09e6
fix(hdr): unpack planar 10-bit luma correctly and drop a stale DV war…
QiE2035 Sep 11, 2026
89a588d
fix(linux): align clipboard, microphone, ABR and tray behavior with W…
QiE2035 Sep 11, 2026
17b2a43
docs: record the Windows parity audit and its fixes
QiE2035 Sep 11, 2026
abeb917
chore(package): bump pkgrel to 39
QiE2035 Sep 11, 2026
4595e34
feat(linux): splice HDR Vivid T.35 on the avcodec encode path
QiE2035 Sep 11, 2026
e7392d9
fix(linux): switch and restore the default recording source for mic r…
QiE2035 Sep 11, 2026
e456313
refactor: share canonical identifiers instead of re-spelling them
QiE2035 Sep 11, 2026
96f6b2a
docs: record the KDE+niri target, the Vivid splice and the constant s…
QiE2035 Sep 11, 2026
9462f7f
chore(package): bump pkgrel to 40
QiE2035 Sep 11, 2026
ff16fde
feat(linux): niri foreground detection and compositor-agnostic output…
QiE2035 Sep 11, 2026
f366f33
docs: record the niri start (foreground producer, output enable)
QiE2035 Sep 11, 2026
eefd7a7
chore(package): bump pkgrel to 41
QiE2035 Sep 11, 2026
3112075
fix(linux): mirror the Windows failure handling for modes, HDR and to…
QiE2035 Sep 11, 2026
13467b8
docs: record the display_device failure-handling round
QiE2035 Sep 11, 2026
db2cc37
chore(package): bump pkgrel to 42
QiE2035 Sep 11, 2026
4862fc2
fix(linux): keep the microphone write off the shared mixer thread
QiE2035 Sep 11, 2026
80ad9cd
docs: record the microphone backpressure round
QiE2035 Sep 11, 2026
e01cd89
chore(package): bump pkgrel to 43
QiE2035 Sep 11, 2026
7a64423
feat(linux): feed the HDR analyzer from hardware encode devices too
QiE2035 Sep 11, 2026
243fa0c
docs: record the analyzer-coverage round
QiE2035 Sep 11, 2026
9628fb4
chore(package): bump pkgrel to 44
QiE2035 Sep 11, 2026
3a0a116
fix(linux): report a display as active only when it is actually enabled
QiE2035 Sep 11, 2026
26a1ff5
fix(linux): stop running klipper writes on the enet control thread
QiE2035 Sep 11, 2026
deb42c1
docs: record the enumeration and clipboard-write round
QiE2035 Sep 11, 2026
7589e15
chore(package): bump pkgrel to 45
QiE2035 Sep 11, 2026
dcfd3e8
fix(linux): sync large clipboard text out of band instead of dropping it
QiE2035 Sep 11, 2026
ec21221
docs: record the clipboard blob round
QiE2035 Sep 11, 2026
8fed8ec
chore(package): bump pkgrel to 46
QiE2035 Sep 11, 2026
b55f5ed
fix(linux): match the agent's echo ring and react to klipper's change…
QiE2035 Sep 11, 2026
eb9cf77
docs: record the echo-ring and event-driven clipboard round
QiE2035 Sep 11, 2026
f071bed
chore(package): bump pkgrel to 47
QiE2035 Sep 11, 2026
2d9e0b5
feat(linux): bring the tray's advanced settings submenu to Linux
QiE2035 Sep 11, 2026
abbf0b5
docs: record the tray advanced-settings round
QiE2035 Sep 11, 2026
aca5eae
chore(package): bump pkgrel to 48
QiE2035 Sep 11, 2026
09b4f71
fix(hdr): attach HDR10+ metadata only once real statistics exist
QiE2035 Sep 11, 2026
1031fde
docs: record the HDR10+ metadata and foreground-cache round
QiE2035 Sep 11, 2026
127d2c2
chore(package): bump pkgrel to 49
QiE2035 Sep 11, 2026
6cab941
fix(hdr): sample the luminance analysis at the Windows cadence
QiE2035 Sep 11, 2026
b370410
docs: record the analysis-cadence round
QiE2035 Sep 11, 2026
74b2df8
chore(package): bump pkgrel to 50
QiE2035 Sep 11, 2026
85a11db
feat(linux): resolve display friendly names from the EDID
QiE2035 Sep 11, 2026
cde587f
docs: record the friendly-name and degradation round
QiE2035 Sep 11, 2026
6a6a52a
chore(package): bump pkgrel to 51
QiE2035 Sep 11, 2026
e25df3e
feat(linux): report HDR runtime status to the WebUI
QiE2035 Sep 11, 2026
22ac423
docs: record the HDR runtime status round
QiE2035 Sep 11, 2026
ca1cdc2
chore(package): bump pkgrel to 52
QiE2035 Sep 11, 2026
ed5f359
fix(linux): reject mirrored topology groups where the setter would
QiE2035 Sep 11, 2026
80cd11f
docs: record the topology-validation fix and the deliberate divergences
QiE2035 Sep 11, 2026
e97d8b1
chore(package): bump pkgrel to 53
QiE2035 Sep 11, 2026
3411d6b
docs: keep the open-items list to genuinely open items
QiE2035 Sep 11, 2026
257436b
docs: restate the backlog overview after the alignment rounds
QiE2035 Sep 11, 2026
6646745
docs: close out the alignment work with a Windows-impact audit
QiE2035 Sep 11, 2026
f2f9155
fix(linux): stop enable_output_via_compositor from recursing into itself
QiE2035 Sep 11, 2026
d6e6935
docs(linux): record the tray virtual-display crash and its fix
QiE2035 Sep 11, 2026
7db908d
chore(packaging): bump pkgrel to 54 for the compositor-output crash fix
QiE2035 Sep 11, 2026
902813f
docs(linux): note the lock-held-across-exec hazard in wait_for_mode_p…
QiE2035 Sep 11, 2026
c625a39
fix(linux): apply the client's mode and HDR state to the virtual display
QiE2035 Sep 13, 2026
8441c14
fix(linux): stop throwing on unreadable debugfs paths
QiE2035 Sep 13, 2026
7a01035
feat(linux): verify VDD mode publication and refuse unencodable modes
QiE2035 Sep 13, 2026
76d295c
docs(linux): record why the virtual display ignored the client's mode
QiE2035 Sep 13, 2026
20b9ed6
chore(packaging): bump pkgrel to 55 for the VDD mode/HDR targeting fix
QiE2035 Sep 13, 2026
44b0d1e
fix(linux): apply the requested refresh rate to the virtual display
QiE2035 Sep 13, 2026
b5d1661
docs(linux): record the VDD refresh-rate finding from the retest
QiE2035 Sep 13, 2026
6c2123f
chore(packaging): bump pkgrel to 56 for the VDD refresh-rate fix
QiE2035 Sep 13, 2026
376057a
feat(packaging): add an AUR package for the linux-migration build
QiE2035 Sep 14, 2026
d931f8e
fix: udev
QiE2035 Sep 15, 2026
3623990
fix(packaging): stop failing on a stale version stamp, and stage an A…
QiE2035 Sep 15, 2026
b15ba67
fix(linux): stop blocking session start on a KScreen that is not there
QiE2035 Sep 16, 2026
2773e28
docs(linux): record why a non-Plasma session blocked on kscreen-doctor
QiE2035 Sep 16, 2026
4d87b27
chore(packaging): bump pkgrel to 58 for the kscreen blocking fix
QiE2035 Sep 16, 2026
f2a3b4a
fix(packaging): relink when the build predates the current commit
QiE2035 Sep 16, 2026
baf5250
feat(linux): enable YUV 4:4:4 for the FFmpeg/CUDA nvenc encoder
QiE2035 Sep 20, 2026
67048e2
chore(packaging): bump pkgrel to 59 for the nvenc YUV 4:4:4 unlock
QiE2035 Sep 20, 2026
2026ae7
fix(linux): complete the D-Bus client handshake in open_user_bus()
QiE2035 Sep 20, 2026
c449f71
fix(linux): skip empty/NUL clipboard text like the GUI agent
QiE2035 Sep 20, 2026
ccec16d
chore(packaging): bump pkgrel to 60 for the D-Bus handshake fix
QiE2035 Sep 20, 2026
c22ba19
fix(video): scale the VBV window when the client changes the bitrate …
QiE2035 Sep 23, 2026
8999b79
fix(linux): exclusive VDD sessions no longer force physical outputs o…
QiE2035 Sep 23, 2026
9f525c3
fix(linux): repair cuda.cu so the CUDA build can be enabled again
QiE2035 Sep 23, 2026
6cb0b2d
docs(build): record the sccache/CUDA build paths and this round's fin…
QiE2035 Sep 23, 2026
c90b3ec
chore(packaging): bump pkgrel to 61 for the bitrate/physical/CUDA fixes
QiE2035 Sep 23, 2026
1e94f53
chore: ignore secondary build trees
QiE2035 Sep 23, 2026
dd45ec6
build: make the CUDA-enabled build the documented default
QiE2035 Sep 23, 2026
e7cfe8f
docs: drop the duplicated sccache note
QiE2035 Sep 23, 2026
bc3143e
chore(packaging): bump pkgrel to 62 for the CUDA-enabled default build
QiE2035 Sep 23, 2026
6a48d1d
fix(video): pass NVENC's own H.264 4:4:4 profile value, not FFmpeg's
QiE2035 Sep 23, 2026
7991f85
chore(packaging): bump pkgrel to 63 for the 4:4:4 profile and NvFBC l…
QiE2035 Sep 23, 2026
f4204f2
fix(linux): let the compositor light a forced connector before steali…
QiE2035 Sep 24, 2026
0cf0f45
chore(packaging): bump pkgrel to 64 for the KWin activation race fix
QiE2035 Sep 24, 2026
0821337
Merge remote-tracking branch 'origin/master' into linux-migration
QiE2035 Oct 12, 2026
6efb462
chore(packaging): bump pkgrel to 65 for the upstream sync
QiE2035 Oct 12, 2026
449021c
docs: record the upstream sync and the gaps it opens
QiE2035 Oct 12, 2026
0c0a032
docs(linux): rewrite the port report and gap backlog as current-state…
QiE2035 Oct 13, 2026
bed61db
fix(packaging): drop the de-registered flatpak deps from the AUR package
QiE2035 Oct 13, 2026
79c6243
Merge remote-tracking branch 'origin/master' into linux-migration
QiE2035 Oct 22, 2026
fdd3a75
docs(linux): correct two backlog items after feasibility checks
QiE2035 Oct 22, 2026
3cf947d
feat(linux): persist the LLM API key in the Secret Service
QiE2035 Oct 22, 2026
32b8730
feat(linux): report KMS framebuffer flips as the pipeline source rate
QiE2035 Oct 22, 2026
17b98ad
feat(linux): track the foreground window on wlroots compositors and X11
QiE2035 Oct 22, 2026
d419346
chore(packaging): bump pkgrel to 69 for the foreground-window producers
QiE2035 Oct 22, 2026
492fcc5
feat(linux): sync clipboard images over ext-data-control
QiE2035 Oct 22, 2026
097fe84
chore(packaging): bump pkgrel to 70 for clipboard image sync
QiE2035 Oct 22, 2026
02e8b16
feat(linux): attach remote USB devices through usbip-utils
QiE2035 Oct 22, 2026
2434d39
feat(linux): drive display modes and output topology over niri's IPC
QiE2035 Oct 22, 2026
43bf03d
chore(packaging): bump pkgrel to 72 for the niri output backend
QiE2035 Oct 22, 2026
e2ab931
docs(linux): correct the remaining-gap counts after the niri backend
QiE2035 Oct 22, 2026
a4dba0f
refactor(dsu): move the cemuhook server into shared sources
QiE2035 Oct 22, 2026
20be183
feat(linux): broadcast client motion over DSU
QiE2035 Oct 22, 2026
9697129
chore(packaging): bump pkgrel to 73 for DSU motion broadcast
QiE2035 Oct 22, 2026
adb966c
docs(linux): record the DSU port and refresh the test baseline
QiE2035 Oct 22, 2026
8654c4f
feat(linux): drive GNOME's Mutter display config backend
QiE2035 Oct 22, 2026
b113331
chore(packaging): bump pkgrel to 74 for the Mutter display backend
QiE2035 Oct 22, 2026
3fd0715
feat(linux): mirror outputs through kscreen-doctor
QiE2035 Oct 22, 2026
8fb7548
chore(packaging): bump pkgrel to 75 for the kscreen mirroring pass
QiE2035 Oct 22, 2026
b1540b0
docs(linux): record the observed kscreen mirror behaviour
QiE2035 Oct 22, 2026
830a6cb
feat(linux): analyze per-pixel max(R,G,B) for the HDR dynamic metadata
QiE2035 Oct 22, 2026
bb55623
chore(packaging): bump pkgrel to 76 for the max(R,G,B) analyzer
QiE2035 Oct 22, 2026
b6fd403
feat(linux): carry clipboard text over the compositor when klipper is…
QiE2035 Oct 22, 2026
9f33fc6
chore(packaging): bump pkgrel to 77 for the compositor text clipboard
QiE2035 Oct 22, 2026
151e5bd
feat(linux): manage displays through RandR on bare X11 sessions
QiE2035 Oct 22, 2026
7e978f4
chore(packaging): bump pkgrel to 78 for the X11 RandR backend
QiE2035 Oct 22, 2026
c39347a
docs(linux): record the X11 RandR display backend
QiE2035 Oct 22, 2026
d5f637b
Merge remote-tracking branch 'origin/master' into linux-migration
QiE2035 Oct 22, 2026
9d4762a
feat(linux): give each client's virtual display its own EDID identity
QiE2035 Oct 22, 2026
d45575f
chore(packaging): bump pkgrel to 79 for the client EDID identity
QiE2035 Oct 22, 2026
983ff8a
docs: record the client-identity stage of the per-client virtual disp…
QiE2035 Oct 22, 2026
6cf64a1
feat(linux): give each client its own virtual display
QiE2035 Oct 22, 2026
d0ae854
docs(linux): record the per-client virtual display work
QiE2035 Oct 22, 2026
045a3d6
chore(tools): audit Windows parity of the shared-code changes
QiE2035 Oct 22, 2026
33c4065
build(linux): make the session bus an actually optional dependency
QiE2035 Oct 22, 2026
e8857ff
docs(linux): record the optional session bus and its verification
QiE2035 Oct 22, 2026
277a1bb
chore(packaging): bump pkgrel to 81 for the optional session bus
QiE2035 Oct 22, 2026
0dc050a
test(linux): keep the asset-wire case green on an installed prefix
QiE2035 Oct 22, 2026
94a3007
chore(packaging): bump pkgrel to 82 for the test baseline refresh
QiE2035 Oct 22, 2026
2de4d33
feat(linux): add a wlroots display backend through wlr-randr
QiE2035 Oct 22, 2026
f3bc62f
chore(packaging): depend on wlr-randr for wlroots sessions and bump p…
QiE2035 Oct 22, 2026
9b61717
docs(linux): record the wlroots display backend
QiE2035 Oct 22, 2026
b5b30a0
refactor(linux): make the display backend precedence a tested contract
QiE2035 Oct 22, 2026
4fab5a2
docs(linux): record the tested display backend precedence
QiE2035 Oct 22, 2026
fac3f41
chore(packaging): bump pkgrel to 84 for the tested display backend pr…
QiE2035 Oct 22, 2026
7969ff1
docs(linux): close out the remaining backlog with evidence and reopen…
QiE2035 Oct 22, 2026
c30ddc8
chore(deps): sync the control panel submodule with upstream
QiE2035 Oct 22, 2026
430c3c0
fix(packaging): correct the AUR moonlight-common-c pin and note the P…
QiE2035 Oct 22, 2026
9362a65
chore(packaging): version the arch package from the binary's own stamp
QiE2035 Oct 22, 2026
44931e0
fix(linux): mirror the Windows touch contact semantics
QiE2035 Oct 22, 2026
b62002b
docs(linux): record the touch semantics fix and its limits
QiE2035 Oct 22, 2026
74d1033
fix(linux): give the virtual touchscreen a usable output on KWin
QiE2035 Oct 22, 2026
2645261
docs(linux): record the KWin touch-device mapping
QiE2035 Oct 22, 2026
81cdb06
chore(packaging): bump pkgrel to 2 for the KWin touch mapping
QiE2035 Oct 22, 2026
c1bf455
docs(linux): refresh the test baseline after the input fixes
QiE2035 Oct 22, 2026
f3150e5
Merge remote-tracking branch 'origin/master' into linux-migration
QiE2035 Oct 22, 2026
a7a2006
docs(linux): refresh the baseline after the upstream test cleanup
QiE2035 Oct 22, 2026
89c37a3
fix(webui): drop the duplicated computed block in the setup wizard
QiE2035 Oct 22, 2026
8004463
fix(linux): make the clipboard provider shutdown-safe
QiE2035 Oct 22, 2026
511f9b9
fix(linux): drop pending clipboard pastes when the item changes
QiE2035 Oct 22, 2026
953de74
fix(linux): destroy the virtual display by the id that created it
QiE2035 Oct 22, 2026
adf06a5
refactor(linux): extract the DRM flip rule from the KMS capture device
QiE2035 Oct 22, 2026
ce3bbbc
fix(linux): keep a failed xrandr probe re-probeable
QiE2035 Oct 22, 2026
b4884ec
fix(ai): let SUNSHINE_LLM_API_KEY survive a locked keyring
QiE2035 Oct 22, 2026
e665330
perf(linux): stride the HDR analysis like the Windows downscale
QiE2035 Oct 22, 2026
215b66e
fix(linux): do not retry a failed DSU bind on every motion event
QiE2035 Oct 22, 2026
5ace750
test(linux): repair two blind tests and keep the keyring clean
QiE2035 Oct 22, 2026
9409f09
packaging: stop adding users to the input group and correct the CUDA …
QiE2035 Oct 22, 2026
510dbe7
docs(linux): correct the remaining-gaps claims about mirroring and niri
QiE2035 Oct 22, 2026
8942020
docs(linux): refresh the test baseline after the review fixes
QiE2035 Oct 22, 2026
6a30162
fix(linux): serialise the clipboard host shutdown and keep in-flight …
QiE2035 Oct 22, 2026
5a4529c
fix(linux): throttle the DSU server start attempts
QiE2035 Oct 22, 2026
cbca021
fix(linux): resolve the configured adapter against sysfs in the KMS b…
QiE2035 Oct 22, 2026
161dd12
fix(linux): report an unclearable keyring entry as a failure
QiE2035 Oct 22, 2026
8296437
fix(linux): make the RandR backend report what the server actually does
QiE2035 Oct 22, 2026
8c09570
docs(linux): refresh the RandR notes and the test baseline
QiE2035 Oct 22, 2026
5c34646
Merge remote-tracking branch 'origin/master' into linux-migration
QiE2035 Oct 24, 2026
fe0d233
docs(linux): explain the three test baselines and the case-count deltas
QiE2035 Oct 24, 2026
b99c6ed
fix(linux): keep the primary role on the screen that had it
QiE2035 Oct 24, 2026
3f72e21
docs(linux): record the primary-role alignment with upstream #1175
QiE2035 Oct 24, 2026
9f29a94
fix(linux): address the fourth review round in the virtual display ba…
QiE2035 Oct 24, 2026
eb4822e
docs(linux): record the fourth review round and refresh the baseline
QiE2035 Oct 24, 2026
b9864ae
docs(linux): correct the backend and pen claims flagged by review
QiE2035 Oct 24, 2026
1b84a7a
fix(linux): do not wait on a missing PulseAudio operation
QiE2035 Oct 24, 2026
fcf7172
fix(packaging): derive the local package version after prepare()
QiE2035 Oct 24, 2026
a869789
fix(linux): resolve connector names with the enumeration's numbering
QiE2035 Oct 24, 2026
127c4c4
fix(linux): resolve the virtual display by owner, not by name
QiE2035 Oct 24, 2026
7d19cb2
docs(linux): record the fifth review round
QiE2035 Oct 24, 2026
1f9b4d5
build(linux): keep the no-DRM build warning-free
QiE2035 Oct 24, 2026
bb50435
fix(linux): let KWin see a forced connector so exclusive virtual disp…
QiE2035 Oct 27, 2026
04b9b16
Merge upstream master into linux-migration
QiE2035 Nov 11, 2026
1894a60
build(linux): build against OpenSSL 4 and the Boost config targets Ar…
QiE2035 Nov 11, 2026
d80f77c
docs(linux): record the 6d41627e upstream sync and the OpenSSL 4 base…
QiE2035 Nov 11, 2026
7606ab6
test(linux): stub the runtime-config symbols the Linux branch resolves
QiE2035 Nov 11, 2026
06e603f
fix(linux): stop treating an unanswered compositor probe as a refusal
QiE2035 Nov 12, 2026
e450cf5
docs: record the compositor probe verdict fix and the 680-case baseline
QiE2035 Nov 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .clangd
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Documentation:
CommentFormat: Doxygen
14 changes: 14 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -113,3 +113,17 @@ tools/sunshine-ds5-sidecar/obj/
tools/hidmaestro-core-patch/**/bin/
tools/hidmaestro-core-patch/**/obj/
.claude/

# makepkg 产物与暂存目录(arch 本地调试包)
packaging/arch-local/pkg/
packaging/arch-local/src/
packaging/arch-local/*.pkg.tar.zst
# makepkg 产物(AUR 包)
packaging/aur/*/pkg/
packaging/aur/*/src/
packaging/aur/*/*.pkg.tar.*
logs_archive/

# secondary build trees (CUDA / experiments)
build-cuda/
build-nols/
157 changes: 157 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
# AGENTS.md — foundation-sunshine (linux-migration branch)

AlkaidLab/qiin2333 fork of LizardByte/Sunshine (Windows streaming enhancements).
This workspace ports those enhancements to Arch Linux on the `linux-migration` branch.
Remote: `mine` = user's fork (QiE2035, push target), `origin` = AlkaidLab upstream.

**Target environments:** Arch Linux with **KDE Plasma (Wayland)** and **niri** are the
primary desktops; a generic path is preferred over a desktop-specific one whenever both
exist (PipeWire/PulseAudio for audio, wlr-output-management / X11 / niri IPC before
anything KDE-only). Compositor-specific backends must probe for their tool and degrade
gracefully when it is absent — never assume kscreen-doctor exists.

**Read before touching sensitive areas:**
- `LINUX_MIGRATION_REPORT.md` — what was ported, how, with file/line evidence
- `LINUX_PORT_GAPS.md` — remaining gap backlog (partial / feasible / non-portable)

## Build / test / package

```bash
sccache --start-server 2>/dev/null || true # optional but big win on rebuilds
cmake -B build -S . -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr \
-DSUNSHINE_ASSETS_DIR=share/sunshine -DSUNSHINE_EXECUTABLE_PATH=/usr/bin/sunshine \
-DSUNSHINE_ENABLE_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES="$(nvidia-smi --query-gpu=compute_cap --format=csv,noheader | head -1 | tr -d .)" \
-DCMAKE_C_COMPILER_LAUNCHER=sccache -DCMAKE_CXX_COMPILER_LAUNCHER=sccache \
-DCMAKE_CUDA_COMPILER_LAUNCHER=sccache -DBUILD_TESTS=ON
ninja -C build sunshine
cd build && ctest # baseline: 31 suites, 30 pass; the single Encoder SetUpTestSuite
# failure inside test_sunshine is headless-only (needs cap_sys_admin)
# (680 cases, 672 pass, 8 skip, 0 assertion failures)
```

CUDA is the default (`SUNSHINE_ENABLE_CUDA` defaults to ON on Linux; a missing
toolkit just skips the CUDA sources). Setting `CMAKE_CUDA_ARCHITECTURES` to the
local GPU keeps CUDA objects to one architecture; the fallback ladder is slow and
architectures the toolkit removed are filtered out automatically. The CUDA build
dlopen()s `libcuda.so.1` (NVIDIA driver) at runtime and links cudart statically —
no CUDA toolkit is needed to run it, and nothing changes for Moonlight clients.

CUDA adds the NVFBC path and removes the NVENC GPU->RAM->GPU round trip; the
ordinary KMS/Wayland/X11 paths stay compiled in. `SUNSHINE_BUILD_DIR=<dir>
makepkg -f` packages another build tree instead of `build/`.

Session-bus features (clipboard host, GNOME display config, the KWin foreground
producer) are genuinely optional: `cmake/compile_definitions/linux.cmake` defines
`SUNSHINE_HAVE_SDBUS` only when libsystemd is found, and those modules degrade to
inert halves instead of breaking the build. Never include `<systemd/sd-bus.h>`
outside such a guard — `src/platform/linux/sdbus_session.h` and
`mutter_display.h` are the patterns to copy. Verify with a fake pkg-config that
hides libsystemd (recipe and results: LINUX_MIGRATION_REPORT.md §6.25).

Packaging (`packaging/arch-local/`, installs prebuilt tree, no compile in makepkg):
`cmake -B build ...` (refreshes the binary version stamp) → `ninja -C build sunshine`
→ `makepkg -f`. The PKGBUILD derives `pkgver` from that stamp itself
(`<YYYY>.<MMDD>.<HHMMSS>.<commit>`, the string the `Sunshine version:` log line
prints), so the package name always names the build it contains; keep `pkgrel` at 1
and bump it only for packaging-only changes. It also re-links automatically when
the stamp and HEAD disagree. Never run makepkg while ninja is still linking. Never
commit `packaging/arch-local/{pkg,src,*.pkg.tar.zst}`.
User installs packages themselves (sudo needs a password).

## Platform rules (Windows CI builds this repo — do not break it)

- `SUNSHINE_TARGET_FILES` (common.cmake) compiles on **Windows too**. New Linux-only
sources go in `cmake/compile_definitions/linux.cmake` (`PLATFORM_TARGET_FILES`).
- Tests are GLOB'd on all platforms and `build_win` runs `BUILD_TESTS=ON`: a
Linux-only test file must be excluded under `if (WIN32)` in `tests/CMakeLists.txt`.
- Windows impls stay inside `#if defined(_WIN32)`; Linux impls after `#else`.
Gotcha: in `vdd_utils.cpp` the entire Windows half sits in `#if defined(_WIN32)`
from line 1 — Linux-side `#include`s go after the `#else`, not at the top.
- Un-gating a Windows-only feature for Linux (include move, real capability report)
is fine only if the Windows branch is byte-identical afterwards.
- New shared-code behaviors must be gated or verified as Windows-neutral; audit with
`git diff <merge-base>..HEAD -- <shared file>` before pushing, or run
`python3 tools/audit-windows-parity.py [<base>..<head>]`, which lists every changed
line that lands inside a Windows-only preprocessor region and fails when a
`src/platform/linux/` source leaks into the shared build files.

## Architecture boundaries

- Cross-platform session logic: `src/display_device/` (session.cpp, settings.cpp).
Platform backends: `src/platform/linux/display_device.cpp` (kscreen-doctor), Windows in
`src/platform/windows/display_device/`.
- VDD (virtual display) Linux backend: `src/display_device/vdd_utils.cpp` `#else` half +
`src/platform/linux/vdd_edid.*`. VDD state is DRM-persistent — `adopt_orphan_vdd_locked()`
recovers it after restart; never recreate what `live_virtual_display_connector()` can adopt.
- Tray owns a single main-thread event loop on Linux. Any shutdown/restart raised off the
main thread must wake it via `system_tray::end_tray()` (init_tray installs a shutdown
watcher — keep it). `tray_update()` from helper threads is the established pattern.
- HDR analyzer feeds `encode_device_t::hdr_luminance_stats`; constants come from
`video_hdr_metadata.h` (`detail::st2084_*`) — do not re-derive PQ math
(widespread fractions `c3=2399/...`, `m2=×32` are wrong; 100 nits ⇒ signal 0.5081).

## Known gotchas

- Sunshine runs with file capabilities ⇒ `AT_SECURE`: `secure_getenv` hides
`XDG_RUNTIME_DIR`, so `sd_bus_open_user()` fails in-process — use
`platf::sdbus::open_user_bus()` (`src/platform/linux/sdbus_session.h`).
- `popen` children inherit listening sockets and can hang forever — use the bounded
`vdd_utils::run_logged()` (fork/exec, closes fds, 10s kill).
- kscreen-doctor needs the session env (`WAYLAND_DISPLAY` + bus); it rejects decimal
refresh in `mode.WxH@refresh` — fractional rates go by mode id.
- NVIDIA: forcing a connector on through its `status` node emits only a
**connector-level** uevent, which KWin ignores — kwin 6.8
`src/backends/drm/drm_backend.cpp:174` monitors `("drm", "drm_minor")` and
`:190-191` drops every sysname that is not a `cardN` primary node, so the output
stays invisible to KScreen ("Output with name or uuid DP-2 not found") and the
session dies later as a 503 on the mode set. Write `change` to
`/sys/class/drm/<card>/uevent` after forcing the connector
(`notify_compositor()` in vdd_utils.cpp), and treat "KScreen lists the output" as
the only proof it is usable — a connector left `enabled` while `disconnected`
keeps a stale encoder that proves nothing. That activation is one-shot: racing it
with the pidfd master-steal SETCRTC makes KWin fail its atomic commit and drop
the output permanently. Compositor first, steal only for compositors that cannot
be observed (`wait_for_compositor_output` in vdd_utils.cpp). Forced-off still
reads as plain "disconnected" in sysfs — enumeration must consult
`vdd_utils::offlined_physical_connectors()`.
- kscreen-doctor exits 0 on failures (`Output ... not found`, `applying config
failed!`) — verdicts must parse the output text, never the exit code alone.
- `BOOST_LOG` `"...sv"` literals need `using namespace std::string_view_literals`.
- OpenSSL on this box is 4.x, which broke three things at once and will break them again on a
fresh checkout: `ASN1_BIT_STRING` is opaque (use `ASN1_STRING_get0_data/_length`),
`X509_get_subject_name()` returns a **const** name (build your own `X509_NAME` instead of
`X509_NAME_add_entry_by_txt` on it), and the CN fallback for hostname verification is gone
(`openssl verify -verify_hostname localhost` on a CN-only self-signed cert reports
`error 62 … hostname mismatch` while a chain-only check passes). `crypto::gen_creds()`
therefore emits a `subjectAltName` when the CN looks like a host. Build that extension as a
GeneralNames sequence via `X509V3_EXT_i2d`; handing an IA5 string to
`X509_EXTENSION_create_by_NID` produces a cert OpenSSL refuses to parse
(`ossl_x509v3_cache_extensions:invalid certificate`).
- Only one sunshine instance at a time (ports 47984/47989/47990/48010).

## Windows parity conventions (enforced — the user audits these)

- **Canonical identifiers live in shared headers; never re-hardcode them.**
`ZAKO_NAME`/`VDD_NAME` (globals.h), ST2084 constants (`video_hdr_metadata.h`
`detail::st2084_*`; the fractions "c3=2399/4096×32" and "m2=×32" found in the wild
are wrong), per-client physical-size classes, VDD state strings
(`classify_vdd_state`), clipboard wire constants. If a Linux file spells one of
these as a literal, that is a bug.
- **Port semantics, not just the happy path.** When mirroring a Windows behavior,
diff the Windows implementation's acceptance bounds, defaults, and tolerances and
reproduce them (e.g. `parse_vdd_resolution` accepts any positive WxH with an
x/X separator — do not invent extra clamps). Feasibility filtering belongs where
the Windows side has it (driver / EDID generator).
- **User-visible naming must match Windows.** The virtual display's EDID name is
`ZAKO_NAME` ("Zako HDR"); anything Linux renames differently is a divergence.
Note KDE prepends the PnP vendor letters ("UQD") decoded from the EDID
manufacturer ID — inherent to EDID, not a naming mismatch.
- After porting, grep the touched Linux files for literals duplicating shared
constants and for leftover divergences; the user spot-checks names and numbers.

## Conventions

- Commit per logical step; tag each feature milestone (`v0.1-linux-base` …
`v0.9.3-linux-upstream-sync` ladder — continue it). User reads Chinese.
- Commit messages: English, conventional-commit style (`feat(linux): …`).
- Do not delete or "clean up" the two MD docs above; update them when landing work.
Loading