From ea5989ad2a0051861d7ef0223d73ceb1618e7900 Mon Sep 17 00:00:00 2001 From: Regalia <126194895+regalialong@users.noreply.github.com> Date: Tue, 26 Nov 2024 05:36:31 +0100 Subject: [PATCH] Linux: Use NSIS installer (#991) * feat: Implement SKIP_SHORTCUT for installer * feat: Update Linux install script to use NSIS-based installer instead * feat: Wine detection for installer shortcut suppression * fix: Revert WINEPREFIX back to XDG Home Oops. * fix(linux): Forgot to use the variable here * fix(linux): Don't error if INSTALL_LOCATION exists but is empty * fix(linux): "Program Files" has a space --- Dotnet/Program.cs | 1 + Dotnet/Update.cs | 5 ++++- Dotnet/Wine.cs | 23 +++++++++++++++++++++++ Installer/installer.nsi | 3 +++ Linux/install-vrcx.sh | 25 +++++++++++-------------- 5 files changed, 42 insertions(+), 15 deletions(-) create mode 100644 Dotnet/Wine.cs diff --git a/Dotnet/Program.cs b/Dotnet/Program.cs index 225faece..498e2e30 100644 --- a/Dotnet/Program.cs +++ b/Dotnet/Program.cs @@ -178,6 +178,7 @@ namespace VRCX Application.SetCompatibleTextRenderingDefault(false); logger.Info("{0} Starting...", Version); + logger.Debug("Wine support detection: {0}", Wine.GetIfWine()); ProcessMonitor.Instance.Init(); SQLiteLegacy.Instance.Init(); diff --git a/Dotnet/Update.cs b/Dotnet/Update.cs index 0eba1355..cd1f884a 100644 --- a/Dotnet/Update.cs +++ b/Dotnet/Update.cs @@ -35,6 +35,9 @@ namespace VRCX private static void Install() { + var setupArguments = "/S"; + if (Wine.GetIfWine()) setupArguments += " /DISABLE_SHORTCUT=true"; + try { File.Move(Update_Executable, VRCX_Setup_Executable); @@ -43,7 +46,7 @@ namespace VRCX StartInfo = new ProcessStartInfo { FileName = VRCX_Setup_Executable, - Arguments = "/S", + Arguments = setupArguments, UseShellExecute = true, WorkingDirectory = Program.AppDataDirectory } diff --git a/Dotnet/Wine.cs b/Dotnet/Wine.cs new file mode 100644 index 00000000..9a3215a4 --- /dev/null +++ b/Dotnet/Wine.cs @@ -0,0 +1,23 @@ +using System; +using System.Runtime.InteropServices; + +namespace VRCX; + +public static class Wine +{ + [DllImport("ntdll.dll")] + private static extern IntPtr wine_get_version(); + + public static bool GetIfWine() + { + // wine_get_version should be guaranteed to exist exclusively in Wine envs, + // unlike some other suggestions like checking Wine registry keys + try + { + wine_get_version(); + return true; + } + catch { return false; } + } +} + diff --git a/Installer/installer.nsi b/Installer/installer.nsi index 21c93681..33783535 100644 --- a/Installer/installer.nsi +++ b/Installer/installer.nsi @@ -160,6 +160,9 @@ Section "Install" SecInstall IntFmt $0 "0x%08X" $0 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\VRCX" "EstimatedSize" "$0" + ${GetParameters} $R2 + ${GetOptions} $R2 /SKIP_SHORTCUT= $3 + StrCmp $3 "true" +3 CreateShortCut "$SMPROGRAMS\VRCX.lnk" "$INSTDIR\VRCX.exe" ApplicationID::Set "$SMPROGRAMS\VRCX.lnk" "VRCX" diff --git a/Linux/install-vrcx.sh b/Linux/install-vrcx.sh index f7f3fef1..c759fff7 100644 --- a/Linux/install-vrcx.sh +++ b/Linux/install-vrcx.sh @@ -1,8 +1,8 @@ #!/usr/bin/env bash steamapps=$HOME/.local/share/Steam/steamapps/compatdata -stable="https://api0.vrcx.app/releases/stable/latest/download?type=zip" -nightly="https://api0.vrcx.app/releases/nightly/latest/download?type=zip" +stable="https://api0.vrcx.app/releases/stable/latest/download" +nightly="https://api0.vrcx.app/releases/nightly/latest/download" download_url=$stable XDG_DATA_HOME=${XDG_DATA_HOME:=$HOME/.local/share} @@ -61,22 +61,19 @@ fi winetricks --force -q corefonts # Workaround for https://bugs.winehq.org/show_bug.cgi?id=32342 echo "Download VRCX" +INSTALL_LOCATION="$WINEPREFIX/drive_c/Program Files/VRCX" -if [[ ! -d $WINEPREFIX/drive_c/vrcx ]]; then - mkdir -p $WINEPREFIX/drive_c/vrcx +if [[ ! -d $INSTALL_LOCATION ]]; then + mkdir -p "$INSTALL_LOCATION" else - rm -r $WINEPREFIX/drive_c/vrcx/* + rm -rf "${INSTALL_LOCATION:?}/"* fi -cd $WINEPREFIX/drive_c/vrcx -curl -L $download_url -o vrcx.zip -unzip -uq vrcx.zip -rm vrcx.zip +cd "$INSTALL_LOCATION" +curl -L $download_url -o vrcx_setup.exe +WINEPREFIX=$WINEPREFIX wine vrcx_setup.exe /S /SKIP_SHORTCUT=true +rm vrcx_setup.exe -echo "#!/usr/bin/env bash -export WINEPREFIX=$WINEPREFIX -wine $WINEPREFIX/drive_c/vrcx/VRCX.exe" > $WINEPREFIX/drive_c/vrcx/vrcx -chmod +x $WINEPREFIX/drive_c/vrcx/vrcx echo "Install VRCX.png to $XDG_DATA_HOME/icons" curl -L https://raw.githubusercontent.com/vrcx-team/VRCX/master/VRCX.png -o "$XDG_DATA_HOME/icons/VRCX.png" @@ -86,7 +83,7 @@ echo "[Desktop Entry] Type=Application Name=VRCX Categories=Utility; -Exec=$WINEPREFIX/drive_c/vrcx/vrcx +Exec=WINEPREFIX=$WINEPREFIX wine '$INSTALL_LOCATION/VRCX.exe' Icon=VRCX " > $XDG_DATA_HOME/applications/vrcx.exe.desktop