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/mus/window_tree_client.h" | 5 #include "ui/aura/mus/window_tree_client.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <string> | 9 #include <string> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 1118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1129 | 1129 |
| 1130 void WindowTreeClient::OnWindowInputEvent(uint32_t event_id, | 1130 void WindowTreeClient::OnWindowInputEvent(uint32_t event_id, |
| 1131 Id window_id, | 1131 Id window_id, |
| 1132 int64_t display_id, | 1132 int64_t display_id, |
| 1133 std::unique_ptr<ui::Event> event, | 1133 std::unique_ptr<ui::Event> event, |
| 1134 bool matches_pointer_watcher) { | 1134 bool matches_pointer_watcher) { |
| 1135 DCHECK(event); | 1135 DCHECK(event); |
| 1136 | 1136 |
| 1137 WindowMus* window = GetWindowByServerId(window_id); // May be null. | 1137 WindowMus* window = GetWindowByServerId(window_id); // May be null. |
| 1138 | 1138 |
| 1139 if (event->IsKeyEvent()) { | |
| 1140 DCHECK(!matches_pointer_watcher); // PointerWatcher isn't for key events. | |
| 1141 if (!window || !window->GetWindow()->GetHost()) { | |
| 1142 tree_->OnWindowInputEventAck(event_id, ui::mojom::EventResult::UNHANDLED); | |
| 1143 return; | |
| 1144 } | |
| 1145 InputMethodMus* input_method = GetWindowTreeHostMus(window)->input_method(); | |
| 1146 input_method->DispatchKeyEvent(event->AsKeyEvent(), | |
| 1147 CreateEventResultCallback(event_id)); | |
| 1148 return; | |
| 1149 } | |
| 1150 | |
| 1151 if (matches_pointer_watcher && has_pointer_watcher_) { | 1139 if (matches_pointer_watcher && has_pointer_watcher_) { |
| 1152 DCHECK(event->IsPointerEvent()); | 1140 DCHECK(event->IsPointerEvent()); |
| 1153 std::unique_ptr<ui::Event> event_in_dip(ui::Event::Clone(*event)); | 1141 std::unique_ptr<ui::Event> event_in_dip(ui::Event::Clone(*event)); |
| 1154 ConvertEventLocationToDip(display_id, event_in_dip->AsLocatedEvent()); | 1142 ConvertEventLocationToDip(display_id, event_in_dip->AsLocatedEvent()); |
| 1155 delegate_->OnPointerEventObserved(*event_in_dip->AsPointerEvent(), | 1143 delegate_->OnPointerEventObserved(*event_in_dip->AsPointerEvent(), |
| 1156 window ? window->GetWindow() : nullptr); | 1144 window ? window->GetWindow() : nullptr); |
| 1157 } | 1145 } |
| 1158 | 1146 |
| 1159 // TODO: use |display_id| to find host and send there. | 1147 // This |window| might have already been deleted by the time |
| 1160 if (!window || !window->GetWindow()->GetHost()) { | 1148 // OnWindowInputEvent is called, so we use the |display_id| to find the host |
| 1149 // for event dispatching. | |
| 1150 WindowTreeHostMus* host = GetWindowTreeHostMusWithDisplayId(display_id); | |
| 1151 if (!host) { | |
| 1161 tree_->OnWindowInputEventAck(event_id, ui::mojom::EventResult::UNHANDLED); | 1152 tree_->OnWindowInputEventAck(event_id, ui::mojom::EventResult::UNHANDLED); |
| 1162 return; | 1153 return; |
| 1163 } | 1154 } |
| 1155 if (!window) | |
| 1156 window = WindowMus::Get(host->window()); | |
|
sky
2017/02/15 21:16:39
If this happens I think you need to reset the even
riajiang
2017/02/22 23:06:31
Done. And updated test.
| |
| 1157 DCHECK(host); | |
| 1164 | 1158 |
| 1165 WindowTreeHostMus* host = GetWindowTreeHostMus(window); | 1159 if (event->IsKeyEvent()) { |
| 1166 DCHECK(host); | 1160 DCHECK(!matches_pointer_watcher); // PointerWatcher isn't for key events. |
| 1161 InputMethodMus* input_method = host->input_method(); | |
| 1162 input_method->DispatchKeyEvent(event->AsKeyEvent(), | |
| 1163 CreateEventResultCallback(event_id)); | |
| 1164 return; | |
| 1165 } | |
| 1167 | 1166 |
| 1168 // The location of the event is relative to |window|. As the event is handed | 1167 // The location of the event is relative to |window|. As the event is handed |
| 1169 // to WindowTreeHost we need it to be relative to WindowTreeHost. | 1168 // to WindowTreeHost we need it to be relative to WindowTreeHost. |
| 1170 if (event->IsLocatedEvent()) { | 1169 if (event->IsLocatedEvent()) { |
| 1171 gfx::Point host_location = event->AsLocatedEvent()->location(); | 1170 gfx::Point host_location = event->AsLocatedEvent()->location(); |
| 1172 aura::Window::ConvertPointToTarget(window->GetWindow(), host->window(), | 1171 aura::Window::ConvertPointToTarget(window->GetWindow(), host->window(), |
| 1173 &host_location); | 1172 &host_location); |
| 1174 event->AsLocatedEvent()->set_location(host_location); | 1173 event->AsLocatedEvent()->set_location(host_location); |
| 1175 } | 1174 } |
| 1176 | 1175 |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1340 } | 1339 } |
| 1341 | 1340 |
| 1342 void WindowTreeClient::WmNewDisplayAdded(const display::Display& display, | 1341 void WindowTreeClient::WmNewDisplayAdded(const display::Display& display, |
| 1343 ui::mojom::WindowDataPtr root_data, | 1342 ui::mojom::WindowDataPtr root_data, |
| 1344 bool parent_drawn) { | 1343 bool parent_drawn) { |
| 1345 WmNewDisplayAddedImpl(display, std::move(root_data), parent_drawn); | 1344 WmNewDisplayAddedImpl(display, std::move(root_data), parent_drawn); |
| 1346 } | 1345 } |
| 1347 | 1346 |
| 1348 void WindowTreeClient::WmDisplayRemoved(int64_t display_id) { | 1347 void WindowTreeClient::WmDisplayRemoved(int64_t display_id) { |
| 1349 DCHECK(window_manager_delegate_); | 1348 DCHECK(window_manager_delegate_); |
| 1350 for (WindowMus* root : roots_) { | 1349 WindowTreeHostMus* host = GetWindowTreeHostMusWithDisplayId(display_id); |
| 1351 DCHECK(root->GetWindow()->GetHost()); | 1350 if (host) { |
| 1352 WindowTreeHostMus* window_tree_host = | 1351 window_manager_delegate_->OnWmDisplayRemoved(host); |
| 1353 static_cast<WindowTreeHostMus*>(root->GetWindow()->GetHost()); | 1352 return; |
| 1354 if (window_tree_host->display_id() == display_id) { | |
| 1355 window_manager_delegate_->OnWmDisplayRemoved(window_tree_host); | |
| 1356 return; | |
| 1357 } | |
| 1358 } | 1353 } |
| 1359 } | 1354 } |
| 1360 | 1355 |
| 1361 void WindowTreeClient::WmDisplayModified(const display::Display& display) { | 1356 void WindowTreeClient::WmDisplayModified(const display::Display& display) { |
| 1362 DCHECK(window_manager_delegate_); | 1357 DCHECK(window_manager_delegate_); |
| 1363 // TODO(sky): this should likely route to WindowTreeHost. | 1358 // TODO(sky): this should likely route to WindowTreeHost. |
| 1364 window_manager_delegate_->OnWmDisplayModified(display); | 1359 window_manager_delegate_->OnWmDisplayModified(display); |
| 1365 } | 1360 } |
| 1366 | 1361 |
| 1367 void WindowTreeClient::WmSetBounds(uint32_t change_id, | 1362 void WindowTreeClient::WmSetBounds(uint32_t change_id, |
| (...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1839 uint32_t WindowTreeClient::CreateChangeIdForCapture(WindowMus* window) { | 1834 uint32_t WindowTreeClient::CreateChangeIdForCapture(WindowMus* window) { |
| 1840 return ScheduleInFlightChange(base::MakeUnique<InFlightCaptureChange>( | 1835 return ScheduleInFlightChange(base::MakeUnique<InFlightCaptureChange>( |
| 1841 this, capture_synchronizer_.get(), window)); | 1836 this, capture_synchronizer_.get(), window)); |
| 1842 } | 1837 } |
| 1843 | 1838 |
| 1844 uint32_t WindowTreeClient::CreateChangeIdForFocus(WindowMus* window) { | 1839 uint32_t WindowTreeClient::CreateChangeIdForFocus(WindowMus* window) { |
| 1845 return ScheduleInFlightChange(base::MakeUnique<InFlightFocusChange>( | 1840 return ScheduleInFlightChange(base::MakeUnique<InFlightFocusChange>( |
| 1846 this, focus_synchronizer_.get(), window)); | 1841 this, focus_synchronizer_.get(), window)); |
| 1847 } | 1842 } |
| 1848 | 1843 |
| 1844 WindowTreeHostMus* WindowTreeClient::GetWindowTreeHostMusWithDisplayId( | |
| 1845 int64_t display_id) { | |
| 1846 for (WindowMus* root : roots_) { | |
| 1847 DCHECK(root->GetWindow()->GetHost()); | |
| 1848 WindowTreeHostMus* window_tree_host = | |
| 1849 static_cast<WindowTreeHostMus*>(root->GetWindow()->GetHost()); | |
| 1850 if (window_tree_host->display_id() == display_id) | |
| 1851 return window_tree_host; | |
| 1852 } | |
| 1853 return nullptr; | |
| 1854 } | |
| 1855 | |
| 1849 } // namespace aura | 1856 } // namespace aura |
| OLD | NEW |