| Index: mojo/services/window_manager/focus_controller.h
|
| diff --git a/mojo/services/window_manager/focus_controller.h b/mojo/services/window_manager/focus_controller.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8a9e8efb14d1fa39773a02aea6bb441058d7b402
|
| --- /dev/null
|
| +++ b/mojo/services/window_manager/focus_controller.h
|
| @@ -0,0 +1,102 @@
|
| +// 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 "third_party/mojo_services/src/view_manager/public/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_;
|
| +
|
| + 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_
|
|
|