Home | History | Annotate | Download | only in aura
      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
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/ui/aura/active_desktop_monitor.h"
      6 
      7 #include "ui/aura/env.h"
      8 #include "ui/aura/window_tree_host.h"
      9 
     10 #if defined(USE_X11)
     11 #include "ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h"
     12 #elif defined(OS_WIN)
     13 #include "ui/views/widget/desktop_aura/desktop_window_tree_host_win.h"
     14 #endif
     15 
     16 // static
     17 ActiveDesktopMonitor* ActiveDesktopMonitor::g_instance_ = NULL;
     18 
     19 ActiveDesktopMonitor::ActiveDesktopMonitor(
     20     chrome::HostDesktopType initial_desktop)
     21     : last_activated_desktop_(initial_desktop) {
     22   DCHECK(!g_instance_);
     23   g_instance_ = this;
     24   aura::Env::GetInstance()->AddObserver(this);
     25 }
     26 
     27 ActiveDesktopMonitor::~ActiveDesktopMonitor() {
     28   DCHECK_EQ(g_instance_, this);
     29   aura::Env::GetInstance()->RemoveObserver(this);
     30   g_instance_ = NULL;
     31 }
     32 
     33 // static
     34 chrome::HostDesktopType ActiveDesktopMonitor::GetLastActivatedDesktopType() {
     35   // Tests may not have created the monitor.
     36   return g_instance_ ? g_instance_->last_activated_desktop_ :
     37       chrome::HOST_DESKTOP_TYPE_NATIVE;
     38 }
     39 
     40 // static
     41 bool ActiveDesktopMonitor::IsDesktopWindow(aura::WindowTreeHost* host) {
     42   // Only windows hosted by a DesktopWindowTreeHost implementation can be mapped
     43   // back to a content Window. All others, therefore, must be the root window
     44   // for an Ash display.
     45 #if defined(OS_WIN)
     46   return views::DesktopWindowTreeHostWin::GetContentWindowForHWND(
     47       host->GetAcceleratedWidget()) != NULL;
     48 #elif defined(USE_X11)
     49   return views::DesktopWindowTreeHostX11::GetContentWindowForXID(
     50       host->GetAcceleratedWidget()) != NULL;
     51 #else
     52   NOTREACHED();
     53   return true;
     54 #endif
     55 }
     56 
     57 void ActiveDesktopMonitor::OnWindowInitialized(aura::Window* window) {}
     58 
     59 void ActiveDesktopMonitor::OnHostActivated(aura::WindowTreeHost* host) {
     60   if (IsDesktopWindow(host))
     61     last_activated_desktop_ = chrome::HOST_DESKTOP_TYPE_NATIVE;
     62   else
     63     last_activated_desktop_ = chrome::HOST_DESKTOP_TYPE_ASH;
     64   DVLOG(1) << __FUNCTION__
     65            << (last_activated_desktop_ == chrome::HOST_DESKTOP_TYPE_NATIVE ?
     66                " native" : " ash") << " desktop activated.";
     67 }
     68