Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/magnifier/magnification_controller.h" | 5 #include "ash/magnifier/magnification_controller.h" |
| 6 | 6 |
| 7 #include "ash/display/display_controller.h" | |
| 7 #include "ash/shell.h" | 8 #include "ash/shell.h" |
| 8 #include "ash/shell_delegate.h" | 9 #include "ash/shell_delegate.h" |
| 9 #include "ash/system/tray/system_tray_delegate.h" | 10 #include "ash/system/tray/system_tray_delegate.h" |
| 10 #include "ui/aura/client/cursor_client.h" | 11 #include "ui/aura/client/cursor_client.h" |
| 11 #include "ui/aura/root_window.h" | 12 #include "ui/aura/root_window.h" |
| 12 #include "ui/aura/window.h" | 13 #include "ui/aura/window.h" |
| 13 #include "ui/aura/window_property.h" | 14 #include "ui/aura/window_property.h" |
| 14 #include "ui/base/events/event.h" | 15 #include "ui/base/events/event.h" |
| 15 #include "ui/base/events/event_handler.h" | 16 #include "ui/base/events/event_handler.h" |
| 16 #include "ui/compositor/dip_util.h" | 17 #include "ui/compositor/dip_util.h" |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 30 const float kMinMagnifiedScaleThreshold = 1.1f; | 31 const float kMinMagnifiedScaleThreshold = 1.1f; |
| 31 const float kNonMagnifiedScale = 1.0f; | 32 const float kNonMagnifiedScale = 1.0f; |
| 32 | 33 |
| 33 const float kInitialMagnifiedScale = 2.0f; | 34 const float kInitialMagnifiedScale = 2.0f; |
| 34 const float kScrollScaleChangeFactor = 0.05f; | 35 const float kScrollScaleChangeFactor = 0.05f; |
| 35 | 36 |
| 36 // Threadshold of panning. If the cursor moves to within pixels (in DIP) of | 37 // Threadshold of panning. If the cursor moves to within pixels (in DIP) of |
| 37 // |kPanningMergin| from the edge, the view-port moves. | 38 // |kPanningMergin| from the edge, the view-port moves. |
| 38 const int kPanningMergin = 100; | 39 const int kPanningMergin = 100; |
| 39 | 40 |
| 41 bool IsRootWindowValid(aura::RootWindow* root_window) { | |
| 42 if (!root_window) | |
| 43 return false; | |
| 44 | |
| 45 std::vector<aura::RootWindow*> root_windows = | |
| 46 ash::Shell::GetInstance()->display_controller()->GetAllRootWindows(); | |
| 47 if (std::find(root_windows.begin(), root_windows.end(), root_window) != | |
| 48 root_windows.end()) { | |
| 49 return true; | |
| 50 } | |
| 51 | |
| 52 return false; | |
| 53 } | |
|
oshima
2013/02/21 16:45:06
Just
return std::find(...) != root_windows.end();
yoshiki
2013/02/25 12:32:44
Done.
| |
| 54 | |
| 40 } // namespace | 55 } // namespace |
| 41 | 56 |
| 42 namespace ash { | 57 namespace ash { |
| 43 | 58 |
| 44 //////////////////////////////////////////////////////////////////////////////// | 59 //////////////////////////////////////////////////////////////////////////////// |
| 45 // MagnificationControllerImpl: | 60 // MagnificationControllerImpl: |
| 46 | 61 |
| 47 class MagnificationControllerImpl : virtual public MagnificationController, | 62 class MagnificationControllerImpl : virtual public MagnificationController, |
| 48 public ui::EventHandler, | 63 public ui::EventHandler, |
| 49 public ui::ImplicitAnimationObserver { | 64 public ui::ImplicitAnimationObserver, |
| 65 public aura::WindowObserver { | |
| 50 public: | 66 public: |
| 51 MagnificationControllerImpl(); | 67 MagnificationControllerImpl(); |
| 52 virtual ~MagnificationControllerImpl(); | 68 virtual ~MagnificationControllerImpl(); |
| 53 | 69 |
| 54 // MagnificationController overrides: | 70 // MagnificationController overrides: |
| 55 virtual void SetEnabled(bool enabled) OVERRIDE; | 71 virtual void SetEnabled(bool enabled) OVERRIDE; |
| 56 virtual bool IsEnabled() const OVERRIDE; | 72 virtual bool IsEnabled() const OVERRIDE; |
| 57 virtual void SetScale(float scale, bool animate) OVERRIDE; | 73 virtual void SetScale(float scale, bool animate) OVERRIDE; |
| 58 virtual float GetScale() const OVERRIDE { return scale_; } | 74 virtual float GetScale() const OVERRIDE { return scale_; } |
| 59 virtual void MoveWindow(int x, int y, bool animate) OVERRIDE; | 75 virtual void MoveWindow(int x, int y, bool animate) OVERRIDE; |
| 60 virtual void MoveWindow(const gfx::Point& point, bool animate) OVERRIDE; | 76 virtual void MoveWindow(const gfx::Point& point, bool animate) OVERRIDE; |
| 61 virtual gfx::Point GetWindowPosition() const OVERRIDE { | 77 virtual gfx::Point GetWindowPosition() const OVERRIDE { |
| 62 return gfx::ToFlooredPoint(origin_); | 78 return gfx::ToFlooredPoint(origin_); |
| 63 } | 79 } |
| 64 virtual void EnsureRectIsVisible(const gfx::Rect& rect, | 80 virtual void EnsureRectIsVisible(const gfx::Rect& rect, |
| 65 bool animate) OVERRIDE; | 81 bool animate) OVERRIDE; |
| 66 virtual void EnsurePointIsVisible(const gfx::Point& point, | 82 virtual void EnsurePointIsVisible(const gfx::Point& point, |
| 67 bool animate) OVERRIDE; | 83 bool animate) OVERRIDE; |
| 68 | 84 |
| 69 private: | 85 private: |
| 70 // ui::ImplicitAnimationObserver overrides: | 86 // ui::ImplicitAnimationObserver overrides: |
| 71 virtual void OnImplicitAnimationsCompleted() OVERRIDE; | 87 virtual void OnImplicitAnimationsCompleted() OVERRIDE; |
| 72 | 88 |
| 89 // aura::WindowObserver overrides: | |
| 90 virtual void OnWindowDestroying(aura::Window* root_window) OVERRIDE; | |
| 91 | |
| 73 // Redraws the magnification window with the given origin position and the | 92 // Redraws the magnification window with the given origin position and the |
| 74 // given scale. Returns true if the window is changed; otherwise, false. | 93 // given scale. Returns true if the window is changed; otherwise, false. |
| 75 // These methods should be called internally just after the scale and/or | 94 // These methods should be called internally just after the scale and/or |
| 76 // the position are changed to redraw the window. | 95 // the position are changed to redraw the window. |
| 77 bool Redraw(const gfx::PointF& position, float scale, bool animate); | 96 bool Redraw(const gfx::PointF& position, float scale, bool animate); |
| 78 bool RedrawDIP(const gfx::PointF& position, float scale, bool animate); | 97 bool RedrawDIP(const gfx::PointF& position, float scale, bool animate); |
| 79 | 98 |
| 80 // Redraw with the given zoom scale keeping the mouse cursor location. In | 99 // Redraw with the given zoom scale keeping the mouse cursor location. In |
| 81 // other words, zoom (or unzoom) centering around the cursor. | 100 // other words, zoom (or unzoom) centering around the cursor. |
| 82 void RedrawKeepingMousePosition(float scale, bool animate); | 101 void RedrawKeepingMousePosition(float scale, bool animate); |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 99 // the animation is completed. This should be called after animation is | 118 // the animation is completed. This should be called after animation is |
| 100 // started. | 119 // started. |
| 101 void AfterAnimationMoveCursorTo(const gfx::Point& location); | 120 void AfterAnimationMoveCursorTo(const gfx::Point& location); |
| 102 | 121 |
| 103 // Switch Magnified RootWindow to |new_root_window|. This does following: | 122 // Switch Magnified RootWindow to |new_root_window|. This does following: |
| 104 // - Unzoom the current root_window. | 123 // - Unzoom the current root_window. |
| 105 // - Zoom the given new root_window |new_root_window|. | 124 // - Zoom the given new root_window |new_root_window|. |
| 106 // - Switch the target window from current window to |new_root_window|. | 125 // - Switch the target window from current window to |new_root_window|. |
| 107 void SwitchTargetRootWindow(aura::RootWindow* new_root_window); | 126 void SwitchTargetRootWindow(aura::RootWindow* new_root_window); |
| 108 | 127 |
| 128 // Checks the current target root window is still alive or not. If it's stale, | |
| 129 // the current primary root window is newly assigned as the current target | |
| 130 // root window instead. | |
| 131 bool IsRootwindowStale(); | |
| 132 | |
| 109 // Returns if the magnification scale is 1.0 or not (larger then 1.0). | 133 // Returns if the magnification scale is 1.0 or not (larger then 1.0). |
| 110 bool IsMagnified() const; | 134 bool IsMagnified() const; |
| 111 | 135 |
| 112 // Returns the rect of the magnification window. | 136 // Returns the rect of the magnification window. |
| 113 gfx::RectF GetWindowRectDIP(float scale) const; | 137 gfx::RectF GetWindowRectDIP(float scale) const; |
| 114 // Returns the size of the root window. | 138 // Returns the size of the root window. |
| 115 gfx::Size GetHostSizeDIP() const; | 139 gfx::Size GetHostSizeDIP() const; |
| 116 | 140 |
| 117 // Correct the givin scale value if nessesary. | 141 // Correct the givin scale value if nessesary. |
| 118 void ValidateScale(float* scale); | 142 void ValidateScale(float* scale); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 161 if (root_window_) | 185 if (root_window_) |
| 162 point_of_interest_ = root_window_->bounds().CenterPoint(); | 186 point_of_interest_ = root_window_->bounds().CenterPoint(); |
| 163 } | 187 } |
| 164 | 188 |
| 165 MagnificationControllerImpl::~MagnificationControllerImpl() { | 189 MagnificationControllerImpl::~MagnificationControllerImpl() { |
| 166 Shell::GetInstance()->RemovePreTargetHandler(this); | 190 Shell::GetInstance()->RemovePreTargetHandler(this); |
| 167 } | 191 } |
| 168 | 192 |
| 169 void MagnificationControllerImpl::RedrawKeepingMousePosition( | 193 void MagnificationControllerImpl::RedrawKeepingMousePosition( |
| 170 float scale, bool animate) { | 194 float scale, bool animate) { |
| 195 CHECK(root_window_); // |root_window_| should be checked at the caller. | |
| 196 | |
| 171 gfx::Point mouse_in_root = point_of_interest_; | 197 gfx::Point mouse_in_root = point_of_interest_; |
| 172 | 198 |
| 173 // mouse_in_root is invalid value when the cursor is hidden. | 199 // mouse_in_root is invalid value when the cursor is hidden. |
| 174 if (!root_window_->bounds().Contains(mouse_in_root)) | 200 if (!root_window_->bounds().Contains(mouse_in_root)) |
| 175 mouse_in_root = root_window_->bounds().CenterPoint(); | 201 mouse_in_root = root_window_->bounds().CenterPoint(); |
| 176 | 202 |
| 177 const gfx::PointF origin = | 203 const gfx::PointF origin = |
| 178 gfx::PointF(mouse_in_root.x() - | 204 gfx::PointF(mouse_in_root.x() - |
| 179 (scale_ / scale) * (mouse_in_root.x() - origin_.x()), | 205 (scale_ / scale) * (mouse_in_root.x() - origin_.x()), |
| 180 mouse_in_root.y() - | 206 mouse_in_root.y() - |
| 181 (scale_ / scale) * (mouse_in_root.y() - origin_.y())); | 207 (scale_ / scale) * (mouse_in_root.y() - origin_.y())); |
| 182 bool changed = RedrawDIP(origin, scale, animate); | 208 bool changed = RedrawDIP(origin, scale, animate); |
| 183 if (changed) | 209 if (changed) |
| 184 AfterAnimationMoveCursorTo(mouse_in_root); | 210 AfterAnimationMoveCursorTo(mouse_in_root); |
| 185 } | 211 } |
| 186 | 212 |
| 187 bool MagnificationControllerImpl::Redraw(const gfx::PointF& position, | 213 bool MagnificationControllerImpl::Redraw(const gfx::PointF& position, |
| 188 float scale, | 214 float scale, |
| 189 bool animate) { | 215 bool animate) { |
| 216 CHECK(root_window_); // |root_window_| should be checked at the caller. | |
| 217 | |
| 190 const gfx::PointF position_in_dip = | 218 const gfx::PointF position_in_dip = |
| 191 ui::ConvertPointToDIP(root_window_->layer(), position); | 219 ui::ConvertPointToDIP(root_window_->layer(), position); |
| 192 return RedrawDIP(position_in_dip, scale, animate); | 220 return RedrawDIP(position_in_dip, scale, animate); |
| 193 } | 221 } |
| 194 | 222 |
| 195 bool MagnificationControllerImpl::RedrawDIP(const gfx::PointF& position_in_dip, | 223 bool MagnificationControllerImpl::RedrawDIP(const gfx::PointF& position_in_dip, |
| 196 float scale, | 224 float scale, |
| 197 bool animate) { | 225 bool animate) { |
| 226 CHECK(root_window_); // |root_window_| should be checked at the caller. | |
| 227 | |
| 198 float x = position_in_dip.x(); | 228 float x = position_in_dip.x(); |
| 199 float y = position_in_dip.y(); | 229 float y = position_in_dip.y(); |
| 200 | 230 |
| 201 ValidateScale(&scale); | 231 ValidateScale(&scale); |
| 202 | 232 |
| 203 if (x < 0) | 233 if (x < 0) |
| 204 x = 0; | 234 x = 0; |
| 205 if (y < 0) | 235 if (y < 0) |
| 206 y = 0; | 236 y = 0; |
| 207 | 237 |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 246 if (animate) | 276 if (animate) |
| 247 is_on_animation_ = true; | 277 is_on_animation_ = true; |
| 248 | 278 |
| 249 return true; | 279 return true; |
| 250 } | 280 } |
| 251 | 281 |
| 252 void MagnificationControllerImpl::EnsureRectIsVisibleWithScale( | 282 void MagnificationControllerImpl::EnsureRectIsVisibleWithScale( |
| 253 const gfx::Rect& target_rect, | 283 const gfx::Rect& target_rect, |
| 254 float scale, | 284 float scale, |
| 255 bool animate) { | 285 bool animate) { |
| 286 CHECK(root_window_); // |root_window_| should be checked at the caller. | |
| 287 | |
| 256 const gfx::Rect target_rect_in_dip = | 288 const gfx::Rect target_rect_in_dip = |
| 257 ui::ConvertRectToDIP(root_window_->layer(), target_rect); | 289 ui::ConvertRectToDIP(root_window_->layer(), target_rect); |
| 258 EnsureRectIsVisibleDIP(target_rect_in_dip, scale, animate); | 290 EnsureRectIsVisibleDIP(target_rect_in_dip, scale, animate); |
| 259 } | 291 } |
| 260 | 292 |
| 261 void MagnificationControllerImpl::EnsureRectIsVisibleDIP( | 293 void MagnificationControllerImpl::EnsureRectIsVisibleDIP( |
| 262 const gfx::Rect& target_rect, | 294 const gfx::Rect& target_rect, |
| 263 float scale, | 295 float scale, |
| 264 bool animate) { | 296 bool animate) { |
| 265 ValidateScale(&scale); | 297 ValidateScale(&scale); |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 292 void MagnificationControllerImpl::EnsurePointIsVisibleWithScale( | 324 void MagnificationControllerImpl::EnsurePointIsVisibleWithScale( |
| 293 const gfx::Point& point, | 325 const gfx::Point& point, |
| 294 float scale, | 326 float scale, |
| 295 bool animate) { | 327 bool animate) { |
| 296 EnsureRectIsVisibleWithScale(gfx::Rect(point, gfx::Size(0, 0)), | 328 EnsureRectIsVisibleWithScale(gfx::Rect(point, gfx::Size(0, 0)), |
| 297 scale, | 329 scale, |
| 298 animate); | 330 animate); |
| 299 } | 331 } |
| 300 | 332 |
| 301 void MagnificationControllerImpl::OnMouseMove(const gfx::Point& location) { | 333 void MagnificationControllerImpl::OnMouseMove(const gfx::Point& location) { |
| 334 CHECK(root_window_); // |root_window_| should be checked at the caller. | |
| 335 | |
| 302 gfx::Point mouse(location); | 336 gfx::Point mouse(location); |
| 303 | 337 |
| 304 int x = origin_.x(); | 338 int x = origin_.x(); |
| 305 int y = origin_.y(); | 339 int y = origin_.y(); |
| 306 bool start_zoom = false; | 340 bool start_zoom = false; |
| 307 | 341 |
| 308 const gfx::Rect window_rect = gfx::ToEnclosingRect(GetWindowRectDIP(scale_)); | 342 const gfx::Rect window_rect = gfx::ToEnclosingRect(GetWindowRectDIP(scale_)); |
| 309 const int left = window_rect.x(); | 343 const int left = window_rect.x(); |
| 310 const int right = window_rect.right(); | 344 const int right = window_rect.right(); |
| 311 int margin = kPanningMergin / scale_; // No need to consider DPI. | 345 int margin = kPanningMergin / scale_; // No need to consider DPI. |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 346 if (ret) { | 380 if (ret) { |
| 347 // If the magnified region is moved, hides the mouse cursor and moves it. | 381 // If the magnified region is moved, hides the mouse cursor and moves it. |
| 348 if (x_diff != 0 || y_diff != 0) | 382 if (x_diff != 0 || y_diff != 0) |
| 349 root_window_->MoveCursorTo(mouse); | 383 root_window_->MoveCursorTo(mouse); |
| 350 } | 384 } |
| 351 } | 385 } |
| 352 } | 386 } |
| 353 | 387 |
| 354 void MagnificationControllerImpl::AfterAnimationMoveCursorTo( | 388 void MagnificationControllerImpl::AfterAnimationMoveCursorTo( |
| 355 const gfx::Point& location) { | 389 const gfx::Point& location) { |
| 390 CHECK(root_window_); // |root_window_| should be checked at the caller. | |
| 391 | |
| 356 aura::client::CursorClient* cursor_client = | 392 aura::client::CursorClient* cursor_client = |
| 357 aura::client::GetCursorClient(root_window_); | 393 aura::client::GetCursorClient(root_window_); |
| 358 if (cursor_client) { | 394 if (cursor_client) { |
| 359 // When cursor is invisible, do not move or show the cursor after the | 395 // When cursor is invisible, do not move or show the cursor after the |
| 360 // animation. | 396 // animation. |
| 361 if (!cursor_client->IsCursorVisible()) | 397 if (!cursor_client->IsCursorVisible()) |
| 362 return; | 398 return; |
| 363 cursor_client->DisableMouseEvents(); | 399 cursor_client->DisableMouseEvents(); |
| 364 } | 400 } |
| 365 move_cursor_after_animation_ = true; | 401 move_cursor_after_animation_ = true; |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 409 | 445 |
| 410 aura::client::CursorClient* cursor_client = | 446 aura::client::CursorClient* cursor_client = |
| 411 aura::client::GetCursorClient(root_window_); | 447 aura::client::GetCursorClient(root_window_); |
| 412 if (cursor_client) | 448 if (cursor_client) |
| 413 cursor_client->EnableMouseEvents(); | 449 cursor_client->EnableMouseEvents(); |
| 414 } | 450 } |
| 415 | 451 |
| 416 is_on_animation_ = false; | 452 is_on_animation_ = false; |
| 417 } | 453 } |
| 418 | 454 |
| 455 void MagnificationControllerImpl::OnWindowDestroying( | |
| 456 aura::Window* root_window) { | |
| 457 if (root_window == root_window_) | |
| 458 root_window_ = NULL; | |
|
oshima
2013/02/21 16:45:06
Shouldn't you switch the root window here?
This w
yoshiki
2013/02/25 12:32:44
Done. Switching root window here.
| |
| 459 } | |
| 460 | |
| 419 void MagnificationControllerImpl::SwitchTargetRootWindow( | 461 void MagnificationControllerImpl::SwitchTargetRootWindow( |
| 420 aura::RootWindow* new_root_window) { | 462 aura::RootWindow* new_root_window) { |
| 421 if (new_root_window == root_window_) | 463 if (new_root_window == root_window_) |
| 422 return; | 464 return; |
| 423 | 465 |
| 466 // Stores the previous scale. | |
| 424 float scale = GetScale(); | 467 float scale = GetScale(); |
| 425 | 468 |
| 469 // Unmagnify the previous root window. | |
| 470 root_window_->RemoveObserver(this); | |
|
oshima
2013/02/21 16:45:06
root_window_ can be NULL at this point, can't it?
yoshiki
2013/02/25 12:32:44
Done. I've added the check.
| |
| 426 RedrawKeepingMousePosition(1.0f, true); | 471 RedrawKeepingMousePosition(1.0f, true); |
| 427 root_window_ = new_root_window; | 472 |
| 428 RedrawKeepingMousePosition(scale, true); | 473 // Ensures that |new_root_window_| is valid. |
| 474 if (IsRootWindowValid(new_root_window)) { | |
|
oshima
2013/02/21 16:45:06
Looking through call flow, this should never be fa
yoshiki
2013/02/25 12:32:44
Done.
| |
| 475 root_window_ = new_root_window; | |
| 476 RedrawKeepingMousePosition(scale, true); | |
| 477 root_window_->AddObserver(this); | |
| 478 } else { | |
| 479 root_window_ = NULL; | |
| 480 } | |
| 481 } | |
| 482 | |
| 483 bool MagnificationControllerImpl::IsRootwindowStale() { | |
|
oshima
2013/02/21 16:45:06
Changing a state inside predicate style method lik
yoshiki
2013/02/25 12:32:44
Removed.
| |
| 484 // If the current target root window is stale, try to switch target to the | |
| 485 // primary root window. | |
| 486 if (!IsRootWindowValid(root_window_)) { | |
| 487 root_window_ = NULL; | |
| 488 | |
| 489 aura::RootWindow* primary_root_window = Shell::GetPrimaryRootWindow(); | |
| 490 SwitchTargetRootWindow(primary_root_window); | |
| 491 | |
| 492 // When there are no root windows. | |
| 493 if (!root_window_) | |
| 494 return true; | |
| 495 | |
| 496 point_of_interest_ = root_window_->bounds().CenterPoint(); | |
| 497 } | |
| 498 | |
| 499 return false; | |
| 429 } | 500 } |
| 430 | 501 |
| 431 //////////////////////////////////////////////////////////////////////////////// | 502 //////////////////////////////////////////////////////////////////////////////// |
| 432 // MagnificationControllerImpl: MagnificationController implementation | 503 // MagnificationControllerImpl: MagnificationController implementation |
| 433 | 504 |
| 434 void MagnificationControllerImpl::SetScale(float scale, bool animate) { | 505 void MagnificationControllerImpl::SetScale(float scale, bool animate) { |
| 435 if (!is_enabled_) | 506 if (!is_enabled_ || IsRootwindowStale()) |
| 436 return; | 507 return; |
| 437 | 508 |
| 438 ValidateScale(&scale); | 509 ValidateScale(&scale); |
| 439 ash::Shell::GetInstance()->delegate()->SaveScreenMagnifierScale(scale); | 510 ash::Shell::GetInstance()->delegate()->SaveScreenMagnifierScale(scale); |
| 440 RedrawKeepingMousePosition(scale, animate); | 511 RedrawKeepingMousePosition(scale, animate); |
| 441 } | 512 } |
| 442 | 513 |
| 443 void MagnificationControllerImpl::MoveWindow(int x, int y, bool animate) { | 514 void MagnificationControllerImpl::MoveWindow(int x, int y, bool animate) { |
| 444 if (!is_enabled_) | 515 if (!is_enabled_ || IsRootwindowStale()) |
| 445 return; | 516 return; |
| 446 | 517 |
| 447 Redraw(gfx::Point(x, y), scale_, animate); | 518 Redraw(gfx::Point(x, y), scale_, animate); |
| 448 } | 519 } |
| 449 | 520 |
| 450 void MagnificationControllerImpl::MoveWindow(const gfx::Point& point, | 521 void MagnificationControllerImpl::MoveWindow(const gfx::Point& point, |
| 451 bool animate) { | 522 bool animate) { |
| 452 if (!is_enabled_) | 523 if (!is_enabled_ || IsRootwindowStale()) |
| 453 return; | 524 return; |
| 454 | 525 |
| 455 Redraw(point, scale_, animate); | 526 Redraw(point, scale_, animate); |
| 456 } | 527 } |
| 457 | 528 |
| 458 void MagnificationControllerImpl::EnsureRectIsVisible( | 529 void MagnificationControllerImpl::EnsureRectIsVisible( |
| 459 const gfx::Rect& target_rect, | 530 const gfx::Rect& target_rect, |
| 460 bool animate) { | 531 bool animate) { |
| 461 if (!is_enabled_) | 532 if (!is_enabled_ || IsRootwindowStale()) |
| 462 return; | 533 return; |
| 463 | 534 |
| 464 EnsureRectIsVisibleWithScale(target_rect, scale_, animate); | 535 EnsureRectIsVisibleWithScale(target_rect, scale_, animate); |
| 465 } | 536 } |
| 466 | 537 |
| 467 void MagnificationControllerImpl::EnsurePointIsVisible( | 538 void MagnificationControllerImpl::EnsurePointIsVisible( |
| 468 const gfx::Point& point, | 539 const gfx::Point& point, |
| 469 bool animate) { | 540 bool animate) { |
| 470 if (!is_enabled_) | 541 if (!is_enabled_ || IsRootwindowStale()) |
| 471 return; | 542 return; |
| 472 | 543 |
| 473 EnsurePointIsVisibleWithScale(point, scale_, animate); | 544 EnsurePointIsVisibleWithScale(point, scale_, animate); |
| 474 } | 545 } |
| 475 | 546 |
| 476 void MagnificationControllerImpl::SetEnabled(bool enabled) { | 547 void MagnificationControllerImpl::SetEnabled(bool enabled) { |
| 548 if (IsRootwindowStale()) | |
| 549 return; | |
| 550 | |
| 477 if (enabled) { | 551 if (enabled) { |
| 478 float scale = | 552 float scale = |
| 479 ash::Shell::GetInstance()->delegate()->GetSavedScreenMagnifierScale(); | 553 ash::Shell::GetInstance()->delegate()->GetSavedScreenMagnifierScale(); |
| 480 if (scale <= 0.0f) | 554 if (scale <= 0.0f) |
| 481 scale = kInitialMagnifiedScale; | 555 scale = kInitialMagnifiedScale; |
| 482 ValidateScale(&scale); | 556 ValidateScale(&scale); |
| 483 | 557 |
| 484 // Do nothing, if already enabled with same scale. | 558 // Do nothing, if already enabled with same scale. |
| 485 if (is_enabled_ && scale == scale_) | 559 if (is_enabled_ && scale == scale_) |
| 486 return; | 560 return; |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 504 | 578 |
| 505 //////////////////////////////////////////////////////////////////////////////// | 579 //////////////////////////////////////////////////////////////////////////////// |
| 506 // MagnificationControllerImpl: aura::EventFilter implementation | 580 // MagnificationControllerImpl: aura::EventFilter implementation |
| 507 | 581 |
| 508 void MagnificationControllerImpl::OnMouseEvent(ui::MouseEvent* event) { | 582 void MagnificationControllerImpl::OnMouseEvent(ui::MouseEvent* event) { |
| 509 aura::Window* target = static_cast<aura::Window*>(event->target()); | 583 aura::Window* target = static_cast<aura::Window*>(event->target()); |
| 510 aura::RootWindow* current_root = target->GetRootWindow(); | 584 aura::RootWindow* current_root = target->GetRootWindow(); |
| 511 gfx::Rect root_bounds = current_root->bounds(); | 585 gfx::Rect root_bounds = current_root->bounds(); |
| 512 | 586 |
| 513 if (root_bounds.Contains(event->root_location())) { | 587 if (root_bounds.Contains(event->root_location())) { |
| 588 // This must be before |SwitchTargetRootWindow()|. | |
| 589 point_of_interest_ = event->root_location(); | |
| 590 | |
| 514 if (current_root != root_window_) | 591 if (current_root != root_window_) |
| 515 SwitchTargetRootWindow(current_root); | 592 SwitchTargetRootWindow(current_root); |
| 516 | 593 |
| 517 point_of_interest_ = event->root_location(); | 594 if (IsMagnified() && root_window_ && event->type() == ui::ET_MOUSE_MOVED) |
| 518 | |
| 519 if (IsMagnified() && event->type() == ui::ET_MOUSE_MOVED) | |
| 520 OnMouseMove(event->root_location()); | 595 OnMouseMove(event->root_location()); |
| 521 } | 596 } |
| 522 } | 597 } |
| 523 | 598 |
| 524 void MagnificationControllerImpl::OnScrollEvent(ui::ScrollEvent* event) { | 599 void MagnificationControllerImpl::OnScrollEvent(ui::ScrollEvent* event) { |
| 525 if (event->IsAltDown() && event->IsControlDown()) { | 600 if (event->IsAltDown() && event->IsControlDown()) { |
| 526 if (event->type() == ui::ET_SCROLL_FLING_START || | 601 if (event->type() == ui::ET_SCROLL_FLING_START || |
| 527 event->type() == ui::ET_SCROLL_FLING_CANCEL) { | 602 event->type() == ui::ET_SCROLL_FLING_CANCEL) { |
| 528 event->StopPropagation(); | 603 event->StopPropagation(); |
| 529 return; | 604 return; |
| 530 } | 605 } |
| 531 | 606 |
| 532 if (event->type() == ui::ET_SCROLL) { | 607 if (event->type() == ui::ET_SCROLL) { |
| 533 ui::ScrollEvent* scroll_event = static_cast<ui::ScrollEvent*>(event); | 608 ui::ScrollEvent* scroll_event = static_cast<ui::ScrollEvent*>(event); |
| 534 float scale = GetScale(); | 609 float scale = GetScale(); |
| 535 scale += scroll_event->y_offset() * kScrollScaleChangeFactor; | 610 scale += scroll_event->y_offset() * kScrollScaleChangeFactor; |
| 536 SetScale(scale, true); | 611 SetScale(scale, true); |
| 537 event->StopPropagation(); | 612 event->StopPropagation(); |
| 538 return; | 613 return; |
| 539 } | 614 } |
| 540 } | 615 } |
| 541 } | 616 } |
| 542 | 617 |
| 543 void MagnificationControllerImpl::OnTouchEvent(ui::TouchEvent* event) { | 618 void MagnificationControllerImpl::OnTouchEvent(ui::TouchEvent* event) { |
| 544 aura::Window* target = static_cast<aura::Window*>(event->target()); | 619 aura::Window* target = static_cast<aura::Window*>(event->target()); |
| 545 aura::RootWindow* current_root = target->GetRootWindow(); | 620 aura::RootWindow* current_root = target->GetRootWindow(); |
| 546 if (current_root == root_window_) { | 621 if (current_root && current_root == root_window_) { |
| 547 gfx::Rect root_bounds = current_root->bounds(); | 622 gfx::Rect root_bounds = current_root->bounds(); |
| 548 if (root_bounds.Contains(event->root_location())) | 623 if (root_bounds.Contains(event->root_location())) |
| 549 point_of_interest_ = event->root_location(); | 624 point_of_interest_ = event->root_location(); |
| 550 } | 625 } |
| 551 } | 626 } |
| 552 | 627 |
| 553 //////////////////////////////////////////////////////////////////////////////// | 628 //////////////////////////////////////////////////////////////////////////////// |
| 554 // MagnificationController: | 629 // MagnificationController: |
| 555 | 630 |
| 556 // static | 631 // static |
| 557 MagnificationController* MagnificationController::CreateInstance() { | 632 MagnificationController* MagnificationController::CreateInstance() { |
| 558 return new MagnificationControllerImpl(); | 633 return new MagnificationControllerImpl(); |
| 559 } | 634 } |
| 560 | 635 |
| 561 } // namespace ash | 636 } // namespace ash |
| OLD | NEW |