OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/base/win/shell.h" | 5 #include "ui/base/win/shell.h" |
6 | 6 |
7 #include <dwmapi.h> | 7 #include <dwmapi.h> |
8 #include <shlobj.h> // Must be before propkey. | 8 #include <shlobj.h> // Must be before propkey. |
9 #include <propkey.h> | 9 #include <propkey.h> |
10 #include <shellapi.h> | 10 #include <shellapi.h> |
11 | 11 |
12 #include "base/command_line.h" | 12 #include "base/command_line.h" |
13 #include "base/debug/alias.h" | 13 #include "base/debug/alias.h" |
14 #include "base/files/file.h" | 14 #include "base/files/file.h" |
15 #include "base/files/file_path.h" | 15 #include "base/files/file_path.h" |
16 #include "base/native_library.h" | 16 #include "base/native_library.h" |
17 #include "base/strings/string_util.h" | 17 #include "base/strings/string_util.h" |
18 #include "base/strings/stringprintf.h" | 18 #include "base/strings/stringprintf.h" |
19 #include "base/threading/thread_restrictions.h" | 19 #include "base/threading/thread_restrictions.h" |
20 #include "base/win/scoped_comptr.h" | 20 #include "base/win/scoped_comptr.h" |
21 #include "base/win/win_util.h" | 21 #include "base/win/win_util.h" |
22 #include "base/win/windows_version.h" | |
23 #include "ui/base/ui_base_switches.h" | 22 #include "ui/base/ui_base_switches.h" |
24 | 23 |
25 namespace ui { | 24 namespace ui { |
26 namespace win { | 25 namespace win { |
27 | 26 |
28 namespace { | 27 namespace { |
29 | 28 |
30 // Default ShellExecuteEx flags used with the "openas" verb. | 29 // Default ShellExecuteEx flags used with the "openas" verb. |
31 // | 30 // |
32 // SEE_MASK_NOASYNC is specified so that ShellExecuteEx can be invoked from a | 31 // SEE_MASK_NOASYNC is specified so that ShellExecuteEx can be invoked from a |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
92 // resulting error does not cause UI due to the SEE_MASK_FLAG_NO_UI flag in | 91 // resulting error does not cause UI due to the SEE_MASK_FLAG_NO_UI flag in |
93 // kDefaultOpenFlags. | 92 // kDefaultOpenFlags. |
94 return InvokeShellExecute(full_path.value(), full_path.value(), | 93 return InvokeShellExecute(full_path.value(), full_path.value(), |
95 base::string16(), L"explore", | 94 base::string16(), L"explore", |
96 kDefaultOpenFlags) == ERROR_SUCCESS; | 95 kDefaultOpenFlags) == ERROR_SUCCESS; |
97 } | 96 } |
98 | 97 |
99 bool PreventWindowFromPinning(HWND hwnd) { | 98 bool PreventWindowFromPinning(HWND hwnd) { |
100 DCHECK(hwnd); | 99 DCHECK(hwnd); |
101 | 100 |
102 // This functionality is only available on Win7+. | |
103 if (base::win::GetVersion() < base::win::VERSION_WIN7) | |
104 return false; | |
105 | |
106 base::win::ScopedComPtr<IPropertyStore> pps; | 101 base::win::ScopedComPtr<IPropertyStore> pps; |
107 if (FAILED( | 102 if (FAILED( |
108 SHGetPropertyStoreForWindow(hwnd, IID_PPV_ARGS(pps.GetAddressOf())))) | 103 SHGetPropertyStoreForWindow(hwnd, IID_PPV_ARGS(pps.GetAddressOf())))) |
109 return false; | 104 return false; |
110 | 105 |
111 return base::win::SetBooleanValueForPropertyStore( | 106 return base::win::SetBooleanValueForPropertyStore( |
112 pps.Get(), PKEY_AppUserModel_PreventPinning, true); | 107 pps.Get(), PKEY_AppUserModel_PreventPinning, true); |
113 } | 108 } |
114 | 109 |
115 // TODO(calamity): investigate moving this out of the UI thread as COM | 110 // TODO(calamity): investigate moving this out of the UI thread as COM |
116 // operations may spawn nested run loops which can cause issues. | 111 // operations may spawn nested run loops which can cause issues. |
117 void SetAppDetailsForWindow(const base::string16& app_id, | 112 void SetAppDetailsForWindow(const base::string16& app_id, |
118 const base::FilePath& app_icon_path, | 113 const base::FilePath& app_icon_path, |
119 int app_icon_index, | 114 int app_icon_index, |
120 const base::string16& relaunch_command, | 115 const base::string16& relaunch_command, |
121 const base::string16& relaunch_display_name, | 116 const base::string16& relaunch_display_name, |
122 HWND hwnd) { | 117 HWND hwnd) { |
123 DCHECK(hwnd); | 118 DCHECK(hwnd); |
124 | 119 |
125 // This functionality is only available on Win7+. | |
126 if (base::win::GetVersion() < base::win::VERSION_WIN7) | |
127 return; | |
128 | |
129 base::win::ScopedComPtr<IPropertyStore> pps; | 120 base::win::ScopedComPtr<IPropertyStore> pps; |
130 if (FAILED( | 121 if (FAILED( |
131 SHGetPropertyStoreForWindow(hwnd, IID_PPV_ARGS(pps.GetAddressOf())))) | 122 SHGetPropertyStoreForWindow(hwnd, IID_PPV_ARGS(pps.GetAddressOf())))) |
132 return; | 123 return; |
133 | 124 |
134 if (!app_id.empty()) | 125 if (!app_id.empty()) |
135 base::win::SetAppIdForPropertyStore(pps.Get(), app_id.c_str()); | 126 base::win::SetAppIdForPropertyStore(pps.Get(), app_id.c_str()); |
136 if (!app_icon_path.empty()) { | 127 if (!app_icon_path.empty()) { |
137 // Always add the icon index explicitly to prevent bad interaction with the | 128 // Always add the icon index explicitly to prevent bad interaction with the |
138 // index notation when file path has commas. | 129 // index notation when file path has commas. |
(...skipping 30 matching lines...) Expand all Loading... |
169 void SetRelaunchDetailsForWindow(const base::string16& relaunch_command, | 160 void SetRelaunchDetailsForWindow(const base::string16& relaunch_command, |
170 const base::string16& display_name, | 161 const base::string16& display_name, |
171 HWND hwnd) { | 162 HWND hwnd) { |
172 SetAppDetailsForWindow(base::string16(), base::FilePath(), 0, | 163 SetAppDetailsForWindow(base::string16(), base::FilePath(), 0, |
173 relaunch_command, display_name, hwnd); | 164 relaunch_command, display_name, hwnd); |
174 } | 165 } |
175 | 166 |
176 void ClearWindowPropertyStore(HWND hwnd) { | 167 void ClearWindowPropertyStore(HWND hwnd) { |
177 DCHECK(hwnd); | 168 DCHECK(hwnd); |
178 | 169 |
179 // This functionality is only available on Win7+. | |
180 if (base::win::GetVersion() < base::win::VERSION_WIN7) | |
181 return; | |
182 | |
183 base::win::ScopedComPtr<IPropertyStore> pps; | 170 base::win::ScopedComPtr<IPropertyStore> pps; |
184 if (FAILED( | 171 if (FAILED( |
185 SHGetPropertyStoreForWindow(hwnd, IID_PPV_ARGS(pps.GetAddressOf())))) | 172 SHGetPropertyStoreForWindow(hwnd, IID_PPV_ARGS(pps.GetAddressOf())))) |
186 return; | 173 return; |
187 | 174 |
188 DWORD property_count; | 175 DWORD property_count; |
189 if (FAILED(pps->GetCount(&property_count))) | 176 if (FAILED(pps->GetCount(&property_count))) |
190 return; | 177 return; |
191 | 178 |
192 PROPVARIANT empty_property_variant = {}; | 179 PROPVARIANT empty_property_variant = {}; |
193 for (DWORD i = 0; i < property_count; i++) { | 180 for (DWORD i = 0; i < property_count; i++) { |
194 PROPERTYKEY key; | 181 PROPERTYKEY key; |
195 if (SUCCEEDED(pps->GetAt(i, &key))) | 182 if (SUCCEEDED(pps->GetAt(i, &key))) |
196 pps->SetValue(key, empty_property_variant); | 183 pps->SetValue(key, empty_property_variant); |
197 } | 184 } |
198 | 185 |
199 pps->Commit(); | 186 pps->Commit(); |
200 } | 187 } |
201 | 188 |
202 bool IsAeroGlassEnabled() { | 189 bool IsAeroGlassEnabled() { |
203 // For testing in Win8 (where it is not possible to disable composition) the | 190 // For testing in Win8 (where it is not possible to disable composition) the |
204 // user can specify this command line switch to mimic the behavior. In this | 191 // user can specify this command line switch to mimic the behavior. In this |
205 // mode, cross-HWND transparency is not supported and various types of | 192 // mode, cross-HWND transparency is not supported and various types of |
206 // widgets fallback to more simplified rendering behavior. | 193 // widgets fallback to more simplified rendering behavior. |
207 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 194 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
208 switches::kDisableDwmComposition)) | 195 switches::kDisableDwmComposition)) |
209 return false; | 196 return false; |
210 | 197 |
211 // Technically Aero glass works in Vista but we want to put XP and Vista | |
212 // at the same feature level. See bug 426573. | |
213 if (base::win::GetVersion() < base::win::VERSION_WIN7) | |
214 return false; | |
215 // If composition is not enabled, we behave like on XP. | 198 // If composition is not enabled, we behave like on XP. |
216 BOOL enabled = FALSE; | 199 BOOL enabled = FALSE; |
217 return SUCCEEDED(DwmIsCompositionEnabled(&enabled)) && enabled; | 200 return SUCCEEDED(DwmIsCompositionEnabled(&enabled)) && enabled; |
218 } | 201 } |
219 | 202 |
220 } // namespace win | 203 } // namespace win |
221 } // namespace ui | 204 } // namespace ui |
OLD | NEW |