blob: ec4f8d6136d18d4731da890ef1069eec80ad4e03 [file] [log] [blame]
// Copyright 2017 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.
#ifndef CHROMECAST_GRAPHICS_CAST_FOCUS_CLIENT_AURA_H_
#define CHROMECAST_GRAPHICS_CAST_FOCUS_CLIENT_AURA_H_
#include <vector>
#include "base/macros.h"
#include "base/observer_list.h"
#include "ui/aura/client/focus_change_observer.h"
#include "ui/aura/client/focus_client.h"
#include "ui/aura/window_observer.h"
#include "ui/wm/public/activation_client.h"
namespace aura {
class Window;
}
namespace chromecast {
class CastFocusClientAura : public aura::WindowObserver,
public aura::client::FocusClient,
public wm::ActivationClient {
public:
CastFocusClientAura();
~CastFocusClientAura() override;
// aura::client::FocusClient implementation:
void AddObserver(aura::client::FocusChangeObserver* observer) override;
void RemoveObserver(aura::client::FocusChangeObserver* observer) override;
void FocusWindow(aura::Window* window) override;
void ResetFocusWithinActiveWindow(aura::Window* window) override;
aura::Window* GetFocusedWindow() override;
// Overridden from wm::ActivationClient:
void AddObserver(wm::ActivationChangeObserver* observer) override;
void RemoveObserver(wm::ActivationChangeObserver* observer) override;
void ActivateWindow(aura::Window* window) override;
void DeactivateWindow(aura::Window* window) override;
const aura::Window* GetActiveWindow() const override;
aura::Window* GetActivatableWindow(aura::Window* window) const override;
const aura::Window* GetToplevelWindow(
const aura::Window* window) const override;
bool CanActivateWindow(const aura::Window* window) const override;
private:
// aura::WindowObserver implementation:
void OnWindowVisibilityChanged(aura::Window* window, bool visible) override;
void OnWindowDestroying(aura::Window* window) override;
void OnWindowHierarchyChanging(const HierarchyChangeParams& params) override;
// Change the focused window and notify focus observers.
void UpdateWindowFocus();
// Get the window that should be focused.
aura::Window* GetWindowToFocus();
// Get the top-most window in a window's hierarchy to determine z order.
// This is the window directly under the root window (a child window of the
// root window).
aura::Window* GetZOrderWindow(aura::Window* window) const {
return const_cast<aura::Window*>(
GetZOrderWindow(const_cast<const aura::Window*>(window)));
}
const aura::Window* GetZOrderWindow(const aura::Window* window) const;
base::ObserverList<aura::client::FocusChangeObserver>::Unchecked
focus_observers_;
// Track the currently focused window, which isn't necessarily a top-level
// window.
aura::Window* focused_window_;
// Track the windows that we've focused in the past, so that we can restore
// focus to them. We assume that this is a small list so that we can perform
// linear ops on it.
std::vector<aura::Window*> focusable_windows_;
DISALLOW_COPY_AND_ASSIGN(CastFocusClientAura);
};
} // namespace chromecast
#endif // CHROMECAST_GRAPHICS_CAST_FOCUS_CLIENT_AURA_H_