OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "components/mus/ws/event_dispatcher.h" | 5 #include "components/mus/ws/event_dispatcher.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 | 8 |
9 #include "base/time/time.h" | 9 #include "base/time/time.h" |
10 #include "cc/surfaces/surface_hittest.h" | 10 #include "cc/surfaces/surface_hittest.h" |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
228 mouse_button_down_ = false; | 228 mouse_button_down_ = false; |
229 } | 229 } |
230 | 230 |
231 void EventDispatcher::SetMousePointerScreenLocation( | 231 void EventDispatcher::SetMousePointerScreenLocation( |
232 const gfx::Point& screen_location) { | 232 const gfx::Point& screen_location) { |
233 DCHECK(pointer_targets_.empty()); | 233 DCHECK(pointer_targets_.empty()); |
234 mouse_pointer_last_location_ = screen_location; | 234 mouse_pointer_last_location_ = screen_location; |
235 UpdateCursorProviderByLastKnownLocation(); | 235 UpdateCursorProviderByLastKnownLocation(); |
236 } | 236 } |
237 | 237 |
238 void EventDispatcher::SetCaptureWindow(ServerWindow* window, | 238 bool EventDispatcher::SetCaptureWindow(ServerWindow* window, |
239 bool in_nonclient_area) { | 239 bool in_nonclient_area) { |
240 if (window == capture_window_) | 240 if (window == capture_window_) |
241 return; | 241 return true; |
| 242 |
| 243 // A window that is blocked by a modal window cannot gain capture. |
| 244 if (window && window->IsBlockedByModalWindow()) |
| 245 return false; |
242 | 246 |
243 if (capture_window_) { | 247 if (capture_window_) { |
244 // Stop observing old capture window. |pointer_targets_| are cleared on | 248 // Stop observing old capture window. |pointer_targets_| are cleared on |
245 // intial setting of a capture window. | 249 // initial setting of a capture window. |
246 delegate_->OnServerWindowCaptureLost(capture_window_); | 250 delegate_->OnServerWindowCaptureLost(capture_window_); |
247 capture_window_->RemoveObserver(this); | 251 capture_window_->RemoveObserver(this); |
248 } else { | 252 } else { |
249 // Cancel implicit capture to all other windows. | 253 // Cancel implicit capture to all other windows. |
250 std::set<ServerWindow*> unobserved_windows; | 254 std::set<ServerWindow*> unobserved_windows; |
251 for (const auto& pair : pointer_targets_) { | 255 for (const auto& pair : pointer_targets_) { |
252 ServerWindow* target = pair.second.window; | 256 ServerWindow* target = pair.second.window; |
253 if (!target) | 257 if (!target) |
254 continue; | 258 continue; |
255 if (unobserved_windows.insert(target).second) | 259 if (unobserved_windows.insert(target).second) |
256 target->RemoveObserver(this); | 260 target->RemoveObserver(this); |
257 if (target == window) | 261 if (target == window) |
258 continue; | 262 continue; |
259 | 263 |
260 ui::EventType event_type = pair.second.is_mouse_event | 264 ui::EventType event_type = pair.second.is_mouse_event |
261 ? ui::ET_POINTER_EXITED | 265 ? ui::ET_POINTER_EXITED |
262 : ui::ET_POINTER_CANCELLED; | 266 : ui::ET_POINTER_CANCELLED; |
263 ui::EventPointerType pointer_type = | 267 ui::EventPointerType pointer_type = |
264 pair.second.is_mouse_event ? ui::EventPointerType::POINTER_TYPE_MOUSE | 268 pair.second.is_mouse_event ? ui::EventPointerType::POINTER_TYPE_MOUSE |
265 : ui::EventPointerType::POINTER_TYPE_TOUCH; | 269 : ui::EventPointerType::POINTER_TYPE_TOUCH; |
266 // TODO(jonross): Track previous location in PointerTarget for sending | 270 // TODO(jonross): Track previous location in PointerTarget for sending |
267 // cancels | 271 // cancels. |
268 ui::PointerEvent event(event_type, pointer_type, gfx::Point(), | 272 ui::PointerEvent event(event_type, pointer_type, gfx::Point(), |
269 gfx::Point(), ui::EF_NONE, pair.first, | 273 gfx::Point(), ui::EF_NONE, pair.first, |
270 ui::EventTimeForNow()); | 274 ui::EventTimeForNow()); |
271 DispatchToPointerTarget(pair.second, event); | 275 DispatchToPointerTarget(pair.second, event); |
272 } | 276 } |
273 pointer_targets_.clear(); | 277 pointer_targets_.clear(); |
274 } | 278 } |
275 | 279 |
276 // Begin tracking the capture window if it is not yet being observed. | 280 // Begin tracking the capture window if it is not yet being observed. |
277 if (window) { | 281 if (window) { |
278 window->AddObserver(this); | 282 window->AddObserver(this); |
279 if (!capture_window_) | 283 if (!capture_window_) |
280 delegate_->SetNativeCapture(); | 284 delegate_->SetNativeCapture(); |
281 } else { | 285 } else { |
282 delegate_->ReleaseNativeCapture(); | 286 delegate_->ReleaseNativeCapture(); |
283 if (!mouse_button_down_) | 287 if (!mouse_button_down_) |
284 UpdateCursorProviderByLastKnownLocation(); | 288 UpdateCursorProviderByLastKnownLocation(); |
285 } | 289 } |
286 | 290 |
287 capture_window_ = window; | 291 capture_window_ = window; |
288 capture_window_in_nonclient_area_ = in_nonclient_area; | 292 capture_window_in_nonclient_area_ = in_nonclient_area; |
| 293 return true; |
289 } | 294 } |
290 | 295 |
291 void EventDispatcher::UpdateCursorProviderByLastKnownLocation() { | 296 void EventDispatcher::UpdateCursorProviderByLastKnownLocation() { |
292 if (!mouse_button_down_) { | 297 if (!mouse_button_down_) { |
293 gfx::Point location = mouse_pointer_last_location_; | 298 gfx::Point location = mouse_pointer_last_location_; |
294 mouse_cursor_source_window_ = | 299 mouse_cursor_source_window_ = |
295 FindDeepestVisibleWindowForEvents(root_, surface_id_, &location); | 300 FindDeepestVisibleWindowForEvents(root_, surface_id_, &location); |
296 } | 301 } |
297 } | 302 } |
298 | 303 |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
463 // Technically we're updating in place, but calling start then stop makes for | 468 // Technically we're updating in place, but calling start then stop makes for |
464 // simpler code. | 469 // simpler code. |
465 StopTrackingPointer(pointer_id); | 470 StopTrackingPointer(pointer_id); |
466 StartTrackingPointer(pointer_id, pointer_target); | 471 StartTrackingPointer(pointer_id, pointer_target); |
467 } | 472 } |
468 | 473 |
469 EventDispatcher::PointerTarget EventDispatcher::PointerTargetForEvent( | 474 EventDispatcher::PointerTarget EventDispatcher::PointerTargetForEvent( |
470 const ui::PointerEvent& event) const { | 475 const ui::PointerEvent& event) const { |
471 PointerTarget pointer_target; | 476 PointerTarget pointer_target; |
472 gfx::Point location(event.location()); | 477 gfx::Point location(event.location()); |
473 pointer_target.window = | 478 ServerWindow* target_window = |
474 FindDeepestVisibleWindowForEvents(root_, surface_id_, &location); | 479 FindDeepestVisibleWindowForEvents(root_, surface_id_, &location); |
| 480 pointer_target.window = target_window->GetModalTarget(); |
475 pointer_target.is_mouse_event = event.IsMousePointerEvent(); | 481 pointer_target.is_mouse_event = event.IsMousePointerEvent(); |
476 pointer_target.in_nonclient_area = | 482 pointer_target.in_nonclient_area = |
| 483 target_window != pointer_target.window || |
477 IsLocationInNonclientArea(pointer_target.window, location); | 484 IsLocationInNonclientArea(pointer_target.window, location); |
478 pointer_target.is_pointer_down = event.type() == ui::ET_POINTER_DOWN; | 485 pointer_target.is_pointer_down = event.type() == ui::ET_POINTER_DOWN; |
479 return pointer_target; | 486 return pointer_target; |
480 } | 487 } |
481 | 488 |
482 bool EventDispatcher::AreAnyPointersDown() const { | 489 bool EventDispatcher::AreAnyPointersDown() const { |
483 for (const auto& pair : pointer_targets_) { | 490 for (const auto& pair : pointer_targets_) { |
484 if (pair.second.is_pointer_down) | 491 if (pair.second.is_pointer_down) |
485 return true; | 492 return true; |
486 } | 493 } |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
554 | 561 |
555 void EventDispatcher::OnWindowDestroyed(ServerWindow* window) { | 562 void EventDispatcher::OnWindowDestroyed(ServerWindow* window) { |
556 CancelPointerEventsToTarget(window); | 563 CancelPointerEventsToTarget(window); |
557 | 564 |
558 if (mouse_cursor_source_window_ == window) | 565 if (mouse_cursor_source_window_ == window) |
559 mouse_cursor_source_window_ = nullptr; | 566 mouse_cursor_source_window_ = nullptr; |
560 } | 567 } |
561 | 568 |
562 } // namespace ws | 569 } // namespace ws |
563 } // namespace mus | 570 } // namespace mus |
OLD | NEW |