diff --git a/home/stormux/.local/.functions/game_install_functions.sh b/home/stormux/.local/.functions/game_install_functions.sh index 4114e69..bfaf7a8 100755 --- a/home/stormux/.local/.functions/game_install_functions.sh +++ b/home/stormux/.local/.functions/game_install_functions.sh @@ -147,6 +147,58 @@ install_with_progress() { esac } +ensure_wine_accessibility_files() { + local accessibilityDir="${HOME}/.local/share/stormux/wine-accessibility" + local nvdaControllerClient32Dll="${ipfsGateway}/ipfs/QmTrRrT4QFKSkZ8ivfUawA6iJ6adEyyogccE3nLDTfSK8u?filename=nvdaControllerClient32.dll" + local nvdaControllerClient64Dll="${ipfsGateway}/ipfs/QmaYE7RFDtwHCiXCVLcuA3esfFx6E7koidtvrck9AwPuuN?filename=nvdaControllerClient64.dll" + local nvda2speechdBinary="${ipfsGateway}/ipfs/QmPxhoNsoFoJC7bCfioBBCcK8tEoSoYpm342z6u7KjFsVz?filename=nvda2speechd" + + download_named "nvdaControllerClient32.dll" "$nvdaControllerClient32Dll" + download_named "nvdaControllerClient64.dll" "$nvdaControllerClient64Dll" + download_named "nvda2speechd" "$nvda2speechdBinary" + + mkdir -p "$accessibilityDir" + cp -f "${cache}/nvdaControllerClient32.dll" "${accessibilityDir}/nvdaControllerClient32.dll" + cp -f "${cache}/nvdaControllerClient64.dll" "${accessibilityDir}/nvdaControllerClient64.dll" + cp -f "${cache}/nvda2speechd" "${accessibilityDir}/nvda2speechd" + chmod 755 "${accessibilityDir}/nvda2speechd" +} + +replace_wine_nvda_dlls() { + local accessibilityDir="${HOME}/.local/share/stormux/wine-accessibility" + local dllFile + local dllName + local replacement + + [[ -d "${WINEPREFIX:-}" ]] || return 0 + + ensure_wine_accessibility_files + find -L "$WINEPREFIX" -type f -iname 'nvdaControllerClient*.dll' -print0 | while IFS= read -r -d '' dllFile; do + dllName="${dllFile##*/}" + replacement="" + + case "${dllName,,}" in + nvdacontrollerclient32.dll) + replacement="${accessibilityDir}/nvdaControllerClient32.dll" + ;; + nvdacontrollerclient64.dll) + replacement="${accessibilityDir}/nvdaControllerClient64.dll" + ;; + nvdacontrollerclient.dll) + if file "$dllFile" | grep -q 'PE32+'; then + replacement="${accessibilityDir}/nvdaControllerClient64.dll" + elif file "$dllFile" | grep -q 'PE32'; then + replacement="${accessibilityDir}/nvdaControllerClient32.dll" + fi + ;; + esac + + if [[ -n "$replacement" && -f "$replacement" ]]; then + cp -f "$replacement" "$dllFile" + fi + done +} + prepare_wine_game_dirs() { local driveC="${WINEPREFIX}/drive_c" local gamesWineRoot="${HOME}/.local/games/Wine" @@ -256,6 +308,7 @@ add_launcher() { set_app_winver "$wineTarget" "$gameWinVer" unset gameWinVer fi + replace_wine_nvda_dlls cat > "$launcherRecipe" < /dev/null || return 1 } +start_nvda2speechd() { + local bridgePidVariable="$1" + local bridgeBinary="${HOME}/.local/share/stormux/wine-accessibility/nvda2speechd" + + if ! [[ -x "$bridgeBinary" ]]; then + bridgeBinary="$(command -v nvda2speechd 2> /dev/null || true)" + fi + [[ -n "$bridgeBinary" && -x "$bridgeBinary" ]] || return 0 + + "$bridgeBinary" > /dev/null 2>&1 & + printf -v "$bridgePidVariable" '%s' "$!" + sleep 0.2 +} + +stop_nvda2speechd() { + local bridgePid="$1" + + [[ -n "$bridgePid" ]] || return 0 + if kill -0 "$bridgePid" 2> /dev/null; then + kill "$bridgePid" 2> /dev/null || true + wait "$bridgePid" 2> /dev/null || true + fi +} + run_wine_path() { local wineTarget="$1" + local bridgePid="" + local launchStatus=0 local wineDir local wineExec @@ -73,8 +99,11 @@ run_wine_path() { wineDir="$(winepath "${wineTarget%\\*}")" || return 1 wineExec="${wineTarget##*\\}" pushd "$wineDir" > /dev/null || return 1 - wine "$wineExec" + start_nvda2speechd bridgePid || true + wine "$wineExec" || launchStatus=$? + stop_nvda2speechd "$bridgePid" popd > /dev/null || return 1 + return "$launchStatus" } run_native() {