Chromium Code Reviews| 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 "services/ui/ws/event_dispatcher.h" | 5 #include "services/ui/ws/event_dispatcher.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/time/time.h" | 9 #include "base/time/time.h" |
| 10 #include "services/ui/ws/accelerator.h" | 10 #include "services/ui/ws/accelerator.h" |
| 11 #include "services/ui/ws/current_drag_operation.h" | |
| 12 #include "services/ui/ws/current_drag_operation_source.h" | |
| 11 #include "services/ui/ws/display.h" | 13 #include "services/ui/ws/display.h" |
| 12 #include "services/ui/ws/event_dispatcher_delegate.h" | 14 #include "services/ui/ws/event_dispatcher_delegate.h" |
| 13 #include "services/ui/ws/server_window.h" | 15 #include "services/ui/ws/server_window.h" |
| 14 #include "services/ui/ws/server_window_delegate.h" | 16 #include "services/ui/ws/server_window_delegate.h" |
| 15 #include "services/ui/ws/window_coordinate_conversions.h" | 17 #include "services/ui/ws/window_coordinate_conversions.h" |
| 16 #include "services/ui/ws/window_finder.h" | 18 #include "services/ui/ws/window_finder.h" |
| 17 #include "ui/events/event_utils.h" | 19 #include "ui/events/event_utils.h" |
| 18 #include "ui/gfx/geometry/point.h" | 20 #include "ui/gfx/geometry/point.h" |
| 19 #include "ui/gfx/geometry/point_conversions.h" | 21 #include "ui/gfx/geometry/point_conversions.h" |
| 20 | 22 |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 172 delegate_->SetNativeCapture(window); | 174 delegate_->SetNativeCapture(window); |
| 173 } else { | 175 } else { |
| 174 delegate_->ReleaseNativeCapture(); | 176 delegate_->ReleaseNativeCapture(); |
| 175 if (!mouse_button_down_) | 177 if (!mouse_button_down_) |
| 176 UpdateCursorProviderByLastKnownLocation(); | 178 UpdateCursorProviderByLastKnownLocation(); |
| 177 } | 179 } |
| 178 | 180 |
| 179 return true; | 181 return true; |
| 180 } | 182 } |
| 181 | 183 |
| 184 void EventDispatcher::SetDragDropSourceWindow( | |
| 185 CurrentDragOperationSource* drag_source, | |
| 186 ServerWindow* window, | |
| 187 mojo::Map<mojo::String, mojo::Array<uint8_t>> mime_data, | |
| 188 uint32_t drag_operations) { | |
| 189 current_drag_drop_operation_.reset(new CurrentDragOperation( | |
|
sky
2016/09/06 21:11:27
MakeUnique is the new hotness.
Should this implic
Elliot Glaysher
2016/09/07 21:42:23
The normal ash drag controller implicitly takes ca
sky
2016/09/07 23:25:29
Relying on ash to have done before calling this is
| |
| 190 drag_source, window, std::move(mime_data), drag_operations)); | |
| 191 } | |
| 192 | |
| 193 void EventDispatcher::EndDragDrop() { | |
| 194 current_drag_drop_operation_.reset(); | |
| 195 } | |
| 196 | |
| 182 void EventDispatcher::AddSystemModalWindow(ServerWindow* window) { | 197 void EventDispatcher::AddSystemModalWindow(ServerWindow* window) { |
| 183 modal_window_controller_.AddSystemModalWindow(window); | 198 modal_window_controller_.AddSystemModalWindow(window); |
| 184 } | 199 } |
| 185 | 200 |
| 186 void EventDispatcher::ReleaseCaptureBlockedByModalWindow( | 201 void EventDispatcher::ReleaseCaptureBlockedByModalWindow( |
| 187 const ServerWindow* modal_window) { | 202 const ServerWindow* modal_window) { |
| 188 if (!capture_window_) | 203 if (!capture_window_) |
| 189 return; | 204 return; |
| 190 | 205 |
| 191 if (modal_window_controller_.IsWindowBlockedBy(capture_window_, | 206 if (modal_window_controller_.IsWindowBlockedBy(capture_window_, |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 280 | 295 |
| 281 DCHECK(event.IsPointerEvent()); | 296 DCHECK(event.IsPointerEvent()); |
| 282 ProcessPointerEvent(*event.AsPointerEvent()); | 297 ProcessPointerEvent(*event.AsPointerEvent()); |
| 283 return; | 298 return; |
| 284 } | 299 } |
| 285 | 300 |
| 286 void EventDispatcher::ProcessKeyEvent(const ui::KeyEvent& event, | 301 void EventDispatcher::ProcessKeyEvent(const ui::KeyEvent& event, |
| 287 AcceleratorMatchPhase match_phase) { | 302 AcceleratorMatchPhase match_phase) { |
| 288 Accelerator* post_target = | 303 Accelerator* post_target = |
| 289 FindAccelerator(event, ui::mojom::AcceleratorPhase::POST_TARGET); | 304 FindAccelerator(event, ui::mojom::AcceleratorPhase::POST_TARGET); |
| 305 if (current_drag_drop_operation_ && event.type() == ui::ET_KEY_PRESSED && | |
| 306 event.key_code() == ui::VKEY_ESCAPE) { | |
| 307 current_drag_drop_operation_->DispatchCancel(); | |
| 308 return; | |
| 309 } | |
| 290 ServerWindow* focused_window = | 310 ServerWindow* focused_window = |
| 291 delegate_->GetFocusedWindowForEventDispatcher(); | 311 delegate_->GetFocusedWindowForEventDispatcher(); |
| 292 if (focused_window) { | 312 if (focused_window) { |
| 293 // Assume key events are for the client area. | 313 // Assume key events are for the client area. |
| 294 const bool in_nonclient_area = false; | 314 const bool in_nonclient_area = false; |
| 295 const ClientSpecificId client_id = | 315 const ClientSpecificId client_id = |
| 296 delegate_->GetEventTargetClientId(focused_window, in_nonclient_area); | 316 delegate_->GetEventTargetClientId(focused_window, in_nonclient_area); |
| 297 delegate_->DispatchInputEventToWindow(focused_window, client_id, event, | 317 delegate_->DispatchInputEventToWindow(focused_window, client_id, event, |
| 298 post_target); | 318 post_target); |
| 299 return; | 319 return; |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 321 (!is_mouse_event || IsOnlyOneMouseButtonDown(event.flags())); | 341 (!is_mouse_event || IsOnlyOneMouseButtonDown(event.flags())); |
| 322 | 342 |
| 323 // Update mouse down state upon events which change it. | 343 // Update mouse down state upon events which change it. |
| 324 if (is_mouse_event) { | 344 if (is_mouse_event) { |
| 325 if (event.type() == ui::ET_POINTER_DOWN) | 345 if (event.type() == ui::ET_POINTER_DOWN) |
| 326 mouse_button_down_ = true; | 346 mouse_button_down_ = true; |
| 327 else if (is_pointer_going_up) | 347 else if (is_pointer_going_up) |
| 328 mouse_button_down_ = false; | 348 mouse_button_down_ = false; |
| 329 } | 349 } |
| 330 | 350 |
| 351 if (current_drag_drop_operation_) { | |
| 352 const PointerTarget target = PointerTargetForEvent(event); | |
|
sky
2016/09/06 21:11:27
Won't an early return potentially leave pointer_ta
Elliot Glaysher
2016/09/07 21:42:23
Maybe I'm misunderstanding this, but why is this a
sky
2016/09/07 23:25:29
As long as you ensure capture is present, then I a
| |
| 353 current_drag_drop_operation_->DispatchLocatedEvent(event, target.window); | |
| 354 return; | |
| 355 } | |
| 356 | |
| 331 if (capture_window_) { | 357 if (capture_window_) { |
| 332 mouse_cursor_source_window_ = capture_window_; | 358 mouse_cursor_source_window_ = capture_window_; |
| 333 DispatchToClient(capture_window_, capture_window_client_id_, event); | 359 DispatchToClient(capture_window_, capture_window_client_id_, event); |
| 334 return; | 360 return; |
| 335 } | 361 } |
| 336 | 362 |
| 337 const int32_t pointer_id = event.pointer_id(); | 363 const int32_t pointer_id = event.pointer_id(); |
| 338 if (!IsTrackingPointer(pointer_id) || | 364 if (!IsTrackingPointer(pointer_id) || |
| 339 !pointer_targets_[pointer_id].is_pointer_down) { | 365 !pointer_targets_[pointer_id].is_pointer_down) { |
| 340 const bool any_pointers_down = AreAnyPointersDown(); | 366 const bool any_pointers_down = AreAnyPointersDown(); |
| (...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 558 | 584 |
| 559 void EventDispatcher::OnWindowDestroyed(ServerWindow* window) { | 585 void EventDispatcher::OnWindowDestroyed(ServerWindow* window) { |
| 560 CancelPointerEventsToTarget(window); | 586 CancelPointerEventsToTarget(window); |
| 561 | 587 |
| 562 if (mouse_cursor_source_window_ == window) | 588 if (mouse_cursor_source_window_ == window) |
| 563 mouse_cursor_source_window_ = nullptr; | 589 mouse_cursor_source_window_ = nullptr; |
| 564 } | 590 } |
| 565 | 591 |
| 566 } // namespace ws | 592 } // namespace ws |
| 567 } // namespace ui | 593 } // namespace ui |
| OLD | NEW |