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

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

Issue 2626013005: Change CaptureSynchronizer and PointerWatcherEventRouter to support multiple CaptureClients. (Closed)
Patch Set: comments; sequence; test Created 3 years, 10 months 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
1 // Copyright 2016 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/views/mus/pointer_watcher_event_router.h" 5 #include "ui/views/mus/pointer_watcher_event_router.h"
6 6
7 #include "ui/aura/client/capture_client.h" 7 #include "ui/aura/client/capture_client.h"
8 #include "ui/aura/mus/window_tree_client.h" 8 #include "ui/aura/mus/window_tree_client.h"
9 #include "ui/aura/window.h" 9 #include "ui/aura/window.h"
10 #include "ui/display/screen.h" 10 #include "ui/display/screen.h"
11 #include "ui/events/base_event_utils.h" 11 #include "ui/events/base_event_utils.h"
12 #include "ui/events/event.h" 12 #include "ui/events/event.h"
13 #include "ui/views/pointer_watcher.h" 13 #include "ui/views/pointer_watcher.h"
14 #include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h" 14 #include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h"
15 15
16 namespace views { 16 namespace views {
17 namespace { 17 namespace {
18 18
19 bool HasPointerWatcher( 19 bool HasPointerWatcher(
20 base::ObserverList<views::PointerWatcher, true>* observer_list) { 20 base::ObserverList<views::PointerWatcher, true>* observer_list) {
21 return observer_list->begin() != observer_list->end(); 21 return observer_list->begin() != observer_list->end();
22 } 22 }
23 23
24 } // namespace 24 } // namespace
25 25
26 PointerWatcherEventRouter::PointerWatcherEventRouter( 26 PointerWatcherEventRouter::PointerWatcherEventRouter(
27 aura::WindowTreeClient* window_tree_client) 27 aura::WindowTreeClient* window_tree_client)
28 : window_tree_client_(window_tree_client) { 28 : window_tree_client_(window_tree_client) {
29 window_tree_client->AddObserver(this); 29 window_tree_client->AddObserver(this);
30 window_tree_client_->GetCaptureClient()->AddObserver(this);
31 } 30 }
32 31
33 PointerWatcherEventRouter::~PointerWatcherEventRouter() { 32 PointerWatcherEventRouter::~PointerWatcherEventRouter() {
34 if (window_tree_client_) { 33 if (window_tree_client_)
35 window_tree_client_->RemoveObserver(this); 34 window_tree_client_->RemoveObserver(this);
36 window_tree_client_->GetCaptureClient()->RemoveObserver(this);
37 }
38 } 35 }
39 36
40 void PointerWatcherEventRouter::AddPointerWatcher(PointerWatcher* watcher, 37 void PointerWatcherEventRouter::AddPointerWatcher(PointerWatcher* watcher,
41 bool wants_moves) { 38 bool wants_moves) {
42 // Pointer watchers cannot be added multiple times. 39 // Pointer watchers cannot be added multiple times.
43 DCHECK(!move_watchers_.HasObserver(watcher)); 40 DCHECK(!move_watchers_.HasObserver(watcher));
44 DCHECK(!non_move_watchers_.HasObserver(watcher)); 41 DCHECK(!non_move_watchers_.HasObserver(watcher));
45 if (wants_moves) { 42 if (wants_moves) {
46 move_watchers_.AddObserver(watcher); 43 move_watchers_.AddObserver(watcher);
47 if (event_types_ != EventTypes::MOVE_EVENTS) { 44 if (event_types_ != EventTypes::MOVE_EVENTS) {
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
125 target_widget); 122 target_widget);
126 } 123 }
127 if (event.type() != ui::ET_POINTER_MOVED) { 124 if (event.type() != ui::ET_POINTER_MOVED) {
128 for (PointerWatcher& observer : non_move_watchers_) { 125 for (PointerWatcher& observer : non_move_watchers_) {
129 observer.OnPointerEventObserved(updated_event, location_in_screen, 126 observer.OnPointerEventObserved(updated_event, location_in_screen,
130 target_widget); 127 target_widget);
131 } 128 }
132 } 129 }
133 } 130 }
134 131
132 void PointerWatcherEventRouter::AttachToCaptureClient(
133 aura::client::CaptureClient* capture_client) {
134 capture_client->AddObserver(this);
135 }
136
137 void PointerWatcherEventRouter::DetachFromCaptureClient(
138 aura::client::CaptureClient* capture_client) {
139 capture_client->RemoveObserver(this);
140 }
141
135 PointerWatcherEventRouter::EventTypes 142 PointerWatcherEventRouter::EventTypes
136 PointerWatcherEventRouter::DetermineEventTypes() { 143 PointerWatcherEventRouter::DetermineEventTypes() {
137 if (HasPointerWatcher(&move_watchers_)) 144 if (HasPointerWatcher(&move_watchers_))
138 return EventTypes::MOVE_EVENTS; 145 return EventTypes::MOVE_EVENTS;
139 146
140 if (HasPointerWatcher(&non_move_watchers_)) 147 if (HasPointerWatcher(&non_move_watchers_))
141 return EventTypes::NON_MOVE_EVENTS; 148 return EventTypes::NON_MOVE_EVENTS;
142 149
143 return EventTypes::NONE; 150 return EventTypes::NONE;
144 } 151 }
145 152
146 void PointerWatcherEventRouter::OnCaptureChanged(aura::Window* lost_capture, 153 void PointerWatcherEventRouter::OnCaptureChanged(aura::Window* lost_capture,
147 aura::Window* gained_capture) { 154 aura::Window* gained_capture) {
148 const ui::MouseEvent mouse_event(ui::ET_MOUSE_CAPTURE_CHANGED, gfx::Point(), 155 const ui::MouseEvent mouse_event(ui::ET_MOUSE_CAPTURE_CHANGED, gfx::Point(),
149 gfx::Point(), ui::EventTimeForNow(), 0, 0); 156 gfx::Point(), ui::EventTimeForNow(), 0, 0);
150 const ui::PointerEvent event(mouse_event); 157 const ui::PointerEvent event(mouse_event);
151 gfx::Point location_in_screen = 158 gfx::Point location_in_screen =
152 display::Screen::GetScreen()->GetCursorScreenPoint(); 159 display::Screen::GetScreen()->GetCursorScreenPoint();
153 for (PointerWatcher& observer : move_watchers_) 160 for (PointerWatcher& observer : move_watchers_)
154 observer.OnPointerEventObserved(event, location_in_screen, nullptr); 161 observer.OnPointerEventObserved(event, location_in_screen, nullptr);
155 for (PointerWatcher& observer : non_move_watchers_) 162 for (PointerWatcher& observer : non_move_watchers_)
156 observer.OnPointerEventObserved(event, location_in_screen, nullptr); 163 observer.OnPointerEventObserved(event, location_in_screen, nullptr);
157 } 164 }
158 165
159 void PointerWatcherEventRouter::OnDidDestroyClient( 166 void PointerWatcherEventRouter::OnDidDestroyClient(
160 aura::WindowTreeClient* client) { 167 aura::WindowTreeClient* client) {
161 // We expect that all observers have been removed by this time. 168 // We expect that all observers have been removed by this time.
162 DCHECK_EQ(event_types_, EventTypes::NONE); 169 DCHECK_EQ(event_types_, EventTypes::NONE);
163 DCHECK_EQ(client, window_tree_client_); 170 DCHECK_EQ(client, window_tree_client_);
164 window_tree_client_->GetCaptureClient()->RemoveObserver(this);
165 window_tree_client_->RemoveObserver(this); 171 window_tree_client_->RemoveObserver(this);
166 window_tree_client_ = nullptr; 172 window_tree_client_ = nullptr;
sadrul 2017/01/30 19:37:58 It would make sense to continue to RemoveObserver
riajiang 2017/01/30 20:24:09 I thought that by the time the WindowTreeClient is
sadrul 2017/01/30 20:52:12 Oh yeah, of course. You are right.
167 } 173 }
168 174
169 } // namespace views 175 } // namespace views
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698