| Index: ui/views/mus/window_manager_connection.cc | 
| diff --git a/ui/views/mus/window_manager_connection.cc b/ui/views/mus/window_manager_connection.cc | 
| index cfa0a2b2322f11e0a66845b681384155f7232661..22cd228e2332aadeae5f833d49b5a8b41f0c1595 100644 | 
| --- a/ui/views/mus/window_manager_connection.cc | 
| +++ b/ui/views/mus/window_manager_connection.cc | 
| @@ -12,6 +12,7 @@ | 
| #include "components/mus/public/cpp/window.h" | 
| #include "components/mus/public/cpp/window_property.h" | 
| #include "components/mus/public/cpp/window_tree_connection.h" | 
| +#include "components/mus/public/interfaces/input_event_matcher.mojom.h" | 
| #include "components/mus/public/interfaces/window_tree.mojom.h" | 
| #include "mojo/converters/geometry/geometry_type_converters.h" | 
| #include "services/shell/public/cpp/connection.h" | 
| @@ -19,6 +20,7 @@ | 
| #include "ui/events/devices/device_data_manager.h" | 
| #include "ui/views/mus/native_widget_mus.h" | 
| #include "ui/views/mus/screen_mus.h" | 
| +#include "ui/views/pointer_watcher.h" | 
| #include "ui/views/views_delegate.h" | 
|  | 
| namespace views { | 
| @@ -75,6 +77,27 @@ NativeWidget* WindowManagerConnection::CreateNativeWidgetMus( | 
| mus::mojom::SurfaceType::DEFAULT); | 
| } | 
|  | 
| +void WindowManagerConnection::AddPointerWatcher(PointerWatcher* watcher) { | 
| +  bool had_observers = pointer_watchers_.might_have_observers(); | 
| +  pointer_watchers_.AddObserver(watcher); | 
| +  if (!had_observers) { | 
| +    // Start a watcher for pointer down. | 
| +    // TODO(jamescook): Extend event observers to handle multiple event types. | 
| +    mus::mojom::EventMatcherPtr matcher = mus::mojom::EventMatcher::New(); | 
| +    matcher->type_matcher = mus::mojom::EventTypeMatcher::New(); | 
| +    matcher->type_matcher->type = mus::mojom::EventType::POINTER_DOWN; | 
| +    window_tree_connection_->SetEventObserver(std::move(matcher)); | 
| +  } | 
| +} | 
| + | 
| +void WindowManagerConnection::RemovePointerWatcher(PointerWatcher* watcher) { | 
| +  pointer_watchers_.RemoveObserver(watcher); | 
| +  if (!pointer_watchers_.might_have_observers()) { | 
| +    // Last PointerWatcher removed, stop the event observer. | 
| +    window_tree_connection_->SetEventObserver(nullptr); | 
| +  } | 
| +} | 
| + | 
| WindowManagerConnection::WindowManagerConnection( | 
| shell::Connector* connector, | 
| const shell::Identity& identity) | 
| @@ -111,6 +134,16 @@ void WindowManagerConnection::OnEmbed(mus::Window* root) {} | 
| void WindowManagerConnection::OnConnectionLost( | 
| mus::WindowTreeConnection* connection) {} | 
|  | 
| +void WindowManagerConnection::OnEventObserved(const ui::Event& event) { | 
| +  if (event.type() == ui::ET_MOUSE_PRESSED) { | 
| +    FOR_EACH_OBSERVER(PointerWatcher, pointer_watchers_, | 
| +                      OnMousePressed(*event.AsMouseEvent())); | 
| +  } else if (event.type() == ui::ET_TOUCH_PRESSED) { | 
| +    FOR_EACH_OBSERVER(PointerWatcher, pointer_watchers_, | 
| +                      OnTouchPressed(*event.AsTouchEvent())); | 
| +  } | 
| +} | 
| + | 
| void WindowManagerConnection::OnWindowManagerFrameValuesChanged() { | 
| if (window_tree_connection_) | 
| NativeWidgetMus::NotifyFrameChanged(window_tree_connection_.get()); | 
|  |