| Index: ui/aura/root_window.cc
|
| diff --git a/ui/aura/root_window.cc b/ui/aura/root_window.cc
|
| index 002d2317cbe93700f934071e08f5381e33f00b8f..5601b8949606b9c27b8d4f6b011d891aa93257bb 100644
|
| --- a/ui/aura/root_window.cc
|
| +++ b/ui/aura/root_window.cc
|
| @@ -80,7 +80,18 @@ RootWindowHost* CreateHost(RootWindow* root_window,
|
|
|
| bool IsUsingEventProcessorForDispatch(const ui::Event& event) {
|
| return event.IsKeyEvent() ||
|
| - event.IsScrollEvent();
|
| + event.IsScrollEvent() ||
|
| + event.IsTouchEvent();
|
| +}
|
| +
|
| +bool IsEventCandidateForHold(const ui::Event& event) {
|
| + if (event.type() == ui::ET_TOUCH_MOVED)
|
| + return true;
|
| + if (event.type() == ui::ET_MOUSE_DRAGGED)
|
| + return true;
|
| + if (event.IsMouseEvent() && (event.flags() & ui::EF_IS_SYNTHESIZED))
|
| + return true;
|
| + return false;
|
| }
|
|
|
| } // namespace
|
| @@ -581,14 +592,20 @@ bool RootWindow::CanDispatchToTarget(ui::EventTarget* target) {
|
| ui::EventDispatchDetails RootWindow::PreDispatchEvent(ui::EventTarget* target,
|
| ui::Event* event) {
|
| if (!dispatching_held_event_ && IsUsingEventProcessorForDispatch(*event)) {
|
| - DispatchDetails details = DispatchHeldEvents();
|
| - if (details.dispatcher_destroyed || details.target_destroyed)
|
| - return details;
|
| + if (!move_hold_count_ || !IsEventCandidateForHold(*event)) {
|
| + if (IsEventCandidateForHold(*event))
|
| + held_move_event_.reset();
|
| + DispatchDetails details = DispatchHeldEvents();
|
| + if (details.dispatcher_destroyed || details.target_destroyed)
|
| + return details;
|
| + }
|
|
|
| Window* target_window = static_cast<Window*>(target);
|
| if (event->IsScrollEvent()) {
|
| PreDispatchLocatedEvent(target_window,
|
| static_cast<ui::ScrollEvent*>(event));
|
| + } else if (event->IsTouchEvent()) {
|
| + PreDispatchTouchEvent(target_window, static_cast<ui::TouchEvent*>(event));
|
| }
|
| }
|
| old_dispatch_target_ = event_dispatch_target_;
|
| @@ -606,6 +623,18 @@ ui::EventDispatchDetails RootWindow::PostDispatchEvent(ui::EventTarget* target,
|
| #ifndef NDEBUG
|
| DCHECK(!event_dispatch_target_ || window()->Contains(event_dispatch_target_));
|
| #endif
|
| +
|
| + if (event.IsTouchEvent() && !details.target_destroyed) {
|
| + ui::TouchEvent orig_event(static_cast<const ui::TouchEvent&>(event),
|
| + static_cast<Window*>(event.target()), window());
|
| + // Get the list of GestureEvents from GestureRecognizer.
|
| + scoped_ptr<ui::GestureRecognizer::Gestures> gestures;
|
| + gestures.reset(ui::GestureRecognizer::Get()->
|
| + ProcessTouchEventForGesture(orig_event, event.result(),
|
| + static_cast<Window*>(target)));
|
| + return ProcessGestures(gestures.get());
|
| + }
|
| +
|
| return details;
|
| }
|
|
|
| @@ -664,25 +693,9 @@ bool RootWindow::OnHostScrollEvent(ui::ScrollEvent* event) {
|
| }
|
|
|
| bool RootWindow::OnHostTouchEvent(ui::TouchEvent* event) {
|
| - if ((event->type() == ui::ET_TOUCH_MOVED)) {
|
| - if (move_hold_count_) {
|
| - Window* null_window = static_cast<Window*>(NULL);
|
| - held_move_event_.reset(
|
| - new ui::TouchEvent(*event, null_window, null_window));
|
| - return true;
|
| - } else {
|
| - // We may have a held event for a period between the time move_hold_count_
|
| - // fell to 0 and the DispatchHeldEvents executes. Since we're going to
|
| - // dispatch the new event directly below, we can reset the old one.
|
| - held_move_event_.reset();
|
| - }
|
| - }
|
| - DispatchDetails details = DispatchHeldEvents();
|
| - if (details.dispatcher_destroyed)
|
| - return false;
|
| - details = DispatchTouchEventImpl(event);
|
| + DispatchDetails details = OnEventFromSource(event);
|
| if (details.dispatcher_destroyed)
|
| - return true;
|
| + event->SetHandled();
|
| return event->handled();
|
| }
|
|
|
| @@ -746,8 +759,7 @@ ui::EventProcessor* RootWindow::GetEventProcessor() {
|
|
|
| ui::EventDispatchDetails RootWindow::OnHostMouseEventImpl(
|
| ui::MouseEvent* event) {
|
| - if (event->type() == ui::ET_MOUSE_DRAGGED ||
|
| - (event->flags() & ui::EF_IS_SYNTHESIZED)) {
|
| + if (IsEventCandidateForHold(*event)) {
|
| if (move_hold_count_) {
|
| Window* null_window = static_cast<Window*>(NULL);
|
| held_move_event_.reset(
|
| @@ -877,75 +889,6 @@ ui::EventDispatchDetails RootWindow::DispatchMouseEventToTarget(
|
| return DispatchDetails();
|
| }
|
|
|
| -ui::EventDispatchDetails RootWindow::DispatchTouchEventImpl(
|
| - ui::TouchEvent* event) {
|
| - switch (event->type()) {
|
| - case ui::ET_TOUCH_PRESSED:
|
| - touch_ids_down_ |= (1 << event->touch_id());
|
| - Env::GetInstance()->set_touch_down(touch_ids_down_ != 0);
|
| - break;
|
| -
|
| - // Handle ET_TOUCH_CANCELLED only if it has a native event.
|
| - case ui::ET_TOUCH_CANCELLED:
|
| - if (!event->HasNativeEvent())
|
| - break;
|
| - // fallthrough
|
| - case ui::ET_TOUCH_RELEASED:
|
| - touch_ids_down_ = (touch_ids_down_ | (1 << event->touch_id())) ^
|
| - (1 << event->touch_id());
|
| - Env::GetInstance()->set_touch_down(touch_ids_down_ != 0);
|
| - break;
|
| -
|
| - default:
|
| - break;
|
| - }
|
| - TransformEventForDeviceScaleFactor(event);
|
| - Window* target = client::GetCaptureWindow(window());
|
| - if (!target) {
|
| - target = ConsumerToWindow(
|
| - ui::GestureRecognizer::Get()->GetTouchLockedTarget(*event));
|
| - if (!target) {
|
| - target = ConsumerToWindow(ui::GestureRecognizer::Get()->
|
| - GetTargetForLocation(event->location()));
|
| - }
|
| - }
|
| -
|
| - // The gesture recognizer processes touch events in the system coordinates. So
|
| - // keep a copy of the touch event here before possibly converting the event to
|
| - // a window's local coordinate system.
|
| - ui::TouchEvent event_for_gr(*event);
|
| -
|
| - ui::EventResult result = ui::ER_UNHANDLED;
|
| - if (!target && !window()->bounds().Contains(event->location())) {
|
| - // If the initial touch is outside the root window, target the root.
|
| - target = window();
|
| - DispatchDetails details = DispatchEvent(target ? target : NULL, event);
|
| - if (details.dispatcher_destroyed)
|
| - return details;
|
| - result = event->result();
|
| - } else {
|
| - // We only come here when the first contact was within the root window.
|
| - if (!target) {
|
| - target = window()->GetEventHandlerForPoint(event->location());
|
| - if (!target)
|
| - return DispatchDetails();
|
| - }
|
| -
|
| - event->ConvertLocationToTarget(window(), target);
|
| - DispatchDetails details = DispatchEvent(target, event);
|
| - if (details.dispatcher_destroyed)
|
| - return details;
|
| - result = event->result();
|
| - }
|
| -
|
| - // Get the list of GestureEvents from GestureRecognizer.
|
| - scoped_ptr<ui::GestureRecognizer::Gestures> gestures;
|
| - gestures.reset(ui::GestureRecognizer::Get()->
|
| - ProcessTouchEventForGesture(event_for_gr, result, target));
|
| -
|
| - return ProcessGestures(gestures.get());
|
| -}
|
| -
|
| ui::EventDispatchDetails RootWindow::DispatchHeldEvents() {
|
| if (!held_repostable_event_ && !held_move_event_)
|
| return DispatchDetails();
|
| @@ -977,7 +920,7 @@ ui::EventDispatchDetails RootWindow::DispatchHeldEvents() {
|
| if (!dispatch_details.dispatcher_destroyed)
|
| held_move_event_.reset();
|
| } else if (held_move_event_ && held_move_event_->IsTouchEvent()) {
|
| - dispatch_details = DispatchTouchEventImpl(
|
| + dispatch_details = OnEventFromSource(
|
| static_cast<ui::TouchEvent*>(held_move_event_.get()));
|
| if (!dispatch_details.dispatcher_destroyed)
|
| held_move_event_.reset();
|
| @@ -1036,4 +979,38 @@ void RootWindow::PreDispatchLocatedEvent(Window* target,
|
| }
|
| }
|
|
|
| +void RootWindow::PreDispatchTouchEvent(Window* target,
|
| + ui::TouchEvent* event) {
|
| + switch (event->type()) {
|
| + case ui::ET_TOUCH_PRESSED:
|
| + touch_ids_down_ |= (1 << event->touch_id());
|
| + Env::GetInstance()->set_touch_down(touch_ids_down_ != 0);
|
| + break;
|
| +
|
| + // Handle ET_TOUCH_CANCELLED only if it has a native event.
|
| + case ui::ET_TOUCH_CANCELLED:
|
| + if (!event->HasNativeEvent())
|
| + break;
|
| + // fallthrough
|
| + case ui::ET_TOUCH_RELEASED:
|
| + touch_ids_down_ = (touch_ids_down_ | (1 << event->touch_id())) ^
|
| + (1 << event->touch_id());
|
| + Env::GetInstance()->set_touch_down(touch_ids_down_ != 0);
|
| + break;
|
| +
|
| + case ui::ET_TOUCH_MOVED:
|
| + if (move_hold_count_) {
|
| + held_move_event_.reset(new ui::TouchEvent(*event));
|
| + event->SetHandled();
|
| + return;
|
| + }
|
| + break;
|
| +
|
| + default:
|
| + NOTREACHED();
|
| + break;
|
| + }
|
| + PreDispatchLocatedEvent(target, event);
|
| +}
|
| +
|
| } // namespace aura
|
|
|