blob: a06ee2d9295f5fe2f4269faf70e13e6b32656d9a [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.
#ifndef SERVICES_WINDOW_MANAGER_FOCUS_CONTROLLER_H_
#define SERVICES_WINDOW_MANAGER_FOCUS_CONTROLLER_H_
#include "base/compiler_specific.h"
#include "base/memory/scoped_ptr.h"
#include "base/observer_list.h"
#include "base/scoped_observer.h"
#include "mojo/services/view_manager/cpp/view_observer.h"
#include "ui/events/event_handler.h"
namespace window_manager {
class FocusControllerObserver;
class FocusRules;
// FocusController handles focus and activation changes in a mojo window
// manager. Within the window manager, there can only be one focused and one
// active window at a time. When focus or activation changes, notifications are
// sent using the FocusControllerObserver interface.
class FocusController : public ui::EventHandler, public mojo::ViewObserver {
public:
// |rules| cannot be null.
explicit FocusController(scoped_ptr<FocusRules> rules);
~FocusController() override;
void AddObserver(FocusControllerObserver* observer);
void RemoveObserver(FocusControllerObserver* observer);
void ActivateView(mojo::View* view);
void DeactivateView(mojo::View* view);
mojo::View* GetActiveView();
mojo::View* GetActivatableView(mojo::View* view);
mojo::View* GetToplevelView(mojo::View* view);
bool CanActivateView(mojo::View* view) const;
void FocusView(mojo::View* view);
void ResetFocusWithinActiveView(mojo::View* view);
mojo::View* GetFocusedView();
// Overridden from ui::EventHandler:
void OnKeyEvent(ui::KeyEvent* event) override;
void OnMouseEvent(ui::MouseEvent* event) override;
void OnScrollEvent(ui::ScrollEvent* event) override;
void OnTouchEvent(ui::TouchEvent* event) override;
void OnGestureEvent(ui::GestureEvent* event) override;
// Overridden from ViewObserver:
void OnTreeChanging(const TreeChangeParams& params) override;
void OnTreeChanged(const TreeChangeParams& params) override;
void OnViewVisibilityChanged(mojo::View* view) override;
void OnViewDestroying(mojo::View* view) override;
private:
// Internal implementation that sets the focused view, fires events etc.
// This function must be called with a valid focusable view.
void SetFocusedView(mojo::View* view);
// Internal implementation that sets the active window, fires events etc.
// This function must be called with a valid |activatable_window|.
// |requested window| refers to the window that was passed in to an external
// request (e.g. FocusWindow or ActivateWindow). It may be null, e.g. if
// SetActiveWindow was not called by an external request. |activatable_window|
// refers to the actual window to be activated, which may be different.
void SetActiveView(mojo::View* requested_view, mojo::View* activatable_view);
// Called when a window's disposition changed such that it and its hierarchy
// are no longer focusable/activatable. |next| is a valid window that is used
// as a starting point for finding a window to focus next based on rules.
void ViewLostFocusFromDispositionChange(mojo::View* view, mojo::View* next);
// Called when an attempt is made to focus or activate a window via an input
// event targeted at that window. Rules determine the best focusable window
// for the input window.
void ViewFocusedFromInputEvent(mojo::View* view);
mojo::View* active_view_;
mojo::View* focused_view_;
bool updating_focus_;
bool updating_activation_;
scoped_ptr<FocusRules> rules_;
base::ObserverList<FocusControllerObserver> focus_controller_observers_;
ScopedObserver<mojo::View, ViewObserver> observer_manager_;
DISALLOW_COPY_AND_ASSIGN(FocusController);
};
// Sets/Gets the focus controller for a view.
void SetFocusController(mojo::View* view, FocusController* focus_controller);
FocusController* GetFocusController(mojo::View* view);
} // namespace window_manager
#endif // SERVICES_WINDOW_MANAGER_FOCUS_CONTROLLER_H_