Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(274)

Side by Side Diff: ui/views/mus/pointer_watcher_event_router2.cc

Issue 2521823002: Wires up PointerWatcherEventRouter for views aura-mus (Closed)
Patch Set: cleanup Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "ui/views/mus/pointer_watcher_event_router2.h"
6
7 #include "ui/aura/client/capture_client.h"
8 #include "ui/aura/mus/window_tree_client.h"
9 #include "ui/aura/window.h"
10 #include "ui/display/screen.h"
11 #include "ui/events/base_event_utils.h"
12 #include "ui/events/event.h"
13 #include "ui/views/pointer_watcher.h"
14 #include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h"
15
16 namespace views {
17 namespace {
18
19 bool HasPointerWatcher(
20 base::ObserverList<views::PointerWatcher, true>* observer_list) {
21 return observer_list->begin() != observer_list->end();
22 }
23
24 } // namespace
25
26 PointerWatcherEventRouter2::PointerWatcherEventRouter2(
27 aura::WindowTreeClient* window_tree_client)
28 : window_tree_client_(window_tree_client) {
29 window_tree_client->AddObserver(this);
30 window_tree_client_->GetCaptureClient()->AddObserver(this);
31 }
32
33 PointerWatcherEventRouter2::~PointerWatcherEventRouter2() {
34 if (window_tree_client_) {
35 window_tree_client_->RemoveObserver(this);
36 window_tree_client_->GetCaptureClient()->RemoveObserver(this);
37 }
38 }
39
40 void PointerWatcherEventRouter2::AddPointerWatcher(PointerWatcher* watcher,
41 bool wants_moves) {
42 // Pointer watchers cannot be added multiple times.
43 DCHECK(!move_watchers_.HasObserver(watcher));
44 DCHECK(!non_move_watchers_.HasObserver(watcher));
45 if (wants_moves) {
46 move_watchers_.AddObserver(watcher);
47 if (event_types_ != EventTypes::MOVE_EVENTS) {
48 event_types_ = EventTypes::MOVE_EVENTS;
49 const bool wants_moves = true;
50 window_tree_client_->StartPointerWatcher(wants_moves);
51 }
52 } else {
53 non_move_watchers_.AddObserver(watcher);
54 if (event_types_ == EventTypes::NONE) {
55 event_types_ = EventTypes::NON_MOVE_EVENTS;
56 const bool wants_moves = false;
57 window_tree_client_->StartPointerWatcher(wants_moves);
58 }
59 }
60 }
61
62 void PointerWatcherEventRouter2::RemovePointerWatcher(PointerWatcher* watcher) {
63 if (non_move_watchers_.HasObserver(watcher)) {
64 non_move_watchers_.RemoveObserver(watcher);
65 } else {
66 DCHECK(move_watchers_.HasObserver(watcher));
67 move_watchers_.RemoveObserver(watcher);
68 }
69 const EventTypes types = DetermineEventTypes();
70 if (types == event_types_)
71 return;
72
73 event_types_ = types;
74 switch (types) {
75 case EventTypes::NONE:
76 window_tree_client_->StopPointerWatcher();
77 break;
78 case EventTypes::NON_MOVE_EVENTS:
79 window_tree_client_->StartPointerWatcher(false);
80 break;
81 case EventTypes::MOVE_EVENTS:
82 // It isn't possible to remove an observer and transition to wanting move
83 // events. This could only happen if there is a bug in the add logic.
84 NOTREACHED();
85 break;
86 }
87 }
88
89 void PointerWatcherEventRouter2::OnPointerEventObserved(
90 const ui::PointerEvent& event,
91 aura::Window* target) {
92 Widget* target_widget = nullptr;
93 if (target) {
94 aura::Window* window = target;
95 while (window && !target_widget) {
96 target_widget = Widget::GetWidgetForNativeView(window);
97 if (!target_widget) {
98 // Widget::GetWidgetForNativeView() uses NativeWidgetAura. Views with
99 // aura-mus may also create DesktopNativeWidgetAura.
100 DesktopNativeWidgetAura* desktop_native_widget_aura =
101 DesktopNativeWidgetAura::ForWindow(target);
102 if (desktop_native_widget_aura) {
103 target_widget = static_cast<internal::NativeWidgetPrivate*>(
104 desktop_native_widget_aura)
105 ->GetWidget();
106 }
107 }
108 window = window->parent();
109 }
110 }
111
112 // The mojo input events type converter uses the event root_location field
113 // to store screen coordinates. Screen coordinates really should be returned
114 // separately. See http://crbug.com/608547
115 gfx::Point location_in_screen = event.AsLocatedEvent()->root_location();
116 for (PointerWatcher& observer : move_watchers_)
117 observer.OnPointerEventObserved(event, location_in_screen, target_widget);
118 if (event.type() != ui::ET_POINTER_MOVED) {
119 for (PointerWatcher& observer : non_move_watchers_)
120 observer.OnPointerEventObserved(event, location_in_screen, target_widget);
121 }
122 }
123
124 PointerWatcherEventRouter2::EventTypes
125 PointerWatcherEventRouter2::DetermineEventTypes() {
126 if (HasPointerWatcher(&move_watchers_))
127 return EventTypes::MOVE_EVENTS;
128
129 if (HasPointerWatcher(&non_move_watchers_))
130 return EventTypes::NON_MOVE_EVENTS;
131
132 return EventTypes::NONE;
133 }
134
135 void PointerWatcherEventRouter2::OnCaptureChanged(
136 aura::Window* lost_capture,
137 aura::Window* gained_capture) {
138 const ui::MouseEvent mouse_event(ui::ET_MOUSE_CAPTURE_CHANGED, gfx::Point(),
139 gfx::Point(), ui::EventTimeForNow(), 0, 0);
140 const ui::PointerEvent event(mouse_event);
141 gfx::Point location_in_screen =
142 display::Screen::GetScreen()->GetCursorScreenPoint();
143 for (PointerWatcher& observer : move_watchers_)
144 observer.OnPointerEventObserved(event, location_in_screen, nullptr);
145 for (PointerWatcher& observer : non_move_watchers_)
146 observer.OnPointerEventObserved(event, location_in_screen, nullptr);
147 }
148
149 void PointerWatcherEventRouter2::OnDidDestroyClient(
150 aura::WindowTreeClient* client) {
151 // We expect that all observers have been removed by this time.
152 DCHECK_EQ(event_types_, EventTypes::NONE);
153 DCHECK_EQ(client, window_tree_client_);
154 window_tree_client_->GetCaptureClient()->RemoveObserver(this);
155 window_tree_client_->RemoveObserver(this);
156 window_tree_client_ = nullptr;
157 }
158
159 } // namespace views
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698