blob: 2c9dd56e0819c4d848fde5613a968e117b4f5261 [file] [log] [blame]
// Copyright 2016 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 <stdint.h>
#include "base/macros.h"
#include "base/observer_list.h"
#include "ui/aura/client/capture_client_observer.h"
#include "ui/aura/mus/window_tree_client_observer.h"
#include "ui/views/mus/mus_export.h"
namespace aura {
class WindowTreeClient;
namespace client {
class CaptureClient;
namespace ui {
class PointerEvent;
namespace views {
class PointerWatcher;
class PointerWatcherEventRouterTest;
// PointerWatcherEventRouter is responsible for maintaining the list of
// PointerWatchers and notifying appropriately. It is expected the owner of
// PointerWatcherEventRouter is a WindowTreeClientDelegate and calls
// OnPointerEventObserved().
class VIEWS_MUS_EXPORT PointerWatcherEventRouter
: public aura::WindowTreeClientObserver,
public aura::client::CaptureClientObserver {
// Public solely for tests.
enum EventTypes {
// No PointerWatchers have been added.
// Used when the only PointerWatchers added do not want moves.
// Used when at least one PointerWatcher has been added that wants moves.
explicit PointerWatcherEventRouter(
aura::WindowTreeClient* window_tree_client);
~PointerWatcherEventRouter() override;
void AddPointerWatcher(PointerWatcher* watcher, bool wants_moves);
void RemovePointerWatcher(PointerWatcher* watcher);
// Called by WindowTreeClientDelegate to notify PointerWatchers appropriately.
void OnPointerEventObserved(const ui::PointerEvent& event,
int64_t display_id,
aura::Window* target);
// Called when the |capture_client| has been set or will be unset.
void AttachToCaptureClient(aura::client::CaptureClient* capture_client);
void DetachFromCaptureClient(aura::client::CaptureClient* capture_client);
friend class PointerWatcherEventRouterTest;
// Determines EventTypes based on the number and type of PointerWatchers.
EventTypes DetermineEventTypes();
// aura::WindowTreeClientObserver:
void OnWillDestroyClient(aura::WindowTreeClient* client) override;
// aura::client::CaptureClientObserver:
void OnCaptureChanged(aura::Window* lost_capture,
aura::Window* gained_capture) override;
aura::WindowTreeClient* window_tree_client_;
// The true parameter to ObserverList indicates the list must be empty on
// destruction. Two sets of observers are maintained, one for observers not
// needing moves |non_move_watchers_| and |move_watchers_| for those
// observers wanting moves too.
base::ObserverList<views::PointerWatcher, true> non_move_watchers_;
base::ObserverList<views::PointerWatcher, true> move_watchers_;
EventTypes event_types_ = EventTypes::NONE;
} // namespace views