| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "ui/aura/window_event_dispatcher.h" | 5 #include "ui/aura/window_event_dispatcher.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 93 ui::GestureRecognizer::Get()->AddGestureEventHelper(this); | 93 ui::GestureRecognizer::Get()->AddGestureEventHelper(this); |
| 94 Env::GetInstance()->AddObserver(this); | 94 Env::GetInstance()->AddObserver(this); |
| 95 } | 95 } |
| 96 | 96 |
| 97 WindowEventDispatcher::~WindowEventDispatcher() { | 97 WindowEventDispatcher::~WindowEventDispatcher() { |
| 98 TRACE_EVENT0("shutdown", "WindowEventDispatcher::Destructor"); | 98 TRACE_EVENT0("shutdown", "WindowEventDispatcher::Destructor"); |
| 99 Env::GetInstance()->RemoveObserver(this); | 99 Env::GetInstance()->RemoveObserver(this); |
| 100 ui::GestureRecognizer::Get()->RemoveGestureEventHelper(this); | 100 ui::GestureRecognizer::Get()->RemoveGestureEventHelper(this); |
| 101 } | 101 } |
| 102 | 102 |
| 103 void WindowEventDispatcher::RepostEvent(const ui::LocatedEvent& event) { | 103 void WindowEventDispatcher::RepostEvent(const ui::LocatedEvent* event) { |
| 104 DCHECK(event.type() == ui::ET_MOUSE_PRESSED || | 104 DCHECK(event->type() == ui::ET_MOUSE_PRESSED || |
| 105 event.type() == ui::ET_GESTURE_TAP_DOWN); | 105 event->type() == ui::ET_GESTURE_TAP_DOWN || |
| 106 event->type() == ui::ET_TOUCH_PRESSED); |
| 106 // We allow for only one outstanding repostable event. This is used | 107 // We allow for only one outstanding repostable event. This is used |
| 107 // in exiting context menus. A dropped repost request is allowed. | 108 // in exiting context menus. A dropped repost request is allowed. |
| 108 if (event.type() == ui::ET_MOUSE_PRESSED) { | 109 if (event->type() == ui::ET_MOUSE_PRESSED) { |
| 109 held_repostable_event_.reset( | 110 held_repostable_event_.reset( |
| 110 new ui::MouseEvent( | 111 new ui::MouseEvent( |
| 111 static_cast<const ui::MouseEvent&>(event), | 112 static_cast<const ui::MouseEvent&>(*event), |
| 112 static_cast<aura::Window*>(event.target()), | 113 static_cast<aura::Window*>(event->target()), |
| 113 window())); | 114 window())); |
| 115 } else if (event->type() == ui::ET_TOUCH_PRESSED) { |
| 116 held_repostable_event_.reset( |
| 117 new ui::TouchEvent(static_cast<const ui::TouchEvent&>(*event))); |
| 118 } else { |
| 119 DCHECK(event->type() == ui::ET_GESTURE_TAP_DOWN); |
| 120 held_repostable_event_.reset(); |
| 121 // TODO(rbyers): Reposing of gestures is tricky to get |
| 122 // right, so it's not yet supported. crbug.com/170987. |
| 123 } |
| 124 |
| 125 if (held_repostable_event_) { |
| 114 base::MessageLoop::current()->PostNonNestableTask( | 126 base::MessageLoop::current()->PostNonNestableTask( |
| 115 FROM_HERE, base::Bind( | 127 FROM_HERE, base::Bind( |
| 116 base::IgnoreResult(&WindowEventDispatcher::DispatchHeldEvents), | 128 base::IgnoreResult(&WindowEventDispatcher::DispatchHeldEvents), |
| 117 repost_event_factory_.GetWeakPtr())); | 129 repost_event_factory_.GetWeakPtr())); |
| 118 } else { | |
| 119 DCHECK(event.type() == ui::ET_GESTURE_TAP_DOWN); | |
| 120 held_repostable_event_.reset(); | |
| 121 // TODO(rbyers): Reposing of gestures is tricky to get | |
| 122 // right, so it's not yet supported. crbug.com/170987. | |
| 123 } | 130 } |
| 124 } | 131 } |
| 125 | 132 |
| 126 void WindowEventDispatcher::OnMouseEventsEnableStateChanged(bool enabled) { | 133 void WindowEventDispatcher::OnMouseEventsEnableStateChanged(bool enabled) { |
| 127 // Send entered / exited so that visual state can be updated to match | 134 // Send entered / exited so that visual state can be updated to match |
| 128 // mouse events state. | 135 // mouse events state. |
| 129 PostSynthesizeMouseMove(); | 136 PostSynthesizeMouseMove(); |
| 130 // TODO(mazda): Add code to disable mouse events when |enabled| == false. | 137 // TODO(mazda): Add code to disable mouse events when |enabled| == false. |
| 131 } | 138 } |
| 132 | 139 |
| (...skipping 526 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 659 // WindowEventDispatcher, private: | 666 // WindowEventDispatcher, private: |
| 660 | 667 |
| 661 ui::EventDispatchDetails WindowEventDispatcher::DispatchHeldEvents() { | 668 ui::EventDispatchDetails WindowEventDispatcher::DispatchHeldEvents() { |
| 662 if (!held_repostable_event_ && !held_move_event_) | 669 if (!held_repostable_event_ && !held_move_event_) |
| 663 return DispatchDetails(); | 670 return DispatchDetails(); |
| 664 | 671 |
| 665 CHECK(!dispatching_held_event_); | 672 CHECK(!dispatching_held_event_); |
| 666 | 673 |
| 667 DispatchDetails dispatch_details; | 674 DispatchDetails dispatch_details; |
| 668 if (held_repostable_event_) { | 675 if (held_repostable_event_) { |
| 669 if (held_repostable_event_->type() == ui::ET_MOUSE_PRESSED) { | 676 if (held_repostable_event_->type() == ui::ET_MOUSE_PRESSED || |
| 670 scoped_ptr<ui::MouseEvent> mouse_event( | 677 held_repostable_event_->type() == ui::ET_TOUCH_PRESSED) { |
| 671 static_cast<ui::MouseEvent*>(held_repostable_event_.release())); | 678 scoped_ptr<ui::LocatedEvent> event = std::move(held_repostable_event_); |
| 672 dispatching_held_event_ = mouse_event.get(); | 679 dispatching_held_event_ = event.get(); |
| 673 dispatch_details = OnEventFromSource(mouse_event.get()); | 680 dispatch_details = OnEventFromSource(event.get()); |
| 674 } else { | 681 } else { |
| 675 // TODO(rbyers): GESTURE_TAP_DOWN not yet supported: crbug.com/170987. | 682 // TODO(rbyers): GESTURE_TAP_DOWN not yet supported: crbug.com/170987. |
| 676 NOTREACHED(); | 683 NOTREACHED(); |
| 677 } | 684 } |
| 678 if (dispatch_details.dispatcher_destroyed) | 685 if (dispatch_details.dispatcher_destroyed) |
| 679 return dispatch_details; | 686 return dispatch_details; |
| 680 } | 687 } |
| 681 | 688 |
| 682 if (held_move_event_) { | 689 if (held_move_event_) { |
| 683 // If a mouse move has been synthesized, the target location is suspect, | 690 // If a mouse move has been synthesized, the target location is suspect, |
| (...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 908 } | 915 } |
| 909 | 916 |
| 910 // This flag is set depending on the gestures recognized in the call above, | 917 // This flag is set depending on the gestures recognized in the call above, |
| 911 // and needs to propagate with the forwarded event. | 918 // and needs to propagate with the forwarded event. |
| 912 event->set_may_cause_scrolling(orig_event.may_cause_scrolling()); | 919 event->set_may_cause_scrolling(orig_event.may_cause_scrolling()); |
| 913 | 920 |
| 914 return PreDispatchLocatedEvent(target, event); | 921 return PreDispatchLocatedEvent(target, event); |
| 915 } | 922 } |
| 916 | 923 |
| 917 } // namespace aura | 924 } // namespace aura |
| OLD | NEW |