From 24d3da3ff0967a1a980f1e2ce36afd71ea4ddff8 Mon Sep 17 00:00:00 2001 From: Ariel Juodziukynas Date: Sat, 21 Mar 2026 10:10:39 -0300 Subject: [PATCH] [UX] Add Proton-Sarek to wine manager --- README.md | 1 + public/locales/en/translation.json | 1 + src/backend/tools/index.ts | 4 ++-- .../wine/manager/downloader/constants.ts | 4 ++++ src/backend/wine/manager/downloader/main.ts | 18 +++++++++++++++++- src/backend/wine/manager/utils.ts | 13 ++++++++++++- src/common/types.ts | 5 ++++- src/frontend/screens/WineManager/index.tsx | 11 +++++++++++ 8 files changed, 52 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 26ff16e929..e69569542a 100644 --- a/README.md +++ b/README.md @@ -323,6 +323,7 @@ Heroic would not be possible without the work done in many other projects: - Nile: https://github.com/imLinguin/nile - Comet: https://github.com/imLinguin/comet - GE-Proton: https://github.com/GloriousEggroll/proton-ge-custom +- Proton-Sarek: https://github.com/pythonlover02/Proton-Sarek - umu-launcher: https://github.com/Open-Wine-Components/umu-launcher - DXVK: https://github.com/doitsujin/dxvk - VKD3D: https://github.com/HansKristian-Work/vkd3d-proton diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index d84d9b137e..cb8108f209 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -1024,6 +1024,7 @@ }, "wineExplanation": { "proton-ge": "GE-Proton is a Proton variant created by Glorious Eggroll. It is meant to be used along with the umu launcher (default in Heroic).", + "proton-sarek": "Proton-Sarek is a Proton variant created by pythonlover02. It is meant to be used with GPUs that do not support Vulkan 1.3+.", "wine-ge": "Wine-GE-Proton is a Wine variant created by Glorious Eggroll. It has been deprecated in favor of GE-Proton with the umu launcher." }, "winetricks": { diff --git a/src/backend/tools/index.ts b/src/backend/tools/index.ts index 7ff9cf57db..6e943489a9 100644 --- a/src/backend/tools/index.ts +++ b/src/backend/tools/index.ts @@ -815,7 +815,7 @@ function getDxvkUrl(): string { } if (any_gpu_supports_version([1, 1, 0])) { logInfo( - 'The GPU(s) in this system only support Vulkan 1.1/1.2, falling back to DXVK 1.10.3', + 'The GPU(s) in this system only support Vulkan 1.1/1.2, falling back to DXVK 1.10.3 for Wine, or use Proton-Sarek.', LogPrefix.ToolInstaller ) return 'https://api.github.com/repos/doitsujin/dxvk/releases/tags/v1.10.3' @@ -851,7 +851,7 @@ function getVkd3dUrl(): string { } if (any_gpu_supports_version([1, 1, 0])) { logInfo( - 'The GPU(s) in this system only support Vulkan 1.1/1.2, falling back to VKD3D 2.6', + 'The GPU(s) in this system only support Vulkan 1.1/1.2, falling back to VKD3D 2.6 for Wine, or use Proton-Sarek.', LogPrefix.ToolInstaller ) return 'https://api.github.com/repos/Heroic-Games-Launcher/vkd3d-proton/releases/tags/v2.6' diff --git a/src/backend/wine/manager/downloader/constants.ts b/src/backend/wine/manager/downloader/constants.ts index 6de77eb396..e94a0b2865 100644 --- a/src/backend/wine/manager/downloader/constants.ts +++ b/src/backend/wine/manager/downloader/constants.ts @@ -25,3 +25,7 @@ export const WINESTAGINGMACOS_URL = /// Url to Game Porting Toolkit from Gcenx github release page export const GPTK_URL = 'https://api.github.com/repos/Gcenx/game-porting-toolkit/releases' + +/// Url for Proton Sarek github release page +export const PROTON_SAREK_URL = + 'https://api.github.com/repos/pythonlover02/Proton-Sarek/releases' diff --git a/src/backend/wine/manager/downloader/main.ts b/src/backend/wine/manager/downloader/main.ts index 04a3d9a9b0..03cc51fd7e 100644 --- a/src/backend/wine/manager/downloader/main.ts +++ b/src/backend/wine/manager/downloader/main.ts @@ -16,7 +16,8 @@ import { WINELUTRIS_URL, WINECROSSOVER_URL, WINESTAGINGMACOS_URL, - GPTK_URL + GPTK_URL, + PROTON_SAREK_URL } from './constants' import { VersionInfo, Repositorys, WineVersionInfo } from 'common/types' import { @@ -150,6 +151,21 @@ async function getAvailableVersions({ }) break } + case Repositorys.PROTONSAREK: { + await fetchReleases({ + url: PROTON_SAREK_URL, + type: 'Proton-Sarek', + count: count + }) + .then((fetchedReleases: VersionInfo[]) => { + console.log(fetchedReleases) + releases.push(...fetchedReleases) + }) + .catch((error: Error) => { + logError(error, LogPrefix.WineDownloader) + }) + break + } default: { logWarning( `Unknown and not supported repository key passed! Skip fetch for ${repo}`, diff --git a/src/backend/wine/manager/utils.ts b/src/backend/wine/manager/utils.ts index fdba965d22..e4490a9dcb 100644 --- a/src/backend/wine/manager/utils.ts +++ b/src/backend/wine/manager/utils.ts @@ -42,6 +42,9 @@ function getLatestLocalVersions(): Record { ?.date, latestGEProton: localWines.find( (wine) => wine.version === 'GE-Proton-latest' + )?.date, + latestProtonSarek: localWines.find( + (wine) => wine.version === 'Proton-Sarek-latest' )?.date } } @@ -104,6 +107,14 @@ export function updateWineListsIfOutdated(releasesData: ReleasesInfo) { ) ) repositoriesToFetch.push(Repositorys.WINEGE) + + if ( + localVersionIsOlder( + latestLocalVersions.latestProtonSarek, + releasesData['proton-sarek'] + ) + ) + repositoriesToFetch.push(Repositorys.PROTONSAREK) } if (isMac) { @@ -155,7 +166,7 @@ async function updateWineVersionInfos( Repositorys.WINESTAGINGMACOS, Repositorys.GPTK ] - : [Repositorys.WINEGE, Repositorys.PROTONGE] + : [Repositorys.WINEGE, Repositorys.PROTONGE, Repositorys.PROTONSAREK] } await getAvailableVersions({ diff --git a/src/common/types.ts b/src/common/types.ts index f25a80355d..ef88dc98be 100644 --- a/src/common/types.ts +++ b/src/common/types.ts @@ -739,6 +739,7 @@ export type Type = | 'Wine-GE' | 'GE-Proton' | 'Proton' + | 'Proton-Sarek' | 'Wine-Lutris' | 'Wine-Kron4ek' | 'Wine-Crossover' @@ -775,7 +776,8 @@ export enum Repositorys { WINELUTRIS, WINECROSSOVER, WINESTAGINGMACOS, - GPTK + GPTK, + PROTONSAREK } export type WineManagerStatus = @@ -850,6 +852,7 @@ export type ReleasesInfo = Record< | 'game-porting-toolkit' | 'wine-staging' | 'wine-crossover' + | 'proton-sarek' | 'dxvk' | 'dxvk-mac' | 'dxmt' diff --git a/src/frontend/screens/WineManager/index.tsx b/src/frontend/screens/WineManager/index.tsx index 90b1171374..c219e14291 100644 --- a/src/frontend/screens/WineManager/index.tsx +++ b/src/frontend/screens/WineManager/index.tsx @@ -91,6 +91,7 @@ export default function WineManager(): JSX.Element | null { WineManagerUISettings[] >([ protonge, + { type: 'Proton-Sarek', value: 'protonsarek', enabled: isLinux }, { type: 'Wine-GE', value: 'winege', enabled: isLinux }, gamePortingToolkit, wineCrossover, @@ -160,6 +161,16 @@ export default function WineManager(): JSX.Element | null { )} ) + case 'Proton-Sarek': + return ( +
+ + {t( + 'wineExplanation.proton-sarek', + 'Proton-Sarek is a Proton variant created by pythonlover02. It is meant to be used with GPUs that do not support Vulkan 1.3+.' + )} +
+ ) default: return <> }