mirror of
https://github.com/python/cpython.git
synced 2025-08-31 05:58:33 +00:00
Adds option to install launcher for all users even when installing Python just-for-me. This helps mitigate issues when the incompatible Python 3.4 launcher is installed.
Enables installer builds with the the text marker. Allows simple installs to include a custom description.
This commit is contained in:
parent
8cc80f1d81
commit
2237bdc595
13 changed files with 126 additions and 54 deletions
|
@ -87,11 +87,13 @@ enum CONTROL_ID {
|
|||
ID_INSTALL_UPGRADE_BUTTON,
|
||||
ID_INSTALL_UPGRADE_CUSTOM_BUTTON,
|
||||
ID_INSTALL_CANCEL_BUTTON,
|
||||
|
||||
ID_INSTALL_LAUNCHER_ALL_USERS_CHECKBOX,
|
||||
|
||||
// Customize Page
|
||||
ID_TARGETDIR_EDITBOX,
|
||||
ID_CUSTOM_ASSOCIATE_FILES_CHECKBOX,
|
||||
ID_CUSTOM_INSTALL_ALL_USERS_CHECKBOX,
|
||||
ID_CUSTOM_INSTALL_LAUNCHER_ALL_USERS_CHECKBOX,
|
||||
ID_CUSTOM_COMPILE_ALL_CHECKBOX,
|
||||
ID_CUSTOM_BROWSE_BUTTON,
|
||||
ID_CUSTOM_BROWSE_BUTTON_LABEL,
|
||||
|
@ -150,10 +152,12 @@ static THEME_ASSIGN_CONTROL_ID CONTROL_ID_NAMES[] = {
|
|||
{ ID_INSTALL_UPGRADE_BUTTON, L"InstallUpgradeButton" },
|
||||
{ ID_INSTALL_UPGRADE_CUSTOM_BUTTON, L"InstallUpgradeCustomButton" },
|
||||
{ ID_INSTALL_CANCEL_BUTTON, L"InstallCancelButton" },
|
||||
{ ID_INSTALL_LAUNCHER_ALL_USERS_CHECKBOX, L"InstallLauncherAllUsers" },
|
||||
|
||||
{ ID_TARGETDIR_EDITBOX, L"TargetDir" },
|
||||
{ ID_CUSTOM_ASSOCIATE_FILES_CHECKBOX, L"AssociateFiles" },
|
||||
{ ID_CUSTOM_INSTALL_ALL_USERS_CHECKBOX, L"InstallAllUsers" },
|
||||
{ ID_CUSTOM_INSTALL_LAUNCHER_ALL_USERS_CHECKBOX, L"CustomInstallLauncherAllUsers" },
|
||||
{ ID_CUSTOM_COMPILE_ALL_CHECKBOX, L"CompileAll" },
|
||||
{ ID_CUSTOM_BROWSE_BUTTON, L"CustomBrowseButton" },
|
||||
{ ID_CUSTOM_BROWSE_BUTTON_LABEL, L"CustomBrowseButtonLabel" },
|
||||
|
@ -261,10 +265,11 @@ class PythonBootstrapperApplication : public CBalBaseBootstrapperApplication {
|
|||
LPWSTR defaultDir = nullptr;
|
||||
LPWSTR targetDir = nullptr;
|
||||
LONGLONG elevated, crtInstalled, installAllUsers;
|
||||
BOOL checked;
|
||||
BOOL checked, launcherChecked;
|
||||
WCHAR wzPath[MAX_PATH] = { };
|
||||
BROWSEINFOW browseInfo = { };
|
||||
PIDLIST_ABSOLUTE pidl = nullptr;
|
||||
DWORD pageId;
|
||||
HRESULT hr = S_OK;
|
||||
|
||||
switch(id) {
|
||||
|
@ -278,7 +283,7 @@ class PythonBootstrapperApplication : public CBalBaseBootstrapperApplication {
|
|||
case ID_INSTALL_BUTTON:
|
||||
SavePageSettings();
|
||||
|
||||
if (!QueryElevateForCrtInstall()) {
|
||||
if (!WillElevate() && !QueryElevateForCrtInstall()) {
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -344,18 +349,32 @@ class PythonBootstrapperApplication : public CBalBaseBootstrapperApplication {
|
|||
ReleaseStr(targetDir);
|
||||
}
|
||||
|
||||
checked = ThemeIsControlChecked(_theme, ID_CUSTOM_INSTALL_ALL_USERS_CHECKBOX);
|
||||
if (!checked && !QueryElevateForCrtInstall()) {
|
||||
if (!WillElevate() && !QueryElevateForCrtInstall()) {
|
||||
break;
|
||||
}
|
||||
|
||||
OnPlan(_command.action);
|
||||
break;
|
||||
|
||||
case ID_INSTALL_LAUNCHER_ALL_USERS_CHECKBOX:
|
||||
checked = ThemeIsControlChecked(_theme, ID_INSTALL_LAUNCHER_ALL_USERS_CHECKBOX);
|
||||
_engine->SetVariableNumeric(L"InstallLauncherAllUsers", checked);
|
||||
|
||||
ThemeControlElevates(_theme, ID_INSTALL_BUTTON, WillElevate());
|
||||
break;
|
||||
|
||||
case ID_CUSTOM_INSTALL_LAUNCHER_ALL_USERS_CHECKBOX:
|
||||
checked = ThemeIsControlChecked(_theme, ID_CUSTOM_INSTALL_LAUNCHER_ALL_USERS_CHECKBOX);
|
||||
_engine->SetVariableNumeric(L"InstallLauncherAllUsers", checked);
|
||||
|
||||
ThemeControlElevates(_theme, ID_CUSTOM_INSTALL_BUTTON, WillElevate());
|
||||
break;
|
||||
|
||||
case ID_CUSTOM_INSTALL_ALL_USERS_CHECKBOX:
|
||||
hr = BalGetNumericVariable(L"WixBundleElevated", &elevated);
|
||||
checked = ThemeIsControlChecked(_theme, ID_CUSTOM_INSTALL_ALL_USERS_CHECKBOX);
|
||||
ThemeControlElevates(_theme, ID_CUSTOM_INSTALL_BUTTON, checked && (FAILED(hr) || !elevated));
|
||||
_engine->SetVariableNumeric(L"InstallAllUsers", checked);
|
||||
|
||||
ThemeControlElevates(_theme, ID_CUSTOM_INSTALL_BUTTON, WillElevate());
|
||||
ThemeControlEnable(_theme, ID_CUSTOM_BROWSE_BUTTON_LABEL, !checked);
|
||||
if (checked) {
|
||||
_engine->SetVariableNumeric(L"CompileAll", 1);
|
||||
|
@ -416,6 +435,7 @@ class PythonBootstrapperApplication : public CBalBaseBootstrapperApplication {
|
|||
case ID_MODIFY_BUTTON:
|
||||
// Some variables cannot be modified
|
||||
_engine->SetVariableString(L"InstallAllUsersState", L"disable");
|
||||
_engine->SetVariableString(L"InstallLauncherAllUsersState", L"disable");
|
||||
_engine->SetVariableString(L"TargetDirState", L"disable");
|
||||
_engine->SetVariableString(L"CustomBrowseButtonState", L"disable");
|
||||
_modifying = TRUE;
|
||||
|
@ -437,35 +457,36 @@ class PythonBootstrapperApplication : public CBalBaseBootstrapperApplication {
|
|||
|
||||
void InstallPage_Show() {
|
||||
// Ensure the All Users install button has a UAC shield
|
||||
LONGLONG elevated, installAll;
|
||||
|
||||
if (FAILED(BalGetNumericVariable(L"WixBundleElevated", &elevated))) {
|
||||
elevated = 0;
|
||||
}
|
||||
|
||||
|
||||
if (SUCCEEDED(BalGetNumericVariable(L"InstallAllUsers", &installAll)) && installAll && !elevated) {
|
||||
ThemeControlElevates(_theme, ID_INSTALL_BUTTON, TRUE);
|
||||
ThemeControlElevates(_theme, ID_INSTALL_SIMPLE_BUTTON, TRUE);
|
||||
ThemeControlElevates(_theme, ID_INSTALL_UPGRADE_BUTTON, TRUE);
|
||||
}
|
||||
BOOL elevated = WillElevate();
|
||||
ThemeControlElevates(_theme, ID_INSTALL_BUTTON, elevated);
|
||||
ThemeControlElevates(_theme, ID_INSTALL_SIMPLE_BUTTON, elevated);
|
||||
ThemeControlElevates(_theme, ID_INSTALL_UPGRADE_BUTTON, elevated);
|
||||
}
|
||||
|
||||
void Custom1Page_Show() {
|
||||
LONGLONG installLauncherAllUsers;
|
||||
|
||||
if (FAILED(BalGetNumericVariable(L"InstallLauncherAllUsers", &installLauncherAllUsers))) {
|
||||
installLauncherAllUsers = 0;
|
||||
}
|
||||
|
||||
ThemeSendControlMessage(_theme, ID_CUSTOM_INSTALL_LAUNCHER_ALL_USERS_CHECKBOX, BM_SETCHECK,
|
||||
installLauncherAllUsers ? BST_CHECKED : BST_UNCHECKED, 0);
|
||||
}
|
||||
|
||||
void Custom2Page_Show() {
|
||||
HRESULT hr;
|
||||
LONGLONG installAll, elevated, includeLauncher;
|
||||
LONGLONG installAll, includeLauncher;
|
||||
|
||||
if (FAILED(BalGetNumericVariable(L"WixBundleElevated", &elevated))) {
|
||||
elevated = 0;
|
||||
if (FAILED(BalGetNumericVariable(L"InstallAllUsers", &installAll))) {
|
||||
installAll = 0;
|
||||
}
|
||||
if (SUCCEEDED(BalGetNumericVariable(L"InstallAllUsers", &installAll))) {
|
||||
ThemeControlElevates(_theme, ID_CUSTOM_INSTALL_BUTTON, installAll && !elevated);
|
||||
|
||||
if (WillElevate()) {
|
||||
ThemeControlElevates(_theme, ID_CUSTOM_INSTALL_BUTTON, TRUE);
|
||||
ThemeShowControl(_theme, ID_CUSTOM_BROWSE_BUTTON_LABEL, SW_HIDE);
|
||||
} else {
|
||||
installAll = 0;
|
||||
ThemeControlElevates(_theme, ID_CUSTOM_INSTALL_BUTTON, FALSE);
|
||||
ThemeShowControl(_theme, ID_CUSTOM_BROWSE_BUTTON_LABEL, SW_SHOW);
|
||||
}
|
||||
|
||||
|
@ -1839,8 +1860,8 @@ private:
|
|||
COLORREF fg = fnt->crForeground, bg = fnt->crBackground;
|
||||
*brush = fnt->hBackground;
|
||||
RemapColor(&fg, &bg, brush);
|
||||
SetTextColor(hDC, fg);
|
||||
SetBkColor(hDC, bg);
|
||||
::SetTextColor(hDC, fg);
|
||||
::SetBkColor(hDC, bg);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -2080,6 +2101,7 @@ private:
|
|||
|
||||
for (DWORD i = 0; i < pPage->cControlIndices; ++i) {
|
||||
THEME_CONTROL* pControl = _theme->rgControls + pPage->rgdwControlIndices[i];
|
||||
BOOL enableControl = TRUE;
|
||||
|
||||
// If this is a named control, try to set its default state.
|
||||
if (pControl->sczName && *pControl->sczName) {
|
||||
|
@ -2091,7 +2113,7 @@ private:
|
|||
|
||||
// If the control value isn't set then disable it.
|
||||
if (!SUCCEEDED(hr)) {
|
||||
ThemeControlEnable(_theme, pControl->wId, FALSE);
|
||||
enableControl = FALSE;
|
||||
} else {
|
||||
ThemeSendControlMessage(
|
||||
_theme,
|
||||
|
@ -2110,13 +2132,25 @@ private:
|
|||
LPWSTR controlState = nullptr;
|
||||
hr = BalGetStringVariable(controlName, &controlState);
|
||||
if (SUCCEEDED(hr) && controlState && *controlState) {
|
||||
if (controlState[0] == '[') {
|
||||
LPWSTR formatted = nullptr;
|
||||
if (SUCCEEDED(BalFormatString(controlState, &formatted))) {
|
||||
StrFree(controlState);
|
||||
controlState = formatted;
|
||||
}
|
||||
}
|
||||
|
||||
if (CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, 0, controlState, -1, L"disable", -1)) {
|
||||
BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Disable control %ls", pControl->sczName);
|
||||
ThemeControlEnable(_theme, pControl->wId, FALSE);
|
||||
enableControl = FALSE;
|
||||
} else if (CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, 0, controlState, -1, L"hide", -1)) {
|
||||
BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Hide control %ls", pControl->sczName);
|
||||
// TODO: This doesn't work
|
||||
ThemeShowControl(_theme, pControl->wId, SW_HIDE);
|
||||
} else {
|
||||
// An explicit state can override the lack of a
|
||||
// backing variable.
|
||||
enableControl = TRUE;
|
||||
}
|
||||
}
|
||||
StrFree(controlState);
|
||||
|
@ -2124,6 +2158,8 @@ private:
|
|||
StrFree(controlName);
|
||||
}
|
||||
|
||||
ThemeControlEnable(_theme, pControl->wId, enableControl);
|
||||
|
||||
// Format the text in each of the new page's controls
|
||||
if (pControl->sczText && *pControl->sczText) {
|
||||
// If the wix developer is showing a hidden variable
|
||||
|
@ -2405,6 +2441,16 @@ private:
|
|||
}
|
||||
}
|
||||
|
||||
BOOL WillElevate() {
|
||||
static BAL_CONDITION WILL_ELEVATE_CONDITION = {
|
||||
L"not WixBundleElevated and (InstallAllUsers or (InstallLauncherAllUsers and Include_launcher))",
|
||||
L""
|
||||
};
|
||||
BOOL result;
|
||||
|
||||
return SUCCEEDED(BalConditionEvaluate(&WILL_ELEVATE_CONDITION, _engine, &result, nullptr)) && result;
|
||||
}
|
||||
|
||||
BOOL IsCrtInstalled() {
|
||||
if (_crtInstalledToken > 0) {
|
||||
return TRUE;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue