;NSIS Modern User Interface ;Start Menu Folder Selection Example Script ;Written by Joost Verburg ;-------------------------------- ;Include Modern UI !include "MUI2.nsh" !include "nsDialogs.nsh" !include "LogicLib.nsh" !include "@NSIS_TARGETS_DIR@\FileAssociation.nsh" !include "@NSIS_TARGETS_DIR@\FileFunc.nsh" !include "@NSIS_TARGETS_DIR@\WordFunc.nsh" ;-------------------------------- ;General ;Name and file Name "@PROJECT_NAME@ Companion @VERSION_FAMILY@" OutFile "companion-windows-@VERSION@.exe" ;Default installation folder InstallDir "$PROGRAMFILES64\@PROJECT_NAME@\Companion @VERSION_FAMILY@" ;Get installation folder from registry if available InstallDirRegKey HKCU "Software\@PROJECT_NAME@\Companion @VERSION_FAMILY@" "" ;Compressor options ;SetCompress off SetCompressor /FINAL /SOLID lzma SetCompressorDictSize 64 ;Request application privileges for Windows Vista RequestExecutionLevel admin ;-------------------------------- ;Variables Var StartMenuFolder Var StartMenuLocationDialog Var StartMenuLocationRadioCurrent Var StartMenuLocationRadioAll Var StartMenuLocationValue ; "current_user" or "all_users" ;-------------------------------- ;Interface Settings !define MUI_ABORTWARNING ;-------------------------------- ;File Exists Macro ; See http://nsis.sourceforge.net/Check_if_a_file_exists_at_compile_time for documentation !macro !defineifexist _VAR_NAME _FILE_NAME !tempfile _TEMPFILE !ifdef NSIS_WIN32_MAKENSIS ; Windows - cmd.exe !system 'if exist "${_FILE_NAME}" echo !define ${_VAR_NAME} > "${_TEMPFILE}"' !else ; Posix - sh !system 'if [ -e "${_FILE_NAME}" ]; then echo "!define ${_VAR_NAME}" > "${_TEMPFILE}"; fi' !endif !include '${_TEMPFILE}' !delfile '${_TEMPFILE}' !undef _TEMPFILE !macroend !define !defineifexist "!insertmacro !defineifexist" ;-------------------------------- ;Pages !insertmacro MUI_PAGE_LICENSE "@NSIS_DISTRO@\bin\license.txt" !insertmacro MUI_PAGE_COMPONENTS !insertmacro MUI_PAGE_DIRECTORY ;Start Menu Folder Page Configuration !define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU" !define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\@PROJECT_NAME@\Companion @VERSION_FAMILY@" !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder" !insertmacro MUI_PAGE_STARTMENU Application $StartMenuFolder ;Start Menu Folder for current user or all users? Page custom StartMenuLocationCreator StartMenuLocationLeave !insertmacro MUI_PAGE_INSTFILES # These indented statements modify settings for MUI_PAGE_FINISH !define MUI_FINISHPAGE_NOAUTOCLOSE !define MUI_FINISHPAGE_RUN !define MUI_FINISHPAGE_RUN_CHECKED !define MUI_FINISHPAGE_RUN_FUNCTION "LaunchLink" # !define MUI_FINISHPAGE_SHOWREADME_NOTCHECKED # !define MUI_FINISHPAGE_SHOWREADME $INSTDIR\readme.txt !insertmacro MUI_PAGE_FINISH !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_COMPONENTS !insertmacro MUI_UNPAGE_INSTFILES ;-------------------------------- ;Languages !insertmacro MUI_LANGUAGE "English" !insertmacro MUI_LANGUAGE "French" ;-------------------------------- ;Installer Sections ; Visual C++ Redistributable (x64) is a required dependency ; !macro GetInstalledVCVersionCall _RESULT Call GetInstalledVCVersion Pop ${_RESULT} !macroend !macro GetInstalledVCVersion !ifndef GetInstalledVCVersion !define GetInstalledVCVersion `!insertmacro GetInstalledVCVersionCall` Function GetInstalledVCVersion ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x64" "Version" StrCpy $R1 "$R0" 1 # get first character ${If} $R1 == "v" StrCpy $R1 "$R0" "" 1 # strip off v prefix ${EndIf} Push $R1 FunctionEnd !endif !macroend !define VCREDISTNAME "Microsoft Visual C++ 2015-2022 Redistributable" !define VCREDISTFILE "@NSIS_DISTRO@\bin\@NSIS_MSVC_REDIST_EXE@" !define VCREDISTEXE "@NSIS_MSVC_REDIST_EXE@" Var VCRedistExeVers Var VCInstVers !insertmacro GetFileVersion !insertmacro VersionCompare !insertmacro GetInstalledVCVersion Section "${VCREDISTNAME}" SecMSVC Push $0 Push $1 SetOutPath "$TEMP" File "${VCREDISTFILE}" ${GetFileVersion} "$TEMP\${VCREDISTEXE}" $VCRedistExeVers ${GetInstalledVCVersion} $VCInstVers ${VersionCompare} "$VCInstVers" "$VCRedistExeVers" $R0 DetailPrint "VC++ Installed: $VCInstVers Redist: $VCRedistExeVers Result: $R0" ${If} $R0 == "2" DetailPrint "Installing ${VCREDISTNAME}..." ExecWait "$TEMP\${VCREDISTEXE} /install /passive /norestart" ;IfErrors InstallError ContinueInstall ; vc_redist exit code is unreliable ${GetInstalledVCVersion} $VCInstVers ${VersionCompare} "$VCInstVers" "$VCRedistExeVers" $R0 ${If} $R0 == "0" Goto ContinueInstall ${EndIf} MessageBox MB_ICONSTOP "\ There was an unexpected error installing$\r$\n\ ${VCREDISTNAME}.$\r$\n\ The installation of @PROJECT_NAME@ cannot continue." Abort ${EndIf} ContinueInstall: Delete "$TEMP\${VCREDISTEXE}" SetOutPath "$INSTDIR" ; Restore original output path Pop $1 Pop $0 SectionEnd Section "@PROJECT_NAME@ Companion @VERSION_FAMILY@" SecCpn SetOutPath "$INSTDIR" ; Copy the complete distribution folder contents File /r "@NSIS_DISTRO@\*" ;Store installation folder WriteRegStr HKCU "Software\@PROJECT_NAME@\Companion @VERSION_FAMILY@" "" $INSTDIR ;Associate with extentions .etx ${registerExtension} "$INSTDIR\bin\companion.exe" ".etx" "@PROJECT_NAME@ Settings File" ;Create uninstaller WriteUninstaller "$INSTDIR\Uninstall.exe" ;Registry information for add/remove programs WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@PROJECT_NAME@ Companion @VERSION_FAMILY@" "DisplayName" "@PROJECT_NAME@ Companion @VERSION_FAMILY@" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@PROJECT_NAME@ Companion @VERSION_FAMILY@" "DisplayVersion" "@VERSION@" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@PROJECT_NAME@ Companion @VERSION_FAMILY@" "UninstallString" "$\"$INSTDIR\Uninstall.exe$\"" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@PROJECT_NAME@ Companion @VERSION_FAMILY@" "DisplayIcon" "$\"$INSTDIR\bin\companion.exe$\"" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@PROJECT_NAME@ Companion @VERSION_FAMILY@" "Publisher" "@PROJECT_NAME@" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@PROJECT_NAME@ Companion @VERSION_FAMILY@" "URLInfoAbout" "https://@PROJECT_NAME_LOWERCASE@.org" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@PROJECT_NAME@ Companion @VERSION_FAMILY@" "QuietUninstallString" "$\"$INSTDIR\Uninstall.exe$\" /S" !insertmacro MUI_STARTMENU_WRITE_BEGIN Application ;Create shortcuts ${If} $StartMenuLocationValue == "all_users" SetShellVarContext all ${Endif} CreateDirectory "$SMPROGRAMS\$StartMenuFolder" CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Companion @VERSION_FAMILY@.lnk" "$INSTDIR\bin\companion.exe" CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Firmware Simulator @VERSION_FAMILY@.lnk" "$INSTDIR\bin\simulator.exe" CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Uninstall Companion @VERSION_FAMILY@.lnk" "$INSTDIR\Uninstall.exe" SetShellVarContext current !insertmacro MUI_STARTMENU_WRITE_END SectionEnd ;-------------------------------- ;Descriptions ;Language strings LangString DESC_SecCpn ${LANG_ENGLISH} "Models and settings editor for @PROJECT_NAME@" LangString DESC_SecCpn ${LANG_FRENCH} "Editeur de r glages et mod les pour @PROJECT_NAME@" LangString DESC_SecMSVC ${LANG_ENGLISH} "Install or update runtime library support files necessary for Companion" LangString DESC_SecMSVC ${LANG_FRENCH} "Fichiers de support de bibliothèque d'exécution nécessaires pour Companion" LangString SML_SubTitle ${LANG_ENGLISH} "Choose a location for the Start Menu shortcuts" LangString SML_SubTitle ${LANG_FRENCH} "Choisissez un emplacement pour les raccourcis de l'application" LangString SML_MainLabel ${LANG_ENGLISH} "Create start menu shortcuts for:" LangString SML_MainLabel ${LANG_FRENCH} "Emplacement pour les raccourcis de l'application:" LangString SML_RadioCurrent ${LANG_ENGLISH} "Current user only" LangString SML_RadioCurrent ${LANG_FRENCH} "Utilisateur actuel" LangString SML_RadioAll ${LANG_ENGLISH} "All users" LangString SML_RadioAll ${LANG_FRENCH} "Tous les utilisateurs" ;Assign language strings to sections !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN !insertmacro MUI_DESCRIPTION_TEXT ${SecCpn} $(DESC_SecCpn) !insertmacro MUI_DESCRIPTION_TEXT ${SecMSVC} $(DESC_SecMSVC) !insertmacro MUI_FUNCTION_DESCRIPTION_END ;-------------------------------- ;Uninstaller Section Section "un.${VCREDISTNAME}" SectionEnd Section "un.@PROJECT_NAME@ Companion @VERSION_FAMILY@" SectionIn RO ; Not deselectable RMDir /r "$INSTDIR\plugins\generic" RMDir /r "$INSTDIR\plugins\iconengines" RMDir /r "$INSTDIR\plugins\imageformats" RMDir /r "$INSTDIR\plugins\multimedia" RMDir /r "$INSTDIR\plugins\networkinformation" RMDir /r "$INSTDIR\plugins\platforms" RMDir /r "$INSTDIR\plugins\styles" RMDir /r "$INSTDIR\plugins\tls" RMDir /r "$INSTDIR\plugins" RMDir /r "$INSTDIR\bin\__pycache__" RMDir /r "$INSTDIR\bin" Delete "$INSTDIR\Uninstall.exe" RMDir "$INSTDIR" ${unregisterExtension} ".etx" "@PROJECT_NAME@ Settings File" !insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuFolder ; Always remove start menu folder for both locations: current user and all users SetShellVarContext all Delete "$SMPROGRAMS\$StartMenuFolder\Companion @VERSION_FAMILY@.lnk" Delete "$SMPROGRAMS\$StartMenuFolder\Firmware Simulator @VERSION_FAMILY@.lnk" Delete "$SMPROGRAMS\$StartMenuFolder\Uninstall Companion @VERSION_FAMILY@.lnk" RMDir "$SMPROGRAMS\$StartMenuFolder" SetShellVarContext current Delete "$SMPROGRAMS\$StartMenuFolder\Companion @VERSION_FAMILY@.lnk" Delete "$SMPROGRAMS\$StartMenuFolder\Firmware Simulator @VERSION_FAMILY@.lnk" Delete "$SMPROGRAMS\$StartMenuFolder\Uninstall Companion @VERSION_FAMILY@.lnk" RMDir "$SMPROGRAMS\$StartMenuFolder" DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@PROJECT_NAME@ Companion @VERSION_FAMILY@" SectionEnd Section /o "un.Settings" DeleteRegKey HKCU "Software\@PROJECT_NAME@\Companion @VERSION_FAMILY@" SectionEnd Function LaunchLink ExecShell "" "$INSTDIR\bin\companion.exe" FunctionEnd ; Custom page with radio buttons, if the start menu entries shall be created ; for the current user or for all users. Function StartMenuLocationCreator ; Set default value if not already set. Do this before we might "abort" this page. ${If} $StartMenuLocationValue == "" StrCpy $StartMenuLocationValue "current_user" ${EndIf} ; If the folder starts with >, the user has chosen not to create a shortcut (see NSIS/StartMenu.nsh) StrCpy $R0 $StartMenuFolder 1 ${If} $R0 == ">" Abort ${EndIf} !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_TEXT_STARTMENU_TITLE) $(SML_SubTitle) nsDialogs::Create 1018 Pop $StartMenuLocationDialog ${If} $StartMenuLocationDialog == error Abort ${EndIf} ${NSD_CreateLabel} 0u 0u 100% 12u $(SML_MainLabel) Pop $R0 ${NSD_CreateRadioButton} 8u 20u 100% 12u $(SML_RadioCurrent) Pop $StartMenuLocationRadioCurrent ${NSD_AddStyle} $StartMenuLocationRadioCurrent ${WS_GROUP} ${NSD_CreateRadioButton} 8u 40u 100% 12u $(SML_RadioAll) Pop $StartMenuLocationRadioAll ${If} $StartMenuLocationValue == "all_users" ${NSD_SetState} $StartMenuLocationRadioAll ${BST_CHECKED} ${Else} ${NSD_SetState} $StartMenuLocationRadioCurrent ${BST_CHECKED} ${EndIf} ${NSD_OnBack} StartMenuLocationLeave nsDialogs::Show FunctionEnd ; Converts the radio button state back into a value for "StartMenuLocationValue" Function StartMenuLocationLeave ${NSD_GetState} $StartMenuLocationRadioAll $R0 ${If} $R0 == ${BST_CHECKED} StrCpy $StartMenuLocationValue "all_users" ${Else} StrCpy $StartMenuLocationValue "current_user" ${Endif} FunctionEnd