From 53841045425cca0ab6757a52dbe264c6a45b83c8 Mon Sep 17 00:00:00 2001 From: Boris Yumankulov Date: Mon, 7 Sep 2026 23:26:55 +0500 Subject: [PATCH] feat: launch Epic games through EGL wrapper Signed-off-by: Boris Yumankulov --- .../share/portproton/scripts/functions_helper | 22 ++++++++++++++++++- build-aux/share/portproton/scripts/start.sh | 13 ++++++++--- build-aux/share/portproton/scripts/var | 1 + portprotonqt/main_window.py | 4 +++- 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/build-aux/share/portproton/scripts/functions_helper b/build-aux/share/portproton/scripts/functions_helper index d38bc5a6..6b2d837f 100755 --- a/build-aux/share/portproton/scripts/functions_helper +++ b/build-aux/share/portproton/scripts/functions_helper @@ -533,6 +533,21 @@ try_download () { return 0 } +prepare_epic_wrapper () { + local expected_hash="1feb21e21e19cbb34e881791c8f2557769f59231e46850915d49a6d0c1ce4583" + export PW_EPIC_WRAPPER_EXE="${PORT_WINE_TMP_PATH}/plugins${PW_PLUGINS_VER}/epic/EpicGamesLauncher.exe" + if [[ ! -f "$PW_EPIC_WRAPPER_EXE" ]] ; then + create_new_dir "$(dirname "$PW_EPIC_WRAPPER_EXE")" + try_download \ + "https://github.com/BananaWorks07/heroic-epic-integration/releases/download/v${PW_EPIC_WRAPPER_VER}/EpicGamesLauncher.exe" \ + "$PW_EPIC_WRAPPER_EXE" no_mirror || return 1 + fi + if [[ "$(sha256sum "$PW_EPIC_WRAPPER_EXE" | awk '{print $1}')" != "$expected_hash" ]] ; then + try_remove_file "$PW_EPIC_WRAPPER_EXE" + fatal "Epic launcher wrapper checksum verification failed" + fi +} + var_winedlloverride_update () { export WINEDLLOVERRIDES="${1}${WINEDLLOVERRIDES:+;$WINEDLLOVERRIDES}" } @@ -4155,7 +4170,12 @@ EOF else case "${PW_EXE_FILE,,}" in *.exe) - pw_run "${PW_VD_TMP[@]}" ${WINE_WIN_START} "${PW_EXE_FILE}" + if [[ -n "${PW_EPIC_WRAPPER_EXE:-}" ]] ; then + pw_run "${PW_VD_TMP[@]}" "${PW_EPIC_WRAPPER_EXE}" \ + "${PW_EXE_FILE}" "$@" + else + pw_run "${PW_VD_TMP[@]}" ${WINE_WIN_START} "${PW_EXE_FILE}" + fi ;; *.bat|*.cmd) PW_USE_TERMINAL=1 diff --git a/build-aux/share/portproton/scripts/start.sh b/build-aux/share/portproton/scripts/start.sh index bca3bfe0..5c1f90f1 100755 --- a/build-aux/share/portproton/scripts/start.sh +++ b/build-aux/share/portproton/scripts/start.sh @@ -73,6 +73,9 @@ fi export PW_START_PID="$$" +# shellcheck source=/dev/null +source "${PORT_SCRIPTS_PATH}/var" + read -r -a pw_full_command_line <<< "$0 $*" export pw_full_command_line export orig_IFS="$IFS" @@ -119,6 +122,9 @@ elif [[ "$1" =~ ^--(debug|launch|edit-db)$ && "${2,,}" =~ \.(exe|bat|cmd|msi|reg elif [[ -f "$OLDPWD/$2" ]] ; then PW_EXE_FILE="$(realpath -s "$OLDPWD/$2")" fi +elif [[ "$1" == "--epic-wrapper" && "${2,,}" =~ \.exe$ ]] ; then + prepare_epic_wrapper || fatal "Failed to prepare Epic launcher wrapper" + PW_EXE_FILE="$(realpath -s "$2")" fi export PW_EXE_FILE @@ -164,9 +170,6 @@ export PW_VULKAN_DIR="${PORT_WINE_TMP_PATH}/VULKAN" create_new_dir "${PW_VULKAN_DIR}" cd "${PORT_SCRIPTS_PATH}" || fatal "Scripts directory not found: ${PORT_SCRIPTS_PATH}" - -# shellcheck source=/dev/null -source "${PORT_SCRIPTS_PATH}/var" # HACK: Avoid inheriting a system scripts cwd in pressure-vessel. cd "${XDG_DATA_HOME:-$HOME}" || fatal "Data directory not found: ${XDG_DATA_HOME:-$HOME}" @@ -576,6 +579,10 @@ Usage examples: portwine_launch stop_portproton ;; + --epic-wrapper) + portwine_launch "${@:3}" + stop_portproton + ;; --stop) start_path="$(realpath "$0")" pgrep -f -- "${start_path}.*--autoinstall" | while read -r autoinstall_pid ; do diff --git a/build-aux/share/portproton/scripts/var b/build-aux/share/portproton/scripts/var index 1b151eb1..8055029e 100755 --- a/build-aux/share/portproton/scripts/var +++ b/build-aux/share/portproton/scripts/var @@ -16,6 +16,7 @@ export VKD3D_SAREK_VER="sarek-2.6.0" export PW_LSFG_VK_VER="2.0.0-dev25-p11" export PW_OPTISCALER_VER="v03-0.9.0-pre8" export PW_SPECIALK_VER="SK_26_5_15" +export PW_EPIC_WRAPPER_VER="0.4" export PW_GALLIUM_NINE_VER="0.10" export DOTPFX_VER="48v9" export DEFPFX_VER="v1" diff --git a/portprotonqt/main_window.py b/portprotonqt/main_window.py index 0f25e013..d23ddc19 100644 --- a/portprotonqt/main_window.py +++ b/portprotonqt/main_window.py @@ -148,6 +148,7 @@ if [ -n "$LIST" ]; then fi """ + class MainWindow( MainWindowControlHintsMixin, MainWindowAutoInstallTabMixin, @@ -2754,8 +2755,9 @@ class MainWindow( ) return try: + wrapper = shlex.join([self.start_sh[0], "--epic-wrapper"]) command = self.egs_api.build_command([ - "launch", app_id, "--json", "--wrapper", self.start_sh[0], + "launch", app_id, "--json", "--wrapper", wrapper, "--no-wine", "--skip-version-check", ]) process = subprocess.Popen( -- 2.54.0