diff --git a/home/stormux/.local/bin/stormux_launch_helpers.sh b/home/stormux/.local/bin/stormux_launch_helpers.sh index aa6d447..bc0fb52 100755 --- a/home/stormux/.local/bin/stormux_launch_helpers.sh +++ b/home/stormux/.local/bin/stormux_launch_helpers.sh @@ -117,6 +117,47 @@ stop_nvda2speechd() { fi } +update_wine_nvda_dlls() { + local accessibilityDir="${HOME}/.local/share/stormux/wine-accessibility" + local scanRoots=("${HOME}/.local/games/Wine" "${WINEPREFIX:-}/drive_c") + local scanRoot + local dllFile + local dllName + local replacement + + [[ -f "${accessibilityDir}/nvdaControllerClient32.dll" ]] || return 0 + [[ -f "${accessibilityDir}/nvdaControllerClient64.dll" ]] || return 0 + + for scanRoot in "${scanRoots[@]}"; do + [[ -d "$scanRoot" ]] || continue + find "$scanRoot" -type f -iname 'nvdaControllerClient*.dll' -print0 + done | 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 + printf 'Updating %s with nvdaControllerClient\n' "$dllFile" + cp -f "$replacement" "$dllFile" + fi + done +} + run_wine_path() { local wineTarget="$1" local bridgePid="" @@ -129,6 +170,7 @@ run_wine_path() { wineDir="$(winepath "${wineTarget%\\*}")" || return 1 wineExec="${wineTarget##*\\}" pushd "$wineDir" > /dev/null || return 1 + update_wine_nvda_dlls start_nvda2speechd bridgePid || true wine "$wineExec" || launchStatus=$? stop_nvda2speechd "$bridgePid"