Index: ui/views/mus/pointer_watcher_event_router2.h |
diff --git a/ui/views/mus/pointer_watcher_event_router2.h b/ui/views/mus/pointer_watcher_event_router2.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b7577a30f9d5817d73612a394df357126c51cb2b |
--- /dev/null |
+++ b/ui/views/mus/pointer_watcher_event_router2.h |
@@ -0,0 +1,91 @@ |
+// 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. |
+ |
+#ifndef UI_VIEWS_MUS_POINTER_WATCHER_EVENT_ROUTER2_H_ |
+#define UI_VIEWS_MUS_POINTER_WATCHER_EVENT_ROUTER2_H_ |
+ |
+#include "base/compiler_specific.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 PointerWatcherEventRouter2Test; |
+ |
+// PointerWatcherEventRouter2 is responsible for maintaining the list of |
+// PointerWatchers and notifying appropriately. It is expected the owner of |
+// PointerWatcherEventRouter2 is a WindowTreeClientDelegate and calls |
+// OnPointerEventObserved(). |
+// TODO(sky): Nuke existing PointerWatcherEventRouter and rename this. |
+class VIEWS_MUS_EXPORT PointerWatcherEventRouter2 |
+ : public aura::WindowTreeClientObserver, |
+ public aura::client::CaptureClientObserver { |
+ public: |
+ // Public solely for tests. |
+ enum EventTypes { |
+ // No PointerWatchers have been added. |
+ NONE, |
+ |
+ // Used when the only PointerWatchers added do not want moves. |
+ NON_MOVE_EVENTS, |
+ |
+ // Used when at least one PointerWatcher has been added that wants moves. |
+ MOVE_EVENTS, |
+ }; |
+ |
+ explicit PointerWatcherEventRouter2( |
+ aura::WindowTreeClient* window_tree_client); |
+ ~PointerWatcherEventRouter2() override; |
+ |
+ // Called by WindowTreeClientDelegate to notify PointerWatchers appropriately. |
+ void OnPointerEventObserved(const ui::PointerEvent& event, |
+ aura::Window* target); |
+ |
+ void AddPointerWatcher(PointerWatcher* watcher, bool wants_moves); |
+ void RemovePointerWatcher(PointerWatcher* watcher); |
+ |
+ private: |
+ friend class PointerWatcherEventRouter2Test; |
+ |
+ // Determines EventTypes based on the number and type of PointerWatchers. |
+ EventTypes DetermineEventTypes(); |
+ |
+ // aura::WindowTreeClientObserver: |
+ void OnDidDestroyClient(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; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(PointerWatcherEventRouter2); |
+}; |
+ |
+} // namespace views |
+ |
+#endif // UI_VIEWS_MUS_POINTER_WATCHER_EVENT_ROUTER2_H_ |