From 8c7db40103838c10073b455909499abf78943090 Mon Sep 17 00:00:00 2001 From: bitraid Date: Wed, 25 Jul 2018 11:13:21 +0300 Subject: [PATCH] NSIS: replace tabs with spaces, break long lines --- misc/nsis/install.nsh | 725 +++++++++++++++++++----------------- misc/nsis/install_pages.nsh | 4 +- misc/nsis/qutebrowser.nsi | 30 +- misc/nsis/uninstall.nsh | 217 ++++++----- 4 files changed, 511 insertions(+), 465 deletions(-) diff --git a/misc/nsis/install.nsh b/misc/nsis/install.nsh index 267fd0d90..f2b2c8600 100755 --- a/misc/nsis/install.nsh +++ b/misc/nsis/install.nsh @@ -27,90 +27,93 @@ !insertmacro MUI_RESERVEFILE_LANGDLL !macro MSI32_STACK - Push "${MSI32_010}" - Push "${MSI32_011}" - Push "${MSI32_012}" - Push "${MSI32_013}" - Push "${MSI32_014}" - Push "${MSI32_020}" - Push "${MSI32_021}" - Push "${MSI32_030}" - Push "${MSI32_040}" - Push "${MSI32_041}" - Push "${MSI32_050}" - Push "${MSI32_051}" - Push "${MSI32_060}" - Push "${MSI32_061}" - Push "${MSI32_062}" - Push "${MSI32_070}" - Push "${MSI32_080}" - Push "${MSI32_081}" - Push "${MSI32_082}" - Push "${MSI32_084}" - Push "${MSI32_090}" - Push "${MSI32_091}" - Push "${MSI32_100}" - Push "${MSI32_101}" + Push "${MSI32_010}" + Push "${MSI32_011}" + Push "${MSI32_012}" + Push "${MSI32_013}" + Push "${MSI32_014}" + Push "${MSI32_020}" + Push "${MSI32_021}" + Push "${MSI32_030}" + Push "${MSI32_040}" + Push "${MSI32_041}" + Push "${MSI32_050}" + Push "${MSI32_051}" + Push "${MSI32_060}" + Push "${MSI32_061}" + Push "${MSI32_062}" + Push "${MSI32_070}" + Push "${MSI32_080}" + Push "${MSI32_081}" + Push "${MSI32_082}" + Push "${MSI32_084}" + Push "${MSI32_090}" + Push "${MSI32_091}" + Push "${MSI32_100}" + Push "${MSI32_101}" !macroend !macro MSI64_STACK - Push "${MSI64_010}" - Push "${MSI64_011}" - Push "${MSI64_012}" - Push "${MSI64_013}" - Push "${MSI64_014}" - Push "${MSI64_020}" - Push "${MSI64_021}" - Push "${MSI64_030}" - Push "${MSI64_040}" - Push "${MSI64_041}" - Push "${MSI64_050}" - Push "${MSI64_051}" - Push "${MSI64_060}" - Push "${MSI64_061}" - Push "${MSI64_062}" - Push "${MSI64_070}" - Push "${MSI64_080}" - Push "${MSI64_081}" - Push "${MSI64_082}" - Push "${MSI64_084}" - Push "${MSI64_090}" - Push "${MSI64_091}" - Push "${MSI64_100}" - Push "${MSI64_101}" + Push "${MSI64_010}" + Push "${MSI64_011}" + Push "${MSI64_012}" + Push "${MSI64_013}" + Push "${MSI64_014}" + Push "${MSI64_020}" + Push "${MSI64_021}" + Push "${MSI64_030}" + Push "${MSI64_040}" + Push "${MSI64_041}" + Push "${MSI64_050}" + Push "${MSI64_051}" + Push "${MSI64_060}" + Push "${MSI64_061}" + Push "${MSI64_062}" + Push "${MSI64_070}" + Push "${MSI64_080}" + Push "${MSI64_081}" + Push "${MSI64_082}" + Push "${MSI64_084}" + Push "${MSI64_090}" + Push "${MSI64_091}" + Push "${MSI64_100}" + Push "${MSI64_101}" !macroend !macro CheckMSI - ${foreach} $9 ${MSI_COUNT} 1 - 1 - Pop $R1 - ReadRegStr $0 HKLM "${REG_UN}\$R1" "DisplayName" - ${if} $0 == "${PRODUCT_NAME}" - ${exitfor} - ${else} - StrCpy $R1 "" - ${endif} - ${next} + ${foreach} $9 ${MSI_COUNT} 1 - 1 + Pop $R1 + ReadRegStr $0 HKLM "${REG_UN}\$R1" "DisplayName" + ${if} $0 == "${PRODUCT_NAME}" + ${exitfor} + ${else} + StrCpy $R1 "" + ${endif} + ${next} !macroend !macro CheckOldNSIS - ReadRegStr $R0 HKLM "${REG_UN}\${PRODUCT_NAME}" "QuietUninstallString" - ${if} $R0 != "" - ReadRegStr $R0 HKLM "${REG_UN}\${PRODUCT_NAME}" "UninstallString" - ${if} $R0 != "" - System::Call 'Shlwapi::PathUnquoteSpaces(t r10r10)' - IfFileExists $R0 +2 0 - StrCpy $R0 "" - ${endif} - ${endif} + ReadRegStr $R0 HKLM "${REG_UN}\${PRODUCT_NAME}" "QuietUninstallString" + ${if} $R0 != "" + ReadRegStr $R0 HKLM "${REG_UN}\${PRODUCT_NAME}" "UninstallString" + ${if} $R0 != "" + System::Call 'Shlwapi::PathUnquoteSpaces(t r10r10)' + IfFileExists $R0 +2 0 + StrCpy $R0 "" + ${endif} + ${endif} !macroend !macro RemoveOld UninstCmd - ClearErrors - ExecWait "${UninstCmd}" - ${if} ${errors} - MessageBox MB_ICONSTOP "The uninstaller has failed to complete.$\r$\nPlease restart Windows and try again." /SD IDOK - Abort - ${endif} + ClearErrors + ExecWait "${UninstCmd}" + ${if} ${errors} + MessageBox MB_ICONSTOP \ + "The uninstaller has failed to complete.$\r$\n\ + Please restart Windows and try again." \ + /SD IDOK + Abort + ${endif} !macroend ; Sections @@ -119,189 +122,202 @@ InstType "Typical" InstType "Minimal" Section "Core Files (required)" SectionCoreFiles - SectionIn 1 2 3 RO + SectionIn 1 2 3 RO - ; if there's an installed version, uninstall it first (I chose not to start the uninstaller silently, so that user sees what failed) - ; if both per-user and per-machine versions are installed, unistall the one that matches $MultiUser.InstallMode - StrCpy $0 "" - ${if} $HasCurrentModeInstallation = 1 - StrCpy $0 "$MultiUser.InstallMode" - ${else} - !if ${MULTIUSER_INSTALLMODE_ALLOW_BOTH_INSTALLATIONS} = 0 - ${if} $HasPerMachineInstallation = 1 - StrCpy $0 "AllUsers" ; if there's no per-user installation, but there's per-machine installation, uninstall it - ${elseif} $HasPerUserInstallation = 1 - StrCpy $0 "CurrentUser" ; if there's no per-machine installation, but there's per-user installation, uninstall it - ${endif} - !endif - ${endif} + ; if there's an installed version, uninstall it first (I chose not to start + ; the uninstaller silently, so that user sees what failed) + ; if both per-user and per-machine versions are installed, unistall the one + ; that matches $MultiUser.InstallMode + StrCpy $0 "" + ${if} $HasCurrentModeInstallation = 1 + StrCpy $0 "$MultiUser.InstallMode" + ${else} + !if ${MULTIUSER_INSTALLMODE_ALLOW_BOTH_INSTALLATIONS} = 0 + ${if} $HasPerMachineInstallation = 1 + ; if there's no per-user installation, but there's per-machine installation, uninstall it + StrCpy $0 "AllUsers" + ${elseif} $HasPerUserInstallation = 1 + ; if there's no per-machine installation, but there's per-user installation, uninstall it + StrCpy $0 "CurrentUser" + ${endif} + !endif + ${endif} - ${if} "$0" != "" - ${if} $0 == "AllUsers" - StrCpy $1 "$PerMachineUninstallString" - StrCpy $3 "$PerMachineInstallationFolder" - ${else} - StrCpy $1 "$PerUserUninstallString" - StrCpy $3 "$PerUserInstallationFolder" - ${endif} - ${if} ${silent} - StrCpy $2 "/S" - ${else} - StrCpy $2 "" - ${endif} + ${if} "$0" != "" + ${if} $0 == "AllUsers" + StrCpy $1 "$PerMachineUninstallString" + StrCpy $3 "$PerMachineInstallationFolder" + ${else} + StrCpy $1 "$PerUserUninstallString" + StrCpy $3 "$PerUserInstallationFolder" + ${endif} + ${if} ${silent} + StrCpy $2 "/S" + ${else} + StrCpy $2 "" + ${endif} - HideWindow - ClearErrors - StrCpy $0 0 - ExecWait '$1 /SS $2 _?=$3' $0 ; $1 is quoted in registry; the _? param stops the uninstaller from copying itself to the temporary directory, which is the only way for ExecWait to work + HideWindow + ClearErrors + StrCpy $0 0 + ; $1 is quoted in registry; the _? param stops the uninstaller from copying + ; itself to the temporary directory, which is the only way for ExecWait to work + ExecWait '$1 /SS $2 _?=$3' $0 - ${if} ${errors} ; stay in installer - SetErrorLevel 2 ; Installation aborted by script - BringToFront - Abort "Error executing uninstaller." - ${else} - ${Switch} $0 - ${Case} 0 ; uninstaller completed successfully - continue with installation - BringToFront - ${Break} - ${Case} 1 ; Installation aborted by user (cancel button) - ${Case} 2 ; Installation aborted by script - SetErrorLevel $0 - Quit ; uninstaller was started, but completed with errors - Quit installer - ${Default} ; all other error codes - uninstaller could not start, elevate, etc. - Abort installer - SetErrorLevel $0 - BringToFront - Abort "Error executing uninstaller." - ${EndSwitch} - ${endif} + ${if} ${errors} ; stay in installer + SetErrorLevel 2 ; Installation aborted by script + BringToFront + Abort "Error executing uninstaller." + ${else} + ${Switch} $0 + ${Case} 0 ; uninstaller completed successfully - continue with installation + BringToFront + ${Break} + ${Case} 1 ; Installation aborted by user (cancel button) + ${Case} 2 ; Installation aborted by script + SetErrorLevel $0 + Quit ; uninstaller was started, but completed with errors - Quit installer + ${Default} ; all other error codes - uninstaller could not start, elevate, etc. - Abort installer + SetErrorLevel $0 + BringToFront + Abort "Error executing uninstaller." + ${EndSwitch} + ${endif} - !insertmacro DeleteRetryAbort "$3\${UNINSTALL_FILENAME}" ; the uninstaller doesn't delete itself when not copied to the temp directory - RMDir "$3" - ${endif} + ; the uninstaller doesn't delete itself when not copied to the temp directory + !insertmacro DeleteRetryAbort "$3\${UNINSTALL_FILENAME}" + RMDir "$3" + ${endif} - ; Remove the old uninstaller if it's leftover - IfFileExists "$INSTDIR\uninst.exe" 0 +2 - Delete "$INSTDIR\uninst.exe" + ; Remove the old uninstaller if it's leftover + IfFileExists "$INSTDIR\uninst.exe" 0 +2 + Delete "$INSTDIR\uninst.exe" - SetOutPath $INSTDIR - ; Write uninstaller and registry uninstall info as the first step, - ; so that the user has the option to run the uninstaller if something goes wrong - WriteUninstaller "${UNINSTALL_FILENAME}" - ; or this if you're using signing: - ; File "${UNINSTALL_FILENAME}" - !insertmacro MULTIUSER_RegistryAddInstallInfo ; add registry keys - ${if} ${silent} ; MUI doesn't write language in silent mode - WriteRegStr "${MUI_LANGDLL_REGISTRY_ROOT}" "${MUI_LANGDLL_REGISTRY_KEY}" "${MUI_LANGDLL_REGISTRY_VALUENAME}" $LANGUAGE - ${endif} - - File /r "${DIST_DIR}\*.*" + SetOutPath $INSTDIR + ; Write uninstaller and registry uninstall info as the first step, + ; so that the user has the option to run the uninstaller if something goes wrong + WriteUninstaller "${UNINSTALL_FILENAME}" + ; or this if you're using signing: + ; File "${UNINSTALL_FILENAME}" + !insertmacro MULTIUSER_RegistryAddInstallInfo ; add registry keys + ${if} ${silent} ; MUI doesn't write language in silent mode + WriteRegStr "${MUI_LANGDLL_REGISTRY_ROOT}" "${MUI_LANGDLL_REGISTRY_KEY}" \ + "${MUI_LANGDLL_REGISTRY_VALUENAME}" $LANGUAGE + ${endif} + + File /r "${DIST_DIR}\*.*" SectionEnd SectionGroup /e "System Integration" SectionGroupIntegration Section "Register with Windows" SectionWindowsRegister - SectionIn 1 2 + SectionIn 1 2 - ; No HKCU support for Windows versions earlier than Win8 - ${if} $MultiUser.InstallMode == "AllUsers" - ${orif} ${AtLeastWin8} - ;StartMenuInternet - StrCpy $0 "$INSTDIR\${PROGEXE}" - System::Call 'kernel32::GetLongPathNameW(t r0, t .r1, i ${NSIS_MAX_STRLEN}) i .r2' + ; No HKCU support for Windows versions earlier than Win8 + ${if} $MultiUser.InstallMode == "AllUsers" + ${orif} ${AtLeastWin8} + ;StartMenuInternet + StrCpy $0 "$INSTDIR\${PROGEXE}" + System::Call 'kernel32::GetLongPathNameW(t r0, t .r1, i ${NSIS_MAX_STRLEN}) i .r2' - StrCpy $0 "SOFTWARE\Clients\StartMenuInternet\${PRODUCT_NAME}" + StrCpy $0 "SOFTWARE\Clients\StartMenuInternet\${PRODUCT_NAME}" - WriteRegStr SHCTX "$0" "" "${PRODUCT_NAME}" + WriteRegStr SHCTX "$0" "" "${PRODUCT_NAME}" - WriteRegStr SHCTX "$0\DefaultIcon" "" "$1,0" + WriteRegStr SHCTX "$0\DefaultIcon" "" "$1,0" - WriteRegDWORD SHCTX "$0\InstallInfo" "IconsVisible" 1 + WriteRegDWORD SHCTX "$0\InstallInfo" "IconsVisible" 1 - WriteRegStr SHCTX "$0\shell\open\command" "" "$\"$1$\"" + WriteRegStr SHCTX "$0\shell\open\command" "" "$\"$1$\"" - WriteRegStr SHCTX "$0\shell\properties" "" "${PRODUCT_NAME} settings" - WriteRegStr SHCTX "$0\shell\properties\command" "" "$\"$1$\" ${SHELL_PROPERTIES}" + WriteRegStr SHCTX "$0\shell\properties" "" "${PRODUCT_NAME} settings" + WriteRegStr SHCTX "$0\shell\properties\command" "" "$\"$1$\" ${SHELL_PROPERTIES}" - WriteRegStr SHCTX "$0\shell\safemode" "" "${PRODUCT_NAME} safe mode" - WriteRegStr SHCTX "$0\shell\safemode\command" "" "$\"$1$\" ${SHELL_SAFEMODE}" + WriteRegStr SHCTX "$0\shell\safemode" "" "${PRODUCT_NAME} safe mode" + WriteRegStr SHCTX "$0\shell\safemode\command" "" "$\"$1$\" ${SHELL_SAFEMODE}" - WriteRegStr SHCTX "$0\Capabilities" "ApplicationDescription" "${COMMENTS}" - WriteRegStr SHCTX "$0\Capabilities" "ApplicationIcon" "$1,0" - WriteRegStr SHCTX "$0\Capabilities" "ApplicationName" "${PRODUCT_NAME}" + WriteRegStr SHCTX "$0\Capabilities" "ApplicationDescription" "${COMMENTS}" + WriteRegStr SHCTX "$0\Capabilities" "ApplicationIcon" "$1,0" + WriteRegStr SHCTX "$0\Capabilities" "ApplicationName" "${PRODUCT_NAME}" - WriteRegStr SHCTX "$0\Capabilities\FileAssociations" ".htm" "${PRODUCT_NAME}HTML" - WriteRegStr SHCTX "$0\Capabilities\FileAssociations" ".html" "${PRODUCT_NAME}HTML" - WriteRegStr SHCTX "$0\Capabilities\FileAssociations" ".shtml" "${PRODUCT_NAME}HTML" - WriteRegStr SHCTX "$0\Capabilities\FileAssociations" ".svg" "${PRODUCT_NAME}HTML" - WriteRegStr SHCTX "$0\Capabilities\FileAssociations" ".xht" "${PRODUCT_NAME}HTML" - WriteRegStr SHCTX "$0\Capabilities\FileAssociations" ".xhtml" "${PRODUCT_NAME}HTML" - WriteRegStr SHCTX "$0\Capabilities\FileAssociations" ".webp" "${PRODUCT_NAME}HTML" + WriteRegStr SHCTX "$0\Capabilities\FileAssociations" ".htm" "${PRODUCT_NAME}HTML" + WriteRegStr SHCTX "$0\Capabilities\FileAssociations" ".html" "${PRODUCT_NAME}HTML" + WriteRegStr SHCTX "$0\Capabilities\FileAssociations" ".shtml" "${PRODUCT_NAME}HTML" + WriteRegStr SHCTX "$0\Capabilities\FileAssociations" ".svg" "${PRODUCT_NAME}HTML" + WriteRegStr SHCTX "$0\Capabilities\FileAssociations" ".xht" "${PRODUCT_NAME}HTML" + WriteRegStr SHCTX "$0\Capabilities\FileAssociations" ".xhtml" "${PRODUCT_NAME}HTML" + WriteRegStr SHCTX "$0\Capabilities\FileAssociations" ".webp" "${PRODUCT_NAME}HTML" - WriteRegStr SHCTX "$0\Capabilities\StartMenu" "StartMenuInternet" "${PRODUCT_NAME}" + WriteRegStr SHCTX "$0\Capabilities\StartMenu" "StartMenuInternet" "${PRODUCT_NAME}" - WriteRegStr SHCTX "$0\Capabilities\URLAssociations" "ftp" "${PRODUCT_NAME}URL" - WriteRegStr SHCTX "$0\Capabilities\URLAssociations" "http" "${PRODUCT_NAME}URL" - WriteRegStr SHCTX "$0\Capabilities\URLAssociations" "https" "${PRODUCT_NAME}URL" + WriteRegStr SHCTX "$0\Capabilities\URLAssociations" "ftp" "${PRODUCT_NAME}URL" + WriteRegStr SHCTX "$0\Capabilities\URLAssociations" "http" "${PRODUCT_NAME}URL" + WriteRegStr SHCTX "$0\Capabilities\URLAssociations" "https" "${PRODUCT_NAME}URL" - ; Register Application - WriteRegStr SHCTX "SOFTWARE\RegisteredApplications" "${PRODUCT_NAME}" "$0\Capabilities" + ; Register Application + WriteRegStr SHCTX "SOFTWARE\RegisteredApplications" "${PRODUCT_NAME}" "$0\Capabilities" - ; Associate file types - WriteRegStr SHCTX "SOFTWARE\Classes\.htm\OpenWithProgids" "${PRODUCT_NAME}HTML" "" - WriteRegStr SHCTX "SOFTWARE\Classes\.html\OpenWithProgids" "${PRODUCT_NAME}HTML" "" - WriteRegStr SHCTX "SOFTWARE\Classes\.shtml\OpenWithProgids" "${PRODUCT_NAME}HTML" "" - WriteRegStr SHCTX "SOFTWARE\Classes\.svg\OpenWithProgids" "${PRODUCT_NAME}HTML" "" - WriteRegStr SHCTX "SOFTWARE\Classes\.xht\OpenWithProgids" "${PRODUCT_NAME}HTML" "" - WriteRegStr SHCTX "SOFTWARE\Classes\.xhtml\OpenWithProgids" "${PRODUCT_NAME}HTML" "" - WriteRegStr SHCTX "SOFTWARE\Classes\.webp\OpenWithProgids" "${PRODUCT_NAME}HTML" "" + ; Associate file types + WriteRegStr SHCTX "SOFTWARE\Classes\.htm\OpenWithProgids" "${PRODUCT_NAME}HTML" "" + WriteRegStr SHCTX "SOFTWARE\Classes\.html\OpenWithProgids" "${PRODUCT_NAME}HTML" "" + WriteRegStr SHCTX "SOFTWARE\Classes\.shtml\OpenWithProgids" "${PRODUCT_NAME}HTML" "" + WriteRegStr SHCTX "SOFTWARE\Classes\.svg\OpenWithProgids" "${PRODUCT_NAME}HTML" "" + WriteRegStr SHCTX "SOFTWARE\Classes\.xht\OpenWithProgids" "${PRODUCT_NAME}HTML" "" + WriteRegStr SHCTX "SOFTWARE\Classes\.xhtml\OpenWithProgids" "${PRODUCT_NAME}HTML" "" + WriteRegStr SHCTX "SOFTWARE\Classes\.webp\OpenWithProgids" "${PRODUCT_NAME}HTML" "" - ; HTML and URL handlers - StrCpy $2 "${PRODUCT_NAME}HTML" - StrCPY $3 "${PRODUCT_NAME} HTML Document" - WriteRegHandler: - WriteRegStr SHCTX "SOFTWARE\Classes\$2" "" "$3" - WriteRegStr SHCTX "SOFTWARE\Classes\$2" "FriendlyTypeName" "$3" - WriteRegDWord SHCTX "SOFTWARE\Classes\$2" "EditFlags" 0x00000002 - WriteRegStr SHCTX "SOFTWARE\Classes\$2\DefaultIcon" "" "$1,0" - WriteRegStr SHCTX "SOFTWARE\Classes\$2\shell" "" "open" - WriteRegStr SHCTX "SOFTWARE\Classes\$2\shell\open\command" "" "$\"$1$\" $\"%1$\"" - WriteRegStr SHCTX "SOFTWARE\Classes\$2\shell\open\ddeexec" "" "" - StrCmp "$2" "${PRODUCT_NAME}HTML" 0 +4 - StrCpy $2 "${PRODUCT_NAME}URL" - StrCpy $3 "${PRODUCT_NAME} URL" - Goto WriteRegHandler - WriteRegStr SHCTX "SOFTWARE\Classes\$2" "URL Protocol" "" - ${endif} + ; HTML and URL handlers + StrCpy $2 "${PRODUCT_NAME}HTML" + StrCPY $3 "${PRODUCT_NAME} HTML Document" + WriteRegHandler: + WriteRegStr SHCTX "SOFTWARE\Classes\$2" "" "$3" + WriteRegStr SHCTX "SOFTWARE\Classes\$2" "FriendlyTypeName" "$3" + WriteRegDWord SHCTX "SOFTWARE\Classes\$2" "EditFlags" 0x00000002 + WriteRegStr SHCTX "SOFTWARE\Classes\$2\DefaultIcon" "" "$1,0" + WriteRegStr SHCTX "SOFTWARE\Classes\$2\shell" "" "open" + WriteRegStr SHCTX "SOFTWARE\Classes\$2\shell\open\command" "" "$\"$1$\" $\"%1$\"" + WriteRegStr SHCTX "SOFTWARE\Classes\$2\shell\open\ddeexec" "" "" + StrCmp "$2" "${PRODUCT_NAME}HTML" 0 +4 + StrCpy $2 "${PRODUCT_NAME}URL" + StrCpy $3 "${PRODUCT_NAME} URL" + Goto WriteRegHandler + WriteRegStr SHCTX "SOFTWARE\Classes\$2" "URL Protocol" "" + ${endif} SectionEnd Section /o "Set as default browser" SectionDefaultBrowser - SectionIn 1 + SectionIn 1 - ReadRegStr $0 HKCU "SOFTWARE\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice" "ProgId" - ReadRegStr $1 HKCU "SOFTWARE\Microsoft\Windows\Shell\Associations\UrlAssociations\https\UserChoice" "ProgId" - ReadRegStr $2 HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.htm\UserChoice" "ProgId" - ReadRegStr $3 HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.html\UserChoice" "ProgId" - ${ifnot} $0 == "${PRODUCT_NAME}URL" - ${orifnot} $1 == "${PRODUCT_NAME}URL" - ${orifnot} $2 == "${PRODUCT_NAME}HTML" - ${orifnot} $3 == "${PRODUCT_NAME}HTML" - ${if} ${AtLeastWin10} - ExecShell "open" "ms-settings:defaultapps" - ${elseif} ${AtLeastWin8} - ExecShell "open" "control.exe" "/name Microsoft.DefaultPrograms /page pageDefaultProgram\pageAdvancedSettings?pszAppName=${PRODUCT_NAME}" - ${else} - StrCmp $0 "${PRODUCT_NAME}URL" +2 0 - WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice" "ProgId" "${PRODUCT_NAME}URL" - StrCmp $1 "${PRODUCT_NAME}URL" +2 0 - WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\Shell\Associations\UrlAssociations\https\UserChoice" "ProgId" "${PRODUCT_NAME}URL" - StrCmp $2 "${PRODUCT_NAME}HTML" +3 0 - DeleteRegKey HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.htm\UserChoice" - WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.htm\UserChoice" "ProgId" "${PRODUCT_NAME}HTML" - StrCmp $3 "${PRODUCT_NAME}HTML" +3 0 - DeleteRegKey HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.html\UserChoice" - WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.html\UserChoice" "ProgId" "${PRODUCT_NAME}HTML" - ${endif} - ${endif} + ReadRegStr $0 HKCU "SOFTWARE\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice" "ProgId" + ReadRegStr $1 HKCU "SOFTWARE\Microsoft\Windows\Shell\Associations\UrlAssociations\https\UserChoice" "ProgId" + ReadRegStr $2 HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.htm\UserChoice" "ProgId" + ReadRegStr $3 HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.html\UserChoice" "ProgId" + ${ifnot} $0 == "${PRODUCT_NAME}URL" + ${orifnot} $1 == "${PRODUCT_NAME}URL" + ${orifnot} $2 == "${PRODUCT_NAME}HTML" + ${orifnot} $3 == "${PRODUCT_NAME}HTML" + ${if} ${AtLeastWin10} + ExecShell "open" "ms-settings:defaultapps" + ${elseif} ${AtLeastWin8} + ExecShell "open" "control.exe" "/name Microsoft.DefaultPrograms /page \ + pageDefaultProgram\pageAdvancedSettings?pszAppName=${PRODUCT_NAME}" + ${else} + StrCmp $0 "${PRODUCT_NAME}URL" +2 0 + WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice" \ + "ProgId" "${PRODUCT_NAME}URL" + StrCmp $1 "${PRODUCT_NAME}URL" +2 0 + WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\Shell\Associations\UrlAssociations\https\UserChoice" \ + "ProgId" "${PRODUCT_NAME}URL" + StrCmp $2 "${PRODUCT_NAME}HTML" +3 0 + DeleteRegKey HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.htm\UserChoice" + WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.htm\UserChoice" \ + "ProgId" "${PRODUCT_NAME}HTML" + StrCmp $3 "${PRODUCT_NAME}HTML" +3 0 + DeleteRegKey HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.html\UserChoice" + WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.html\UserChoice" \ + "ProgId" "${PRODUCT_NAME}HTML" + ${endif} + ${endif} SectionEnd SectionGroupEnd @@ -309,176 +325,189 @@ SectionGroupEnd SectionGroup "Shortcuts" SectionGroupShortcuts Section "Dektop Icon" SectionDesktopIcon - SectionIn 1 2 + SectionIn 1 2 - !insertmacro MULTIUSER_GetCurrentUserString $0 - CreateShortCut "$DESKTOP\${PRODUCT_NAME}$0.lnk" "$INSTDIR\${PROGEXE}" + !insertmacro MULTIUSER_GetCurrentUserString $0 + CreateShortCut "$DESKTOP\${PRODUCT_NAME}$0.lnk" "$INSTDIR\${PROGEXE}" SectionEnd Section "Start Menu Icon" SectionStartMenuIcon - SectionIn 1 2 + SectionIn 1 2 - !insertmacro MULTIUSER_GetCurrentUserString $0 - CreateShortCut "$STARTMENU\${PRODUCT_NAME}$0.lnk" "$INSTDIR\${PROGEXE}" + !insertmacro MULTIUSER_GetCurrentUserString $0 + CreateShortCut "$STARTMENU\${PRODUCT_NAME}$0.lnk" "$INSTDIR\${PROGEXE}" SectionEnd SectionGroupEnd Section "-Write Install Info" ; hidden section, write install info as the final step - !insertmacro MULTIUSER_RegistryAddInstallSizeInfo - !insertmacro MULTIUSER_GetCurrentUserString $0 - WriteRegStr SHCTX "${MULTIUSER_INSTALLMODE_UNINSTALL_REGISTRY_KEY_PATH}$0" "HelpLink" "${HELP_LINK}" - WriteRegStr SHCTX "${MULTIUSER_INSTALLMODE_UNINSTALL_REGISTRY_KEY_PATH}$0" "URLInfoAbout" "${URL_ABOUT}" - WriteRegStr SHCTX "${MULTIUSER_INSTALLMODE_UNINSTALL_REGISTRY_KEY_PATH}$0" "URLUpdateInfo" "${URL_UPDATE}" - WriteRegStr SHCTX "${MULTIUSER_INSTALLMODE_UNINSTALL_REGISTRY_KEY_PATH}$0" "Comments" "${COMMENTS}" - WriteRegStr SHCTX "${MULTIUSER_INSTALLMODE_UNINSTALL_REGISTRY_KEY_PATH}$0" "Contact" "${CONTACT}" + !insertmacro MULTIUSER_RegistryAddInstallSizeInfo + !insertmacro MULTIUSER_GetCurrentUserString $0 + WriteRegStr SHCTX "${MULTIUSER_INSTALLMODE_UNINSTALL_REGISTRY_KEY_PATH}$0" "HelpLink" "${HELP_LINK}" + WriteRegStr SHCTX "${MULTIUSER_INSTALLMODE_UNINSTALL_REGISTRY_KEY_PATH}$0" "URLInfoAbout" "${URL_ABOUT}" + WriteRegStr SHCTX "${MULTIUSER_INSTALLMODE_UNINSTALL_REGISTRY_KEY_PATH}$0" "URLUpdateInfo" "${URL_UPDATE}" + WriteRegStr SHCTX "${MULTIUSER_INSTALLMODE_UNINSTALL_REGISTRY_KEY_PATH}$0" "Comments" "${COMMENTS}" + WriteRegStr SHCTX "${MULTIUSER_INSTALLMODE_UNINSTALL_REGISTRY_KEY_PATH}$0" "Contact" "${CONTACT}" - ; Add InstallDate String - System::Call /NOUNLOAD '*(&i2,&i2,&i2,&i2,&i2,&i2,&i2,&i2) i .r9' - System::Call /NOUNLOAD 'kernel32::GetLocalTime(i)i(r9)' - System::Call /NOUNLOAD '*$9(&i2,&i2,&i2,&i2,&i2,&i2,&i2,&i2)i(.r1,.r2,.r3,.r4,.r5,.r6,.r7,)' - System::Free $9 - IntCmp $2 9 0 0 +2 - StrCpy $2 '0$2' - IntCmp $4 9 0 0 +2 - StrCpy $4 '0$4' - WriteRegStr SHCTX "${MULTIUSER_INSTALLMODE_UNINSTALL_REGISTRY_KEY_PATH}$0" "InstallDate" "$1$2$4" + ; Add InstallDate String + System::Call /NOUNLOAD '*(&i2,&i2,&i2,&i2,&i2,&i2,&i2,&i2) i .r9' + System::Call /NOUNLOAD 'kernel32::GetLocalTime(i)i(r9)' + System::Call /NOUNLOAD '*$9(&i2,&i2,&i2,&i2,&i2,&i2,&i2,&i2)i(.r1,.r2,.r3,.r4,.r5,.r6,.r7,)' + System::Free $9 + IntCmp $2 9 0 0 +2 + StrCpy $2 '0$2' + IntCmp $4 9 0 0 +2 + StrCpy $4 '0$4' + WriteRegStr SHCTX "${MULTIUSER_INSTALLMODE_UNINSTALL_REGISTRY_KEY_PATH}$0" "InstallDate" "$1$2$4" - ; Refresh Shell Icons - System::Call "shell32::SHChangeNotify(i 0x08000000, i 0, i 0, i 0)" + ; Refresh Shell Icons + System::Call "shell32::SHChangeNotify(i 0x08000000, i 0, i 0, i 0)" SectionEnd ; Modern install component descriptions !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN - !insertmacro MUI_DESCRIPTION_TEXT ${SectionCoreFiles} "Core files required to run ${PRODUCT_NAME}." - !insertmacro MUI_DESCRIPTION_TEXT ${SectionGroupIntegration} "Integrate ${PRODUCT_NAME} with the Operating System." - !insertmacro MUI_DESCRIPTION_TEXT ${SectionWindowsRegister} "Register protocols and file extensions with ${PRODUCT_NAME}." - !insertmacro MUI_DESCRIPTION_TEXT ${SectionDefaultBrowser} "Set ${PRODUCT_NAME} as the default Web browser." - !insertmacro MUI_DESCRIPTION_TEXT ${SectionGroupShortcuts} "Create shortcut icons to run ${PRODUCT_NAME}." - !insertmacro MUI_DESCRIPTION_TEXT ${SectionDesktopIcon} "Create ${PRODUCT_NAME} icon on the Desktop." - !insertmacro MUI_DESCRIPTION_TEXT ${SectionStartMenuIcon} "Create ${PRODUCT_NAME} icon in the Start Menu." + !insertmacro MUI_DESCRIPTION_TEXT ${SectionCoreFiles} \ + "Core files required to run ${PRODUCT_NAME}." + !insertmacro MUI_DESCRIPTION_TEXT ${SectionGroupIntegration} \ + "Integrate ${PRODUCT_NAME} with the Operating System." + !insertmacro MUI_DESCRIPTION_TEXT ${SectionWindowsRegister} \ + "Register protocols and file extensions with ${PRODUCT_NAME}." + !insertmacro MUI_DESCRIPTION_TEXT ${SectionDefaultBrowser} \ + "Set ${PRODUCT_NAME} as the default Web browser." + !insertmacro MUI_DESCRIPTION_TEXT ${SectionGroupShortcuts} \ + "Create shortcut icons to run ${PRODUCT_NAME}." + !insertmacro MUI_DESCRIPTION_TEXT ${SectionDesktopIcon} \ + "Create ${PRODUCT_NAME} icon on the Desktop." + !insertmacro MUI_DESCRIPTION_TEXT ${SectionStartMenuIcon} \ + "Create ${PRODUCT_NAME} icon in the Start Menu." !insertmacro MUI_FUNCTION_DESCRIPTION_END ; Callbacks Function .onInit - !insertmacro CheckPlatform ${PLATFORM} - !insertmacro CheckMinWinVer ${MIN_WIN_VER} - ${ifnot} ${UAC_IsInnerInstance} - !insertmacro CheckSingleInstance "Setup" "Global" "${SETUP_MUTEX}" - !insertmacro CheckSingleInstance "Application" "Local" "${APP_MUTEX}" - ${endif} + !insertmacro CheckPlatform ${PLATFORM} + !insertmacro CheckMinWinVer ${MIN_WIN_VER} + ${ifnot} ${UAC_IsInnerInstance} + !insertmacro CheckSingleInstance "Setup" "Global" "${SETUP_MUTEX}" + !insertmacro CheckSingleInstance "Application" "Local" "${APP_MUTEX}" + ${endif} - ; Detect existing setup from previous installers - !insertmacro CheckOldNSIS - !insertmacro MSI32_STACK - !insertmacro CheckMSI - ${if} $R1 == "" - ${andif} ${RunningX64} - SetRegView 64 ; Will be set again by MULTIUSER_INIT - !insertmacro MSI64_STACK - !insertmacro CheckMSI - ${endif} - ${if} $R0 != "" - ${orif} $R1 != "" - MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION \ - "An older version of ${PRODUCT_NAME} is already installed.$\n\ - $\nClick `OK` to remove the previous version and continue,$\n\ - or `Cancel` to cancel this upgrade." \ - IDOK +2 - Abort - ${if} $R0 != "" - ${GetParent} $R0 $0 - ${GetFileName} $R0 $1 - ; Using cmd.exe for elevation to work - !insertmacro RemoveOld "cmd.exe /c start /wait /d $\"$0$\" $1 /S _?=$0" - ${endif} - ${if} $R1 != "" - !insertmacro RemoveOld "msiexec.exe /X$R1 /passive /promptrestart" - ${endif} - ${endif} + ; Detect existing setup from previous installers + !insertmacro CheckOldNSIS + !insertmacro MSI32_STACK + !insertmacro CheckMSI + ${if} $R1 == "" + ${andif} ${RunningX64} + SetRegView 64 ; Will be set again by MULTIUSER_INIT + !insertmacro MSI64_STACK + !insertmacro CheckMSI + ${endif} + ${if} $R0 != "" + ${orif} $R1 != "" + MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION \ + "An older version of ${PRODUCT_NAME} is already installed.$\r$\n$\r$\n\ + Click `OK` to remove the previous version and continue,$\r$\n\ + or `Cancel` to cancel this upgrade." \ + IDOK +2 + Abort + ${if} $R0 != "" + ${GetParent} $R0 $0 + ${GetFileName} $R0 $1 + ; Using cmd.exe for elevation to work + !insertmacro RemoveOld "cmd.exe /c start /wait /d $\"$0$\" $1 /S _?=$0" + ${endif} + ${if} $R1 != "" + !insertmacro RemoveOld "msiexec.exe /X$R1 /passive /promptrestart" + ${endif} + ${endif} - !insertmacro MULTIUSER_INIT + !insertmacro MULTIUSER_INIT - ${if} $IsInnerInstance = 0 - !insertmacro MUI_LANGDLL_DISPLAY - ${endif} + ${if} $IsInnerInstance = 0 + !insertmacro MUI_LANGDLL_DISPLAY + ${endif} FunctionEnd Function .onSelChange - ${if} ${SectionIsSelected} ${SectionDefaultBrowser} - !insertmacro SetSectionFlag ${SectionWindowsRegister} ${SF_RO} - !insertmacro SelectSection ${SectionWindowsRegister} - ${else} - !insertmacro ClearSectionFlag ${SectionWindowsRegister} ${SF_RO} - ${endif} + ${if} ${SectionIsSelected} ${SectionDefaultBrowser} + !insertmacro SetSectionFlag ${SectionWindowsRegister} ${SF_RO} + !insertmacro SelectSection ${SectionWindowsRegister} + ${else} + !insertmacro ClearSectionFlag ${SectionWindowsRegister} ${SF_RO} + ${endif} FunctionEnd Function PageWelcomeLicensePre - ${if} $InstallShowPagesBeforeComponents = 0 - Abort ; don't display the Welcome and License pages for the inner instance - ${endif} + ${if} $InstallShowPagesBeforeComponents = 0 + Abort ; don't display the Welcome and License pages for the inner instance + ${endif} FunctionEnd Function PageInstallModeChangeMode - ; Disable integration for single user install on Win7 and older, as it's not supported - ${if} $MultiUser.InstallMode == "CurrentUser" - ${andif} ${AtMostWin7} - SectionSetText ${SectionGroupIntegration} "System Integration (not supported)" - IntOP $0 ${SF_RO} & ${SECTION_OFF} - SectionSetFlags ${SectionWindowsRegister} $0 - SectionSetFlags ${SectionDefaultBrowser} $0 - !insertmacro SetSectionFlag ${SectionGroupIntegration} ${SF_RO} - !insertmacro ClearSectionFlag ${SectionGroupIntegration} ${SF_EXPAND} - ${else} - ; This is necessary because if the installer started under Win7/Vista as Administrator with UAC disabled, - ; going back to All users after first selecting Single user, the integration component would still be disabled - SectionSetText ${SectionGroupIntegration} "System Integration" - !insertmacro ClearSectionFlag ${SectionWindowsRegister} ${SF_RO} - !insertmacro ClearSectionFlag ${SectionDefaultBrowser} ${SF_RO} - !insertmacro ClearSectionFlag ${SectionGroupIntegration} ${SF_RO} - !insertmacro SetSectionFlag ${SectionGroupIntegration} ${SF_EXPAND} - !insertmacro SelectSection ${SectionWindowsRegister} + ; Disable integration for single user install on Win7 and older, as it's not supported + ${if} $MultiUser.InstallMode == "CurrentUser" + ${andif} ${AtMostWin7} + SectionSetText ${SectionGroupIntegration} "System Integration (not supported)" + IntOP $0 ${SF_RO} & ${SECTION_OFF} + SectionSetFlags ${SectionWindowsRegister} $0 + SectionSetFlags ${SectionDefaultBrowser} $0 + !insertmacro SetSectionFlag ${SectionGroupIntegration} ${SF_RO} + !insertmacro ClearSectionFlag ${SectionGroupIntegration} ${SF_EXPAND} + ${else} + ; This is necessary because if the installer started under Win7/Vista as Administrator with UAC disabled, + ; going back to All users after first selecting Single user, the integration component would still be disabled + SectionSetText ${SectionGroupIntegration} "System Integration" + !insertmacro ClearSectionFlag ${SectionWindowsRegister} ${SF_RO} + !insertmacro ClearSectionFlag ${SectionDefaultBrowser} ${SF_RO} + !insertmacro ClearSectionFlag ${SectionGroupIntegration} ${SF_RO} + !insertmacro SetSectionFlag ${SectionGroupIntegration} ${SF_EXPAND} + !insertmacro SelectSection ${SectionWindowsRegister} - ; Select 'Default browser' if already set in registry - ReadRegStr $0 HKCU "SOFTWARE\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice" "ProgId" - ${if} $0 == "${PRODUCT_NAME}URL" - !insertmacro SetSectionFlag ${SectionWindowsRegister} ${SF_RO} - !insertmacro SelectSection ${SectionDefaultBrowser} - ${else} - !insertmacro UnselectSection ${SectionDefaultBrowser} - ${endif} - ${endif} + ; Select 'Default browser' if already set in registry + ReadRegStr $0 HKCU "SOFTWARE\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice" "ProgId" + ${if} $0 == "${PRODUCT_NAME}URL" + !insertmacro SetSectionFlag ${SectionWindowsRegister} ${SF_RO} + !insertmacro SelectSection ${SectionDefaultBrowser} + ${else} + !insertmacro UnselectSection ${SectionDefaultBrowser} + ${endif} + ${endif} FunctionEnd Function PageDirectoryPre - GetDlgItem $0 $HWNDPARENT 1 - SendMessage $0 ${WM_SETTEXT} 0 "STR:$(^InstallBtn)" ; this is the last page before installing + GetDlgItem $0 $HWNDPARENT 1 + SendMessage $0 ${WM_SETTEXT} 0 "STR:$(^InstallBtn)" ; this is the last page before installing FunctionEnd Function PageDirectoryShow - ${if} $CmdLineDir != "" - FindWindow $R1 "#32770" "" $HWNDPARENT + ${if} $CmdLineDir != "" + FindWindow $R1 "#32770" "" $HWNDPARENT - GetDlgItem $0 $R1 1019 ; Directory edit - SendMessage $0 ${EM_SETREADONLY} 1 0 ; read-only is better than disabled, as user can copy contents + GetDlgItem $0 $R1 1019 ; Directory edit + SendMessage $0 ${EM_SETREADONLY} 1 0 ; read-only is better than disabled, as user can copy contents - GetDlgItem $0 $R1 1001 ; Browse button - EnableWindow $0 0 - ${endif} + GetDlgItem $0 $R1 1001 ; Browse button + EnableWindow $0 0 + ${endif} FunctionEnd Function PageFinishRun - ; the installer might exit too soon before the application starts and it loses the right to be the foreground window and starts in the background - ; however, if there's no active window when the application starts, it will become the active window, so we hide the installer - HideWindow - ; the installer will show itself again quickly before closing (w/o Taskbar button), we move it offscreen - !define SWP_NOSIZE 0x0001 - !define SWP_NOZORDER 0x0004 - System::Call "User32::SetWindowPos(i, i, i, i, i, i, i) b ($HWNDPARENT, 0, -1000, -1000, 0, 0, ${SWP_NOZORDER}|${SWP_NOSIZE})" + ; the installer might exit too soon before the application starts and it loses + ; the right to be the foreground window and starts in the background + ; however, if there's no active window when the application starts, it will + ; become the active window, so we hide the installer + HideWindow + ; the installer will show itself again quickly before closing (w/o Taskbar button), we move it offscreen + !define SWP_NOSIZE 0x0001 + !define SWP_NOZORDER 0x0004 + System::Call "User32::SetWindowPos(i, i, i, i, i, i, i) b \ + ($HWNDPARENT, 0, -1000, -1000, 0, 0, ${SWP_NOZORDER}|${SWP_NOSIZE})" - !insertmacro UAC_AsUser_ExecShell "open" "$INSTDIR\${PROGEXE}" "" "$INSTDIR" "" + !insertmacro UAC_AsUser_ExecShell "open" "$INSTDIR\${PROGEXE}" "" "$INSTDIR" "" FunctionEnd Function .onInstFailed - MessageBox MB_ICONSTOP "${PRODUCT_NAME} ${VERSION} could not be fully installed.$\r$\nPlease, restart Windows and run the setup program again." /SD IDOK + MessageBox MB_ICONSTOP \ + "${PRODUCT_NAME} ${VERSION} could not be fully installed.$\r$\n\ + Please, restart Windows and run the setup program again." \ + /SD IDOK FunctionEnd diff --git a/misc/nsis/install_pages.nsh b/misc/nsis/install_pages.nsh index 92328c66b..585939426 100755 --- a/misc/nsis/install_pages.nsh +++ b/misc/nsis/install_pages.nsh @@ -25,7 +25,7 @@ !define MULTIUSER_INSTALLMODE_ALLOW_ELEVATION_IF_SILENT 0 !define MULTIUSER_INSTALLMODE_DEFAULT_ALLUSERS 1 !if ${PLATFORM} == "win64" - !define MULTIUSER_INSTALLMODE_64_BIT 1 + !define MULTIUSER_INSTALLMODE_64_BIT 1 !endif !define MULTIUSER_INSTALLMODE_DISPLAYNAME "${PRODUCT_NAME} ${VERSION} (${ARCH})" @@ -59,4 +59,4 @@ !define MUI_FINISHPAGE_RUN !define MUI_FINISHPAGE_RUN_FUNCTION PageFinishRun -!insertmacro MUI_PAGE_FINISH \ No newline at end of file +!insertmacro MUI_PAGE_FINISH diff --git a/misc/nsis/qutebrowser.nsi b/misc/nsis/qutebrowser.nsi index a114e6774..aff61462e 100755 --- a/misc/nsis/qutebrowser.nsi +++ b/misc/nsis/qutebrowser.nsi @@ -122,32 +122,32 @@ ShowUninstDetails hide ; Set PLATFORM - default x64 !ifdef X86 - !define PLATFORM "Win32" - !define ARCH "x86" - !define SUFFIX "win32" + !define PLATFORM "Win32" + !define ARCH "x86" + !define SUFFIX "win32" !else - !define PLATFORM "Win64" - !define ARCH "x64" - !define SUFFIX "amd64" + !define PLATFORM "Win64" + !define ARCH "x64" + !define SUFFIX "amd64" !endif ; If not defined, get VERSION from PROGEXE. Set DIST_DIR accordingly. !ifndef VERSION - !define /ifndef DIST_DIR ".\..\..\dist\${PRODUCT_NAME}-${ARCH}" - !getdllversion "${DIST_DIR}\${PROGEXE}" expv_ - !define VERSION "${expv_1}.${expv_2}.${expv_3}" + !define /ifndef DIST_DIR ".\..\..\dist\${PRODUCT_NAME}-${ARCH}" + !getdllversion "${DIST_DIR}\${PROGEXE}" expv_ + !define VERSION "${expv_1}.${expv_2}.${expv_3}" !else - !define /ifndef DIST_DIR ".\..\..\dist\${PRODUCT_NAME}-${VERSION}-${ARCH}" + !define /ifndef DIST_DIR ".\..\..\dist\${PRODUCT_NAME}-${VERSION}-${ARCH}" !endif ; Pack the exe header with upx, unless NOUPX is defined. !ifndef NOUPX - !define /ifndef UPX "upx" ; assume upx is in path if UPX is not defined - !packhdr "$%TEMP%\exehead.tmp" '"${UPX}" "--ultra-brute" "$%TEMP%\exehead.tmp"' + !define /ifndef UPX "upx" ; assume upx is in path if UPX is not defined + !packhdr "$%TEMP%\exehead.tmp" '"${UPX}" "--ultra-brute" "$%TEMP%\exehead.tmp"' !else - !ifdef UPX - !error "Both UPX and NOUPX are defined." - !endif + !ifdef UPX + !error "Both UPX and NOUPX are defined." + !endif !endif ; Version Information diff --git a/misc/nsis/uninstall.nsh b/misc/nsis/uninstall.nsh index 19abc1298..b688a6f1e 100755 --- a/misc/nsis/uninstall.nsh +++ b/misc/nsis/uninstall.nsh @@ -27,148 +27,165 @@ Var RunningFromInstaller ; installer started uninstaller using /uninstall parame !insertmacro CheckSingleInstanceFunc "un." Section "un.Program Files" SectionUninstallProgram - SectionIn RO + SectionIn RO - ; Call shell script to generate an uninstall-list nsh file - !tempfile UNLIST - !ifdef NSIS_WIN32_MAKENSIS - !execute 'cmd.exe /c .\mkunlist.cmd "${DIST_DIR}" "${UNLIST}"' - !else - !error "POSIX script for uninstall list generation is not yet available." - !endif + ; Call shell script to generate an uninstall-list nsh file + !tempfile UNLIST + !ifdef NSIS_WIN32_MAKENSIS + !execute 'cmd.exe /c .\mkunlist.cmd "${DIST_DIR}" "${UNLIST}"' + !else + !error "POSIX script for uninstall list generation is not yet available." + !endif - ; Try to delete the EXE as the first step - if it's in use, don't remove anything else - !insertmacro DeleteRetryAbort "$INSTDIR\${PROGEXE}" + ; Try to delete the EXE as the first step - if it's in use, don't remove anything else + !insertmacro DeleteRetryAbort "$INSTDIR\${PROGEXE}" - ; Include and then delete the uninstall nsh file - !include "${UNLIST}" - !delfile "${UNLIST}" + ; Include and then delete the uninstall nsh file + !include "${UNLIST}" + !delfile "${UNLIST}" - ; Clean up "Dektop Icon" - !insertmacro MULTIUSER_GetCurrentUserString $0 - !insertmacro DeleteRetryAbort "$DESKTOP\${PRODUCT_NAME}$0.lnk" + ; Clean up "Dektop Icon" + !insertmacro MULTIUSER_GetCurrentUserString $0 + !insertmacro DeleteRetryAbort "$DESKTOP\${PRODUCT_NAME}$0.lnk" - ; Clean up "Start Menu Icon" - !insertmacro MULTIUSER_GetCurrentUserString $0 - !insertmacro DeleteRetryAbort "$STARTMENU\${PRODUCT_NAME}$0.lnk" + ; Clean up "Start Menu Icon" + !insertmacro MULTIUSER_GetCurrentUserString $0 + !insertmacro DeleteRetryAbort "$STARTMENU\${PRODUCT_NAME}$0.lnk" - ; Clean up Windows Registry - ${if} $MultiUser.InstallMode == "AllUsers" - ${orif} ${AtLeastWin8} - DeleteRegValue SHCTX "Software\RegisteredApplications" "${PRODUCT_NAME}" - DeleteRegKey SHCTX "Software\Clients\StartMenuInternet\${PRODUCT_NAME}" - DeleteRegKey SHCTX "Software\Classes\${PRODUCT_NAME}HTML" - DeleteRegKey SHCTX "Software\Classes\${PRODUCT_NAME}URL" - DeleteRegValue SHCTX "Software\Classes\.htm\OpenWithProgids" "${PRODUCT_NAME}HTML" - DeleteRegValue SHCTX "Software\Classes\.html\OpenWithProgids" "${PRODUCT_NAME}HTML" - DeleteRegValue SHCTX "Software\Classes\.shtml\OpenWithProgids" "${PRODUCT_NAME}HTML" - DeleteRegValue SHCTX "Software\Classes\.svg\OpenWithProgids" "${PRODUCT_NAME}HTML" - DeleteRegValue SHCTX "Software\Classes\.xht\OpenWithProgids" "${PRODUCT_NAME}HTML" - DeleteRegValue SHCTX "Software\Classes\.xhtml\OpenWithProgids" "${PRODUCT_NAME}HTML" - DeleteRegValue SHCTX "Software\Classes\.webp\OpenWithProgids" "${PRODUCT_NAME}HTML" - ${endif} + ; Clean up Windows Registry + ${if} $MultiUser.InstallMode == "AllUsers" + ${orif} ${AtLeastWin8} + DeleteRegValue SHCTX "Software\RegisteredApplications" "${PRODUCT_NAME}" + DeleteRegKey SHCTX "Software\Clients\StartMenuInternet\${PRODUCT_NAME}" + DeleteRegKey SHCTX "Software\Classes\${PRODUCT_NAME}HTML" + DeleteRegKey SHCTX "Software\Classes\${PRODUCT_NAME}URL" + DeleteRegValue SHCTX "Software\Classes\.htm\OpenWithProgids" "${PRODUCT_NAME}HTML" + DeleteRegValue SHCTX "Software\Classes\.html\OpenWithProgids" "${PRODUCT_NAME}HTML" + DeleteRegValue SHCTX "Software\Classes\.shtml\OpenWithProgids" "${PRODUCT_NAME}HTML" + DeleteRegValue SHCTX "Software\Classes\.svg\OpenWithProgids" "${PRODUCT_NAME}HTML" + DeleteRegValue SHCTX "Software\Classes\.xht\OpenWithProgids" "${PRODUCT_NAME}HTML" + DeleteRegValue SHCTX "Software\Classes\.xhtml\OpenWithProgids" "${PRODUCT_NAME}HTML" + DeleteRegValue SHCTX "Software\Classes\.webp\OpenWithProgids" "${PRODUCT_NAME}HTML" + ${endif} - ; Refresh Shell Icons - System::Call "shell32::SHChangeNotify(i 0x08000000, i 0, i 0, i 0)" + ; Refresh Shell Icons + System::Call "shell32::SHChangeNotify(i 0x08000000, i 0, i 0, i 0)" SectionEnd Section /o "!un.Program Settings" SectionRemoveSettings - ; this section is executed only explicitly and shouldn't be placed in SectionUninstallProgram - DeleteRegKey HKCU "Software\${PRODUCT_NAME}" - SetShellVarContext current - RMDIR /r "${CONFIG_DIR}\data" - RMDIR /r "${CONFIG_DIR}\config" - RMDIR "${CONFIG_DIR}" - ${if} $MultiUser.InstallMode == "AllUsers" - SetShellVarContext all - ${endif} + ; this section is executed only explicitly and shouldn't be placed in SectionUninstallProgram + DeleteRegKey HKCU "Software\${PRODUCT_NAME}" + SetShellVarContext current + RMDIR /r "${CONFIG_DIR}\data" + RMDIR /r "${CONFIG_DIR}\config" + RMDIR "${CONFIG_DIR}" + ${if} $MultiUser.InstallMode == "AllUsers" + SetShellVarContext all + ${endif} SectionEnd Section /o "un.Program Cache" SectionRemoveCache - ; this section is executed only explicitly and shouldn't be placed in SectionUninstallProgram - SetShellVarContext current - RMDIR /r "${CACHE_DIR}\cache" - RMDIR "${CACHE_DIR}" - ${if} $MultiUser.InstallMode == "AllUsers" - SetShellVarContext all - ${endif} + ; this section is executed only explicitly and shouldn't be placed in SectionUninstallProgram + SetShellVarContext current + RMDIR /r "${CACHE_DIR}\cache" + RMDIR "${CACHE_DIR}" + ${if} $MultiUser.InstallMode == "AllUsers" + SetShellVarContext all + ${endif} SectionEnd Section "-Uninstall" ; hidden section, must always be the last one! - Delete "$INSTDIR\${UNINSTALL_FILENAME}" ; we cannot use DeleteRetryAbort here - when using the _? parameter the uninstaller cannot delete itself and Delete fails, which is OK - ; remove the directory only if it is empty - the user might have saved some files in it - RMDir "$INSTDIR" + ; we cannot use DeleteRetryAbort here - when using the _? parameter the + ; uninstaller cannot delete itself and Delete fails, which is OK + Delete "$INSTDIR\${UNINSTALL_FILENAME}" + ; remove the directory only if it is empty - the user might have saved some files in it + RMDir "$INSTDIR" - ; Remove the uninstaller from registry as the very last step - if sth. goes wrong, let the user run it again - !insertmacro MULTIUSER_RegistryRemoveInstallInfo ; Remove registry keys + ; Remove the uninstaller from registry as the very last step + ; if something goes wrong, let the user run it again + !insertmacro MULTIUSER_RegistryRemoveInstallInfo ; Remove registry keys SectionEnd ; Modern install component descriptions !insertmacro MUI_UNFUNCTION_DESCRIPTION_BEGIN - !insertmacro MUI_DESCRIPTION_TEXT ${SectionUninstallProgram} "Remove ${PRODUCT_NAME} application files." - !insertmacro MUI_DESCRIPTION_TEXT ${SectionRemoveSettings} "Remove ${PRODUCT_NAME} user files (configuration, bookmarks, history, sessions, scripts, cookies, etc.)." - !insertmacro MUI_DESCRIPTION_TEXT ${SectionRemoveCache} "Remove ${PRODUCT_NAME} cache files." + !insertmacro MUI_DESCRIPTION_TEXT ${SectionUninstallProgram} \ + "Remove ${PRODUCT_NAME} application files." + !insertmacro MUI_DESCRIPTION_TEXT ${SectionRemoveSettings} \ + "Remove ${PRODUCT_NAME} user files \ + (configuration, bookmarks, history, sessions, scripts, cookies, etc.)." + !insertmacro MUI_DESCRIPTION_TEXT ${SectionRemoveCache} \ + "Remove ${PRODUCT_NAME} cache files." !insertmacro MUI_UNFUNCTION_DESCRIPTION_END ; Callbacks Function un.onInit - ${GetParameters} $R0 + ${GetParameters} $R0 - ${GetOptions} $R0 "/uninstall" $R1 - ${ifnot} ${errors} - StrCpy $RunningFromInstaller 1 - ${else} - StrCpy $RunningFromInstaller 0 - ${endif} + ${GetOptions} $R0 "/uninstall" $R1 + ${ifnot} ${errors} + StrCpy $RunningFromInstaller 1 + ${else} + StrCpy $RunningFromInstaller 0 + ${endif} - var /GLOBAL KeepReg - ${GetOptions} $R0 "/upgrade" $R1 - ${ifnot} ${errors} - StrCpy $KeepReg 1 - ${else} - StrCpy $KeepReg 0 - ${endif} + var /GLOBAL KeepReg + ${GetOptions} $R0 "/upgrade" $R1 + ${ifnot} ${errors} + StrCpy $KeepReg 1 + ${else} + StrCpy $KeepReg 0 + ${endif} - ${GetOptions} $R0 "/SS" $R1 - ${ifnot} ${errors} - StrCpy $SemiSilentMode 1 - StrCpy $RunningFromInstaller 1 - SetAutoClose true ; auto close (if no errors) if we are called from the installer; if there are errors, will be automatically set to false - ${else} - StrCpy $SemiSilentMode 0 - ${endif} + ${GetOptions} $R0 "/SS" $R1 + ${ifnot} ${errors} + StrCpy $SemiSilentMode 1 + StrCpy $RunningFromInstaller 1 + ; auto close (if no errors) if we are called from the installer + ; if there are errors, will be automatically set to false + SetAutoClose true + ${else} + StrCpy $SemiSilentMode 0 + ${endif} - ${ifnot} ${UAC_IsInnerInstance} - ${andif} $RunningFromInstaller = 0 - !insertmacro CheckSingleInstance "Setup" "Global" "${SETUP_MUTEX}" - !insertmacro CheckSingleInstance "Application" "Local" "${APP_MUTEX}" - ${endif} + ${ifnot} ${UAC_IsInnerInstance} + ${andif} $RunningFromInstaller = 0 + !insertmacro CheckSingleInstance "Setup" "Global" "${SETUP_MUTEX}" + !insertmacro CheckSingleInstance "Application" "Local" "${APP_MUTEX}" + ${endif} - !insertmacro MULTIUSER_UNINIT + !insertmacro MULTIUSER_UNINIT - !insertmacro MUI_UNGETLANGUAGE + !insertmacro MUI_UNGETLANGUAGE FunctionEnd Function un.PageInstallModeChangeMode FunctionEnd Function un.PageComponentsPre - ${if} $SemiSilentMode = 1 - Abort ; if user is installing, no use to remove program settings anyway (should be compatible with all versions) - ${endif} + ${if} $SemiSilentMode = 1 + ; if user is installing, no use to remove program settings anyway + ; (should be compatible with all versions) + Abort + ${endif} FunctionEnd Function un.PageComponentsShow - ; Show/hide the Back button - GetDlgItem $0 $HWNDPARENT 3 - ShowWindow $0 $UninstallShowBackButton + ; Show/hide the Back button + GetDlgItem $0 $HWNDPARENT 3 + ShowWindow $0 $UninstallShowBackButton FunctionEnd Function un.onUninstFailed - ${if} $SemiSilentMode = 0 - MessageBox MB_ICONSTOP "${PRODUCT_NAME} ${VERSION} could not be fully uninstalled.$\r$\nPlease, restart Windows and run the uninstaller again." /SD IDOK - ${else} - MessageBox MB_ICONSTOP "${PRODUCT_NAME} could not be fully installed.$\r$\nPlease, restart Windows and run the setup program again." /SD IDOK - ${endif} + ${if} $SemiSilentMode = 0 + MessageBox MB_ICONSTOP \ + "${PRODUCT_NAME} ${VERSION} could not be fully uninstalled.$\r$\n\ + Please restart Windows and run the uninstaller again." \ + /SD IDOK + ${else} + MessageBox MB_ICONSTOP \ + "${PRODUCT_NAME} could not be fully installed.$\r$\n\ + Please, restart Windows and run the setup program again." \ + /SD IDOK + ${endif} FunctionEnd