1// Copyright 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/ui/host_desktop.h" 6 7#if defined(OS_WIN) 8#include <windows.h> 9#endif 10 11#include "ash/shell.h" 12#include "chrome/browser/ui/ash/ash_util.h" 13#include "chrome/browser/ui/aura/active_desktop_monitor.h" 14#include "chrome/browser/ui/browser.h" 15#include "chrome/browser/ui/browser_list.h" 16 17namespace chrome { 18 19HostDesktopType GetHostDesktopTypeForNativeView(gfx::NativeView native_view) { 20#if defined(USE_ASH) 21 // TODO(ananta) 22 // Once we've threaded creation context to wherever needed, we should remove 23 // this check here. 24#if defined(OS_WIN) 25 if (!native_view) 26 return GetActiveDesktop(); 27#endif 28 return IsNativeViewInAsh(native_view) ? 29 HOST_DESKTOP_TYPE_ASH : 30 HOST_DESKTOP_TYPE_NATIVE; 31#else 32 return HOST_DESKTOP_TYPE_NATIVE; 33#endif 34} 35 36HostDesktopType GetHostDesktopTypeForNativeWindow( 37 gfx::NativeWindow native_window) { 38#if defined(USE_ASH) 39 // TODO(ananta) 40 // Once we've threaded creation context to wherever needed, we should remove 41 // this check here. 42#if defined(OS_WIN) 43 if (!native_window) 44 return GetActiveDesktop(); 45#endif 46 return IsNativeWindowInAsh(native_window) ? 47 HOST_DESKTOP_TYPE_ASH : 48 HOST_DESKTOP_TYPE_NATIVE; 49#else 50 return HOST_DESKTOP_TYPE_NATIVE; 51#endif 52} 53 54HostDesktopType GetActiveDesktop() { 55#if defined(USE_ASH) && !defined(OS_CHROMEOS) 56 // The Ash desktop is considered active if a non-desktop RootWindow was last 57 // activated and the Ash desktop is still open. As it is, the Ash desktop 58 // will be considered the last active if a user switches from metro Chrome to 59 // the Windows desktop but doesn't activate any Chrome windows there (e.g., 60 // by clicking on one or otherwise giving one focus). Consider finding a way 61 // to detect that the Windows desktop has been activated so that the native 62 // desktop can be considered active once the user switches to it if its 63 // BrowserList isn't empty. 64 if ((ActiveDesktopMonitor::GetLastActivatedDesktopType() == 65 chrome::HOST_DESKTOP_TYPE_ASH) && 66 ash::Shell::HasInstance()) { 67 return HOST_DESKTOP_TYPE_ASH; 68 } 69#endif 70 return HOST_DESKTOP_TYPE_NATIVE; 71} 72 73} // namespace chrome 74