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/root_window.h"
      9 
     10 #if defined(USE_X11)
     11 #include "ui/views/widget/desktop_aura/desktop_root_window_host_x11.h"
     12 #elif defined(OS_WIN)
     13 #include "ui/views/widget/desktop_aura/desktop_root_window_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::RootWindow* root_window) {
     42   // Only windows hosted by a DesktopRootWindowHost 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::DesktopRootWindowHostWin::GetContentWindowForHWND(
     47       root_window->GetAcceleratedWidget()) != NULL;
     48 #elif defined(USE_X11)
     49   return views::DesktopRootWindowHostX11::GetContentWindowForXID(
     50       root_window->GetAcceleratedWidget()) != NULL;
     51 #else
     52   NOTREACHED();
     53   return true;
     54 #endif
     55 }
     56 
     57 void ActiveDesktopMonitor::OnWindowInitialized(aura::Window* window) {}
     58 
     59 void ActiveDesktopMonitor::OnRootWindowActivated(
     60     aura::RootWindow* root_window) {
     61   if (IsDesktopWindow(root_window))
     62     last_activated_desktop_ = chrome::HOST_DESKTOP_TYPE_NATIVE;
     63   else
     64     last_activated_desktop_ = chrome::HOST_DESKTOP_TYPE_ASH;
     65   DVLOG(1) << __FUNCTION__
     66            << (last_activated_desktop_ == chrome::HOST_DESKTOP_TYPE_NATIVE ?
     67                " native" : " ash") << " desktop activated.";
     68 }
     69