Commit Graph
213 Commits
Author SHA1 Message Date
Kalah ac30bb3f23 Merge branch 'main' into docs/nvidia-reports 2026-10-19 19:08:01 +02:00
Kalah 46f4bea286 Merge pull request #100 from lucannez64/fix/host-dns
Use the host DNS resolver in Darling
2026-10-19 19:06:55 +02:00
lucannez64 857aabf8b7 Bypass proxies when checking guest DNS 2026-10-19 18:22:17 +02:00
Polar 5260291443 Document NVIDIA reports instead of "NVIDIA is not validated" 2026-10-19 16:21:26 +00:00
lucannez64 306c6c5bf8 Use the host DNS resolver in Darling 2026-10-19 18:11:49 +02:00
Kalah 02c6eebb00 Merge pull request #88 from lucannez64/fix/x11-vrr
Fix Metal VSync and VRR presentation together
2026-10-19 13:00:57 +02:00
lucannez64 cf86cff688 Keep the merged X11 patch in canonical diff format 2026-10-19 13:00:24 +02:00
lucannez64 71efcdf5f6 Merge current main into the tested VSync and VRR fixes 2026-10-19 12:59:58 +02:00
lucannez64 86cfbb1fd0 Merge VSync and VRR fixes for combined testing 2026-10-19 12:15:09 +02:00
Kalah acd54d8d4d Merge pull request #96 from lucannez64/fix/nsopenpanel-close
Fix NSOpenPanel Open/Cancel not closing the panel (fixes #85)
2026-10-19 09:35:43 +02:00
lucannez64andClaude Sonnet 5.5 9efaf4fb8e Openpanel probe: expand the tree to the subfolder before selecting, print selection diagnostics
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-19 09:33:30 +02:00
lucannez64andClaude Sonnet 5.5 092c454699 Fix openpanel probe: keep trigger note and panel alive across modal pools
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-19 09:28:34 +02:00
lucannez64andClaude Sonnet 5.5 15b1c49d02 Add standalone NSOpenPanel Open/Cancel probe for issue #85
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-19 09:19:42 +02:00
lucannez64andClaude Sonnet 5.5 caec5f1dce Make NSOpenPanel Open/Cancel always end the modal session
Open with no row selected passed nil to -_setFilename:, and NSOpenPanel boxed it in an
array literal, so the action threw before the modal session was stopped and the panel
stayed up. Both buttons now go through one helper that stops the session only when
this panel is the modal window and always orders the panel out; Open accepts the
selection (filtered by canChooseFiles/canChooseDirectories and multiple-selection),
or the shown directory for directory choosers. Escape cancels.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-19 08:49:04 +02:00
Kalah fe892961ab Merge pull request #89 from lucannez64/fix/splash-stays-mapped
Keep hidden X11 windows unmapped
2026-10-19 08:25:12 +02:00
lucannez64andClaude Sonnet 5.5 6a3f81cd3f Keep hidden X11 windows unmapped
Restack and makeKey no longer map a window AppKit considers hidden, and
setIsVisible: NO always unmaps, so the client's splash stays hidden.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-19 08:00:41 +02:00
Kalah a35aecb3ec Merge pull request #87 from ekisu/fix/cocoa-window-decorations
Fix client-side window decorations and LeagueClient header dragging
2026-10-19 07:43:05 +02:00
Kalah 34d7d4aeb8 Merge branch 'main' into fix/cocoa-window-decorations 2026-10-19 07:40:37 +02:00
lucannez64 99cd0f038d Present full-window Metal layers on the managed X11 surface for VRR 2026-10-19 07:35:16 +02:00
Kalah f20bb9cec4 Merge pull request #77 from lucannez64/fix/overview-stuck-super
X11: release modifiers swallowed by the GNOME overview (#74)
2026-10-19 07:17:06 +02:00
Kalah ead486fcc7 Merge branch 'main' into fix/overview-stuck-super 2026-10-19 07:13:28 +02:00
ekisu c451834cc2 Recompile NSEvent in incremental AppKit runtime builds 2026-10-19 01:15:32 -03:00
ekisu 956f1a156d Implement Cocoa local event monitors for native client dragging 2026-10-19 01:15:03 -03:00
ekisu cae74e9e0c Fix X11 decorations for client-drawn Cocoa windows
Synchronize Motif decoration hints on style and titlebar-property changes, including native-window recreation and restoring ordinary WM decorations. Add a ten-case standalone Cocoa/X11 regression probe and document validation on KWin/Xwayland.
2026-10-18 21:06:22 -03:00
lucannez64 3142128575 Fix Metal VSync propagation to window swap intervals 2026-10-19 01:10:03 +02:00
Kalah bcb3245e56 Merge pull request #80 from lucannez64/fix/rootless-update-test
Fix rootless update test after the shared-identity step
2026-10-19 01:00:21 +02:00
lucannez64andClaude Opus 5.5 d6829e8201 tests: expect the shared-identity step at the end of rootless update
#79 made update.sh stop Darling again after the overlays and run
configure-darling-platform.py --replace-known-defaults --write. The
rootless update test still expected the old call list and failed. Stub the
identity tool, expect the stop + identity calls last, and check a failed
install never reaches them.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-19 00:58:45 +02:00
Kalah 8184a0b2b4 Merge pull request #76 from lucannez64/fix/mic-input
Pass microphone input through for voice chat
2026-10-19 00:56:58 +02:00
lucannez64 fdc579c2e6 Merge remote-tracking branch 'origin/main' into fix/mic-input 2026-10-19 00:55:17 +02:00
lucannez64andClaude Opus 5.5 74723556ef AUHAL: accept Vivox's playback format and trace recorded levels
The issue #75 trace shows recording now runs, but Vivox's playback unit
(mic test loopback, other players' voices) sets interleaved Float32 stereo
at 32 kHz on input scope element 0 and got -10868. Apply the relaxed rule
to both client sides (input scope element 0, output scope element 1); the
playback path already interleaves for the device and PulseAudio resamples.

AudioUnitRender(bus 1) now traces frames and peak level (no samples) so a
log shows whether the client pulls sound or silence. The input check also
sets Vivox's playback format and expects unsigned 16-bit to be refused.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-19 00:41:10 +02:00
lucannez64andClaude Opus 5.5 d525aba5f6 AUHAL: only accept float or signed integer recording formats
RenderBus pads missing frames with zeros, which is loud for unsigned PCM
(silence is 0x80 for 8-bit, 0x8000 for 16-bit). Reject unsigned and 8-bit
formats on element 1; voice engines use float or signed 16-bit.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-19 00:25:23 +02:00
Kalah 32ed82e9f2 Merge pull request #79 from lucannez64/fix/replace-shared-identity
Provision a platform identity on setup and replace the shared serial/UUID on update
2026-10-19 00:22:48 +02:00
lucannez64andClaude Opus 5.5 c068e32152 install-runtime.sh: provision a platform identity for new prefixes
When install-runtime.sh creates the prefix (first-time setup, regular or
Nix), it now runs configure-darling-platform.py --provision --write once
the runtime is stopped, so each new install gets its own synthetic serial,
MLB, UUID and ROM. A prefix counts as new the same way Darling decides it:
the directory did not exist before the first `darling shell`. Existing
prefixes keep their identity on reinstall and update.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-19 00:22:07 +02:00
lucannez64andClaude Opus 5.5 fd8732d4bc update.sh: replace the shared serial and UUID automatically
Older setups shipped serial C02ZL0GVMD6N and UUID
6F3B2A1E-8C4D-4E5F-9A7B-1D2C3E4F5A6B to every install. After installing,
update.sh now runs configure-darling-platform.py --replace-known-defaults,
which provisions the prefix only when its saved identity still has one of
those values. Other custom values (imported serials/UUIDs, model, board,
manufacturer, ROM, MLB) are kept; prefixes with no saved identity or only
custom values are not touched.

provision() also drops a standalone system-id or provisioning_UDID derived
from the shared UUID instead of keeping it.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-19 00:17:22 +02:00
lucannez64andClaude Opus 5.5 f8b875ddf1 AUHAL: accept interleaved recording formats on element 1
Vivox sets interleaved Float32 stereo on output scope element 1 and
AUBase's canonical-only rule rejected it with -10868, so voice chat never
started recording (issue #75 trace: 20 attempts, all failing there).
A real AUHAL converts any linear PCM; element 1 now accepts native-endian
float32 or 8/16/32-bit integers in either layout, which PulseAudio records
and RenderBus copies. Playback (element 0) keeps the canonical rule.

The input check gains a Vivox-style run: interleaved stereo 44.1 kHz with
the device set on element 1.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-19 00:13:16 +02:00
Kalah 20a8ea3370 Merge pull request #78 from lucannez64/fix/close-client-cooldown-boot
close-league-client-in-game: don't block closes right after boot
2026-10-18 23:20:24 +02:00
lucannez64andClaude Opus 5.5 4ae311b14e close-league-client-in-game: don't block closes right after boot
last_close started at 0.0 and the cooldown compares it with
time.monotonic(), which counts from boot. For the first 30 s of uptime
every close was refused as "in cooldown". That made the tests flaky on
freshly booted CI runners (seen on PR #76). Use None for "never closed".

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-18 23:16:18 +02:00
lucannez64andClaude Opus 5.5 da356d9112 X11: take modifier masks from the server's modifier map
Right Alt (keycode 108) was hard-coded as Mod5/AltGr. On layouts where it
is Mod1, the swallowed-release reconcile accepted Mod1 as held but rebuilt
the state with Mod5, so the guest could see Option and Function together.
Read the per-key masks from XGetModifierMapping (refreshed on
MappingNotify) and use them everywhere; the old table is the fallback for
unmapped keys. The probe now checks Right Alt against whichever mask the
backend reports.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-18 23:13:07 +02:00
lucannez64andClaude Opus 5.5 52b0fa905d riot-audio-input-check: detect a synchronous access callback by thread
The handler read a flag the caller wrote without synchronization, and
inferred "called inside the request" from whether the call had returned,
which misfires when the handler runs on another thread first. Compare the
handler's thread with the caller's instead and keep the shared results
atomic.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-18 23:08:48 +02:00
lucannez64andClaude Opus 5.5 c7a7ff9f41 X11: release modifiers whose release the compositor swallowed
GNOME's overview delivers the Super press to the game window, eats the
release and hands the keyboard back without a FocusOut. The backend kept
Command held, so every later key and click reached the game as a Command
shortcut until a real focus change reconciled it (issue #74).

Each key, button, motion and crossing event carries the server's modifier
state; release any modifier key we track as down whose modifier is missing
from it. Synthetic events from other clients are ignored.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-18 23:03:23 +02:00
lucannez64andClaude Opus 5.5 5c8226f3e2 Pass microphone input through CoreAudio and AVFoundation
Voice chat (Vivox) saw no capture device and Chromium was told mic
access was denied. Fixes for issue #75:

- AVCaptureDevice: audio is Authorized when CoreAudio has a default
  input device; requestAccess answers asynchronously. Video stays Denied.
- PulseAudio input device reports 2 channels on input scope, 0 on output
  (was copied from the output device).
- PulseAudio input stream: real sample/host timestamps, one device
  buffer per IOProc call, holes as silence, IOProc errors no longer cork
  the stream, record buffer attrs sized to the device buffer.
- AUHAL: two elements per scope like macOS, non-blocking
  AudioUnitRender on bus 1 with planar support, device records in the
  bus 1 format, input-only units route CurrentDevice/BufferFrameSize to
  the input device, input start errors handled.
- New offline check tools/riot-audio-input-check.cpp.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-18 22:55:11 +02:00
Kalah a594fda49a Merge pull request #73 from PolarSeeker77/fix/x11-transparent-windows
X11: give transparent windows an alpha visual, float translucent splash windows
2026-10-18 20:57:01 +02:00
Kalah a8f17f7bea Merge branch 'main' into fix/x11-transparent-windows 2026-10-18 20:56:29 +02:00
Kalah ecc5b812bb Merge pull request #72 from 3AvisD/fix/close-league-client-in-game
fix(launcher): close the League client UI while a match runs
2026-10-18 20:56:18 +02:00
Kalah 70841d6080 Merge pull request #71 from 3AvisD/fix/mesa-shader-cache
fix(launcher): keep Mesa's shader cache on the host
2026-10-18 20:56:15 +02:00
lucannez64andClaude Opus 5.5 957b960985 close-league-client-in-game: start the idle clock only after a client was seen
A long patch or login can keep the League client closed for more than ten
minutes after launch; the helper then left before the first match.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-18 20:48:43 +02:00
3AvisD efc92dfb04 fix(launcher): keep Mesa's shader cache on the host
Mesa derives its shader disk cache from $HOME. Inside the guest that is
/Users/<user>, which does not exist on the host filesystem, so Mesa could not
create the cache and disabled it, once per process:

    Failed to create /Users/<user> for shader cache (Permission denied)---disabling

One launcher log contained 212 of those lines, and no shader compiled by one
process was reused by another process or by the next start: the client and the
game recompiled every shader on every launch, spending CPU at startup for no
gain.

Mesa is host code loaded into the guest and reads MESA_SHADER_CACHE_DIR verbatim,
so point it at a host directory; Mesa creates mesa_shader_cache/ (client and game
shaders) and radv_builtin_shaders/ below it. A non-empty value from the caller is
preserved, and a directory that cannot be created leaves the previous behaviour
instead of ending the launch.

Observed on a Radeon RX 550 with radv: no shader-cache failure after the change,
and 434 files / 5.6 MB written during one client start, still growing while the
client ran. The cache is reused from the second start on, which lowers the
client's CPU use while it starts; the startup-time gain itself has not been
measured separately.
2026-10-18 12:18:33 -06:00
3AvisD bc8fa71a7f fix(launcher): close the League client UI while a match runs
The client does not come back properly after a match when its own "Close client
during game" option is enabled. The UI (LeagueClientUx and its helpers) is a
Chromium/CEF instance and, under Darling, the pre-match instance keeps running:
the client the backend starts when the match ends is a second CEF instance on the
same --user-data-dir, and its window never paints. Its DOM and audio work and the
window stays black; closing the client by hand during a match leaves the same
state for the same reason.

RCLOL_CLOSE_CLIENT_IN_GAME=1 opts in to closing that UI from the host, and only
while a match runs, so the client that appears afterwards is the only instance.
The UI also competes with the game for CPU: on a four-core host with a Radeon
RX 550 a practice match reported roughly 120 FPS with the UI running and roughly
180 FPS with it closed. This is not the helper-killing memory optimization the
RAM section warns against, and the Riot client, the League backend and the game
are never touched.

The helper fails closed. It attributes the game and the client to the launcher's
prefix through the loader's __mldr_sockpath, since guest processes do not carry
DPREFIX (checked on a live session). It never closes a client younger than 60
seconds (the one the backend starts after a match), preserves a process of
another installation or owner, acts only when the environment and the stat fields
can be read, gives up after three closes in one match, and leaves after ten
minutes without a client or a match. It is off by default.

Tests use fake /proc entries and mock every signal.
2026-10-18 12:18:33 -06:00
Polar 57c65b8225 X11: alpha visual for transparent windows, float translucent splashes
Riot's splash screens draw on a black rectangle: LeagueClient's is a
borderless NSWindow with setOpaque:NO and a pattern-image background, the
Riot Client's an Electron BrowserWindow with transparent: true. X11Window
created every window with a 24-bit visual and -setOpaque: only stored the
flag, so there was no alpha channel.

A non-opaque window whose background can show through (alpha below 1, or a
pattern image) now gets the 32-bit ARGB visual. League's game window is
non-opaque on an opaque background and stays on the opaque visual, which
X11IsLeagueGameWindow also enforces. The X window exists before apps set
opacity and background, so the choice is checked again when the first
subwindow is created (layer subwindows inherit the visual) and before the
first map, and the window recreated while unmapped if it changed. Its
background is transparent instead of None, so no black frame shows before
the first draw. Its surface comes from an alpha EGL config for that visual
(CGLGetWindowWithAlpha) and its compositing context from the surface's
config (CGLCreateContextForWindow): NVIDIA refuses the default config on a
32-bit window, and no driver makes a context from it current on the alpha
surface. Without an alpha config the window falls back to the opaque
visual.

A translucent window above the normal level (Electron's alwaysOnTop
splash) is typed _NET_WM_WINDOW_TYPE_SPLASH with _NET_WM_STATE_ABOVE before
it is mapped: window managers float it and draw no frame around it.
Electron's level never arrived, though: CGWindowLevelForKey returned the
normal level for every key, and the SDK turns NSFloatingWindowLevel into a
call to it. It now returns the levels macOS does; Cocotron only stores
levels, so nothing else changes.
2026-10-18 17:49:10 +00:00
Kalah d24f26ee63 Merge pull request #70 from DavidutzDev/feat/prefix-location
Add darling-lol --set-prefix to keep the prefix on another drive
2026-10-18 19:14:32 +02:00