| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "ash/display/extended_mouse_warp_controller.h" | 5 #include "ash/display/extended_mouse_warp_controller.h" |
| 6 | 6 |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 | 8 |
| 9 #include "ash/display/display_manager.h" | 9 #include "ash/display/display_manager.h" |
| 10 #include "ash/display/display_util.h" | 10 #include "ash/display/display_util.h" |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 45 return Shell::GetScreen()->GetDisplayNearestWindow(window); | 45 return Shell::GetScreen()->GetDisplayNearestWindow(window); |
| 46 } | 46 } |
| 47 | 47 |
| 48 } // namespace | 48 } // namespace |
| 49 | 49 |
| 50 ExtendedMouseWarpController::WarpRegion::WarpRegion( | 50 ExtendedMouseWarpController::WarpRegion::WarpRegion( |
| 51 int64_t a_display_id, | 51 int64_t a_display_id, |
| 52 int64_t b_display_id, | 52 int64_t b_display_id, |
| 53 const gfx::Rect& a_indicator_bounds, | 53 const gfx::Rect& a_indicator_bounds, |
| 54 const gfx::Rect& b_indicator_bounds) | 54 const gfx::Rect& b_indicator_bounds) |
| 55 : a_display_id(a_display_id), | 55 : a_display_id_(a_display_id), |
| 56 b_display_id(b_display_id), | 56 b_display_id_(b_display_id), |
| 57 a_indicator_bounds(a_indicator_bounds), | 57 a_indicator_bounds_(a_indicator_bounds), |
| 58 b_indicator_bounds(b_indicator_bounds), | 58 b_indicator_bounds_(b_indicator_bounds), |
| 59 shared_display_edge_indicator(nullptr) { | 59 shared_display_edge_indicator_(nullptr) { |
| 60 // Initialize edge bounds from indicator bounds. | 60 // Initialize edge bounds from indicator bounds. |
| 61 aura::Window* a_window = GetRootWindowForDisplayId(a_display_id); | 61 aura::Window* a_window = GetRootWindowForDisplayId(a_display_id); |
| 62 aura::Window* b_window = GetRootWindowForDisplayId(b_display_id); | 62 aura::Window* b_window = GetRootWindowForDisplayId(b_display_id); |
| 63 | 63 |
| 64 AshWindowTreeHost* a_ash_host = GetRootWindowController(a_window)->ash_host(); | 64 AshWindowTreeHost* a_ash_host = GetRootWindowController(a_window)->ash_host(); |
| 65 AshWindowTreeHost* b_ash_host = GetRootWindowController(b_window)->ash_host(); | 65 AshWindowTreeHost* b_ash_host = GetRootWindowController(b_window)->ash_host(); |
| 66 | 66 |
| 67 a_edge_bounds_in_native = GetNativeEdgeBounds(a_ash_host, a_indicator_bounds); | 67 a_edge_bounds_in_native_ = |
| 68 b_edge_bounds_in_native = GetNativeEdgeBounds(b_ash_host, b_indicator_bounds); | 68 GetNativeEdgeBounds(a_ash_host, a_indicator_bounds); |
| 69 b_edge_bounds_in_native_ = |
| 70 GetNativeEdgeBounds(b_ash_host, b_indicator_bounds); |
| 69 } | 71 } |
| 70 | 72 |
| 71 ExtendedMouseWarpController::WarpRegion::~WarpRegion() {} | 73 ExtendedMouseWarpController::WarpRegion::~WarpRegion() {} |
| 72 | 74 |
| 73 ExtendedMouseWarpController::ExtendedMouseWarpController( | 75 ExtendedMouseWarpController::ExtendedMouseWarpController( |
| 74 aura::Window* drag_source) | 76 aura::Window* drag_source) |
| 75 : drag_source_root_(drag_source), | 77 : drag_source_root_(drag_source), |
| 76 allow_non_native_event_(false) { | 78 allow_non_native_event_(false) { |
| 77 ash::DisplayManager* display_manager = | 79 ash::DisplayManager* display_manager = |
| 78 Shell::GetInstance()->display_manager(); | 80 Shell::GetInstance()->display_manager(); |
| 79 | 81 |
| 80 // For the time being, 3 or more displays are always always laid out | 82 // For the time being, 3 or more displays are always always laid out |
| 81 // horizontally, with each display being RIGHT of the previous one. | 83 // horizontally, with each display being RIGHT of the previous one. |
| 82 if (display_manager->GetNumDisplays() > 2) { | 84 if (display_manager->GetNumDisplays() > 2) { |
| 83 for (size_t i = 1; i < display_manager->GetNumDisplays(); ++i) { | 85 for (size_t i = 1; i < display_manager->GetNumDisplays(); ++i) { |
| 84 const gfx::Display& left = display_manager->GetDisplayAt(i - 1); | 86 const gfx::Display& left = display_manager->GetDisplayAt(i - 1); |
| 85 const gfx::Display& right = display_manager->GetDisplayAt(i); | 87 const gfx::Display& right = display_manager->GetDisplayAt(i); |
| 86 | 88 |
| 87 AddWarpRegion(CreateVerticalEdgeBounds(left, right, DisplayLayout::RIGHT), | 89 AddWarpRegion(CreateVerticalEdgeBounds(left, right, DisplayLayout::RIGHT), |
| 88 drag_source != nullptr); | 90 drag_source != nullptr); |
| 89 } | 91 } |
| 90 } else { | 92 } else { |
| 93 // Make sure to set |a| as the primary display, and |b| as the secondary |
| 94 // display. DisplayLayout::Position is defined in terms of primary. |
| 91 DisplayLayout::Position position = | 95 DisplayLayout::Position position = |
| 92 display_manager->GetCurrentDisplayLayout().position; | 96 display_manager->GetCurrentDisplayLayout().position; |
| 93 const gfx::Display& a = display_manager->GetDisplayAt(0); | 97 const gfx::Display& a = Shell::GetScreen()->GetPrimaryDisplay(); |
| 94 const gfx::Display& b = display_manager->GetDisplayAt(1); | 98 const gfx::Display& b = ScreenUtil::GetSecondaryDisplay(); |
| 95 | 99 |
| 96 // TODO(oshima): Use ComputeBondary instead. | 100 // TODO(oshima): Use ComputeBondary instead. |
| 97 if (position == DisplayLayout::TOP || position == DisplayLayout::BOTTOM) | 101 if (position == DisplayLayout::TOP || position == DisplayLayout::BOTTOM) { |
| 98 AddWarpRegion(CreateHorizontalEdgeBounds(a, b, position), | 102 AddWarpRegion(CreateHorizontalEdgeBounds(a, b, position), |
| 99 drag_source != nullptr); | 103 drag_source != nullptr); |
| 100 else | 104 } else { |
| 101 AddWarpRegion(CreateVerticalEdgeBounds(a, b, position), | 105 AddWarpRegion(CreateVerticalEdgeBounds(a, b, position), |
| 102 drag_source != nullptr); | 106 drag_source != nullptr); |
| 107 } |
| 103 } | 108 } |
| 104 } | 109 } |
| 105 | 110 |
| 106 ExtendedMouseWarpController::~ExtendedMouseWarpController() { | 111 ExtendedMouseWarpController::~ExtendedMouseWarpController() { |
| 107 } | 112 } |
| 108 | 113 |
| 109 bool ExtendedMouseWarpController::WarpMouseCursor(ui::MouseEvent* event) { | 114 bool ExtendedMouseWarpController::WarpMouseCursor(ui::MouseEvent* event) { |
| 110 if (Shell::GetScreen()->GetNumDisplays() <= 1 || !enabled_) | 115 if (Shell::GetScreen()->GetNumDisplays() <= 1 || !enabled_) |
| 111 return false; | 116 return false; |
| 112 | 117 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 141 | 146 |
| 142 return WarpMouseCursorInNativeCoords(point_in_native, point_in_screen, false); | 147 return WarpMouseCursorInNativeCoords(point_in_native, point_in_screen, false); |
| 143 } | 148 } |
| 144 | 149 |
| 145 void ExtendedMouseWarpController::SetEnabled(bool enabled) { | 150 void ExtendedMouseWarpController::SetEnabled(bool enabled) { |
| 146 enabled_ = enabled; | 151 enabled_ = enabled; |
| 147 } | 152 } |
| 148 | 153 |
| 149 void ExtendedMouseWarpController::AddWarpRegion( | 154 void ExtendedMouseWarpController::AddWarpRegion( |
| 150 scoped_ptr<WarpRegion> warp_region, | 155 scoped_ptr<WarpRegion> warp_region, |
| 151 bool drag_source) { | 156 bool has_drag_source) { |
| 152 if (drag_source) { | 157 if (has_drag_source) { |
| 153 warp_region->shared_display_edge_indicator.reset( | 158 warp_region->shared_display_edge_indicator_.reset( |
| 154 new SharedDisplayEdgeIndicator); | 159 new SharedDisplayEdgeIndicator); |
| 155 warp_region->shared_display_edge_indicator->Show( | 160 warp_region->shared_display_edge_indicator_->Show( |
| 156 warp_region->a_indicator_bounds, warp_region->b_indicator_bounds); | 161 warp_region->a_indicator_bounds_, warp_region->b_indicator_bounds_); |
| 157 } | 162 } |
| 158 | 163 |
| 159 warp_regions_.emplace_back(std::move(warp_region)); | 164 warp_regions_.emplace_back(std::move(warp_region)); |
| 160 } | 165 } |
| 161 | 166 |
| 162 bool ExtendedMouseWarpController::WarpMouseCursorInNativeCoords( | 167 bool ExtendedMouseWarpController::WarpMouseCursorInNativeCoords( |
| 163 const gfx::Point& point_in_native, | 168 const gfx::Point& point_in_native, |
| 164 const gfx::Point& point_in_screen, | 169 const gfx::Point& point_in_screen, |
| 165 bool update_mouse_location_now) { | 170 bool update_mouse_location_now) { |
| 166 for (const scoped_ptr<WarpRegion>& warp : warp_regions_) { | 171 for (const scoped_ptr<WarpRegion>& warp : warp_regions_) { |
| 167 bool in_a_edge = warp->a_edge_bounds_in_native.Contains(point_in_native); | 172 bool in_a_edge = warp->a_edge_bounds_in_native_.Contains(point_in_native); |
| 168 bool in_b_edge = warp->b_edge_bounds_in_native.Contains(point_in_native); | 173 bool in_b_edge = warp->b_edge_bounds_in_native_.Contains(point_in_native); |
| 169 if (!in_a_edge && !in_b_edge) | 174 if (!in_a_edge && !in_b_edge) |
| 170 continue; | 175 continue; |
| 171 | 176 |
| 172 // The mouse must move. | 177 // The mouse must move. |
| 173 aura::Window* dst_window = GetRootWindowForDisplayId( | 178 aura::Window* dst_window = GetRootWindowForDisplayId( |
| 174 in_a_edge ? warp->b_display_id : warp->a_display_id); | 179 in_a_edge ? warp->b_display_id_ : warp->a_display_id_); |
| 175 AshWindowTreeHost* target_ash_host = | 180 AshWindowTreeHost* target_ash_host = |
| 176 GetRootWindowController(dst_window)->ash_host(); | 181 GetRootWindowController(dst_window)->ash_host(); |
| 177 | 182 |
| 178 MoveCursorTo(target_ash_host, point_in_screen, update_mouse_location_now); | 183 MoveCursorTo(target_ash_host, point_in_screen, update_mouse_location_now); |
| 179 return true; | 184 return true; |
| 180 } | 185 } |
| 181 | 186 |
| 182 return false; | 187 return false; |
| 183 } | 188 } |
| 184 | 189 |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 265 upper_indicator_y = std::max(upper_indicator_y, upper_shared_y); | 270 upper_indicator_y = std::max(upper_indicator_y, upper_shared_y); |
| 266 } | 271 } |
| 267 a_indicator_bounds.set_y(upper_indicator_y); | 272 a_indicator_bounds.set_y(upper_indicator_y); |
| 268 a_indicator_bounds.set_height(lower_indicator_y - upper_indicator_y); | 273 a_indicator_bounds.set_height(lower_indicator_y - upper_indicator_y); |
| 269 | 274 |
| 270 return make_scoped_ptr( | 275 return make_scoped_ptr( |
| 271 new WarpRegion(a.id(), b.id(), a_indicator_bounds, b_indicator_bounds)); | 276 new WarpRegion(a.id(), b.id(), a_indicator_bounds, b_indicator_bounds)); |
| 272 } | 277 } |
| 273 | 278 |
| 274 } // namespace ash | 279 } // namespace ash |
| OLD | NEW |