Chromium Code Reviews| Index: ash/laser/laser_pointer_controller.cc |
| diff --git a/ash/laser/laser_pointer_controller.cc b/ash/laser/laser_pointer_controller.cc |
| index 35a15d04f6954179b5db5f0c8f19cf5bb1a7cb5f..df28093cdadc981f400904fea4e038b3ce29f255 100644 |
| --- a/ash/laser/laser_pointer_controller.cc |
| +++ b/ash/laser/laser_pointer_controller.cc |
| @@ -73,40 +73,38 @@ void LaserPointerController::OnMouseEvent(ui::MouseEvent* event) { |
| event->type() != ui::ET_MOUSE_RELEASED) |
| return; |
| - // Delete the LaserPointerView instance if mouse is released. |
| - if (event->type() == ui::ET_MOUSE_RELEASED) { |
| - stationary_timer_->Stop(); |
| - laser_pointer_view_->Stop(); |
| - laser_pointer_view_.reset(); |
| + aura::Window* current_window = GetCurrentRootWindow(); |
| + if (!current_window) { |
| + DestroyLaserPointerView(); |
| return; |
| } |
| - // This will handle creating the initial laser pointer view on |
| - // ET_MOUSE_PRESSED events. |
| - SwitchTargetRootWindowIfNeeded(GetCurrentRootWindow()); |
| + // Compute the event coordinate relative to the display it is currently on |
| + // (and not the one the event was captured on). |
| + gfx::Point event_location = event->root_location(); |
| + aura::Window* target = static_cast<aura::Window*>(event->target()); |
| + aura::Window* event_root = target->GetRootWindow(); |
| + aura::Window::ConvertPointToTarget(event_root, current_window, |
| + &event_location); |
| + |
| + // Start a new laser session if the mouse is pressed but not pressed over the |
| + // palette. |
| + if (event->type() == ui::ET_MOUSE_PRESSED && |
| + !PaletteContainsPointInScreen(event_location)) { |
| + DestroyLaserPointerView(); |
| + UpdateLaserPointerView(current_window, event_location, event, false); |
| + } |
| - if (laser_pointer_view_) { |
| - // Remap point from where it was captured to the display it is actually on. |
| - gfx::Point event_location = event->root_location(); |
| - aura::Window* target = static_cast<aura::Window*>(event->target()); |
| - aura::Window* event_root = target->GetRootWindow(); |
| - aura::Window::ConvertPointToTarget( |
| - event_root, laser_pointer_view_->GetRootWindow(), &event_location); |
| - |
| - current_mouse_location_ = event_location; |
| - laser_pointer_view_->AddNewPoint(current_mouse_location_); |
| + // Do not update laser if it is in the process of fading away. |
| + if (event->type() == ui::ET_MOUSE_DRAGGED && laser_pointer_view_ && |
| + !is_fading_away_) { |
| + UpdateLaserPointerView(current_window, event_location, event, true); |
| + } |
| - stationary_timer_repeat_count_ = 0; |
| - if (event->type() == ui::ET_MOUSE_DRAGGED) { |
| - // Start the timer to add stationary points if dragged. |
| - if (!stationary_timer_->IsRunning()) |
| - stationary_timer_->Reset(); |
| - } |
| - |
| - // If the stylus is over the palette icon or widget, do not consume the |
| - // event. |
| - if (!PaletteContainsPointInScreen(current_mouse_location_)) |
| - event->StopPropagation(); |
| + if (event->type() == ui::ET_MOUSE_RELEASED && laser_pointer_view_ && |
| + !is_fading_away_) { |
| + is_fading_away_ = true; |
| + UpdateLaserPointerView(current_window, event_location, event, true); |
| } |
| } |
| @@ -117,8 +115,7 @@ void LaserPointerController::OnWindowDestroying(aura::Window* window) { |
| void LaserPointerController::SwitchTargetRootWindowIfNeeded( |
| aura::Window* root_window) { |
| if (!root_window) { |
| - stationary_timer_->Stop(); |
| - laser_pointer_view_.reset(); |
| + DestroyLaserPointerView(); |
| } else if (laser_pointer_view_) { |
| laser_pointer_view_->ReparentWidget(root_window); |
| } else if (enabled_) { |
| @@ -127,13 +124,47 @@ void LaserPointerController::SwitchTargetRootWindowIfNeeded( |
| } |
| } |
| -void LaserPointerController::AddStationaryPoint() { |
| +void LaserPointerController::UpdateLaserPointerView( |
| + aura::Window* current_window, |
| + const gfx::Point& event_location, |
| + ui::MouseEvent* event, |
| + bool start_timer) { |
| + SwitchTargetRootWindowIfNeeded(current_window); |
| + current_mouse_location_ = event_location; |
| laser_pointer_view_->AddNewPoint(current_mouse_location_); |
| + if (start_timer) { |
|
jdufault
2016/10/14 19:13:09
Instead of having a boolean why not just extract t
sammiequon
2016/10/14 21:29:32
Done.
|
| + stationary_timer_repeat_count_ = 0; |
| + if (!stationary_timer_->IsRunning()) |
| + stationary_timer_->Reset(); |
| + } |
| + event->StopPropagation(); |
| +} |
| + |
| +void LaserPointerController::DestroyLaserPointerView() { |
| + // |stationary_timer_| should also be stopped so that it does not attempt to |
| + // add points when |laser_pointer_view_| is null. |
| + stationary_timer_->Stop(); |
| + if (laser_pointer_view_) { |
| + is_fading_away_ = false; |
| + laser_pointer_view_.reset(); |
| + } |
| +} |
| + |
| +void LaserPointerController::AddStationaryPoint() { |
| + if (is_fading_away_) |
| + laser_pointer_view_->UpdateTime(); |
| + else |
| + laser_pointer_view_->AddNewPoint(current_mouse_location_); |
| + |
| // We can stop repeating the timer once the mouse has been stationary for |
| // longer than the life of a point. |
| if (stationary_timer_repeat_count_ * kAddStationaryPointsDelayMs >= |
| kPointLifeDurationMs) { |
| stationary_timer_->Stop(); |
| + // Reset the view if the timer expires and the view was in process of fading |
| + // away. |
| + if (is_fading_away_) |
| + DestroyLaserPointerView(); |
| } |
| stationary_timer_repeat_count_++; |
| } |