diff --git a/nsis/openvpn-gui.nsi b/nsis/openvpn-gui.nsi index b2ee2aa..59b69bc 100644 --- a/nsis/openvpn-gui.nsi +++ b/nsis/openvpn-gui.nsi @@ -1,5 +1,5 @@ ; **************************************************************************** -; * Copyright (C) 2013 OpenVPN Technologies, Inc. * +; * Copyright (C) 2013-2015 OpenVPN Technologies, Inc. * ; * This program is free software; you can redistribute it and/or modify * ; * it under the terms of the GNU General Public License version 2 * ; * as published by the Free Software Foundation. * @@ -12,10 +12,15 @@ SetCompressor lzma !include "MultiUser.nsh" !include "MUI2.nsh" +; WinMessages.nsh is needed to send WM_CLOSE to the GUI if it is still running +!include "WinMessages.nsh" + ; Defines !define MULTIUSER_EXECUTIONLEVEL Admin !define PACKAGE_NAME "OpenVPN-GUI" !define REG_KEY "HKLM Software\OpenVPN-GUI" +!define MUI_FINISHPAGE_RUN_TEXT "Start OpenVPN GUI" +!define MUI_FINISHPAGE_RUN "$INSTDIR\bin\openvpn-gui.exe" ; Basic configuration Name "OpenVPN-GUI ${VERSION}" @@ -32,13 +37,40 @@ InstallDir "$PROGRAMFILES\${PACKAGE_NAME}" !insertmacro MUI_PAGE_COMPONENTS !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_INSTFILES +!define MUI_PAGE_CUSTOMFUNCTION_SHOW StartGUI.show +!insertmacro MUI_PAGE_FINISH ; Uninstaller pages !insertmacro MUI_UNPAGE_COMPONENTS !insertmacro MUI_UNPAGE_INSTFILES -Function .onInit +Var /Global strGuiKilled ; Track if GUI was killed so we can tick the checkbox to start it upon installer finish +;-------------------------------- +; Macros + +!macro SelectByParameter SECT PARAMETER DEFAULT + ${GetOptions} $R0 "/${PARAMETER}=" $0 + ${If} ${DEFAULT} == 0 + ${If} $0 == 1 + !insertmacro SelectSection ${SECT} + ${EndIf} + ${Else} + ${If} $0 != 0 + !insertmacro SelectSection ${SECT} + ${EndIf} + ${EndIf} +!macroend + +;-------------------- +; Functions + +Function .onInit + ${GetParameters} $R0 + ClearErrors + + !insertmacro SelectByParameter ${SecOverwriteConfiguration} SELECT_OVERWRITE_CONFIGURATION 1 + SetShellVarContext all ; Check if we're running on 64-bit Windows @@ -63,13 +95,54 @@ Function un.onInit ${EndIf} FunctionEnd +Function StartGUI.show + SendMessage $mui.FinishPage.Run ${BM_SETCHECK} ${BST_CHECKED} 0 + ShowWindow $mui.FinishPage.Run 0 + + ; if we killed the GUI to do the install/upgrade, automatically tick the "Start OpenVPN GUI" option + ${If} $strGuiKilled == "1" + SendMessage $mui.FinishPage.Run ${BM_SETCHECK} ${BST_CHECKED} 1 + ${EndIf} +FunctionEnd + +;-------------------- +; Sections + +Section -pre + Push $0 ; for FindWindow + FindWindow $0 "OpenVPN-GUI" + StrCmp $0 0 guiNotRunning + + MessageBox MB_YESNO|MB_ICONEXCLAMATION "To perform the specified operation, OpenVPN-GUI needs to be closed. Shall I close it?" /SD IDYES IDNO guiEndNo + DetailPrint "Closing OpenVPN-GUI..." + Goto guiEndYes + + guiEndNo: + Quit + + guiEndYes: + ; user wants to close GUI as part of install/upgrade + FindWindow $0 "OpenVPN-GUI" + IntCmp $0 0 guiClosed + SendMessage $0 ${WM_CLOSE} 0 0 + Sleep 100 + Goto guiEndYes + + guiClosed: + ; Keep track that we closed the GUI so we can offer to auto (re)start it later + StrCpy $strGuiKilled "1" + + guiNotRunning: + ; openvpn-gui not running/closed successfully, carry on with install/upgrade + +SectionEnd + ; This empty section allows selecting whether to reset OpenVPN-GUI registry key ; values to the default. OpenVPN-specific part of the configuration gets ; auto-detected and overwritten regardless of this setting. Section /o "$(NAME_SecOverwriteConfiguration)" SecOverwriteConfiguration SectionEnd - Section "-Add registry keys" SecAddRegistryKeys AddSize 0 @@ -178,7 +251,7 @@ SectionEnd Section "-post" - ; Create uninstall + ; Create uninstaller WriteUninstaller "$INSTDIR\Uninstall.exe" WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${PACKAGE_NAME}" "DisplayName" "${PACKAGE_NAME} ${VERSION}" @@ -196,6 +269,19 @@ SectionEnd Section "-un.Uninstall" SecUninstall + ; Stop OpenVPN-GUI if currently running + DetailPrint "Stopping OpenVPN-GUI..." + + StopGUI: + + FindWindow $0 "OpenVPN-GUI" + IntCmp $0 0 guiClosed + SendMessage $0 ${WM_CLOSE} 0 0 + Sleep 100 + Goto StopGUI + + guiClosed: + ; We'll always delete registry keys related to OpenVPN. These will be ; recreated automatically when OpenVPN-GUI is installed again. DeleteRegValue ${REG_KEY} "config_dir" @@ -221,7 +307,9 @@ Section "-un.Uninstall" SecUninstall SectionEnd +;-------------------- ; Language settings + !include "english.nsh" !insertmacro MUI_LANGUAGE "English"