Chromium Code Reviews| 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 "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/debug/trace_event.h" | 8 #include "base/debug/trace_event.h" |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 142 return; | 142 return; |
| 143 Window* target = GetGestureTarget(event); | 143 Window* target = GetGestureTarget(event); |
| 144 if (target) { | 144 if (target) { |
| 145 event->ConvertLocationToTarget(window(), target); | 145 event->ConvertLocationToTarget(window(), target); |
| 146 DispatchDetails details = DispatchEvent(target, event); | 146 DispatchDetails details = DispatchEvent(target, event); |
| 147 if (details.dispatcher_destroyed) | 147 if (details.dispatcher_destroyed) |
| 148 return; | 148 return; |
| 149 } | 149 } |
| 150 } | 150 } |
| 151 | 151 |
| 152 DispatchDetails WindowEventDispatcher::DispatchMouseExitAtPoint( | 152 DispatchDetails WindowEventDispatcher::DispatchMouseExitAtPoint(Window* window, |
| 153 const gfx::Point& point) { | 153 const gfx::Point& point) { |
| 154 ui::MouseEvent event(ui::ET_MOUSE_EXITED, point, point, ui::EF_NONE, | 154 ui::MouseEvent event(ui::ET_MOUSE_EXITED, point, point, ui::EF_NONE, |
| 155 ui::EF_NONE); | 155 ui::EF_NONE); |
| 156 return DispatchMouseEnterOrExit(event, ui::ET_MOUSE_EXITED); | 156 return DispatchMouseEnterOrExit(window, event, ui::ET_MOUSE_EXITED); |
| 157 } | 157 } |
| 158 | 158 |
| 159 void WindowEventDispatcher::ProcessedTouchEvent(ui::TouchEvent* event, | 159 void WindowEventDispatcher::ProcessedTouchEvent(ui::TouchEvent* event, |
| 160 Window* window, | 160 Window* window, |
| 161 ui::EventResult result) { | 161 ui::EventResult result) { |
| 162 // Once we've fully migrated to the eager gesture detector, we won't need to | 162 // Once we've fully migrated to the eager gesture detector, we won't need to |
| 163 // pass an event here. | 163 // pass an event here. |
| 164 scoped_ptr<ui::GestureRecognizer::Gestures> gestures( | 164 scoped_ptr<ui::GestureRecognizer::Gestures> gestures( |
| 165 ui::GestureRecognizer::Get()->AckAsyncTouchEvent( | 165 ui::GestureRecognizer::Get()->AckAsyncTouchEvent( |
| 166 *event, result, window)); | 166 *event, result, window)); |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 235 | 235 |
| 236 void WindowEventDispatcher::DispatchMouseExitToHidingWindow(Window* window) { | 236 void WindowEventDispatcher::DispatchMouseExitToHidingWindow(Window* window) { |
| 237 // The mouse capture is intentionally ignored. Think that a mouse enters | 237 // The mouse capture is intentionally ignored. Think that a mouse enters |
| 238 // to a window, the window sets the capture, the mouse exits the window, | 238 // to a window, the window sets the capture, the mouse exits the window, |
| 239 // and then it releases the capture. In that case OnMouseExited won't | 239 // and then it releases the capture. In that case OnMouseExited won't |
| 240 // be called. So it is natural not to emit OnMouseExited even though | 240 // be called. So it is natural not to emit OnMouseExited even though |
| 241 // |window| is the capture window. | 241 // |window| is the capture window. |
| 242 gfx::Point last_mouse_location = GetLastMouseLocationInRoot(); | 242 gfx::Point last_mouse_location = GetLastMouseLocationInRoot(); |
| 243 if (window->Contains(mouse_moved_handler_) && | 243 if (window->Contains(mouse_moved_handler_) && |
| 244 window->ContainsPointInRoot(last_mouse_location)) { | 244 window->ContainsPointInRoot(last_mouse_location)) { |
| 245 DispatchDetails details = DispatchMouseExitAtPoint(last_mouse_location); | 245 DispatchDetails details = DispatchMouseExitAtPoint(window, |
| 246 last_mouse_location); | |
| 246 if (details.dispatcher_destroyed) | 247 if (details.dispatcher_destroyed) |
| 247 return; | 248 return; |
| 248 } | 249 } |
| 249 } | 250 } |
| 250 | 251 |
| 251 ui::EventDispatchDetails WindowEventDispatcher::DispatchMouseEnterOrExit( | 252 ui::EventDispatchDetails WindowEventDispatcher::DispatchMouseEnterOrExit( |
| 253 Window* target, | |
| 252 const ui::MouseEvent& event, | 254 const ui::MouseEvent& event, |
| 253 ui::EventType type) { | 255 ui::EventType type) { |
| 254 if (event.type() != ui::ET_MOUSE_CAPTURE_CHANGED && | 256 if (event.type() != ui::ET_MOUSE_CAPTURE_CHANGED && |
| 255 !(event.flags() & ui::EF_IS_SYNTHESIZED)) { | 257 !(event.flags() & ui::EF_IS_SYNTHESIZED)) { |
| 256 SetLastMouseLocation(window(), event.root_location()); | 258 SetLastMouseLocation(window(), event.root_location()); |
| 257 } | 259 } |
| 258 | 260 |
| 259 if (!mouse_moved_handler_ || !mouse_moved_handler_->delegate() || | 261 if (!mouse_moved_handler_ || !mouse_moved_handler_->delegate() || |
| 260 !window()->Contains(mouse_moved_handler_)) | 262 !window()->Contains(mouse_moved_handler_)) |
| 261 return DispatchDetails(); | 263 return DispatchDetails(); |
| 262 | 264 |
| 263 // |event| may be an event in the process of being dispatched to a target (in | 265 // |event| may be an event in the process of being dispatched to a target (in |
| 264 // which case its locations will be in the event's target's coordinate | 266 // which case its locations will be in the event's target's coordinate |
| 265 // system), or a synthetic event created in root-window (in which case, the | 267 // system), or a synthetic event created in root-window (in which case, the |
| 266 // event's target will be NULL, and the event will be in the root-window's | 268 // event's target will be NULL, and the event will be in the root-window's |
| 267 // coordinate system. | 269 // coordinate system. |
| 268 aura::Window* target = static_cast<Window*>(event.target()); | 270 if (event.target()) |
|
sky
2014/12/18 20:29:29
Why do we need both the supplied target and event.
Miyoung Shin
2014/12/19 14:39:42
You're right.
I think I can use only target to con
sky
2015/01/05 17:23:02
You didn't quite end up with what I was suggesting
Miyoung Shin
2015/01/06 13:20:44
Sorry, I don't understand your point yet and why y
| |
| 271 target = static_cast<Window*>(event.target()); | |
| 269 if (!target) | 272 if (!target) |
| 270 target = window(); | 273 target = window(); |
| 271 ui::MouseEvent translated_event(event, | 274 ui::MouseEvent translated_event(event, |
| 272 target, | 275 target, |
| 273 mouse_moved_handler_, | 276 mouse_moved_handler_, |
| 274 type, | 277 type, |
| 275 event.flags() | ui::EF_IS_SYNTHESIZED); | 278 event.flags() | ui::EF_IS_SYNTHESIZED); |
| 276 return DispatchEvent(mouse_moved_handler_, &translated_event); | 279 return DispatchEvent(mouse_moved_handler_, &translated_event); |
| 277 } | 280 } |
| 278 | 281 |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 397 // OS to send us the mouse exit events (WM_MOUSELEAVE). Additionally on | 400 // OS to send us the mouse exit events (WM_MOUSELEAVE). Additionally on |
| 398 // desktop Windows, every top level window could potentially have its own | 401 // desktop Windows, every top level window could potentially have its own |
| 399 // root window, in which case this function will get called whenever those | 402 // root window, in which case this function will get called whenever those |
| 400 // windows grab mouse capture. Sending mouse exit messages in these cases | 403 // windows grab mouse capture. Sending mouse exit messages in these cases |
| 401 // causes subtle bugs like (crbug.com/394672). | 404 // causes subtle bugs like (crbug.com/394672). |
| 402 #if !defined(OS_WIN) | 405 #if !defined(OS_WIN) |
| 403 if (mouse_moved_handler_) { | 406 if (mouse_moved_handler_) { |
| 404 // Dispatch a mouse exit to reset any state associated with hover. This is | 407 // Dispatch a mouse exit to reset any state associated with hover. This is |
| 405 // important when going from no window having capture to a window having | 408 // important when going from no window having capture to a window having |
| 406 // capture because we do not dispatch ET_MOUSE_CAPTURE_CHANGED in this case. | 409 // capture because we do not dispatch ET_MOUSE_CAPTURE_CHANGED in this case. |
| 407 DispatchDetails details = DispatchMouseExitAtPoint( | 410 DispatchDetails details = DispatchMouseExitAtPoint(NULL, |
|
sky
2014/12/18 20:29:29
nullptr
Miyoung Shin
2014/12/19 14:39:42
ok
| |
| 408 GetLastMouseLocationInRoot()); | 411 GetLastMouseLocationInRoot()); |
| 409 if (details.dispatcher_destroyed) | 412 if (details.dispatcher_destroyed) |
| 410 return; | 413 return; |
| 411 } | 414 } |
| 412 #endif | 415 #endif |
| 413 | 416 |
| 414 mouse_moved_handler_ = NULL; | 417 mouse_moved_handler_ = NULL; |
| 415 mouse_pressed_handler_ = NULL; | 418 mouse_pressed_handler_ = NULL; |
| 416 } | 419 } |
| 417 | 420 |
| (...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 778 } | 781 } |
| 779 } | 782 } |
| 780 | 783 |
| 781 const int kMouseButtonFlagMask = ui::EF_LEFT_MOUSE_BUTTON | | 784 const int kMouseButtonFlagMask = ui::EF_LEFT_MOUSE_BUTTON | |
| 782 ui::EF_MIDDLE_MOUSE_BUTTON | | 785 ui::EF_MIDDLE_MOUSE_BUTTON | |
| 783 ui::EF_RIGHT_MOUSE_BUTTON; | 786 ui::EF_RIGHT_MOUSE_BUTTON; |
| 784 switch (event->type()) { | 787 switch (event->type()) { |
| 785 case ui::ET_MOUSE_EXITED: | 788 case ui::ET_MOUSE_EXITED: |
| 786 if (!target || target == window()) { | 789 if (!target || target == window()) { |
| 787 DispatchDetails details = | 790 DispatchDetails details = |
| 788 DispatchMouseEnterOrExit(*event, ui::ET_MOUSE_EXITED); | 791 DispatchMouseEnterOrExit(target, *event, ui::ET_MOUSE_EXITED); |
| 789 if (details.dispatcher_destroyed) { | 792 if (details.dispatcher_destroyed) { |
| 790 event->SetHandled(); | 793 event->SetHandled(); |
| 791 return; | 794 return; |
| 792 } | 795 } |
| 793 mouse_moved_handler_ = NULL; | 796 mouse_moved_handler_ = NULL; |
| 794 } | 797 } |
| 795 break; | 798 break; |
| 796 case ui::ET_MOUSE_MOVED: | 799 case ui::ET_MOUSE_MOVED: |
| 797 // Send an exit to the current |mouse_moved_handler_| and an enter to | 800 // Send an exit to the current |mouse_moved_handler_| and an enter to |
| 798 // |target|. Take care that both us and |target| aren't destroyed during | 801 // |target|. Take care that both us and |target| aren't destroyed during |
| 799 // dispatch. | 802 // dispatch. |
| 800 if (target != mouse_moved_handler_) { | 803 if (target != mouse_moved_handler_) { |
| 801 aura::Window* old_mouse_moved_handler = mouse_moved_handler_; | 804 aura::Window* old_mouse_moved_handler = mouse_moved_handler_; |
| 802 WindowTracker live_window; | 805 WindowTracker live_window; |
| 803 live_window.Add(target); | 806 live_window.Add(target); |
| 804 DispatchDetails details = | 807 DispatchDetails details = |
| 805 DispatchMouseEnterOrExit(*event, ui::ET_MOUSE_EXITED); | 808 DispatchMouseEnterOrExit(target, *event, ui::ET_MOUSE_EXITED); |
| 806 if (details.dispatcher_destroyed) { | 809 if (details.dispatcher_destroyed) { |
| 807 event->SetHandled(); | 810 event->SetHandled(); |
| 808 return; | 811 return; |
| 809 } | 812 } |
| 810 // If the |mouse_moved_handler_| changes out from under us, assume a | 813 // If the |mouse_moved_handler_| changes out from under us, assume a |
| 811 // nested message loop ran and we don't need to do anything. | 814 // nested message loop ran and we don't need to do anything. |
| 812 if (mouse_moved_handler_ != old_mouse_moved_handler) { | 815 if (mouse_moved_handler_ != old_mouse_moved_handler) { |
| 813 event->SetHandled(); | 816 event->SetHandled(); |
| 814 return; | 817 return; |
| 815 } | 818 } |
| 816 if (!live_window.Contains(target) || details.target_destroyed) { | 819 if (!live_window.Contains(target) || details.target_destroyed) { |
| 817 mouse_moved_handler_ = NULL; | 820 mouse_moved_handler_ = NULL; |
| 818 event->SetHandled(); | 821 event->SetHandled(); |
| 819 return; | 822 return; |
| 820 } | 823 } |
| 821 live_window.Remove(target); | 824 live_window.Remove(target); |
| 822 | 825 |
| 823 mouse_moved_handler_ = target; | 826 mouse_moved_handler_ = target; |
| 824 details = DispatchMouseEnterOrExit(*event, ui::ET_MOUSE_ENTERED); | 827 details = DispatchMouseEnterOrExit(target, *event, |
| 828 ui::ET_MOUSE_ENTERED); | |
| 825 if (details.dispatcher_destroyed || details.target_destroyed) { | 829 if (details.dispatcher_destroyed || details.target_destroyed) { |
| 826 event->SetHandled(); | 830 event->SetHandled(); |
| 827 return; | 831 return; |
| 828 } | 832 } |
| 829 } | 833 } |
| 830 break; | 834 break; |
| 831 case ui::ET_MOUSE_PRESSED: | 835 case ui::ET_MOUSE_PRESSED: |
| 832 // Don't set the mouse pressed handler for non client mouse down events. | 836 // Don't set the mouse pressed handler for non client mouse down events. |
| 833 // These are only sent by Windows and are not always followed with non | 837 // These are only sent by Windows and are not always followed with non |
| 834 // client mouse up events which causes subsequent mouse events to be | 838 // client mouse up events which causes subsequent mouse events to be |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 888 // The event is invalid - ignore it. | 892 // The event is invalid - ignore it. |
| 889 event->StopPropagation(); | 893 event->StopPropagation(); |
| 890 event->DisableSynchronousHandling(); | 894 event->DisableSynchronousHandling(); |
| 891 return; | 895 return; |
| 892 } | 896 } |
| 893 | 897 |
| 894 PreDispatchLocatedEvent(target, event); | 898 PreDispatchLocatedEvent(target, event); |
| 895 } | 899 } |
| 896 | 900 |
| 897 } // namespace aura | 901 } // namespace aura |
| OLD | NEW |