Chromium Code Reviews| Index: base/win/metro.cc |
| diff --git a/base/win/metro.cc b/base/win/metro.cc |
| index 81e3bdaabbfef42e218f8011ed8d7b14deb35970..cc92d52f970e78a80bd77e6d3b81de124296612a 100644 |
| --- a/base/win/metro.cc |
| +++ b/base/win/metro.cc |
| @@ -15,6 +15,47 @@ HMODULE GetMetroModule() { |
| return GetModuleHandleA("metro_driver.dll"); |
| } |
| +bool InMetroMode() { |
| + enum ImmersiveState { |
| + kImmersiveUnknown, |
| + kImmersiveTrue, |
| + kImmersiveFalse |
| + }; |
| + typedef BOOL (WINAPI* IsImmersiveProcessFunc)(HANDLE process); |
| + |
| + // Since the immersive state of a process can never change, we look it |
| + // up once and then cache it here. |
| + static ImmersiveState state = kImmersiveUnknown; |
| + |
| + if (state == kImmersiveUnknown) { |
| + // We didn't look it up yet. Note that the code below here is idempotent, |
| + // so it doesn't matter if it races to assignment on multiple threads. |
| + HMODULE user32 = ::GetModuleHandleA("user32.dll"); |
| + DCHECK(user32 != NULL); |
| + |
| + IsImmersiveProcessFunc is_immersive_process = |
| + reinterpret_cast<IsImmersiveProcessFunc>( |
| + ::GetProcAddress(user32, "IsImmersiveProcess")); |
| + |
| + if (is_immersive_process != NULL) { |
| + if (is_immersive_process(::GetCurrentProcess())) { |
| + DCHECK(GetMetroModule() != NULL); |
|
Sigurður Ásgeirsson
2012/06/18 13:54:15
This assert is apparently firing inside the render
|
| + |
| + state = kImmersiveTrue; |
| + } else { |
| + state = kImmersiveFalse; |
| + } |
| + } else { |
| + // No "IsImmersiveProcess" export on user32.dll, so we're pre-windows8 |
| + // and therefore not immersive. |
| + state = kImmersiveFalse; |
| + } |
| + } |
| + DCHECK_NE(kImmersiveUnknown, state); |
| + |
| + return state == kImmersiveTrue; |
| +} |
| + |
| wchar_t* LocalAllocAndCopyString(const string16& src) { |
| size_t dest_size = (src.length() + 1) * sizeof(wchar_t); |
| wchar_t* dest = reinterpret_cast<wchar_t*>(LocalAlloc(LPTR, dest_size)); |