| OLD | NEW |
| 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 "services/ui/ws/window_manager_state.h" | 5 #include "services/ui/ws/window_manager_state.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/memory/weak_ptr.h" | 10 #include "base/memory/weak_ptr.h" |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 65 const ServerWindow* GetEmbedRoot(const ServerWindow* window) { | 65 const ServerWindow* GetEmbedRoot(const ServerWindow* window) { |
| 66 DCHECK(window); | 66 DCHECK(window); |
| 67 const ServerWindow* embed_root = window->parent(); | 67 const ServerWindow* embed_root = window->parent(); |
| 68 while (embed_root && embed_root->id().client_id == window->id().client_id) | 68 while (embed_root && embed_root->id().client_id == window->id().client_id) |
| 69 embed_root = embed_root->parent(); | 69 embed_root = embed_root->parent(); |
| 70 return embed_root; | 70 return embed_root; |
| 71 } | 71 } |
| 72 | 72 |
| 73 } // namespace | 73 } // namespace |
| 74 | 74 |
| 75 WindowManagerState::InFlightEventDetails::InFlightEventDetails( | 75 WindowManagerState::InFlightEventDispatchDetails::InFlightEventDispatchDetails( |
| 76 WindowManagerState* window_manager_state, | 76 WindowManagerState* window_manager_state, |
| 77 WindowTree* tree, | 77 WindowTree* tree, |
| 78 int64_t display_id, | 78 int64_t display_id, |
| 79 const Event& event, | 79 const Event& event, |
| 80 EventDispatchPhase phase) | 80 EventDispatchPhase phase) |
| 81 : tree(tree), | 81 : tree(tree), |
| 82 display_id(display_id), | 82 display_id(display_id), |
| 83 event(Event::Clone(event)), | 83 event(Event::Clone(event)), |
| 84 phase(phase), | 84 phase(phase), |
| 85 weak_factory(window_manager_state) {} | 85 weak_factory(window_manager_state) {} |
| 86 | 86 |
| 87 WindowManagerState::InFlightEventDetails::~InFlightEventDetails() {} | 87 WindowManagerState::InFlightEventDispatchDetails:: |
| 88 ~InFlightEventDispatchDetails() {} |
| 88 | 89 |
| 89 class WindowManagerState::ProcessedEventTarget { | 90 class WindowManagerState::ProcessedEventTarget { |
| 90 public: | 91 public: |
| 91 ProcessedEventTarget(ServerWindow* window, | 92 ProcessedEventTarget(ServerWindow* window, |
| 92 ClientSpecificId client_id, | 93 ClientSpecificId client_id, |
| 93 Accelerator* accelerator) | 94 Accelerator* accelerator) |
| 94 : client_id_(client_id) { | 95 : client_id_(client_id) { |
| 95 tracker_.Add(window); | 96 tracker_.Add(window); |
| 96 if (accelerator) | 97 if (accelerator) |
| 97 accelerator_ = accelerator->GetWeakPtr(); | 98 accelerator_ = accelerator->GetWeakPtr(); |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 185 event_dispatcher_.ReleaseCaptureBlockedByAnyModalWindow(); | 186 event_dispatcher_.ReleaseCaptureBlockedByAnyModalWindow(); |
| 186 } | 187 } |
| 187 | 188 |
| 188 void WindowManagerState::SetDragDropSourceWindow( | 189 void WindowManagerState::SetDragDropSourceWindow( |
| 189 DragSource* drag_source, | 190 DragSource* drag_source, |
| 190 ServerWindow* window, | 191 ServerWindow* window, |
| 191 DragTargetConnection* source_connection, | 192 DragTargetConnection* source_connection, |
| 192 const std::unordered_map<std::string, std::vector<uint8_t>>& drag_data, | 193 const std::unordered_map<std::string, std::vector<uint8_t>>& drag_data, |
| 193 uint32_t drag_operation) { | 194 uint32_t drag_operation) { |
| 194 int32_t drag_pointer = MouseEvent::kMousePointerId; | 195 int32_t drag_pointer = MouseEvent::kMousePointerId; |
| 195 if (in_flight_event_details_ && | 196 if (in_flight_event_dispatch_details_ && |
| 196 in_flight_event_details_->event->IsPointerEvent()) { | 197 in_flight_event_dispatch_details_->event->IsPointerEvent()) { |
| 197 drag_pointer = | 198 drag_pointer = in_flight_event_dispatch_details_->event->AsPointerEvent() |
| 198 in_flight_event_details_->event->AsPointerEvent()->pointer_details().id; | 199 ->pointer_details() |
| 200 .id; |
| 199 } else { | 201 } else { |
| 200 NOTIMPLEMENTED() << "Set drag drop set up during something other than a " | 202 NOTIMPLEMENTED() << "Set drag drop set up during something other than a " |
| 201 << "pointer event; rejecting drag."; | 203 << "pointer event; rejecting drag."; |
| 202 drag_source->OnDragCompleted(false, ui::mojom::kDropEffectNone); | 204 drag_source->OnDragCompleted(false, ui::mojom::kDropEffectNone); |
| 203 return; | 205 return; |
| 204 } | 206 } |
| 205 | 207 |
| 206 event_dispatcher_.SetDragDropSourceWindow(drag_source, window, | 208 event_dispatcher_.SetDragDropSourceWindow(drag_source, window, |
| 207 source_connection, drag_pointer, | 209 source_connection, drag_pointer, |
| 208 drag_data, drag_operation); | 210 drag_data, drag_operation); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 243 NOTREACHED(); | 245 NOTREACHED(); |
| 244 } | 246 } |
| 245 | 247 |
| 246 const UserId& WindowManagerState::user_id() const { | 248 const UserId& WindowManagerState::user_id() const { |
| 247 return window_tree_->user_id(); | 249 return window_tree_->user_id(); |
| 248 } | 250 } |
| 249 | 251 |
| 250 void WindowManagerState::OnWillDestroyTree(WindowTree* tree) { | 252 void WindowManagerState::OnWillDestroyTree(WindowTree* tree) { |
| 251 event_dispatcher_.OnWillDestroyDragTargetConnection(tree); | 253 event_dispatcher_.OnWillDestroyDragTargetConnection(tree); |
| 252 | 254 |
| 253 if (!in_flight_event_details_ || in_flight_event_details_->tree != tree) | 255 if (!in_flight_event_dispatch_details_ || |
| 256 in_flight_event_dispatch_details_->tree != tree) |
| 254 return; | 257 return; |
| 255 | 258 |
| 256 // The WindowTree is dying. So it's not going to ack the event. | 259 // The WindowTree is dying. So it's not going to ack the event. |
| 257 // If the dying tree matches the root |tree_| mark as handled so we don't | 260 // If the dying tree matches the root |tree_| mark as handled so we don't |
| 258 // notify it of accelerators. | 261 // notify it of accelerators. |
| 259 OnEventAck(in_flight_event_details_->tree, | 262 OnEventAck(in_flight_event_dispatch_details_->tree, |
| 260 tree == window_tree_ ? mojom::EventResult::HANDLED | 263 tree == window_tree_ ? mojom::EventResult::HANDLED |
| 261 : mojom::EventResult::UNHANDLED); | 264 : mojom::EventResult::UNHANDLED); |
| 262 } | 265 } |
| 263 | 266 |
| 264 ServerWindow* WindowManagerState::GetOrphanedRootWithId(const WindowId& id) { | 267 ServerWindow* WindowManagerState::GetOrphanedRootWithId(const WindowId& id) { |
| 265 for (auto& display_root_ptr : orphaned_window_manager_display_roots_) { | 268 for (auto& display_root_ptr : orphaned_window_manager_display_roots_) { |
| 266 if (display_root_ptr->root()->id() == id) | 269 if (display_root_ptr->root()->id() == id) |
| 267 return display_root_ptr->root(); | 270 return display_root_ptr->root(); |
| 268 } | 271 } |
| 269 return nullptr; | 272 return nullptr; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 285 // The tree is no longer active, so no point in dispatching any further | 288 // The tree is no longer active, so no point in dispatching any further |
| 286 // events. | 289 // events. |
| 287 std::queue<std::unique_ptr<QueuedEvent>> event_queue; | 290 std::queue<std::unique_ptr<QueuedEvent>> event_queue; |
| 288 event_queue.swap(event_queue_); | 291 event_queue.swap(event_queue_); |
| 289 } | 292 } |
| 290 | 293 |
| 291 void WindowManagerState::ProcessEvent(const ui::Event& event, | 294 void WindowManagerState::ProcessEvent(const ui::Event& event, |
| 292 int64_t display_id) { | 295 int64_t display_id) { |
| 293 // If this is still waiting for an ack from a previously sent event, then | 296 // If this is still waiting for an ack from a previously sent event, then |
| 294 // queue up the event to be dispatched once the ack is received. | 297 // queue up the event to be dispatched once the ack is received. |
| 295 if (in_flight_event_details_) { | 298 if (event_dispatcher_.IsHitTestInFlight() || |
| 299 in_flight_event_dispatch_details_) { |
| 296 if (!event_queue_.empty() && !event_queue_.back()->processed_target && | 300 if (!event_queue_.empty() && !event_queue_.back()->processed_target && |
| 297 EventsCanBeCoalesced(*event_queue_.back()->event, event)) { | 301 EventsCanBeCoalesced(*event_queue_.back()->event, event)) { |
| 298 event_queue_.back()->event = CoalesceEvents( | 302 event_queue_.back()->event = CoalesceEvents( |
| 299 std::move(event_queue_.back()->event), ui::Event::Clone(event)); | 303 std::move(event_queue_.back()->event), ui::Event::Clone(event)); |
| 300 event_queue_.back()->display_id = display_id; | 304 event_queue_.back()->display_id = display_id; |
| 301 return; | 305 return; |
| 302 } | 306 } |
| 303 QueueEvent(event, nullptr, display_id); | 307 QueueEvent(event, nullptr, display_id); |
| 304 return; | 308 return; |
| 305 } | 309 } |
| 306 | 310 |
| 307 ProcessEventImpl(event, display_id); | 311 ProcessEventImpl(event, display_id); |
| 308 } | 312 } |
| 309 | 313 |
| 310 void WindowManagerState::OnAcceleratorAck( | 314 void WindowManagerState::OnAcceleratorAck( |
| 311 mojom::EventResult result, | 315 mojom::EventResult result, |
| 312 const std::unordered_map<std::string, std::vector<uint8_t>>& properties) { | 316 const std::unordered_map<std::string, std::vector<uint8_t>>& properties) { |
| 313 DCHECK(in_flight_event_details_); | 317 DCHECK(in_flight_event_dispatch_details_); |
| 314 DCHECK_EQ(EventDispatchPhase::PRE_TARGET_ACCELERATOR, | 318 DCHECK_EQ(EventDispatchPhase::PRE_TARGET_ACCELERATOR, |
| 315 in_flight_event_details_->phase); | 319 in_flight_event_dispatch_details_->phase); |
| 316 | 320 |
| 317 std::unique_ptr<InFlightEventDetails> details = | 321 std::unique_ptr<InFlightEventDispatchDetails> details = |
| 318 std::move(in_flight_event_details_); | 322 std::move(in_flight_event_dispatch_details_); |
| 319 | 323 |
| 320 if (result == mojom::EventResult::UNHANDLED) { | 324 if (result == mojom::EventResult::UNHANDLED) { |
| 321 DCHECK(details->event->IsKeyEvent()); | 325 DCHECK(details->event->IsKeyEvent()); |
| 322 if (!properties.empty()) | 326 if (!properties.empty()) |
| 323 details->event->AsKeyEvent()->SetProperties(properties); | 327 details->event->AsKeyEvent()->SetProperties(properties); |
| 324 event_processing_display_id_ = details->display_id; | 328 event_processing_display_id_ = details->display_id; |
| 325 event_dispatcher_.ProcessEvent( | 329 event_dispatcher_.ProcessEvent( |
| 326 *details->event, EventDispatcher::AcceleratorMatchPhase::POST_ONLY); | 330 *details->event, EventDispatcher::AcceleratorMatchPhase::POST_ONLY); |
| 327 } else { | 331 } else { |
| 328 // We're not going to process the event any further, notify event observers. | 332 // We're not going to process the event any further, notify event observers. |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 382 for (auto& display_root_ptr : window_manager_display_roots_) { | 386 for (auto& display_root_ptr : window_manager_display_roots_) { |
| 383 if (display_root_ptr->root()->parent() == window) | 387 if (display_root_ptr->root()->parent() == window) |
| 384 return display_root_ptr->GetClientVisibleRoot(); | 388 return display_root_ptr->GetClientVisibleRoot(); |
| 385 } | 389 } |
| 386 NOTREACHED(); | 390 NOTREACHED(); |
| 387 return nullptr; | 391 return nullptr; |
| 388 } | 392 } |
| 389 | 393 |
| 390 void WindowManagerState::OnEventAck(mojom::WindowTree* tree, | 394 void WindowManagerState::OnEventAck(mojom::WindowTree* tree, |
| 391 mojom::EventResult result) { | 395 mojom::EventResult result) { |
| 392 DCHECK(in_flight_event_details_); | 396 DCHECK(in_flight_event_dispatch_details_); |
| 393 std::unique_ptr<InFlightEventDetails> details = | 397 std::unique_ptr<InFlightEventDispatchDetails> details = |
| 394 std::move(in_flight_event_details_); | 398 std::move(in_flight_event_dispatch_details_); |
| 395 | 399 |
| 396 if (result == mojom::EventResult::UNHANDLED && | 400 if (result == mojom::EventResult::UNHANDLED && |
| 397 details->post_target_accelerator) { | 401 details->post_target_accelerator) { |
| 398 OnAccelerator(details->post_target_accelerator->id(), *details->event, | 402 OnAccelerator(details->post_target_accelerator->id(), *details->event, |
| 399 AcceleratorPhase::POST); | 403 AcceleratorPhase::POST); |
| 400 } | 404 } |
| 401 | 405 |
| 402 ProcessNextEventFromQueue(); | 406 ProcessNextEventFromQueue(); |
| 403 } | 407 } |
| 404 | 408 |
| 405 void WindowManagerState::OnEventAckTimeout(ClientSpecificId client_id) { | 409 void WindowManagerState::OnEventAckTimeout(ClientSpecificId client_id) { |
| 406 WindowTree* hung_tree = window_server()->GetTreeWithId(client_id); | 410 WindowTree* hung_tree = window_server()->GetTreeWithId(client_id); |
| 407 if (hung_tree && !hung_tree->janky()) | 411 if (hung_tree && !hung_tree->janky()) |
| 408 window_tree_->ClientJankinessChanged(hung_tree); | 412 window_tree_->ClientJankinessChanged(hung_tree); |
| 409 if (in_flight_event_details_->phase == | 413 if (in_flight_event_dispatch_details_->phase == |
| 410 EventDispatchPhase::PRE_TARGET_ACCELERATOR) { | 414 EventDispatchPhase::PRE_TARGET_ACCELERATOR) { |
| 411 OnAcceleratorAck(mojom::EventResult::UNHANDLED, KeyEvent::Properties()); | 415 OnAcceleratorAck(mojom::EventResult::UNHANDLED, KeyEvent::Properties()); |
| 412 } else { | 416 } else { |
| 413 OnEventAck(in_flight_event_details_->tree, mojom::EventResult::UNHANDLED); | 417 OnEventAck(in_flight_event_dispatch_details_->tree, |
| 418 mojom::EventResult::UNHANDLED); |
| 414 } | 419 } |
| 415 } | 420 } |
| 416 | 421 |
| 417 void WindowManagerState::ProcessEventImpl(const ui::Event& event, | 422 void WindowManagerState::ProcessEventImpl(const ui::Event& event, |
| 418 int64_t display_id) { | 423 int64_t display_id) { |
| 424 DCHECK(!in_flight_event_dispatch_details_ && |
| 425 !event_dispatcher_.IsHitTestInFlight()); |
| 419 // Debug accelerators are always checked and don't interfere with processing. | 426 // Debug accelerators are always checked and don't interfere with processing. |
| 420 ProcessDebugAccelerator(event); | 427 ProcessDebugAccelerator(event); |
| 421 event_processing_display_id_ = display_id; | 428 event_processing_display_id_ = display_id; |
| 422 event_dispatcher_.ProcessEvent(event, | 429 event_dispatcher_.ProcessEvent(event, |
| 423 EventDispatcher::AcceleratorMatchPhase::ANY); | 430 EventDispatcher::AcceleratorMatchPhase::ANY); |
| 424 } | 431 } |
| 425 | 432 |
| 426 void WindowManagerState::QueueEvent( | 433 void WindowManagerState::QueueEvent( |
| 427 const ui::Event& event, | 434 const ui::Event& event, |
| 428 std::unique_ptr<ProcessedEventTarget> processed_event_target, | 435 std::unique_ptr<ProcessedEventTarget> processed_event_target, |
| 429 int64_t display_id) { | 436 int64_t display_id) { |
| 430 std::unique_ptr<QueuedEvent> queued_event(new QueuedEvent); | 437 std::unique_ptr<QueuedEvent> queued_event(new QueuedEvent); |
| 431 queued_event->event = ui::Event::Clone(event); | 438 queued_event->event = ui::Event::Clone(event); |
| 432 queued_event->processed_target = std::move(processed_event_target); | 439 queued_event->processed_target = std::move(processed_event_target); |
| 433 queued_event->display_id = display_id; | 440 queued_event->display_id = display_id; |
| 434 event_queue_.push(std::move(queued_event)); | 441 event_queue_.push(std::move(queued_event)); |
| 435 } | 442 } |
| 436 | 443 |
| 437 void WindowManagerState::ProcessNextEventFromQueue() { | 444 // TODO(riajiang): We might want to do event targeting for the next event while |
| 438 // Loop through |event_queue_| stopping after dispatching the first valid | 445 // waiting for the current event to be dispatched. crbug.com/724521 |
| 439 // event. | |
| 440 while (!event_queue_.empty()) { | |
| 441 std::unique_ptr<QueuedEvent> queued_event = std::move(event_queue_.front()); | |
| 442 event_queue_.pop(); | |
| 443 if (!queued_event->processed_target) { | |
| 444 ProcessEventImpl(*queued_event->event, queued_event->display_id); | |
| 445 return; | |
| 446 } | |
| 447 if (queued_event->processed_target->IsValid()) { | |
| 448 DispatchInputEventToWindowImpl( | |
| 449 queued_event->processed_target->window(), | |
| 450 queued_event->processed_target->client_id(), *queued_event->event, | |
| 451 queued_event->processed_target->accelerator()); | |
| 452 return; | |
| 453 } | |
| 454 } | |
| 455 } | |
| 456 | |
| 457 void WindowManagerState::DispatchInputEventToWindowImpl( | 446 void WindowManagerState::DispatchInputEventToWindowImpl( |
| 458 ServerWindow* target, | 447 ServerWindow* target, |
| 459 ClientSpecificId client_id, | 448 ClientSpecificId client_id, |
| 460 const ui::Event& event, | 449 const ui::Event& event, |
| 461 base::WeakPtr<Accelerator> accelerator) { | 450 base::WeakPtr<Accelerator> accelerator) { |
| 451 DCHECK(!in_flight_event_dispatch_details_); |
| 462 DCHECK(target); | 452 DCHECK(target); |
| 463 if (target->parent() == nullptr) | 453 if (target->parent() == nullptr) |
| 464 target = GetWindowManagerRootForDisplayRoot(target); | 454 target = GetWindowManagerRootForDisplayRoot(target); |
| 465 | 455 |
| 466 if (event.IsMousePointerEvent()) { | 456 if (event.IsMousePointerEvent()) { |
| 467 DCHECK(event_dispatcher_.mouse_cursor_source_window()); | 457 DCHECK(event_dispatcher_.mouse_cursor_source_window()); |
| 468 UpdateNativeCursorFromDispatcher(); | 458 UpdateNativeCursorFromDispatcher(); |
| 469 } | 459 } |
| 470 | 460 |
| 471 WindowTree* tree = window_server()->GetTreeWithId(client_id); | 461 WindowTree* tree = window_server()->GetTreeWithId(client_id); |
| 472 DCHECK(tree); | 462 DCHECK(tree); |
| 473 ScheduleInputEventTimeout(tree, target, event, EventDispatchPhase::TARGET); | 463 ScheduleInputEventTimeout(tree, target, event, EventDispatchPhase::TARGET); |
| 474 in_flight_event_details_->post_target_accelerator = accelerator; | 464 in_flight_event_dispatch_details_->post_target_accelerator = accelerator; |
| 475 | 465 |
| 476 // Ignore |tree| because it will receive the event via normal dispatch. | 466 // Ignore |tree| because it will receive the event via normal dispatch. |
| 477 window_server()->SendToPointerWatchers(event, user_id(), target, tree, | 467 window_server()->SendToPointerWatchers( |
| 478 in_flight_event_details_->display_id); | 468 event, user_id(), target, tree, |
| 469 in_flight_event_dispatch_details_->display_id); |
| 479 | 470 |
| 480 tree->DispatchInputEvent( | 471 tree->DispatchInputEvent( |
| 481 target, event, | 472 target, event, |
| 482 base::BindOnce(&WindowManagerState::OnEventAck, | 473 base::BindOnce( |
| 483 in_flight_event_details_->weak_factory.GetWeakPtr(), | 474 &WindowManagerState::OnEventAck, |
| 484 tree)); | 475 in_flight_event_dispatch_details_->weak_factory.GetWeakPtr(), tree)); |
| 485 } | 476 } |
| 486 | 477 |
| 487 void WindowManagerState::AddDebugAccelerators() { | 478 void WindowManagerState::AddDebugAccelerators() { |
| 488 const DebugAccelerator accelerator = { | 479 const DebugAccelerator accelerator = { |
| 489 DebugAcceleratorType::PRINT_WINDOWS, ui::VKEY_S, | 480 DebugAcceleratorType::PRINT_WINDOWS, ui::VKEY_S, |
| 490 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN}; | 481 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN}; |
| 491 debug_accelerators_.push_back(accelerator); | 482 debug_accelerators_.push_back(accelerator); |
| 492 } | 483 } |
| 493 | 484 |
| 494 void WindowManagerState::ProcessDebugAccelerator(const ui::Event& event) { | 485 void WindowManagerState::ProcessDebugAccelerator(const ui::Event& event) { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 518 ServerWindow* focused_window = GetFocusedWindowForEventDispatcher(); | 509 ServerWindow* focused_window = GetFocusedWindowForEventDispatcher(); |
| 519 LOG(ERROR) << "Focused window: " | 510 LOG(ERROR) << "Focused window: " |
| 520 << (focused_window ? focused_window->id().ToString() : "(null)"); | 511 << (focused_window ? focused_window->id().ToString() : "(null)"); |
| 521 #endif | 512 #endif |
| 522 } | 513 } |
| 523 | 514 |
| 524 void WindowManagerState::ScheduleInputEventTimeout(WindowTree* tree, | 515 void WindowManagerState::ScheduleInputEventTimeout(WindowTree* tree, |
| 525 ServerWindow* target, | 516 ServerWindow* target, |
| 526 const Event& event, | 517 const Event& event, |
| 527 EventDispatchPhase phase) { | 518 EventDispatchPhase phase) { |
| 528 std::unique_ptr<InFlightEventDetails> details = | 519 std::unique_ptr<InFlightEventDispatchDetails> details = |
| 529 base::MakeUnique<InFlightEventDetails>( | 520 base::MakeUnique<InFlightEventDispatchDetails>( |
| 530 this, tree, event_processing_display_id_, event, phase); | 521 this, tree, event_processing_display_id_, event, phase); |
| 531 | 522 |
| 532 // TOOD(sad): Adjust this delay, possibly make this dynamic. | 523 // TOOD(sad): Adjust this delay, possibly make this dynamic. |
| 533 const base::TimeDelta max_delay = base::debug::BeingDebugged() | 524 const base::TimeDelta max_delay = base::debug::BeingDebugged() |
| 534 ? base::TimeDelta::FromDays(1) | 525 ? base::TimeDelta::FromDays(1) |
| 535 : GetDefaultAckTimerDelay(); | 526 : GetDefaultAckTimerDelay(); |
| 536 details->timer.Start( | 527 details->timer.Start( |
| 537 FROM_HERE, max_delay, | 528 FROM_HERE, max_delay, |
| 538 base::Bind(&WindowManagerState::OnEventAckTimeout, | 529 base::Bind(&WindowManagerState::OnEventAckTimeout, |
| 539 details->weak_factory.GetWeakPtr(), tree->id())); | 530 details->weak_factory.GetWeakPtr(), tree->id())); |
| 540 in_flight_event_details_ = std::move(details); | 531 in_flight_event_dispatch_details_ = std::move(details); |
| 541 } | 532 } |
| 542 | 533 |
| 543 //////////////////////////////////////////////////////////////////////////////// | 534 //////////////////////////////////////////////////////////////////////////////// |
| 544 // EventDispatcherDelegate: | 535 // EventDispatcherDelegate: |
| 545 | 536 |
| 546 void WindowManagerState::OnAccelerator(uint32_t accelerator_id, | 537 void WindowManagerState::OnAccelerator(uint32_t accelerator_id, |
| 547 const ui::Event& event, | 538 const ui::Event& event, |
| 548 AcceleratorPhase phase) { | 539 AcceleratorPhase phase) { |
| 549 DCHECK(IsActive()); | 540 DCHECK(IsActive()); |
| 550 const bool needs_ack = phase == AcceleratorPhase::PRE; | 541 const bool needs_ack = phase == AcceleratorPhase::PRE; |
| 551 WindowTree::AcceleratorCallback ack_callback; | 542 WindowTree::AcceleratorCallback ack_callback; |
| 552 if (needs_ack) { | 543 if (needs_ack) { |
| 553 DCHECK(!in_flight_event_details_); | 544 DCHECK(!in_flight_event_dispatch_details_); |
| 554 ScheduleInputEventTimeout(window_tree_, nullptr, event, | 545 ScheduleInputEventTimeout(window_tree_, nullptr, event, |
| 555 EventDispatchPhase::PRE_TARGET_ACCELERATOR); | 546 EventDispatchPhase::PRE_TARGET_ACCELERATOR); |
| 556 ack_callback = | 547 ack_callback = base::BindOnce( |
| 557 base::BindOnce(&WindowManagerState::OnAcceleratorAck, | 548 &WindowManagerState::OnAcceleratorAck, |
| 558 in_flight_event_details_->weak_factory.GetWeakPtr()); | 549 in_flight_event_dispatch_details_->weak_factory.GetWeakPtr()); |
| 559 } | 550 } |
| 560 window_tree_->OnAccelerator(accelerator_id, event, std::move(ack_callback)); | 551 window_tree_->OnAccelerator(accelerator_id, event, std::move(ack_callback)); |
| 561 } | 552 } |
| 562 | 553 |
| 563 void WindowManagerState::SetFocusedWindowFromEventDispatcher( | 554 void WindowManagerState::SetFocusedWindowFromEventDispatcher( |
| 564 ServerWindow* new_focused_window) { | 555 ServerWindow* new_focused_window) { |
| 565 DCHECK(IsActive()); | 556 DCHECK(IsActive()); |
| 566 window_server()->SetFocusedWindow(new_focused_window); | 557 window_server()->SetFocusedWindow(new_focused_window); |
| 567 } | 558 } |
| 568 | 559 |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 618 ->OnMouseCursorLocationChanged(point); | 609 ->OnMouseCursorLocationChanged(point); |
| 619 } | 610 } |
| 620 | 611 |
| 621 void WindowManagerState::DispatchInputEventToWindow(ServerWindow* target, | 612 void WindowManagerState::DispatchInputEventToWindow(ServerWindow* target, |
| 622 ClientSpecificId client_id, | 613 ClientSpecificId client_id, |
| 623 const ui::Event& event, | 614 const ui::Event& event, |
| 624 Accelerator* accelerator) { | 615 Accelerator* accelerator) { |
| 625 DCHECK(IsActive()); | 616 DCHECK(IsActive()); |
| 626 // TODO(sky): this needs to see if another wms has capture and if so forward | 617 // TODO(sky): this needs to see if another wms has capture and if so forward |
| 627 // to it. | 618 // to it. |
| 628 if (in_flight_event_details_) { | 619 if (in_flight_event_dispatch_details_) { |
| 629 std::unique_ptr<ProcessedEventTarget> processed_event_target( | 620 std::unique_ptr<ProcessedEventTarget> processed_event_target( |
| 630 new ProcessedEventTarget(target, client_id, accelerator)); | 621 new ProcessedEventTarget(target, client_id, accelerator)); |
| 631 QueueEvent(event, std::move(processed_event_target), | 622 QueueEvent(event, std::move(processed_event_target), |
| 632 event_processing_display_id_); | 623 event_processing_display_id_); |
| 633 return; | 624 return; |
| 634 } | 625 } |
| 635 | 626 |
| 636 base::WeakPtr<Accelerator> weak_accelerator; | 627 base::WeakPtr<Accelerator> weak_accelerator; |
| 637 if (accelerator) | 628 if (accelerator) |
| 638 weak_accelerator = accelerator->GetWeakPtr(); | 629 weak_accelerator = accelerator->GetWeakPtr(); |
| 639 DispatchInputEventToWindowImpl(target, client_id, event, weak_accelerator); | 630 DispatchInputEventToWindowImpl(target, client_id, event, weak_accelerator); |
| 640 } | 631 } |
| 641 | 632 |
| 633 void WindowManagerState::ProcessNextEventFromQueue() { |
| 634 // Loop through |event_queue_| stopping after dispatching the first valid |
| 635 // event. |
| 636 while (!event_queue_.empty()) { |
| 637 if (in_flight_event_dispatch_details_) |
| 638 return; |
| 639 |
| 640 if (!event_queue_.front()->processed_target && |
| 641 event_dispatcher_.IsHitTestInFlight()) |
| 642 return; |
| 643 |
| 644 std::unique_ptr<QueuedEvent> queued_event = std::move(event_queue_.front()); |
| 645 event_queue_.pop(); |
| 646 if (!queued_event->processed_target) { |
| 647 ProcessEventImpl(*queued_event->event, queued_event->display_id); |
| 648 return; |
| 649 } |
| 650 if (queued_event->processed_target->IsValid()) { |
| 651 DispatchInputEventToWindowImpl( |
| 652 queued_event->processed_target->window(), |
| 653 queued_event->processed_target->client_id(), *queued_event->event, |
| 654 queued_event->processed_target->accelerator()); |
| 655 return; |
| 656 } |
| 657 } |
| 658 } |
| 659 |
| 642 ClientSpecificId WindowManagerState::GetEventTargetClientId( | 660 ClientSpecificId WindowManagerState::GetEventTargetClientId( |
| 643 const ServerWindow* window, | 661 const ServerWindow* window, |
| 644 bool in_nonclient_area) { | 662 bool in_nonclient_area) { |
| 645 if (in_nonclient_area) { | 663 if (in_nonclient_area) { |
| 646 // Events in the non-client area always go to the window manager. | 664 // Events in the non-client area always go to the window manager. |
| 647 return window_tree_->id(); | 665 return window_tree_->id(); |
| 648 } | 666 } |
| 649 | 667 |
| 650 // If the window is an embed root, it goes to the tree embedded in the window. | 668 // If the window is an embed root, it goes to the tree embedded in the window. |
| 651 WindowTree* tree = window_server()->GetTreeWithRoot(window); | 669 WindowTree* tree = window_server()->GetTreeWithRoot(window); |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 713 window->RemoveObserver(this); | 731 window->RemoveObserver(this); |
| 714 orphaned_window_manager_display_roots_.erase(iter); | 732 orphaned_window_manager_display_roots_.erase(iter); |
| 715 return; | 733 return; |
| 716 } | 734 } |
| 717 } | 735 } |
| 718 NOTREACHED(); | 736 NOTREACHED(); |
| 719 } | 737 } |
| 720 | 738 |
| 721 } // namespace ws | 739 } // namespace ws |
| 722 } // namespace ui | 740 } // namespace ui |
| OLD | NEW |