blob: 95496a10be372747e8537d81c8e758e89c721e4c [file] [log] [blame]
// Copyright 2014 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 "mojo/services/window_manager/basic_focus_rules.h"
#include "base/macros.h"
#include "mojo/services/public/cpp/view_manager/view.h"
#include "mojo/services/window_manager/window_manager_app.h"
namespace mojo {
BasicFocusRules::BasicFocusRules(mojo::WindowManagerApp* window_manager_app,
mojo::View* window_container)
: window_container_(window_container),
window_manager_app_(window_manager_app) {}
BasicFocusRules::~BasicFocusRules() {}
bool BasicFocusRules::IsToplevelView(mojo::View* view) const {
return view->parent() == window_container_;
}
bool BasicFocusRules::CanActivateView(mojo::View* view) const {
// TODO(erg): This needs to check visibility, along with focus, and several
// other things (see wm::BaseFocusRules).
return view->parent() == window_container_;
}
bool BasicFocusRules::CanFocusView(mojo::View* view) const {
return true;
}
mojo::View* BasicFocusRules::GetToplevelView(mojo::View* view) const {
while (view->parent() != window_container_) {
view = view->parent();
// Unparented hierarchy, there is no "top level" window.
if (!view)
return nullptr;
}
return view;
}
mojo::View* BasicFocusRules::GetActivatableView(mojo::View* view) const {
return GetToplevelView(view);
}
mojo::View* BasicFocusRules::GetFocusableView(mojo::View* view) const {
return view;
}
mojo::View* BasicFocusRules::GetNextActivatableView(
mojo::View* activatable) const {
const mojo::View::Children& children = activatable->parent()->children();
for (mojo::View::Children::const_reverse_iterator it = children.rbegin();
it != children.rend(); ++it) {
if (*it != activatable)
return *it;
}
return nullptr;
}
} // namespace mojo