111 lines
3.8 KiB
Bash
Executable File
111 lines
3.8 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# omarchy:summary=Launch Steam, applying Asahi muvm login workarounds on Apple Silicon
|
|
# omarchy:group=launch
|
|
# omarchy:args=[--prepare|steam-args...]
|
|
|
|
set -euo pipefail
|
|
|
|
steam_root="$HOME/.local/share/Steam"
|
|
|
|
write_steam_desktop() {
|
|
local app_dir="$HOME/.local/share/applications"
|
|
# This is a user-owned override. Create it once without replacing existing
|
|
# customizations, including a symlink managed by the user.
|
|
[[ -e $app_dir/steam.desktop || -L $app_dir/steam.desktop ]] && return 0
|
|
mkdir -p "$app_dir"
|
|
cat >"$app_dir/steam.desktop" <<'EOF'
|
|
[Desktop Entry]
|
|
Name=Steam
|
|
Comment=Application for managing and playing games on Steam
|
|
Exec=omarchy-launch-steam %U
|
|
Icon=steam
|
|
Terminal=false
|
|
Type=Application
|
|
Categories=Network;FileTransfer;Game;
|
|
MimeType=x-scheme-handler/steam;x-scheme-handler/steamlink;
|
|
EOF
|
|
}
|
|
|
|
steam_client_ready() {
|
|
[[ -d $steam_root/steamui ]] && compgen -G "$steam_root/*/steamui.so" >/dev/null
|
|
}
|
|
|
|
launch_fex_steam() {
|
|
local launcher="$1"
|
|
shift
|
|
|
|
exec muvm -- FEXBash -c 'exec "$@"' omarchy-steam "$launcher" "$@"
|
|
}
|
|
|
|
patch_steam_ui() {
|
|
local steamui="$steam_root/steamui"
|
|
[[ -d $steamui ]] || return 0
|
|
|
|
python3 - "$steamui" <<'PY'
|
|
import pathlib
|
|
import re
|
|
import sys
|
|
|
|
steamui = pathlib.Path(sys.argv[1])
|
|
pattern = re.compile(
|
|
r"const t=\(0,(\w+)\.(\w+)\)\(\"System\.Network\.RegisterForDeviceChanges\"\);"
|
|
r"t&&SteamClient\.System\.Network\.RegisterForDeviceChanges\(this\.OnNetworkDevicesChanged\),"
|
|
r"\(0,\1\.\2\)\(\"System\.Network\.GetProxyInfo\"\)&&SteamClient\.System\.Network\.GetProxyInfo\(\)\.then\(e=>this\.m_proxyInfo=e\),"
|
|
r"\(0,\1\.\2\)\(\"System\.Network\.RegisterForConnectivityTestChanges\"\)&&SteamClient\.System\.Network\.RegisterForConnectivityTestChanges\(this\.OnConnectivityTestStateChanged\),"
|
|
r"t\|\|\(this\.m_bIsAwaitingInitialNetworkState=!1\)"
|
|
)
|
|
replacement = (
|
|
r'const t=(0,\1.\2)("System.Network.RegisterForDeviceChanges")'
|
|
r'&&!!(SteamClient.System&&SteamClient.System.Network&&"function"==typeof SteamClient.System.Network.RegisterForDeviceChanges);'
|
|
r'try{t&&SteamClient.System.Network.RegisterForDeviceChanges(this.OnNetworkDevicesChanged)}catch(e){}'
|
|
r'try{(0,\1.\2)("System.Network.GetProxyInfo")&&SteamClient.System.Network.GetProxyInfo().then(e=>this.m_proxyInfo=e)}catch(e){}'
|
|
r'try{(0,\1.\2)("System.Network.RegisterForConnectivityTestChanges")&&SteamClient.System.Network.RegisterForConnectivityTestChanges(this.OnConnectivityTestStateChanged)}catch(e){}'
|
|
r'this.m_bIsAwaitingInitialNetworkState=!1,this.m_bIsConnectedToANetwork=!0'
|
|
)
|
|
|
|
for path in sorted(steamui.glob("chunk~*.js")):
|
|
text = path.read_text(errors="replace")
|
|
# The exact original block no longer matches after replacement. A generic
|
|
# connected-state assignment elsewhere in the chunk is not a patch marker.
|
|
updated, count = pattern.subn(replacement, text, count=1)
|
|
if count != 1:
|
|
continue
|
|
backup = path.with_suffix(path.suffix + ".omarchy-bak")
|
|
if not backup.exists():
|
|
backup.write_text(text)
|
|
path.write_text(updated)
|
|
PY
|
|
}
|
|
|
|
prepare_asahi() {
|
|
[[ $(uname -m) == aarch64 ]] || return 0
|
|
write_steam_desktop
|
|
patch_steam_ui
|
|
}
|
|
|
|
if [[ ${1:-} == --prepare ]]; then
|
|
prepare_asahi
|
|
exit 0
|
|
fi
|
|
|
|
if [[ $(uname -m) == aarch64 ]] && command -v muvm >/dev/null && command -v FEXBash >/dev/null; then
|
|
launcher="$HOME/.local/share/fex-steam/steam-launcher/bin_steam.sh"
|
|
|
|
if [[ -f $launcher ]]; then
|
|
steam_args=(-cef-force-occlusion)
|
|
if steam_client_ready; then
|
|
# Steam's verifier replaces our patched UI chunk on every launch.
|
|
# Keep update/bootstrap checks enabled while preserving that patch.
|
|
steam_args+=(-noverifyfiles)
|
|
prepare_asahi
|
|
else
|
|
write_steam_desktop
|
|
fi
|
|
|
|
launch_fex_steam "$launcher" "${steam_args[@]}" "$@"
|
|
fi
|
|
fi
|
|
|
|
exec steam "$@"
|