Skip to content

Commit 6581868

Browse files
committed
ModernSettings: Add support for more settings
Based on `HostId`: * {7E0522FC-1AC4-41CA-AFD0-3610417A9C41} execute `shell:::{PageId}` * {12B1697E-D3A0-4DBC-B568-CCF64A3F934D} execute command in `DeepLink`
1 parent 7ee668e commit 6581868

File tree

4 files changed

+54
-15
lines changed

4 files changed

+54
-15
lines changed

Src/StartMenu/StartMenuHelper/ModernSettings.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -359,13 +359,13 @@ ModernSettings::Setting::Setting(const Blob& blob)
359359
});
360360
}
361361

362-
std::vector<ModernSettings::Setting> ModernSettings::enumerate() const
362+
std::vector<std::wstring_view> ModernSettings::enumerate() const
363363
{
364-
std::vector<ModernSettings::Setting> retval;
364+
std::vector<std::wstring_view> retval;
365365
retval.reserve(m_settings.size());
366366

367367
for (const auto& i : m_settings)
368-
retval.emplace_back(i.second);
368+
retval.emplace_back(i.first);
369369

370370
return retval;
371371
}

Src/StartMenu/StartMenuHelper/ModernSettings.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ class ModernSettings
127127
}
128128
};
129129

130-
std::vector<Setting> enumerate() const;
130+
std::vector<std::wstring_view> enumerate() const;
131131
Setting get(const std::wstring_view& name) const;
132132

133133
private:

Src/StartMenu/StartMenuHelper/ModernSettingsContextMenu.cpp

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,11 @@ static bool ActivateModernSettingPage(const WCHAR* page)
7070

7171
extern ModernSettings::Setting GetModernSetting(LPCITEMIDLIST pidl);
7272

73+
static HRESULT Execute(const wchar_t* cmd)
74+
{
75+
return (intptr_t)::ShellExecute(nullptr, L"open", cmd, nullptr, nullptr, SW_SHOWNORMAL) > 32 ? S_OK : E_FAIL;
76+
}
77+
7378
static HRESULT OpenItemByPidl(LPCITEMIDLIST pidl)
7479
{
7580
auto child = ILFindLastID(pidl);
@@ -80,10 +85,49 @@ static HRESULT OpenItemByPidl(LPCITEMIDLIST pidl)
8085

8186
if (setting.hostId == L"{6E6DDBCB-9C89-434B-A994-D5F22239523B}")
8287
{
88+
if (setting.deepLink.empty())
89+
return E_INVALIDARG;
90+
8391
std::wstring cmd(L"windowsdefender://");
8492
cmd += setting.deepLink;
8593

86-
return (intptr_t)::ShellExecute(nullptr, L"open", cmd.c_str(), nullptr, nullptr, SW_SHOWNORMAL) > 32 ? S_OK : E_FAIL;
94+
return Execute(cmd.c_str());
95+
}
96+
97+
if (setting.hostId == L"{7E0522FC-1AC4-41CA-AFD0-3610417A9C41}")
98+
{
99+
if (setting.pageId.empty())
100+
return E_INVALIDARG;
101+
102+
std::wstring cmd(L"shell:::");
103+
cmd += setting.pageId;
104+
105+
return Execute(cmd.c_str());
106+
}
107+
108+
if (setting.hostId == L"{12B1697E-D3A0-4DBC-B568-CCF64A3F934D}")
109+
{
110+
if (setting.deepLink.empty())
111+
return E_INVALIDARG;
112+
113+
std::wstring cmd(setting.deepLink);
114+
115+
if (cmd.compare(0, 8, L"shell:::") == 0)
116+
return Execute(cmd.c_str());
117+
118+
cmd.resize(MAX_PATH);
119+
DoEnvironmentSubst(cmd.data(), (UINT)cmd.size());
120+
121+
STARTUPINFO startupInfo = { sizeof(startupInfo) };
122+
PROCESS_INFORMATION processInfo{};
123+
124+
if (!CreateProcess(nullptr, cmd.data(), nullptr, nullptr, FALSE, 0, nullptr, nullptr, &startupInfo, &processInfo))
125+
return E_FAIL;
126+
127+
CloseHandle(processInfo.hThread);
128+
CloseHandle(processInfo.hProcess);
129+
130+
return S_OK;
87131
}
88132

89133
if (setting.pageId.empty())

Src/StartMenu/StartMenuHelper/ModernSettingsShellFolder.cpp

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -91,16 +91,11 @@ class ATL_NO_VTABLE CModernSettingsShellFolderEnumIDList :
9191
ULONG i = 0;
9292
while (SUCCEEDED(hr) && i < celt && m_item < m_items.size())
9393
{
94-
const auto& s = m_items[m_item];
95-
if ((s.hostId.empty() && s.deepLink.empty()) ||
96-
(s.hostId == L"{6E6DDBCB-9C89-434B-A994-D5F22239523B}" && !s.deepLink.empty()))
94+
hr = m_parent->CreateChildID(m_items[m_item], &rgelt[i]);
95+
if (SUCCEEDED(hr))
9796
{
98-
hr = m_parent->CreateChildID(s.fileName, &rgelt[i]);
99-
if (SUCCEEDED(hr))
100-
{
101-
celtFetched++;
102-
i++;
103-
}
97+
celtFetched++;
98+
i++;
10499
}
105100

106101
m_item++;
@@ -141,7 +136,7 @@ class ATL_NO_VTABLE CModernSettingsShellFolderEnumIDList :
141136
private:
142137
CComPtr<CModernSettingsShellFolder> m_parent;
143138
std::shared_ptr<ModernSettings> m_settings;
144-
std::vector<ModernSettings::Setting> m_items;
139+
std::vector<std::wstring_view> m_items;
145140
DWORD m_item = 0;
146141
};
147142

0 commit comments

Comments
 (0)