Chromium Code Reviews| Index: ui/views/corewm/tooltip_controller.cc |
| diff --git a/ui/views/corewm/tooltip_controller.cc b/ui/views/corewm/tooltip_controller.cc |
| index 500466fdf4d646c69ccba8f31c98ef85a8f9496c..9cb56c2cf76f4e732dcb2bb91722c8b6c20db02d 100644 |
| --- a/ui/views/corewm/tooltip_controller.cc |
| +++ b/ui/views/corewm/tooltip_controller.cc |
| @@ -28,6 +28,10 @@ namespace { |
| const int kTooltipTimeoutMs = 500; |
| const int kDefaultTooltipShownTimeoutMs = 10000; |
| +// Delay mouse events so that they are dispatched if there are no mouse location |
| +// events pending. Even a short delay delays them until the mouse is steady. |
| +const int kMouseMoveDelay = 10; |
| + |
| // Returns true if |target| is a valid window to get the tooltip from. |
| // |event_target| is the original target from the event and |target| the window |
| // at the same location. |
| @@ -46,9 +50,10 @@ bool IsValidTarget(aura::Window* event_target, aura::Window* target) { |
| // Returns the target (the Window tooltip text comes from) based on the event. |
| // If a Window other than event.target() is returned, |location| is adjusted |
| // to be in the coordinates of the returned Window. |
| -aura::Window* GetTooltipTarget(const ui::MouseEvent& event, |
| +aura::Window* GetTooltipTarget(ui::EventType event_type, |
| + aura::Window* target, |
| gfx::Point* location) { |
| - switch (event.type()) { |
| + switch (event_type) { |
| case ui::ET_MOUSE_CAPTURE_CHANGED: |
| // On windows we can get a capture changed without an exit. We need to |
| // reset state when this happens else the tooltip may incorrectly show. |
| @@ -57,7 +62,7 @@ aura::Window* GetTooltipTarget(const ui::MouseEvent& event, |
| return NULL; |
| case ui::ET_MOUSE_MOVED: |
| case ui::ET_MOUSE_DRAGGED: { |
| - aura::Window* event_target = static_cast<aura::Window*>(event.target()); |
| + aura::Window* event_target = target; |
| if (!event_target) |
| return NULL; |
| @@ -83,7 +88,7 @@ aura::Window* GetTooltipTarget(const ui::MouseEvent& event, |
| // If |target| has capture all events go to it, even if the mouse is |
| // really over another window. Find the real window the mouse is over. |
| - gfx::Point screen_loc(event.location()); |
| + gfx::Point screen_loc(*location); |
| aura::client::GetScreenPositionClient(event_target->GetRootWindow())-> |
| ConvertPointToScreen(event_target, &screen_loc); |
| gfx::Screen* screen = gfx::Screen::GetScreenFor(event_target); |
| @@ -185,14 +190,14 @@ void TooltipController::OnMouseEvent(ui::MouseEvent* event) { |
| case ui::ET_MOUSE_EXITED: |
| case ui::ET_MOUSE_MOVED: |
| case ui::ET_MOUSE_DRAGGED: { |
| - curr_mouse_loc_ = event->location(); |
| - aura::Window* target = GetTooltipTarget(*event, &curr_mouse_loc_); |
| - SetTooltipWindow(target); |
| - if (tooltip_timer_.IsRunning()) |
| - tooltip_timer_.Reset(); |
| - |
| - if (tooltip_->IsVisible()) |
| - UpdateIfRequired(); |
| + last_mouse_location_ = event->location(); |
| + mouse_event_timer_.Start( |
| + FROM_HERE, |
| + base::TimeDelta::FromMilliseconds(kMouseMoveDelay), |
| + base::Bind(&TooltipController::DispatchMouseEvent, |
|
sky
2014/05/08 19:05:55
What happens if we enter some sort of nested messa
varkha
2014/05/13 19:30:55
We would need to synchronously process any pending
|
| + base::Unretained(this), |
| + event->type(), |
| + static_cast<aura::Window*>(event->target()))); |
|
sky
2014/05/08 19:05:55
What if window is destroyed between now and when t
varkha
2014/05/13 19:30:55
We could maintain a set of windows for which we ha
|
| break; |
| } |
| case ui::ET_MOUSE_PRESSED: |
| @@ -239,6 +244,18 @@ void TooltipController::OnWindowDestroyed(aura::Window* window) { |
| //////////////////////////////////////////////////////////////////////////////// |
| // TooltipController private: |
| +void TooltipController::DispatchMouseEvent(ui::EventType event_type, |
| + aura::Window* target) { |
| + curr_mouse_loc_ = last_mouse_location_; |
| + target = GetTooltipTarget(event_type, target, &curr_mouse_loc_); |
| + SetTooltipWindow(target); |
| + if (tooltip_timer_.IsRunning()) |
| + tooltip_timer_.Reset(); |
| + |
| + if (tooltip_->IsVisible()) |
| + UpdateIfRequired(); |
| +} |
| + |
| void TooltipController::TooltipTimerFired() { |
| UpdateIfRequired(); |
| } |