Skip to content

Instantly share code, notes, and snippets.

@feer9
Created March 28, 2024 05:06
Show Gist options
  • Save feer9/88b875e5050418359ef9958fd878f40a to your computer and use it in GitHub Desktop.
Save feer9/88b875e5050418359ef9958fd878f40a to your computer and use it in GitHub Desktop.
Run a program with Mobox's Wine inside of Termux X11
#!/data/data/com.termux/files/usr/bin/bash
show_help() {
cat << EOF
Usage: ${0##*/} [-hu] FILE [Args...]
Exec
-h Display this help and exit
-u --update Update mobox before running
EOF
}
update=false
while :; do
case $1 in
"")
break
;;
-h|-\?|--help)
show_help # Display a usage synopsis
exit
;;
-u|--update)
update=true
;;
--) # End of all options
shift
break
;;
-?*)
printf 'WARN: Unknown option (ignored): %s\n' "$1" >&2
;;
*) # Default case: No more options, so break out of the loop
# Leaves the rest of the arguments to be passed to wine
break
;;
esac
shift
done
if [ "$#" -eq 0 ]; then
echo "No input"
show_help
exit 1
fi
# [mobox]
. $PREFIX/glibc/opt/package-manager/token
function wget-git-q {
wget -q --retry-connrefused --tries=0 --header "PRIVATE-TOKEN: $PRIVATE_TOKEN" "https://gitlab.com/api/v4/projects/$PROJECT_ID/repository/files/$1/raw?ref=main" -O $2
return $?
}
if [ "$update" = true ] ; then
mv $PREFIX/glibc/opt/package-manager/package-manager $PREFIX/glibc/opt/package-manager/package-manager-bak
wget-git-q "package-manager" "$PREFIX/glibc/opt/package-manager/package-manager"
if [ "$?" = "0" ]; then
rm $PREFIX/glibc/opt/package-manager/package-manager-bak
. $PREFIX/glibc/opt/package-manager/package-manager
sync-all
sleep 2
else
mv $PREFIX/glibc/opt/package-manager/package-manager-bak $PREFIX/glibc/opt/package-manager/package-manager
echo "Couldn't check for updates"
sleep 1
. $PREFIX/glibc/opt/package-manager/package-manager
fi
fi
# [start-tfm]
cd
mkdir -p /sdcard/Android/data/com.termux/files/Download
mkdir -p /sdcard/moboxtrace
. $PREFIX/glibc/opt/scripts/configs
load_configs
function stop-all {
pkill -f "app_process / com.termux.x11"
rm -rf $PREFIX/tmp/pulse-*
pulseaudio -k &>/dev/null
unset PULSE_SERVER
pkill pulseaudio
rm -rf $PREFIX/tmp/.virgl_test &>/dev/null
pkill virgl
rm -rf $PREFIX/tmp/.virgl_test &>/dev/null
}
chmod +x $PREFIX/glibc/bin/box64
chmod +x $WINE_PATH/bin/{wine,wineserver}
patchelf --force-rpath --set-rpath $PREFIX/glibc/lib --set-interpreter $PREFIX/glibc/lib/ld-linux-aarch64.so.1 $PREFIX/glibc/bin/box64
rm -rf $PREFIX/glibc/bin/{wine,wineserver}
ln -sf $WINE_PATH/bin/wine $PREFIX/glibc/bin/wine
ln -sf $WINE_PATH/bin/wineserver $PREFIX/glibc/bin/wineserver
export GLIBC_BIN=$PREFIX/glibc/bin
LD_PRELOAD_SAVED=$LD_PRELOAD
unset LD_PRELOAD
if ! ls $PREFIX/glibc/opt/prefix/start/Registry/2.* &>/dev/null; then
cp -r $PREFIX/glibc/opt/prefix/start/Registry/2.* $WINEPREFIX/drive_c/ProgramData/Microsoft/Windows/Start\ Menu/Registry
fi
rm -rf "$WINEPREFIX/drive_c/ProgramData/Microsoft/Windows/Start Menu/Install/media foundation (for RE)"
if [ ! -e "$WINEPREFIX/drive_c/ProgramData/Microsoft/Windows/Start Menu/Install/media foundation (for RE).lnk" ]; then
cp "$PREFIX/glibc/opt/prefix/start/Install/media foundation (for RE).lnk" "$WINEPREFIX/drive_c/ProgramData/Microsoft/Windows/Start Menu/Install"
fi
rm -rf $PREFIX/glibc/opt/prefix/start-default
rm -d $PREFIX/glibc/opt/prefix/start/Install/1.* &>/dev/null
rm -d $PREFIX/glibc/opt/prefix/start/Install/2.* &>/dev/null
rm -d $WINEPREFIX/drive_c/ProgramData/Microsoft/Windows/Start\ Menu/Install/1.* &>/dev/null
rm -d $WINEPREFIX/drive_c/ProgramData/Microsoft/Windows/Start\ Menu/Install/2.* &>/dev/null
if ls $PREFIX/glibc/opt/prefix/start/Install/1.* &>/dev/null && ls $WINEPREFIX/drive_c/ProgramData/Microsoft/Windows/Start\ Menu/Install/1.* &>/dev/null; then
rm -rf $WINEPREFIX/drive_c/ProgramData/Microsoft/Windows/Start\ Menu/Install/1.*/* &>/dev/null
cp $PREFIX/glibc/opt/prefix/start/Install/1.*/* $WINEPREFIX/drive_c/ProgramData/Microsoft/Windows/Start\ Menu/Install/1.* &>/dev/null
fi
if ls $PREFIX/glibc/opt/prefix/start/Install/2.* &>/dev/null && ls $WINEPREFIX/drive_c/ProgramData/Microsoft/Windows/Start\ Menu/Install/2.* &>/dev/null; then
rm -rf $WINEPREFIX/drive_c/ProgramData/Microsoft/Windows/Start\ Menu/Install/2.*/* &>/dev/null
cp $PREFIX/glibc/opt/prefix/start/Install/2.*/* $WINEPREFIX/drive_c/ProgramData/Microsoft/Windows/Start\ Menu/Install/2.* &>/dev/null
fi
mkdir -p $WINEPREFIX/moboxmeta
if [ ! -f $WINEPREFIX/moboxmeta/services-fix-applied ]; then
echo "Applying services fix"
taskset -c $PRIMARY_CORES $GLIBC_BIN/box64 $GLIBC_BIN/wine regedit $PREFIX/glibc/opt/prefix/fix-services.reg &>/dev/null
sleep 5
$GLIBC_BIN/box64 $GLIBC_BIN/wineserver -k &>/dev/null
touch $WINEPREFIX/moboxmeta/services-fix-applied
fi
if [ ! -f $WINEPREFIX/moboxmeta/fonts-fix-applied ]; then
echo "Applying fonts fix"
tar -xf $PREFIX/glibc/opt/prefix/fix-fonts.tar.xz -C $WINEPREFIX/drive_c/windows
touch $WINEPREFIX/moboxmeta/fonts-fix-applied
fi
if [ ! -f $WINEPREFIX/moboxmeta/dxdlls-fix-applied ]; then
echo "Applying dlls fix"
7z x $PREFIX/glibc/opt/prefix/directx.7z -o$WINEPREFIX/drive_c -y &>/dev/null
taskset -c $PRIMARY_CORES $GLIBC_BIN/box64 $GLIBC_BIN/wine regedit $PREFIX/glibc/opt/prefix/user.reg &>/dev/null
sleep 5
$GLIBC_BIN/box64 $GLIBC_BIN/wineserver -k &>/dev/null
touch $WINEPREFIX/moboxmeta/dxdlls-fix-applied
fi
load_configs
ln -sf $(df -H | grep -o "/storage/....-....") "$WINEPREFIX/dosdevices/f:" &>/dev/null
# Run the target app
taskset -c $PRIMARY_CORES $GLIBC_BIN/box64 $GLIBC_BIN/wine "$@"
if [ "$STARTUP_WINEDEVICE_MODE" = "0" ]; then
$GLIBC_BIN/box64 $GLIBC_BIN/wine taskkill /f /im services.exe &>/dev/null &
fi
export LD_PRELOAD=$LD_PRELOAD_SAVED
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment