Commit Graph
258 Commits
Author SHA1 Message Date
3AvisD a53dd00ff9 docs: document Vulkan ICD selection for multiple GPUs 2026-10-23 11:24:24 -06:00
Kalah 92484938b8 Merge pull request #123 from 3AvisD/fix/recover-stale-client
fix(launcher): recover a stale client tree without restarting Darling
2026-10-23 14:19:34 +02:00
lucannez64andClaude Opus 5.5 143f0228d4 Merge main into fix/recover-stale-client
Resolve conflicts with #122: keep both feature docs and CI steps, and drop
this branch's copy of the close-helper block, which main now starts after
the installed-client check.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-23 14:18:33 +02:00
Kalah 560872b796 Merge pull request #122 from 3AvisD/feat/hide-client-in-game
feat(launcher): select close/hide client handling from League preferences
2026-10-23 14:17:39 +02:00
Kalah 19b7a708c6 Merge branch 'main' into feat/hide-client-in-game 2026-10-23 14:16:58 +02:00
3AvisD 308fb3f3ce fix(launcher): harden stale-client recovery
- fail closed when X11 omits _NET_CLIENT_LIST or WM_CLASS, and recognize the
  RiotClientServices window class;
- require stale client processes to be at least 60 seconds old;
- recheck process identity before SIGTERM and SIGKILL and recheck the window
  before signalling;
- document the age and window-detection guards.
2026-10-23 06:08:45 -06:00
3AvisD 604073448c fix(launcher): address in-game helper review
- restore hidden windows even when the launcher output pipe is closed;
- exit the hide watcher after ten idle minutes and start it only after the
  installed-client check;
- reject missing, malformed or invalid close-during-game preferences instead
  of silently selecting hide;
- document the preference contract and idle behavior.
2026-10-23 06:08:45 -06:00
Kalah 9a7c1d9933 Merge pull request #115 from ekisu/perf/indium-cpu-shadow
perf(indium): cache buffer address-table keys in CPU memory
2026-10-23 13:42:26 +02:00
Kalah 036b4604ee Merge branch 'main' into perf/indium-cpu-shadow 2026-10-23 13:35:33 +02:00
3AvisD c12ab84559 fix(launcher): remove orphaned client-in-game helpers
A launcher can exit while its long-lived close/hide helper remains. The next
run then starts another watcher, so several copies watch the same prefix.

Add an opt-in RCLOL_CLEAN_STALE_HELPERS=1 preflight that removes only helper
processes of this prefix reparented to init/systemd. Helpers of a live
launcher, other prefixes, the game, Riot/League/CEF, darlingserver and the
runtime are preserved. Unreadable or relative process data leaves a process
alone.

Validated across repeated launcher starts: the cleanup removed four, then one,
then one orphaned watcher; a subsequent dry run reported no orphaned helpers.
Zombie reaping after partial recovery is tracked separately in #124.
2026-10-22 15:50:38 -06:00
3AvisD 9172bb6c3d fix(launcher): handle YAML comments and log failures
- strip inline YAML comments from preference values, including quoted values;
- keep a successfully unmapped window tracked when the success log raises
  BrokenPipeError, while still discarding a window whose unmap failed;
- cover both cases with tests.
2026-10-22 15:30:45 -06:00
3AvisD 4ef09cb92a fix(launcher): recover a stale client tree without restarting Darling
Darlingserver normally stays alive after the Riot Client or game is closed.
If the client window disappears but Riot/League/CEF processes remain,
restarting via run.sh reuses a half-dead runtime and can fail to open a
window.

Add an opt-in RCLOL_RECOVER_STALE_CLIENT=1 preflight. When a darlingserver is
alive, no game is running, no managed client window is visible and stale
client processes belong to this prefix, stop only that client/CEF tree.
Preserve darlingserver, launchd/mldr, sockets and .init.pid, then continue
with the normal product launch.

The helper fails closed when X11 is unavailable, never touches a running game
or a visible client window, and does not patch client binaries, CEF or assets.
It saves the Darling bootstrap, but not Riot Client/CEF startup; a full runtime
restart remains the fallback if no window appears.
2026-10-22 15:27:33 -06:00
3AvisD 9bcd41e12f fix(launcher): fail closed on automatic mode edge cases
- restrict preference reads to the lol-user-experience section;
- distinguish a failed close-preference read from a missing key;
- reject xprop's 'not found' text as a WM_CLASS value;
- track a window before unmap so an interrupting signal still restores it;
- report the tricks-mode opt-out in the hide helper's startup message;
- cover the new cases with preference, window and interruption tests.
2026-10-22 15:07:47 -06:00
3AvisD 8de6bceeae feat(launcher): select client-in-game mode from preferences
Add RCLOL_CLIENT_IN_GAME_TRICKS=1 as the practical launcher switch. It reads
lol-user-experience from LCULocalPreferences.yaml:

- potatoModeEnabled false or unreadable: no action;
- closeLeagueClientDuringGame true: close the client UI;
- closeLeagueClientDuringGame false: hide the client windows.

The existing close and hide switches remain low-level options when the
automatic switch is not set. The hide helper accepts the master switch, and
the resolver plus preference cases are covered by tests and documentation.

The local .desktop entry was validated with the master switch; the installed
preferences select hide on this machine.
2026-10-22 14:56:03 -06:00
3AvisD 521527eb21 fix(launcher): address hide-client review findings
- associate target windows with the selected prefix through the guest PID,
  X11 _NET_WM_PID, NSpid and the loader socket; fail closed when ownership is
  unknown;
- let --once run without either opt-in gate, matching the documented
  diagnostic;
- route SIGHUP through the restore handler;
- cache non-empty WM_CLASS results per window and prune stale entries;
- cover unreadable /proc, host PID mapping and prefix ownership in tests.
2026-10-22 12:32:03 -06:00
3AvisD 899576cbbc feat(launcher): hide the League client UI while a match runs
Add an opt-in alternative to closing LeagueClientUx: hide the managed
LeagueClientUx and Riot Client X11 windows while the game process runs and
show them again when it exits. The client stays open; the game window is
never touched.

Detection is attributed to the launcher prefix through __mldr_sockpath and
fails closed when proc, ownership or window state is unreadable. The helper
requires X11/Xwayland, restores the window on end, signal or error, and is
mutually exclusive with RCLOL_CLOSE_CLIENT_IN_GAME=1.

Document the flag, compliance scope and limits. A local 30-second test on an
i5-3470/RX 550 reduced summed client/CEF CPU from 120.7% to 93.4%; this is a
CPU-bound-host measurement, not a universal FPS claim.

No client binaries, CEF, assets or anti-cheat are modified.
2026-10-22 12:15:35 -06:00
Kalah e4e98ea688 Merge pull request #120 from lucannez64/lucannez64-patch-1
Add donations section to README
2026-10-22 13:02:37 +02:00
Kalah b93f70ab63 Add donations section to README
Added a donations section with a link to Ko-Fi.
2026-10-22 13:01:57 +02:00
Kalah 0920506cb4 Merge pull request #118 from lucannez64/fix/launcher-entry-cleanup
fix(launcher): only remove launcher artifacts this project created
2026-10-21 17:46:46 +02:00
Kalah 0c1c1b5ab3 Merge pull request #117 from 3AvisD/chore/launcher-name
launcher: use a neutral Darling Launcher name and icon
2026-10-21 17:45:18 +02:00
lucannez64 4d0affe1fc fix(launcher): only remove launcher artifacts this project created
Match the legacy entry against this checkout's desktop-run.sh instead of any
desktop-run.sh, and delete the legacy icon files only after that entry or the
old artwork proves ownership.  Quote and escape Exec arguments as the Desktop
Entry specification requires, so a checkout path with reserved characters no
longer produces an invalid entry, and escape the Path value.

Use StartupWMClass=RiotClientServices in both entries: Darling derives WM_CLASS
from -[NSProcessInfo processName], the basename of argv[0], and the launcher
starts .../RiotClientServices.  "Riot Client" is only the bundle display name,
so the checkout entry never matched the window.  Both entries now share
Name/GenericName/Comment/Icon/Keywords/Categories and a test keeps them in
sync; Terminal stays different because the checkout entry logs to
build/desktop-launch.log while the packaged entry runs the session in a
terminal.

Also drop the stray top-level icon copies, handle dangling legacy symlinks,
name the icon for assistive technology, document the alias and menu entry, and
cover the helper with disposable-HOME tests.
2026-10-21 17:38:42 +02:00
3AvisD 6dec8e176e launcher: use a neutral Darling Launcher name and icon
Use a project-owned identity for the visible desktop entry while keeping the existing binary, package and window-matching identifiers working. The helper now copies the project's original icon instead of extracting one from the client, and the old game-named entry and icons it created are removed. Extend the packaging check to assert the neutral fields.
2026-10-20 23:49:39 -06:00
ekisu 634803a30a test(indium): run accepted address shadow regression in CI 2026-10-20 15:47:20 -03:00
ekisu 97c78c2679 perf(indium): cache buffer address keys in CPU memory 2026-10-20 15:47:20 -03:00
Kalah b88893b1cd Merge pull request #114 from nicolai455/fix/nix-fhs-fontconfig
fix(nix): harden fontconfig compatibility across host setups
2026-10-20 13:58:44 +02:00
lucannez64 bdbf1e9a37 test(nix): run font compatibility regressions in CI 2026-10-20 13:57:05 +02:00
Nicolai Bruns 699b96ffc8 docs(tests): document fontconfig regression helpers 2026-10-20 13:43:22 +02:00
Nicolai Bruns 6a96869db8 fix(nix): harden fontconfig compatibility across host setups 2026-10-20 13:31:02 +02:00
nbandlucannez64 ec85cfb96b fix: preserve ambiguous guest processes during prefix cleanup (#111)
* fix: preserve ambiguous guest processes during prefix cleanup

* fix: warn only for matching runtime cleanup candidates

---------

Co-authored-by: lucannez64 <[email protected]>
2026-10-20 13:02:29 +02:00
nbandKalah bbfa4c61b0 fix(appkit): add NSSavePanel tag-name compatibility (#112)
Co-authored-by: Kalah <[email protected]>
2026-10-20 12:24:10 +02:00
Kalah c00dd569c0 Fix Nix FHS text fonts and fontconfig aliases (#113) 2026-10-20 12:14:32 +02:00
Kalah 71f7cfd4a0 Merge pull request #105 from WolfBlack879/fix/trustd-keepalive
security: keep trustd running from boot (fixes black Riot Client window)
2026-10-20 12:02:15 +02:00
Kalah f91dee1580 Merge branch 'main' into fix/trustd-keepalive 2026-10-20 12:00:48 +02:00
Kalah 1069572d2c Merge pull request #107 from DavidutzDev/fix/darlingserver-fd-limit
Raise darlingserver's soft fd limit when the hard limit is fixed
2026-10-20 11:58:17 +02:00
Kalah b93421d55b Merge branch 'main' into fix/darlingserver-fd-limit 2026-10-20 11:57:42 +02:00
Kalah fc178d2d86 Merge pull request #110 from 3AvisD/fix/trademark-logo
Compliance and best-practice adjustments
2026-10-20 11:53:24 +02:00
lucannez64 ef36caf35c Fix Mach-O analysis with no matching strings 2026-10-20 11:52:23 +02:00
3AvisD 4157d1ed3b docs: add scope and terminology guidance
Add docs/COMPLIANCE.md with the project's compatibility scope: no DRM/anti-cheat circumvention, no third-party game assets, and neutral terminology for issues and PRs. Link it from README and NOTICE.
2026-10-19 23:06:47 -06:00
3AvisD 3309f079c7 patches, tools, docs: use neutral integrity-check wording and state the compatibility scope
The patch comments and the Mach-O strings filter named an anti-cheat product. Use neutral wording; the patches still differ only in comments. The platform-identity document now says the overrides are for compatibility, not a bypass of anti-cheat, telemetry, licensing or platform controls.
2026-10-19 22:47:59 -06:00
3AvisD 24962cc056 flake.nix: mark the desktop entry and package as unofficial
Keep the executable names and StartupWMClass; only the user-facing name, comment and descriptions change.
2026-10-19 22:47:59 -06:00
3AvisD 9651602cba README, NOTICE: add trademark notice and remove the gameplay clip
Consolidate the non-affiliation note into a dedicated Trademarks section, replace the embedded gameplay video with a pointer to the status document, and reword the takedown note as a continuity statement. Describe the compatibility tools as referring to public API names and constants.
2026-10-19 22:47:59 -06:00
3AvisD 3edddf250d darling-lol: use an original project mark instead of the game logo
The bundled darling-lol.svg/png are the League of Legends logo, a Riot Games trademark, used as the project icon. The README already states that the project is not affiliated with or endorsed by Riot Games, so the icon should not be someone else's mark.

Replace both files with an original D monogram. Same file names, so flake.nix and the desktop entry keep working. The mark is provisional and easy to swap for a final one. No functional changes.
2026-10-19 22:36:55 -06:00
David GhegheaandClaude Opus 5.5 cb1c9c2354 Raise darlingserver's soft fd limit when the hard limit is fixed
Under the rootless NixOS launcher darlingserver cannot raise its hard
RLIMIT_NOFILE to nr_open, so it kept the soft limit it inherited. Every
named memory entry holds a memfd in darlingserver, and its descriptors
peak at about 1100 when the League lobby opens. With an inherited soft
limit of 1024, memfd_create failed with EMFILE, mach_make_memory_entry_64
returned KERN_RESOURCE_SHORTAGE, and Chromium's CHECK in
PlatformSharedMemoryRegion::Create killed the League UX and the Riot
Client renderer after clicking Play.

When raising the hard limit fails, raise the soft limit to the inherited
hard limit instead. Log errno, size and fd limits when named-entry
creation fails, and log the live memfd count every 1024 creations so a
leak shows up in dserver.log.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-19 22:45:23 +02:00
BenjaminandClaude Opus 5.5 a68e3ab169 security: keep trustd running from boot
The Riot Client UI intermittently stayed black for 30s to 2+ minutes
(sometimes indefinitely). Electron 22 / Chrome 108 verifies the local
Riot backend's TLS certificate through SecTrust, which calls trustd over
XPC. trustd is launched on demand and has EnablePressuredExit, so it is
often not running; under Darling the on-demand launch can take minutes,
and every cert verification (serialized behind Chrome's global lock)
waits for it. The UI's websocket handshake stalls after ServerHello
until then.

Start trustd at boot and keep it alive. Measured on one machine:
before, time to "renderer socket connected to Foundation" ranged
0.8s-136s or never; after, 0.83s / 0.85s / 0.97s on three launches.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_014cgmCWUB2zNH4uiMEioafC
2026-10-19 17:10:06 -03:00
Kalah 6505ecffba Merge pull request #101 from PolarSeeker77/docs/nvidia-reports
Document NVIDIA reports instead of "NVIDIA is not validated"
2026-10-19 19:08:32 +02:00
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