; Custom NSIS include for electron-builder. ; ; Wizard installer (oneClick=false, perMachine=true) with an optional VST3 ; install step. After the directory page, we add a custom page with a checkbox: ; ; [x] Install Prism VST3 plugins (recommended) ; ; If checked, customInstall xcopies the bundled .vst3 bundles from ; $INSTDIR\resources\plugins\VST3\ into $COMMONFILES64\VST3\. The whole ; installer already runs elevated (perMachine=true → UAC at launch), so writes ; to Common Files succeed without a second elevation. On uninstall, the bundles ; are removed unconditionally (harmless if the user opted out at install time). !include "LogicLib.nsh" !include "WinMessages.nsh" !ifndef BUILD_UNINSTALLER !include "nsDialogs.nsh" Var PRISM_VST_CHECKBOX Var PRISM_VST_STATE !macro customInit ; Silent installs skip the options page, so default to installing plugins. StrCpy $PRISM_VST_STATE ${BST_CHECKED} !macroend ; NOTE on parse order: this file is `!include`d before electron-builder's main ; installer template, so MUI references live inside inserted macro bodies. !macro customPageAfterChangeDir Page custom prismVstOptionsPage prismVstOptionsPageLeave Function prismVstOptionsPage !insertmacro MUI_HEADER_TEXT "VST3 Plugins" "Choose whether to install the Prism scope plugins." nsDialogs::Create 1018 Pop $0 ${If} $0 == error Abort ${EndIf} ${NSD_CreateCheckBox} 0 0u 100% 12u "Install Prism VST3 plugins (recommended)" Pop $PRISM_VST_CHECKBOX ${NSD_Check} $PRISM_VST_CHECKBOX ${NSD_CreateLabel} 0 22u 100% 80u "Installs the seven Prism scope plugins (Spectrum, Oscilloscope, Vectorscope, Spectrogram, VU Meter, Loudness Meter, Waveform) to:$\r$\n$\r$\n $COMMONFILES64\VST3$\r$\n$\r$\nDAWs (FL Studio, Ableton, Logic, Reaper, etc.) will find them on the next plugin rescan.$\r$\n$\r$\nUncheck to install only the Prism desktop app. You can re-run this installer at any time to add the plugins later." Pop $0 nsDialogs::Show FunctionEnd Function prismVstOptionsPageLeave ${NSD_GetState} $PRISM_VST_CHECKBOX $PRISM_VST_STATE FunctionEnd !macroend !macro customInstall ${IfNot} ${FileExists} "$INSTDIR\resources\tui\prism-tui.exe" DetailPrint "ERROR: bundled prism-tui.exe was not found" MessageBox MB_OK|MB_ICONSTOP "The bundled prism-tui executable was not found.$\r$\n$\r$\nMissing path:$\r$\n$INSTDIR\resources\tui\prism-tui.exe" /SD IDOK Abort ${EndIf} ; PowerShell avoids NSIS string-length truncation on machines with a large ; PATH. It removes exact duplicates, appends Prism once, and leaves every ; other entry intact. PowerShell comparisons are case-insensitive here. nsExec::ExecToLog `powershell.exe -NoProfile -NonInteractive -ExecutionPolicy Bypass -Command "& { param([string]$$entry) $$path = [Environment]::GetEnvironmentVariable('Path', 'Machine'); $$entries = @($$path -split ';' | Where-Object { $$_ -and $$_ -ine $$entry }); $$entries += $$entry; [Environment]::SetEnvironmentVariable('Path', ($$entries -join ';'), 'Machine') }" "$INSTDIR\resources\tui"` Pop $0 ${If} $0 != 0 DetailPrint "ERROR: could not add Prism TUI to the machine PATH (exit code $0)" MessageBox MB_OK|MB_ICONSTOP "Prism could not add prism-tui to the machine PATH.$\r$\n$\r$\nPowerShell exit code: $0" /SD IDOK Abort ${EndIf} SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 DetailPrint "Added $INSTDIR\resources\tui to the machine PATH" ${If} $PRISM_VST_STATE == ${BST_CHECKED} DetailPrint "Installing Prism VST3 plugins to $COMMONFILES64\VST3" ${IfNot} ${FileExists} "$INSTDIR\resources\plugins\VST3\*.vst3" DetailPrint "ERROR: bundled Prism VST3 plugins were not found at $INSTDIR\resources\plugins\VST3" MessageBox MB_OK|MB_ICONSTOP "Prism VST3 plugins were selected, but the bundled plugin files were not found.$\r$\n$\r$\nMissing path:$\r$\n$INSTDIR\resources\plugins\VST3" /SD IDOK Abort ${EndIf} CreateDirectory "$COMMONFILES64\VST3" ; xcopy /E recurse, /I treat dest as dir, /Y overwrite without prompt. ; The trailing "\*" + "/E" copies each *.vst3 bundle subfolder verbatim. nsExec::ExecToLog 'cmd.exe /c xcopy /E /I /Y "$INSTDIR\resources\plugins\VST3\*" "$COMMONFILES64\VST3\"' Pop $0 ${If} $0 != 0 DetailPrint "ERROR: Prism VST3 plugin copy failed with xcopy exit code $0" MessageBox MB_OK|MB_ICONSTOP "Prism VST3 plugin installation failed while copying files to:$\r$\n$COMMONFILES64\VST3$\r$\n$\r$\nxcopy exit code: $0" /SD IDOK Abort ${EndIf} ${Else} DetailPrint "Prism VST3 plugins: skipped (opted out)." ${EndIf} !macroend !endif !macro customUnInstall ; Remove only Prism's exact machine-PATH entry. A failure is non-fatal so an ; otherwise valid uninstall is never blocked. nsExec::ExecToLog `powershell.exe -NoProfile -NonInteractive -ExecutionPolicy Bypass -Command "& { param([string]$$entry) $$path = [Environment]::GetEnvironmentVariable('Path', 'Machine'); $$entries = @($$path -split ';' | Where-Object { $$_ -and $$_ -ine $$entry }); [Environment]::SetEnvironmentVariable('Path', ($$entries -join ';'), 'Machine') }" "$INSTDIR\resources\tui"` Pop $0 ${If} $0 == 0 SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 ${Else} DetailPrint "WARNING: could not remove Prism TUI from the machine PATH (exit code $0)" ${EndIf} ; Always attempt removal — harmless RMDir if the bundle isn't there (user opted ; out at install or removed manually). RMDir /r "$COMMONFILES64\VST3\Prism Spectrum.vst3" RMDir /r "$COMMONFILES64\VST3\Prism Oscilloscope.vst3" RMDir /r "$COMMONFILES64\VST3\Prism VU Meter.vst3" RMDir /r "$COMMONFILES64\VST3\Prism Loudness Meter.vst3" RMDir /r "$COMMONFILES64\VST3\Prism Vectorscope.vst3" RMDir /r "$COMMONFILES64\VST3\Prism Spectrogram.vst3" RMDir /r "$COMMONFILES64\VST3\Prism Waveform.vst3" !macroend