From baee2888907b260881d5831c68500941937261a0 Mon Sep 17 00:00:00 2001 From: bitraid Date: Fri, 20 Jul 2018 18:10:59 +0300 Subject: [PATCH] NSIS script rewrite --- misc/nsis/graphics/install.ico | Bin 0 -> 22486 bytes misc/nsis/graphics/readme.txt | 2 + misc/nsis/graphics/uninstall.ico | Bin 0 -> 22486 bytes misc/nsis/graphics/wizard.bmp | Bin 0 -> 52574 bytes misc/nsis/install.nsh | 484 +++++++++++++++++++++++++++++++ misc/nsis/install_pages.nsh | 62 ++++ misc/nsis/mkunlist.cmd | 45 +++ misc/nsis/qutebrowser.nsi | 179 ++++++++++++ misc/nsis/uninstall.nsh | 174 +++++++++++ misc/nsis/uninstall_pages.nsh | 32 ++ misc/qutebrowser.nsi | 80 ----- 11 files changed, 978 insertions(+), 80 deletions(-) create mode 100755 misc/nsis/graphics/install.ico create mode 100755 misc/nsis/graphics/readme.txt create mode 100755 misc/nsis/graphics/uninstall.ico create mode 100755 misc/nsis/graphics/wizard.bmp create mode 100755 misc/nsis/install.nsh create mode 100755 misc/nsis/install_pages.nsh create mode 100755 misc/nsis/mkunlist.cmd create mode 100755 misc/nsis/qutebrowser.nsi create mode 100755 misc/nsis/uninstall.nsh create mode 100755 misc/nsis/uninstall_pages.nsh delete mode 100644 misc/qutebrowser.nsi diff --git a/misc/nsis/graphics/install.ico b/misc/nsis/graphics/install.ico new file mode 100755 index 0000000000000000000000000000000000000000..8a30f612e8639c21f1bb07f158683eef0b879643 GIT binary patch literal 22486 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 G>i+@bT(1iN literal 0 HcmV?d00001 diff --git a/misc/nsis/graphics/wizard.bmp b/misc/nsis/graphics/wizard.bmp new file mode 100755 index 0000000000000000000000000000000000000000..a48c8ee03f177f0f814b839390c161e0c71644cb GIT binary patch literal 52574 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 literal 0 HcmV?d00001 diff --git a/misc/nsis/install.nsh b/misc/nsis/install.nsh new file mode 100755 index 000000000..267fd0d90 --- /dev/null +++ b/misc/nsis/install.nsh @@ -0,0 +1,484 @@ +# Copyright 2018 Florian Bruhin (The Compiler) +# +# This file is part of qutebrowser. +# +# qutebrowser is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# qutebrowser is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with qutebrowser. If not, see . + +# NSIS installer header. Uses NsisMultiUser plugin and contains portions of +# its demo code, copyright 2017 Richard Drizin, Alex Mitev. + + +;Languages (first is default language) - must be inserted after all pages +!insertmacro MUI_LANGUAGE "English" +!insertmacro MULTIUSER_LANGUAGE_INIT + +; Reserve files +!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}" +!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}" +!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} +!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} +!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} +!macroend + +; Sections +InstType "Full" +InstType "Typical" +InstType "Minimal" + +Section "Core Files (required)" SectionCoreFiles + 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} "$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 + + ${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} + + ; 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}\*.*" +SectionEnd + +SectionGroup /e "System Integration" SectionGroupIntegration + +Section "Register with Windows" SectionWindowsRegister + 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' + + StrCpy $0 "SOFTWARE\Clients\StartMenuInternet\${PRODUCT_NAME}" + + WriteRegStr SHCTX "$0" "" "${PRODUCT_NAME}" + + WriteRegStr SHCTX "$0\DefaultIcon" "" "$1,0" + + WriteRegDWORD SHCTX "$0\InstallInfo" "IconsVisible" 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\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\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\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" + + ; 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} +SectionEnd + +Section /o "Set as default browser" SectionDefaultBrowser + 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} +SectionEnd + +SectionGroupEnd + +SectionGroup "Shortcuts" SectionGroupShortcuts + +Section "Dektop Icon" SectionDesktopIcon + SectionIn 1 2 + + !insertmacro MULTIUSER_GetCurrentUserString $0 + CreateShortCut "$DESKTOP\${PRODUCT_NAME}$0.lnk" "$INSTDIR\${PROGEXE}" +SectionEnd + +Section "Start Menu Icon" SectionStartMenuIcon + SectionIn 1 2 + + !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}" + + ; 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)" +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_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} + + ; 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} + + !insertmacro MULTIUSER_INIT + + ${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} +FunctionEnd + +Function PageWelcomeLicensePre + ${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} + + ; 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 +FunctionEnd + +Function PageDirectoryShow + ${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 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})" + + !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 +FunctionEnd diff --git a/misc/nsis/install_pages.nsh b/misc/nsis/install_pages.nsh new file mode 100755 index 000000000..92328c66b --- /dev/null +++ b/misc/nsis/install_pages.nsh @@ -0,0 +1,62 @@ +# Copyright 2018 Florian Bruhin (The Compiler) +# +# This file is part of qutebrowser. +# +# qutebrowser is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# qutebrowser is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with qutebrowser. If not, see . + +# NSIS pages header. Uses NsisMultiUser plugin and contains portions of +# its demo code, copyright 2017 Richard Drizin, Alex Mitev. + + +; NsisMultiUser optional defines +!define MULTIUSER_INSTALLMODE_ALLOW_BOTH_INSTALLATIONS 0 +!define MULTIUSER_INSTALLMODE_ALLOW_ELEVATION 1 +!define MULTIUSER_INSTALLMODE_ALLOW_ELEVATION_IF_SILENT 0 +!define MULTIUSER_INSTALLMODE_DEFAULT_ALLUSERS 1 +!if ${PLATFORM} == "win64" + !define MULTIUSER_INSTALLMODE_64_BIT 1 +!endif +!define MULTIUSER_INSTALLMODE_DISPLAYNAME "${PRODUCT_NAME} ${VERSION} (${ARCH})" + +; Interface Settings +!define MUI_ABORTWARNING ; Show a confirmation when cancelling the installation +!define MUI_LANGDLL_ALLLANGUAGES ; Show all languages, despite user's codepage + +; Remember the installer language +!define MUI_LANGDLL_REGISTRY_ROOT "SHCTX" +!define MUI_LANGDLL_REGISTRY_KEY "${SETTINGS_REG_KEY}" +!define MUI_LANGDLL_REGISTRY_VALUENAME "Language" + +; Pages +!define MUI_PAGE_CUSTOMFUNCTION_PRE PageWelcomeLicensePre +!insertmacro MUI_PAGE_WELCOME + +!define MUI_PAGE_CUSTOMFUNCTION_PRE PageWelcomeLicensePre +!insertmacro MUI_PAGE_LICENSE "${LICENSE_FILE}" + +!define MULTIUSER_INSTALLMODE_CHANGE_MODE_FUNCTION PageInstallModeChangeMode +!insertmacro MULTIUSER_PAGE_INSTALLMODE + +!define MUI_COMPONENTSPAGE_SMALLDESC +!insertmacro MUI_PAGE_COMPONENTS + +!define MUI_PAGE_CUSTOMFUNCTION_PRE PageDirectoryPre +!define MUI_PAGE_CUSTOMFUNCTION_SHOW PageDirectoryShow +!insertmacro MUI_PAGE_DIRECTORY + +!insertmacro MUI_PAGE_INSTFILES + +!define MUI_FINISHPAGE_RUN +!define MUI_FINISHPAGE_RUN_FUNCTION PageFinishRun +!insertmacro MUI_PAGE_FINISH \ No newline at end of file diff --git a/misc/nsis/mkunlist.cmd b/misc/nsis/mkunlist.cmd new file mode 100755 index 000000000..114116e23 --- /dev/null +++ b/misc/nsis/mkunlist.cmd @@ -0,0 +1,45 @@ +@echo off + +rem This is called from qutebrowser NSIS script at compile time. +rem It enumerates the files of the release and generates a nsh file with the +rem commands to remove them. + +setlocal EnableDelayedExpansion + +if [%2]==[] exit 1 + +set "DIST=%~f1" +set "ULIST=%2" +set "DLIST=%TEMP%\%~n2%RANDOM%.tmp" + +if not exist "%DIST%" exit 2 + +if exist "%ULIST%" del "%ULIST%" || exit 3 +if exist "%DLIST%" del "%DLIST%" || exit 3 + +for /r "%DIST%" %%i in (*) do ( + set "FN=%%i" + set "FN=!FN:%DIST%=!" + set "FN=!FN:$=$$!" + (echo:Delete "$INSTDIR!FN!") >> "%ULIST%" +) + +rem '*' doesn't catch hidden files and there are a couple files starting with +rem a '.', which will appear as hidden if mapped from a linux file system. +for /f "tokens=*" %%i in ('dir "%DIST%" /a:h-d /b /s') do ( + set "HFN=%%i" + set "HFN=!HFN:%DIST%=!" + set "HFN=!HFN:$=$$!" + (echo:Delete "$INSTDIR!HFN!") >> "%ULIST%" +) + +for /r "%DIST%" %%i in (.) do ( + set "DN=%%i" + set "DN=!DN:%DIST%=!" + set "DN=!DN:$=$$!" + (echo:RMDir "$INSTDIR!DN:~0,-1!") >> "%DLIST%" +) + +sort /r "%DLIST%" >> "%ULIST%" + +del "%DLIST%" diff --git a/misc/nsis/qutebrowser.nsi b/misc/nsis/qutebrowser.nsi new file mode 100755 index 000000000..a114e6774 --- /dev/null +++ b/misc/nsis/qutebrowser.nsi @@ -0,0 +1,179 @@ +# Copyright 2018 Florian Bruhin (The Compiler) +# +# This file is part of qutebrowser. +# +# qutebrowser is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# qutebrowser is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with qutebrowser. If not, see . + +# NSIS installer script. Uses NsisMultiUser plugin and contains portions of +# its demo code, copyright 2017 Richard Drizin, Alex Mitev. + +# Includes modified graphics from the NSIS distribution. + +# Requires: +# - NsisMultiUser plugin @ 79914db https://github.com/Drizin/NsisMultiUser +# - UAC plugin v2.4.5c (20150526) http://nsis.sourceforge.net/UAC_plug-in + + +; Installer Attributes +Unicode true +XPStyle on +ManifestSupportedOS all +SetDatablockOptimize on +SetCompressor /SOLID /FINAL lzma +SetCompressorDictSize 32 +CRCCheck force +AllowSkipFiles off +SetOverwrite on +ShowInstDetails hide +ShowUninstDetails hide + +!addplugindir /x86-unicode ".\Plugins\x86-unicode" +!addincludedir ".\Include" + +!include MUI2.nsh +!include NsisMultiUser.nsh + +; Installer defines +!define PRODUCT_NAME "qutebrowser" ; name of the application as displayed to the user +!define PROGEXE "qutebrowser.exe" ; main application filename +!define COMPANY_NAME "qutebrowser.org" ; company, used for registry tree hierarchy +!define COPYRIGHT "© 2014-2018 Florian Bruhin (The Compiler)" +!define TM "qutebrowser is free software under the GNU General Public License" +!define URL_ABOUT "https://qutebrowser.org/" +!define URL_UPDATE "https://qutebrowser.org/doc/install.html" +!define HELP_LINK "https://qutebrowser.org/doc/help/" +!define CONTACT "mail@qutebrowser.org" +!define COMMENTS "A keyboard-driven, vim-like browser based on PyQt5." +!define SHELL_PROPERTIES "qute://settings/" +!define SHELL_SAFEMODE "--temp-basedir" +!define LANGID "1033" +!define MIN_WIN_VER "XP" +!define SETUP_MUTEX "${PRODUCT_NAME} Setup Mutex" ; do not change this between program versions! +!define APP_MUTEX "${PRODUCT_NAME} App Mutex" ; do not change this between program versions! +!define REG_UN "Software\Microsoft\Windows\CurrentVersion\Uninstall" +!define SETTINGS_REG_KEY "${REG_UN}\${PRODUCT_NAME}" +!define CONFIG_DIR "$APPDATA\${PRODUCT_NAME}" +!define CACHE_DIR "$LOCALAPPDATA\${PRODUCT_NAME}" +!define LICENSE_FILE ".\..\..\LICENSE" +!define MUI_ICON ".\graphics\install.ico" +!define MUI_UNICON ".\graphics\uninstall.ico" +!define MUI_WELCOMEFINISHPAGE_BITMAP ".\graphics\wizard.bmp" +; The old MSI installers had a different Product Code on every release by mistake +!define MSI_COUNT 24 +!define MSI32_010 "{50691080-E51F-4F1A-AEEA-ACA8C64DB98B}" +!define MSI32_011 "{B6FE0FC1-3754-4FF6-A5E5-A305B1EDC8CB}" +!define MSI32_012 "{B1341894-8D82-40C6-B0D0-A5ECEFB997BE}" +!define MSI32_013 "{22EEF3C7-4D72-4F7E-B35B-1F2A22B5E64A}" +!define MSI32_014 "{29C7D770-EBFE-465A-8354-C6A4EA3D8BAF}" +!define MSI32_020 "{061B339B-ABBC-4D89-BE0D-A843FEA48DA7}" +!define MSI32_021 "{0228BB7C-8D7C-4763-A1C6-AAE0B1902AF9}" +!define MSI32_030 "{F514C234-DB31-4158-9D96-53412B431F81}" +!define MSI32_040 "{895E71DC-41D6-4FC3-A0F8-2EC5FE19ACB8}" +!define MSI32_041 "{66F9576D-0DB5-475D-9C25-E0511580C897}" +!define MSI32_050 "{EDB54F4D-7A00-47AE-9808-E59FF5E79136}" +!define MSI32_051 "{EEF03487-BC9F-4EA4-A5A1-E9CF5F9E1FB6}" +!define MSI32_060 "{F9FECA24-95DA-4E46-83E3-A805E5B1CE06}" +!define MSI32_061 "{F1A0F4B9-CCA3-4B07-8ADB-16BC81530440}" +!define MSI32_062 "{43F5E4C5-FF96-4676-B027-5AD63D3871AB}" +!define MSI32_070 "{558FF39C-CA5F-4E2A-87D2-90963FCBC424}" +!define MSI32_080 "{9DF540E2-4F8C-46A4-A27F-43BD0558CC42}" +!define MSI32_081 "{EA0FB6B1-83AF-4F16-8B89-645B587D90FD}" +!define MSI32_082 "{F849A0B2-301C-435D-9CC0-9651938FCA6F}" +!define MSI32_084 "{9331D947-AC86-4542-A755-A833429C6E69}" +!define MSI32_090 "{AD967987-7777-4095-A03A-3F2EE8968D9E}" +!define MSI32_091 "{87F05B8A-2238-4D86-82BB-EC8B4CE97E78}" +!define MSI32_100 "{07B85A0B-D025-4B4B-B46D-BC9B02912835}" +!define MSI32_101 "{9F05D9E4-D049-445E-A489-A7DC0256C774}" +!define MSI64_010 "{A8191862-28A7-4BB0-9532-49AD5CFFFE66}" +!define MSI64_011 "{1C476CC1-A171-48B7-A883-0F00F4D301D3}" +!define MSI64_012 "{ADA727AC-9DDD-4F03-93B7-BAFE950757BE}" +!define MSI64_013 "{64949BFF-287A-4C16-A5F3-84A38A6703F1}" +!define MSI64_014 "{63F22761-D886-4FDD-93F4-7543265E9FF7}" +!define MSI64_020 "{80BE09C6-347F-4121-98D3-1E4363C3CE6B}" +!define MSI64_021 "{2D86F472-DD52-40A1-8FE0-90550D674554}" +!define MSI64_030 "{53DED10D-C609-406F-959E-C1B52A518561}" +!define MSI64_040 "{B9535FDF-7A9E-4AED-BA1E-BEE5FFCBC311}" +!define MSI64_041 "{DAE1309A-FE7D-46E5-B488-B437CC509DF9}" +!define MSI64_050 "{DC9ECE64-F8E5-4BCB-BCFF-BE4ADCEF2655}" +!define MSI64_051 "{26AED286-23BD-49FF-BD9C-7C0DC4467BD7}" +!define MSI64_060 "{3035744D-2390-4D5E-ACAD-905E72B9EBEC}" +!define MSI64_061 "{0223F48F-93A8-4985-BCFF-328E5A9D97D5}" +!define MSI64_062 "{95835A82-A9C2-4924-87DF-E03D910E3400}" +!define MSI64_070 "{61D1AC75-7ECD-45FF-B42B-454C056DB178}" +!define MSI64_080 "{92D1C65C-1338-4B11-B515-6BD5B1FF92D9}" +!define MSI64_081 "{AF7AC009-FB82-48F6-9439-6E46AEB60DBF}" +!define MSI64_082 "{CC316D68-5742-4C2B-98EC-4ADF06A19B84}" +!define MSI64_084 "{633F41F9-FE9B-42D1-9CC4-718CBD01EE11}" +!define MSI64_090 "{5E3E7404-D6D7-4FF1-846A-F9BBFE2F841A}" +!define MSI64_091 "{3190D3F6-7B24-47DC-88E7-99280905FACF}" +!define MSI64_100 "{7AA6530C-3812-4DC5-9A30-E762BBDDF55E}" +!define MSI64_101 "{B0104B85-8229-49FB-8606-275A90ACC024}" + +; Set PLATFORM - default x64 +!ifdef X86 + !define PLATFORM "Win32" + !define ARCH "x86" + !define SUFFIX "win32" +!else + !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}" +!else + !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"' +!else + !ifdef UPX + !error "Both UPX and NOUPX are defined." + !endif +!endif + +; Version Information +VIFileVersion "${VERSION}.0" +VIProductVersion "${VERSION}.0" +VIAddVersionKey /LANG=${LANGID} "Comments" "Built with NSIS ${NSIS_VERSION}" +VIAddVersionKey /LANG=${LANGID} "CompanyName" "${COMPANY_NAME}" +VIAddVersionKey /LANG=${LANGID} "FileVersion" "${VERSION}" +VIAddVersionKey /LANG=${LANGID} "InternalName" "${PRODUCT_NAME}-${VERSION}-${SUFFIX}" +VIAddVersionKey /LANG=${LANGID} "LegalTrademarks" "${TM}" +VIAddVersionKey /LANG=${LANGID} "LegalCopyright" "${COPYRIGHT}" +VIAddVersionKey /LANG=${LANGID} "FileDescription" "${PRODUCT_NAME} ${ARCH} Setup" +VIAddVersionKey /LANG=${LANGID} "OriginalFilename" "${PRODUCT_NAME}-${VERSION}-${SUFFIX}.exe" +VIAddVersionKey /LANG=${LANGID} "ProductName" "${PRODUCT_NAME}" +VIAddVersionKey /LANG=${LANGID} "ProductVersion" "${VERSION}" + +; Final Attributes +Name "${PRODUCT_NAME}" +BrandingText "${PRODUCT_NAME} v${VERSION} Installer (${ARCH})" +OutFile "${DIST_DIR}\..\${PRODUCT_NAME}-${VERSION}-${SUFFIX}.exe" + +; installer/uninstaller pages and actions +!include "Utils.nsh" +!include "install_pages.nsh" +; remove next line if you're using signing after the uninstaller is extracted from the initially compiled setup +!include "uninstall_pages.nsh" +!include "install.nsh" +; remove next line if you're using signing after the uninstaller is extracted from the initially compiled setup +!include "uninstall.nsh" diff --git a/misc/nsis/uninstall.nsh b/misc/nsis/uninstall.nsh new file mode 100755 index 000000000..19abc1298 --- /dev/null +++ b/misc/nsis/uninstall.nsh @@ -0,0 +1,174 @@ +# Copyright 2018 Florian Bruhin (The Compiler) +# +# This file is part of qutebrowser. +# +# qutebrowser is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# qutebrowser is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with qutebrowser. If not, see . + +# NSIS uninstaller header. Uses NsisMultiUser plugin and contains portions of +# its demo code, copyright 2017 Richard Drizin, Alex Mitev. + + +; Variables +Var SemiSilentMode ; installer started uninstaller in semi-silent mode using /SS parameter +Var RunningFromInstaller ; installer started uninstaller using /uninstall parameter + +!insertmacro DeleteRetryAbortFunc "un." +!insertmacro CheckSingleInstanceFunc "un." + +Section "un.Program Files" SectionUninstallProgram + 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 + + ; 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}" + + ; 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 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)" +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} +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} + +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" + + ; 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 +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_UNFUNCTION_DESCRIPTION_END + +; Callbacks +Function un.onInit + ${GetParameters} $R0 + + ${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} + + ${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} + + ${ifnot} ${UAC_IsInnerInstance} + ${andif} $RunningFromInstaller = 0 + !insertmacro CheckSingleInstance "Setup" "Global" "${SETUP_MUTEX}" + !insertmacro CheckSingleInstance "Application" "Local" "${APP_MUTEX}" + ${endif} + + !insertmacro MULTIUSER_UNINIT + + !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} +FunctionEnd + +Function un.PageComponentsShow + ; 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} +FunctionEnd diff --git a/misc/nsis/uninstall_pages.nsh b/misc/nsis/uninstall_pages.nsh new file mode 100755 index 000000000..8ad203ebb --- /dev/null +++ b/misc/nsis/uninstall_pages.nsh @@ -0,0 +1,32 @@ +# Copyright 2018 Florian Bruhin (The Compiler) +# +# This file is part of qutebrowser. +# +# qutebrowser is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# qutebrowser is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with qutebrowser. If not, see . + +# NSIS pages header. Uses NsisMultiUser plugin and contains portions of +# its demo code, copyright 2017 Richard Drizin, Alex Mitev. + + +; Pages +!define MUI_UNABORTWARNING ; Show a confirmation when cancelling the installation + +!define MULTIUSER_INSTALLMODE_CHANGE_MODE_FUNCTION un.PageInstallModeChangeMode +!insertmacro MULTIUSER_UNPAGE_INSTALLMODE + +!define MUI_PAGE_CUSTOMFUNCTION_PRE un.PageComponentsPre +!define MUI_PAGE_CUSTOMFUNCTION_SHOW un.PageComponentsShow +!insertmacro MUI_UNPAGE_COMPONENTS + +!insertmacro MUI_UNPAGE_INSTFILES diff --git a/misc/qutebrowser.nsi b/misc/qutebrowser.nsi deleted file mode 100644 index 76f459a78..000000000 --- a/misc/qutebrowser.nsi +++ /dev/null @@ -1,80 +0,0 @@ -Name "qutebrowser" - -Unicode true -RequestExecutionLevel admin -SetCompressor /solid lzma - -!ifdef X64 - OutFile "..\dist\qutebrowser-${VERSION}-amd64.exe" - InstallDir "$ProgramFiles64\qutebrowser" -!else - OutFile "..\dist\qutebrowser-${VERSION}-win32.exe" - InstallDir "$ProgramFiles\qutebrowser" -!endif - -;Default installation folder - -!include "MUI2.nsh" -;!include "MultiUser.nsh" - -!define MUI_ABORTWARNING -;!define MULTIUSER_MUI -;!define MULTIUSER_INSTALLMODE_COMMANDLINE -!define MUI_ICON "../icons/qutebrowser.ico" -!define MUI_UNICON "../icons/qutebrowser.ico" - -!insertmacro MUI_PAGE_LICENSE "..\LICENSE" -!insertmacro MUI_PAGE_DIRECTORY -!insertmacro MUI_PAGE_INSTFILES -!insertmacro MUI_UNPAGE_CONFIRM -!insertmacro MUI_UNPAGE_INSTFILES - -!insertmacro MUI_LANGUAGE "English" - -; depends on admin status -;SetShellVarContext current - - -Section "Install" - - ; Uninstall old versions - ExecWait 'MsiExec.exe /quiet /qn /norestart /X{633F41F9-FE9B-42D1-9CC4-718CBD01EE11}' - ExecWait 'MsiExec.exe /quiet /qn /norestart /X{9331D947-AC86-4542-A755-A833429C6E69}' - IfFileExists "$INSTDIR\uninst.exe" 0 +2 - ExecWait "$INSTDIR\uninst.exe /S _?=$INSTDIR" - CreateDirectory "$INSTDIR" - - SetOutPath "$INSTDIR" - - !ifdef X64 - file /r "..\dist\qutebrowser-${VERSION}-x64\*.*" - !else - file /r "..\dist\qutebrowser-${VERSION}-x86\*.*" - !endif - - SetShellVarContext all - CreateShortCut "$SMPROGRAMS\qutebrowser.lnk" "$INSTDIR\qutebrowser.exe" - - ;Create uninstaller - WriteUninstaller "$INSTDIR\uninst.exe" - - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qutebrowser" "DisplayName" "qutebrowser" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qutebrowser" "UninstallString" '"$INSTDIR\uninst.exe"' - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qutebrowser" "QuietUninstallString" '"$INSTDIR\uninst.exe" /S' - -SectionEnd - -;-------------------------------- -;Uninstaller Section - -Section "Uninstall" - - SetShellVarContext all - Delete "$SMPROGRAMS\qutebrowser.lnk" - - RMDir /r "$INSTDIR\*.*" - RMDir "$INSTDIR" - - DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qutebrowser" - -SectionEnd