OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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_targeter.h" | 5 #include "ui/aura/window_targeter.h" |
6 | 6 |
7 #include "ui/aura/client/capture_client.h" | 7 #include "ui/aura/client/capture_client.h" |
8 #include "ui/aura/client/event_client.h" | 8 #include "ui/aura/client/event_client.h" |
9 #include "ui/aura/client/focus_client.h" | 9 #include "ui/aura/client/focus_client.h" |
10 #include "ui/aura/window.h" | 10 #include "ui/aura/window.h" |
11 #include "ui/aura/window_delegate.h" | 11 #include "ui/aura/window_delegate.h" |
12 #include "ui/aura/window_event_dispatcher.h" | 12 #include "ui/aura/window_event_dispatcher.h" |
13 #include "ui/aura/window_tree_host.h" | 13 #include "ui/aura/window_tree_host.h" |
14 #include "ui/events/event_target.h" | 14 #include "ui/events/event_target.h" |
15 | 15 |
16 namespace aura { | 16 namespace aura { |
17 | 17 |
| 18 namespace { |
| 19 |
| 20 bool IsLocatedEvent(const ui::Event& event) { |
| 21 return event.IsMouseEvent() || event.IsTouchEvent() || |
| 22 event.IsScrollEvent() || event.IsGestureEvent(); |
| 23 } |
| 24 |
| 25 } // namespace |
| 26 |
18 WindowTargeter::WindowTargeter() {} | 27 WindowTargeter::WindowTargeter() {} |
19 WindowTargeter::~WindowTargeter() {} | 28 WindowTargeter::~WindowTargeter() {} |
20 | 29 |
21 ui::EventTarget* WindowTargeter::FindTargetForEvent(ui::EventTarget* root, | 30 ui::EventTarget* WindowTargeter::FindTargetForEvent(ui::EventTarget* root, |
22 ui::Event* event) { | 31 ui::Event* event) { |
23 Window* window = static_cast<Window*>(root); | 32 Window* window = static_cast<Window*>(root); |
24 Window* target = event->IsKeyEvent() ? | 33 Window* target = event->IsKeyEvent() ? |
25 FindTargetForKeyEvent(window, *static_cast<ui::KeyEvent*>(event)) : | 34 FindTargetForKeyEvent(window, *static_cast<ui::KeyEvent*>(event)) : |
26 static_cast<Window*>(EventTargeter::FindTargetForEvent(root, event)); | 35 static_cast<Window*>(EventTargeter::FindTargetForEvent(root, event)); |
27 if (target && !window->parent()) { | 36 if (target && !window->parent() && !window->Contains(target)) { |
28 // |window| is the root window. | 37 // |window| is the root window, but |target| is not a descendent of |
29 if (!window->Contains(target)) { | 38 // |window|. So do not allow dispatching from here. Instead, dispatch the |
30 // |target| is not a descendent of |window|. So do not allow dispatching | 39 // event through the WindowEventDispatcher that owns |target|. |
31 // from here. Instead, dispatch the event through the | 40 aura::Window* new_root = target->GetRootWindow(); |
32 // WindowEventDispatcher that owns |target|. | 41 if (IsLocatedEvent(*event)) { |
33 ui::EventDispatchDetails details ALLOW_UNUSED = | 42 // The event has been transformed to be in |target|'s coordinate system. |
34 target->GetHost()->event_processor()->OnEventFromSource(event); | 43 // But dispatching the event through the EventProcessor requires the event |
35 target = NULL; | 44 // to be in the host's coordinate system. So, convert the event to be in |
| 45 // the root's coordinate space, and then to the host's coordinate space by |
| 46 // applying the host's transform. |
| 47 ui::LocatedEvent* located_event = static_cast<ui::LocatedEvent*>(event); |
| 48 located_event->ConvertLocationToTarget(target, new_root); |
| 49 located_event->UpdateForRootTransform( |
| 50 new_root->GetHost()->GetRootTransform()); |
36 } | 51 } |
| 52 ui::EventDispatchDetails details ALLOW_UNUSED = |
| 53 new_root->GetHost()->event_processor()->OnEventFromSource(event); |
| 54 target = NULL; |
37 } | 55 } |
38 return target; | 56 return target; |
39 } | 57 } |
40 | 58 |
41 bool WindowTargeter::SubtreeCanAcceptEvent( | 59 bool WindowTargeter::SubtreeCanAcceptEvent( |
42 ui::EventTarget* target, | 60 ui::EventTarget* target, |
43 const ui::LocatedEvent& event) const { | 61 const ui::LocatedEvent& event) const { |
44 aura::Window* window = static_cast<aura::Window*>(target); | 62 aura::Window* window = static_cast<aura::Window*>(target); |
45 if (!window->IsVisible()) | 63 if (!window->IsVisible()) |
46 return false; | 64 return false; |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
135 | 153 |
136 // If the initial touch is outside the root window, target the root. | 154 // If the initial touch is outside the root window, target the root. |
137 if (!root_window->bounds().Contains(event.location())) | 155 if (!root_window->bounds().Contains(event.location())) |
138 return root_window; | 156 return root_window; |
139 } | 157 } |
140 | 158 |
141 return NULL; | 159 return NULL; |
142 } | 160 } |
143 | 161 |
144 } // namespace aura | 162 } // namespace aura |
OLD | NEW |