diff --git a/docs/development/x86-64-steam-client.md b/docs/development/x86-64-steam-client.md index 8d57b9ce2..af3c02f4a 100644 --- a/docs/development/x86-64-steam-client.md +++ b/docs/development/x86-64-steam-client.md @@ -305,7 +305,8 @@ alone would then read as an installed client. downloaded its version again (Left 4 Dead 2, 8.6 GB; hard links do not help, switching platform makes Steam download depot 551 anyway). A shared game gets the tool its own client uses: `droiddeck-fex` there becomes `droiddeck-direct` here and the other way round, a Proton build keeps its Proton. Only - automatic choices are replaced; a tool the user picked stays. + an automatic choice that would switch the build is replaced; any other choice, including another + Proton, stays. - **Updates and uninstall.** The newer manifest wins: an update made through a view is written back to the client that owns the game. Uninstalling a shared game removes it from that client only; its files stay with the client that installed it (Steam does not delete through the link) and it stays hidden diff --git a/tools/linuxfs/overlay/usr/local/bin/droiddeck-steam-share b/tools/linuxfs/overlay/usr/local/bin/droiddeck-steam-share index d3191b449..9ab21e781 100755 --- a/tools/linuxfs/overlay/usr/local/bin/droiddeck-steam-share +++ b/tools/linuxfs/overlay/usr/local/bin/droiddeck-steam-share @@ -11,6 +11,7 @@ NOT_GAMES = frozenset(( )) TOOL_DIR = re.compile(r"(steam ?linux ?runtime.*|proton.*|steamworks shared|fex|steamvr)", re.I) AUTOMATIC = ("", "droiddeck-direct", "droiddeck-fex", "droiddeck-proton-arm64", "droiddeck-proton-11-arm64") +LINUX_TOOLS = ("droiddeck-direct", "droiddeck-fex") STATE = ".droiddeck-shared.json" LABELS = {"arm64": "ARM64 client games", "x86-64": "x86-64 client games"} @@ -205,6 +206,8 @@ def set_tools(config, wanted): name = name.group(1) if name else "" if name == tool or not (canonical(name) in map(canonical, AUTOMATIC) or name.startswith("proton_")): continue + if name and (name in LINUX_TOOLS) == (tool in LINUX_TOOLS): + continue inner = inner[:m.start()] + inner[m.end():] inner = ('\n\t\t\t\t\t"%s"\n\t\t\t\t\t{\n\t\t\t\t\t\t"name"\t\t"%s"\n\t\t\t\t\t\t"config"\t\t""\n' '\t\t\t\t\t\t"priority"\t\t"250"\n\t\t\t\t\t}' % (app, tool)) + inner diff --git a/tools/tests/test_steam_share.py b/tools/tests/test_steam_share.py index cb5013767..214543357 100644 --- a/tools/tests/test_steam_share.py +++ b/tools/tests/test_steam_share.py @@ -75,11 +75,17 @@ class SteamShareTest(unittest.TestCase): self.assertEqual(tools['413150'], 'droiddeck-direct') self.assertEqual(tools['13210'], 'droiddeck-proton-a64') - def test_an_automatic_x64_proton_is_replaced(self): + def test_a_proton_pick_stays_when_the_other_client_uses_another_proton(self): (self.x64 / 'config/config.vdf').write_text(CONFIG % mapping(_13210='droiddeck-proton-11-a64')) - (self.arm / 'config/config.vdf').write_text(CONFIG % mapping(_0='droiddeck-proton-arm64')) self.run_share('x86-64') - self.assertEqual(SHARE['entries']((self.x64 / 'config/config.vdf').read_text())['13210'], 'droiddeck-proton-a64') + self.assertEqual(SHARE['entries']((self.x64 / 'config/config.vdf').read_text())['13210'], 'droiddeck-proton-11-a64') + + def test_an_automatic_proton_gives_way_to_the_installed_linux_build(self): + self.install(self.x64, '550', 'Left 4 Dead 2') + (self.x64 / 'config/config.vdf').write_text(CONFIG % mapping(_550='droiddeck-direct')) + (self.arm / 'config/config.vdf').write_text(CONFIG % mapping(_0='droiddeck-proton-arm64', _550='droiddeck-proton-arm64')) + self.run_share('arm64') + self.assertEqual(SHARE['entries']((self.arm / 'config/config.vdf').read_text())['550'], 'droiddeck-fex') def test_an_x64_proton_pick_reaches_the_arm64_client(self): self.install(self.x64, '550', 'Left 4 Dead 2')