Index: ash/pointer_watcher_delegate_aura.cc |
diff --git a/ash/pointer_watcher_delegate_aura.cc b/ash/pointer_watcher_delegate_aura.cc |
index 53cc95024310b971e65838c5a05c78265f275707..2dfe4f9963007abe93cd09a1842ec0e8e350d077 100644 |
--- a/ash/pointer_watcher_delegate_aura.cc |
+++ b/ash/pointer_watcher_delegate_aura.cc |
@@ -24,32 +24,43 @@ PointerWatcherDelegateAura::~PointerWatcherDelegateAura() { |
} |
void PointerWatcherDelegateAura::AddPointerWatcher( |
- views::PointerWatcher* watcher) { |
- pointer_watchers_.AddObserver(watcher); |
+ views::PointerWatcher* watcher, |
+ bool wants_moves) { |
+ // We only allow a watcher to be added once. That is, we don't consider |
+ // the pair of |watcher| and |wants_move| unique, just |watcher|. |
+ if (wants_moves) { |
+ DCHECK(!non_move_watchers_.HasObserver(watcher)); |
+ move_watchers_.AddObserver(watcher); |
+ } else { |
+ DCHECK(!move_watchers_.HasObserver(watcher)); |
+ non_move_watchers_.AddObserver(watcher); |
+ } |
} |
void PointerWatcherDelegateAura::RemovePointerWatcher( |
views::PointerWatcher* watcher) { |
- pointer_watchers_.RemoveObserver(watcher); |
+ non_move_watchers_.RemoveObserver(watcher); |
+ move_watchers_.RemoveObserver(watcher); |
} |
void PointerWatcherDelegateAura::OnMouseEvent(ui::MouseEvent* event) { |
if (event->type() == ui::ET_MOUSE_CAPTURE_CHANGED) { |
- FOR_EACH_OBSERVER(views::PointerWatcher, pointer_watchers_, |
+ FOR_EACH_OBSERVER(views::PointerWatcher, non_move_watchers_, |
+ OnMouseCaptureChanged()); |
+ FOR_EACH_OBSERVER(views::PointerWatcher, move_watchers_, |
OnMouseCaptureChanged()); |
return; |
} |
+ |
// For compatibility with the mus version, don't send moves. |
if (event->type() != ui::ET_MOUSE_PRESSED && |
event->type() != ui::ET_MOUSE_RELEASED) |
return; |
+ |
if (!ui::PointerEvent::CanConvertFrom(*event)) |
return; |
- ui::PointerEvent mouse_pointer_event(*event); |
- FOR_EACH_OBSERVER( |
- views::PointerWatcher, pointer_watchers_, |
- OnPointerEventObserved(mouse_pointer_event, GetLocationInScreen(*event), |
- GetTargetWidget(*event))); |
+ |
+ NotifyWatchers(ui::PointerEvent(*event), *event); |
} |
void PointerWatcherDelegateAura::OnTouchEvent(ui::TouchEvent* event) { |
@@ -57,11 +68,9 @@ void PointerWatcherDelegateAura::OnTouchEvent(ui::TouchEvent* event) { |
if (event->type() != ui::ET_TOUCH_PRESSED && |
event->type() != ui::ET_TOUCH_RELEASED) |
return; |
- ui::PointerEvent touch_pointer_event(*event); |
- FOR_EACH_OBSERVER( |
- views::PointerWatcher, pointer_watchers_, |
- OnPointerEventObserved(touch_pointer_event, GetLocationInScreen(*event), |
- GetTargetWidget(*event))); |
+ |
+ DCHECK(ui::PointerEvent::CanConvertFrom(*event)); |
+ NotifyWatchers(ui::PointerEvent(*event), *event); |
} |
gfx::Point PointerWatcherDelegateAura::GetLocationInScreen( |
@@ -79,4 +88,20 @@ views::Widget* PointerWatcherDelegateAura::GetTargetWidget( |
return views::Widget::GetTopLevelWidgetForNativeView(window); |
} |
+void PointerWatcherDelegateAura::NotifyWatchers( |
+ const ui::PointerEvent& event, |
+ const ui::LocatedEvent& original_event) { |
+ const gfx::Point screen_location(GetLocationInScreen(original_event)); |
+ views::Widget* target_widget = GetTargetWidget(original_event); |
+ FOR_EACH_OBSERVER( |
+ views::PointerWatcher, move_watchers_, |
+ OnPointerEventObserved(event, screen_location, target_widget)); |
+ if (event.type() != ui::ET_MOUSE_MOVED && |
+ event.type() != ui::ET_TOUCH_MOVED) { |
+ FOR_EACH_OBSERVER( |
+ views::PointerWatcher, non_move_watchers_, |
+ OnPointerEventObserved(event, screen_location, target_widget)); |
+ } |
+} |
+ |
} // namespace ash |