From 06f7335cc8686b63e4743d80b1a79156097034d3 Mon Sep 17 00:00:00 2001 From: anders_k Date: Tue, 24 Mar 2020 02:01:11 +0000 Subject: [PATCH] * Added MULTIUSER_INSTALLMODEPAGE_SHOWUSERNAME * Decoupled the page from MUI * Try FOLDERID_UserProgramFiles git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@7160 212acab6-be3b-0410-9dea-997c60f758d6 --- Contrib/Language files/English.nsh | 2 +- Contrib/MultiUser/MultiUser.nsh | 172 ++++++++++++++++------------- Contrib/MultiUser/Readme.html | 47 ++++---- Docs/src/history.but | 2 + 4 files changed, 119 insertions(+), 104 deletions(-) diff --git a/Contrib/Language files/English.nsh b/Contrib/Language files/English.nsh index 5e4fa8c8..4da2e096 100644 --- a/Contrib/Language files/English.nsh +++ b/Contrib/Language files/English.nsh @@ -123,7 +123,7 @@ !ifdef MULTIUSER_INSTALLMODEPAGE ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Choose Users" ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Choose for which users you want to install $(^NameDA)." - ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Select whether you want to install $(^NameDA) for yourself only or for all users of this computer. $(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Select whether you want to install $(^NameDA) only for yourself or for all users of this computer. $(^ClickNext)" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Install for anyone using this computer" ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Install just for me" !endif diff --git a/Contrib/MultiUser/MultiUser.nsh b/Contrib/MultiUser/MultiUser.nsh index 01738267..59c07aa3 100644 --- a/Contrib/MultiUser/MultiUser.nsh +++ b/Contrib/MultiUser/MultiUser.nsh @@ -9,20 +9,24 @@ Copyright 2008-2020 Joost Verburg */ !ifndef MULTIUSER_INCLUDED -!define MULTIUSER_INCLUDED -!verbose push -!verbose 3 +!define MULTIUSER_INCLUDED 20200319 +!verbose push 3 ;Standard NSIS header files !ifdef MULTIUSER_MUI !include MUI2.nsh !endif -!include nsDialogs.nsh !include LogicLib.nsh !include WinVer.nsh !include FileFunc.nsh +!if ${NSIS_PTR_SIZE} > 4 +!define /IfNDef MULTIUSER_MINWIN 0x501 +!else +!define /IfNDef MULTIUSER_MINWIN 0x400 +!endif + ;Variables Var MultiUser.Privileges @@ -123,39 +127,46 @@ Install modes !macro MULTIUSER_INSTALLMODE_CURRENTUSER UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX ;Install mode initialization - per-user - - ${if} ${IsNT} - + + !if ${MULTIUSER_MINWIN} < 0x500 + ${if} ${IsNT} + !endif + StrCpy $MultiUser.InstallMode CurrentUser - SetShellVarContext current !if "${UNINSTALLER_PREFIX}" != UN ;Set default installation location for installer !ifdef MULTIUSER_INSTALLMODE_INSTDIR + !if ${MULTIUSER_MINWIN} < 0x490 ${if} ${AtLeastWin2000} - StrCpy $INSTDIR "$LOCALAPPDATA\${MULTIUSER_INSTALLMODE_INSTDIR}" + !endif + GetKnownFolderPath $INSTDIR {5CD7AEE2-2219-4A67-B85D-6C9CE15660CB} ; FOLDERID_UserProgramFiles + StrCmp $INSTDIR "" 0 +2 + StrCpy $INSTDIR "$LocalAppData\Programs" ; Fallback directory + StrCpy $INSTDIR "$INSTDIR\${MULTIUSER_INSTALLMODE_INSTDIR}" + !if ${MULTIUSER_MINWIN} < 0x490 ${else} StrCpy $INSTDIR "$PROGRAMFILES\${MULTIUSER_INSTALLMODE_INSTDIR}" ${endif} + !endif !endif !endif !ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME - ReadRegStr $MultiUser.InstDir HKCU "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME}" - ${if} $MultiUser.InstDir != "" StrCpy $INSTDIR $MultiUser.InstDir ${endif} - !endif - + !ifdef MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION Call "${MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION}" !endif - + + !if ${MULTIUSER_MINWIN} < 0x500 ${endif} + !endif !macroend @@ -203,17 +214,9 @@ Installer/uninstaller initialization !define /ReDef MULTIUSER_TMPSTR_CAPTION "$(^Name)" !endif - !ifndef MULTIUSER_INIT_TEXT_ADMINREQUIRED - !define MULTIUSER_INIT_TEXT_ADMINREQUIRED "${MULTIUSER_TMPSTR_CAPTION} requires administrator privileges." - !endif - - !ifndef MULTIUSER_INIT_TEXT_POWERREQUIRED - !define MULTIUSER_INIT_TEXT_POWERREQUIRED "${MULTIUSER_TMPSTR_CAPTION} requires at least Power User privileges." - !endif - - !ifndef MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE - !define MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE "Your user account does not have sufficient privileges to install $(^Name) for all users of this computer." - !endif + !define /IfNDef MULTIUSER_INIT_TEXT_ADMINREQUIRED "${MULTIUSER_TMPSTR_CAPTION} requires administrator privileges." + !define /IfNDef MULTIUSER_INIT_TEXT_POWERREQUIRED "${MULTIUSER_TMPSTR_CAPTION} requires at least Power User privileges." + !define /IfNDef MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE "Your user account does not have sufficient privileges to install $(^Name) for all users of this computer." !undef MULTIUSER_TMPSTR_CAPTION @@ -228,7 +231,9 @@ Installer/uninstaller initialization UserInfo::GetAccountType Pop $MultiUser.Privileges + !if ${MULTIUSER_MINWIN} < 0x500 ${if} ${IsNT} + !endif ;Check privileges @@ -324,46 +329,50 @@ Installer/uninstaller initialization !endif - !if ${NSIS_PTR_SIZE} <= 4 + !if ${MULTIUSER_MINWIN} < 0x500 ${else} ;Not running Windows NT, per-user installation not supported Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers - !endif ${endif} + !endif !macroend !macro MULTIUSER_INIT - !verbose push - !verbose 3 - - !insertmacro MULTIUSER_INIT_CHECKS "" "" - + !verbose push 3 + !ifdef __UNINSTALL__ + !insertmacro MULTIUSER_UNINIT + !else + !insertmacro MULTIUSER_INIT_CHECKS "" "" + !endif !verbose pop !macroend !ifndef MULTIUSER_NOUNINSTALL - !macro MULTIUSER_UNINIT - !verbose push - !verbose 3 - + !verbose push 3 !insertmacro MULTIUSER_INIT_CHECKS Un un. - !verbose pop !macroend - !endif /* -Modern UI 2 page +Mode selection page */ -!ifdef MULTIUSER_MUI +!macro MULTIUSER_PAGE_FUNCTION_CUSTOM TYPE + !ifmacrodef MUI_PAGE_FUNCTION_CUSTOM + !insertmacro MUI_PAGE_FUNCTION_CUSTOM "${TYPE}" + !endif + !ifdef MULTIUSER_PAGE_CUSTOMFUNCTION_${TYPE} + Call "${MULTIUSER_PAGE_CUSTOMFUNCTION_${TYPE}}" + !undef MULTIUSER_PAGE_CUSTOMFUNCTION_${TYPE} + !endif +!macroend !macro MULTIUSER_INSTALLMODEPAGE_INTERFACE @@ -375,30 +384,30 @@ Modern UI 2 page Var MultiUser.InstallModePage.AllUsers Var MultiUser.InstallModePage.CurrentUser - - Var MultiUser.InstallModePage.ReturnValue + !endif !macroend -!macro MULTIUSER_PAGEDECLARATION_INSTALLMODE +!macro MULTIUSER_PAGEDECLARATION_INSTALLMODE UNPREFIX UNIQUEID - !insertmacro MUI_SET MULTIUSER_${MUI_PAGE_UNINSTALLER_PREFIX}INSTALLMODEPAGE "" + !define /ReDef MULTIUSER_${UNPREFIX}INSTALLMODEPAGE "" ; Unlock strings in the language file(s) !insertmacro MULTIUSER_INSTALLMODEPAGE_INTERFACE - !insertmacro MUI_DEFAULT MULTIUSER_INSTALLMODEPAGE_TEXT_TOP "$(MULTIUSER_INNERTEXT_INSTALLMODE_TOP)" - !insertmacro MUI_DEFAULT MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS "$(MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS)" - !insertmacro MUI_DEFAULT MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER "$(MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER)" + !define /IfNDef MULTIUSER_INSTALLMODEPAGE_TEXT_TOP "$(MULTIUSER_INNERTEXT_INSTALLMODE_TOP)" + !define /IfNDef MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS "$(MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS)" + !define /IfNDef MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER "$(MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER)" PageEx custom - PageCallbacks MultiUser.InstallModePre_${MUI_UNIQUEID} MultiUser.InstallModeLeave_${MUI_UNIQUEID} + PageCallbacks MultiUser.InstallModePre_${UNIQUEID} MultiUser.InstallModeLeave_${UNIQUEID} - Caption " " + !define /IfNDef MULTIUSER_INSTALLMODEPAGE_CAPTION " " + Caption "${MULTIUSER_INSTALLMODEPAGE_CAPTION}" PageExEnd - !insertmacro MULTIUSER_FUNCTION_INSTALLMODEPAGE MultiUser.InstallModePre_${MUI_UNIQUEID} MultiUser.InstallModeLeave_${MUI_UNIQUEID} + !insertmacro MULTIUSER_FUNCTION_INSTALLMODEPAGE MultiUser.InstallModePre_${UNIQUEID} MultiUser.InstallModeLeave_${UNIQUEID} !undef MULTIUSER_INSTALLMODEPAGE_TEXT_TOP !undef MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS @@ -408,17 +417,16 @@ Modern UI 2 page !macro MULTIUSER_PAGE_INSTALLMODE - ;Modern UI page for install mode - - !verbose push - !verbose 3 + !verbose push 3 !ifndef MULTIUSER_EXECUTIONLEVEL_ALLUSERS !error "A mixed-mode installation requires MULTIUSER_EXECUTIONLEVEL to be set to Admin, Power or Highest." !endif - - !insertmacro MUI_PAGE_INIT - !insertmacro MULTIUSER_PAGEDECLARATION_INSTALLMODE + + !ifmacrodef MUI_PAGE_INIT + !insertmacro MUI_PAGE_INIT + !endif + !insertmacro MULTIUSER_PAGEDECLARATION_INSTALLMODE "" ${__COUNTER__} !verbose pop @@ -426,61 +434,75 @@ Modern UI 2 page !macro MULTIUSER_FUNCTION_INSTALLMODEPAGE PRE LEAVE - ;Page functions of Modern UI page + !include nsDialogs.nsh Function "${PRE}" - + + !if ${MULTIUSER_MINWIN} < 0x500 ${ifnot} ${IsNT} Abort ${endif} - + !endif + ${if} $MultiUser.Privileges != "Power" ${andif} $MultiUser.Privileges != "Admin" Abort ${endif} - - !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE - !insertmacro MUI_HEADER_TEXT_PAGE $(MULTIUSER_TEXT_INSTALLMODE_TITLE) $(MULTIUSER_TEXT_INSTALLMODE_SUBTITLE) - + + !insertmacro MULTIUSER_PAGE_FUNCTION_CUSTOM PRE + !ifmacrodef MUI_HEADER_TEXT_PAGE + !insertmacro MUI_HEADER_TEXT_PAGE $(MULTIUSER_TEXT_INSTALLMODE_TITLE) $(MULTIUSER_TEXT_INSTALLMODE_SUBTITLE) + !endif + nsDialogs::Create 1018 Pop $MultiUser.InstallModePage - ${NSD_CreateLabel} 0u 0u 300u 40u "${MULTIUSER_INSTALLMODEPAGE_TEXT_TOP}" + ${NSD_CreateLabel} 0 2u 100% 42u "${MULTIUSER_INSTALLMODEPAGE_TEXT_TOP}" Pop $MultiUser.InstallModePage.Text - ${NSD_CreateRadioButton} 20u 50u 280u 10u "${MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS}" + ${NSD_CreateRadioButton} 15u 50u -15u 10u "${MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS}" Pop $MultiUser.InstallModePage.AllUsers - - ${NSD_CreateRadioButton} 20u 70u 280u 10u "${MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER}" + + !ifdef MULTIUSER_INSTALLMODEPAGE_SHOWUSERNAME + !ifdef NOSYSTEMCALLS + ReadEnvStr $0 USERNAME + !else + System::Call 'ADVAPI32::GetUserName(t""r0,*i${NSIS_MAX_STRLEN})' + !endif + StrCmp $0 "" +2 + StrCpy $0 " ($0)" + ${NSD_CreateRadioButton} 15u 70u -15u 10u "${MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER}$0" + !else + ${NSD_CreateRadioButton} 15u 70u -15u 10u "${MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER}" + !endif Pop $MultiUser.InstallModePage.CurrentUser - + ${if} $MultiUser.InstallMode == "AllUsers" SendMessage $MultiUser.InstallModePage.AllUsers ${BM_SETCHECK} ${BST_CHECKED} 0 ${else} SendMessage $MultiUser.InstallModePage.CurrentUser ${BM_SETCHECK} ${BST_CHECKED} 0 ${endif} - !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW + !insertmacro MULTIUSER_PAGE_FUNCTION_CUSTOM SHOW nsDialogs::Show - !insertmacro MUI_PAGE_FUNCTION_CUSTOM DESTROYED + !insertmacro MULTIUSER_PAGE_FUNCTION_CUSTOM DESTROYED FunctionEnd Function "${LEAVE}" - SendMessage $MultiUser.InstallModePage.AllUsers ${BM_GETCHECK} 0 0 $MultiUser.InstallModePage.ReturnValue + SendMessage $MultiUser.InstallModePage.AllUsers ${BM_GETCHECK} 0 0 $0 - ${if} $MultiUser.InstallModePage.ReturnValue = ${BST_CHECKED} + ${if} $0 = ${BST_CHECKED} Call MultiUser.InstallMode.AllUsers ${else} Call MultiUser.InstallMode.CurrentUser ${endif} - !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE + !insertmacro MULTIUSER_PAGE_FUNCTION_CUSTOM LEAVE FunctionEnd !macroend -!endif !verbose pop !endif diff --git a/Contrib/MultiUser/Readme.html b/Contrib/MultiUser/Readme.html index 586c2ce0..57ecc455 100644 --- a/Contrib/MultiUser/Readme.html +++ b/Contrib/MultiUser/Readme.html @@ -4,6 +4,9 @@ Multi-User Header File (MultiUser.nsh)