| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "ui/views/widget/desktop_aura/desktop_focus_rules.h" |
| |
| #include "ui/aura/window.h" |
| #include "ui/aura/window_event_dispatcher.h" |
| |
| namespace views { |
| |
| DesktopFocusRules::DesktopFocusRules(aura::Window* content_window) |
| : content_window_(content_window) {} |
| |
| DesktopFocusRules::~DesktopFocusRules() {} |
| |
| bool DesktopFocusRules::CanActivateWindow(aura::Window* window) const { |
| if (!BaseFocusRules::CanActivateWindow(window)) |
| return false; |
| // Never activate a window that is not a child of the root window. Transients |
| // spanning different DesktopNativeWidgetAuras may trigger this. |
| return !window || content_window_->GetRootWindow()->Contains(window); |
| } |
| |
| bool DesktopFocusRules::SupportsChildActivation(aura::Window* window) const { |
| // In Desktop-Aura, only the content_window or children of the RootWindow are |
| // activatable. |
| return window == content_window_->parent() || |
| window->GetRootWindow() == window; |
| } |
| |
| bool DesktopFocusRules::IsWindowConsideredVisibleForActivation( |
| aura::Window* window) const { |
| // |content_window_| is initially hidden and made visible from Show(). Even in |
| // this state we still want it to be active. |
| return BaseFocusRules::IsWindowConsideredVisibleForActivation(window) || |
| (window == content_window_); |
| } |
| |
| aura::Window* DesktopFocusRules::GetToplevelWindow( |
| aura::Window* window) const { |
| aura::Window* top_level_window = |
| wm::BaseFocusRules::GetToplevelWindow(window); |
| // In Desktop-Aura, only the content_window or children of the RootWindow are |
| // considered as top level windows. |
| if (top_level_window == content_window_->parent()) |
| return content_window_; |
| return top_level_window; |
| } |
| |
| aura::Window* DesktopFocusRules::GetNextActivatableWindow( |
| aura::Window* window) const { |
| aura::Window* next_activatable_window = |
| wm::BaseFocusRules::GetNextActivatableWindow(window); |
| // In Desktop-Aura the content_window_'s parent is a dummy window and thus |
| // should never be activated. We should return the content_window_ if it |
| // can be activated in this case. |
| if (next_activatable_window == content_window_->parent() && |
| CanActivateWindow(content_window_)) |
| return content_window_; |
| return next_activatable_window; |
| } |
| |
| } // namespace views |