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