Start nvda2speechd for Wine games

This commit is contained in:
Storm Dragon
2026-04-22 13:53:43 -04:00
parent 4c5e69649e
commit 153fbd90d2
2 changed files with 83 additions and 1 deletions
@@ -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" <<LAUNCHER
run_wine_path '${wineTarget}'
@@ -63,8 +63,34 @@ run_wine() {
popd > /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() {