| 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/accelerators/accelerator_controller.h" | 7 #include "ash/accelerators/accelerator_controller.h" |
| 8 #include "ash/accessibility_delegate.h" | 8 #include "ash/accessibility_delegate.h" |
| 9 #include "ash/ash_switches.h" | 9 #include "ash/ash_switches.h" |
| 10 #include "ash/display/root_window_transformers.h" | 10 #include "ash/display/root_window_transformers.h" |
| 11 #include "ash/host/ash_window_tree_host.h" | 11 #include "ash/host/ash_window_tree_host.h" |
| 12 #include "ash/host/root_window_transformer.h" | 12 #include "ash/host/root_window_transformer.h" |
| 13 #include "ash/root_window_controller.h" | 13 #include "ash/root_window_controller.h" |
| 14 #include "ash/shell.h" | 14 #include "ash/shell.h" |
| 15 #include "ash/system/tray/system_tray_delegate.h" | 15 #include "ash/system/tray/system_tray_delegate.h" |
| 16 #include "base/command_line.h" | 16 #include "base/command_line.h" |
| 17 #include "base/synchronization/waitable_event.h" | 17 #include "base/synchronization/waitable_event.h" |
| 18 #include "ui/aura/client/aura_constants.h" |
| 18 #include "ui/aura/client/cursor_client.h" | 19 #include "ui/aura/client/cursor_client.h" |
| 19 #include "ui/aura/window.h" | 20 #include "ui/aura/window.h" |
| 20 #include "ui/aura/window_property.h" | |
| 21 #include "ui/aura/window_tree_host.h" | 21 #include "ui/aura/window_tree_host.h" |
| 22 #include "ui/base/ime/input_method.h" |
| 23 #include "ui/base/ime/input_method_observer.h" |
| 24 #include "ui/base/ime/text_input_client.h" |
| 22 #include "ui/compositor/dip_util.h" | 25 #include "ui/compositor/dip_util.h" |
| 23 #include "ui/compositor/layer.h" | 26 #include "ui/compositor/layer.h" |
| 24 #include "ui/compositor/layer_animation_observer.h" | 27 #include "ui/compositor/layer_animation_observer.h" |
| 25 #include "ui/compositor/scoped_layer_animation_settings.h" | 28 #include "ui/compositor/scoped_layer_animation_settings.h" |
| 26 #include "ui/events/event.h" | 29 #include "ui/events/event.h" |
| 27 #include "ui/events/event_handler.h" | 30 #include "ui/events/event_handler.h" |
| 28 #include "ui/gfx/point3_f.h" | 31 #include "ui/gfx/point3_f.h" |
| 29 #include "ui/gfx/point_conversions.h" | 32 #include "ui/gfx/point_conversions.h" |
| 30 #include "ui/gfx/point_f.h" | 33 #include "ui/gfx/point_f.h" |
| 31 #include "ui/gfx/rect_conversions.h" | 34 #include "ui/gfx/rect_conversions.h" |
| 32 #include "ui/gfx/screen.h" | 35 #include "ui/gfx/screen.h" |
| 33 #include "ui/wm/core/compound_event_filter.h" | 36 #include "ui/wm/core/compound_event_filter.h" |
| 37 #include "ui/wm/core/coordinate_conversion.h" |
| 34 | 38 |
| 35 namespace { | 39 namespace { |
| 36 | 40 |
| 37 const float kMaxMagnifiedScale = 4.0f; | 41 const float kMaxMagnifiedScale = 4.0f; |
| 38 const float kMaxMagnifiedScaleThreshold = 4.0f; | 42 const float kMaxMagnifiedScaleThreshold = 4.0f; |
| 39 const float kMinMagnifiedScaleThreshold = 1.1f; | 43 const float kMinMagnifiedScaleThreshold = 1.1f; |
| 40 const float kNonMagnifiedScale = 1.0f; | 44 const float kNonMagnifiedScale = 1.0f; |
| 41 | 45 |
| 42 const float kInitialMagnifiedScale = 2.0f; | 46 const float kInitialMagnifiedScale = 2.0f; |
| 43 const float kScrollScaleChangeFactor = 0.05f; | 47 const float kScrollScaleChangeFactor = 0.05f; |
| 44 | 48 |
| 45 // Threadshold of panning. If the cursor moves to within pixels (in DIP) of | 49 // Threadshold of panning. If the cursor moves to within pixels (in DIP) of |
| 46 // |kPanningMergin| from the edge, the view-port moves. | 50 // |kPanningMergin| from the edge, the view-port moves. |
| 47 const int kPanningMergin = 100; | 51 const int kPanningMergin = 100; |
| 48 | 52 |
| 53 // Gives a little panning margin for following caret, so that we will move the |
| 54 // view-port before the caret is completely out of sight. |
| 55 const int kCaretPanningMargin = 10; |
| 56 |
| 49 void MoveCursorTo(aura::WindowTreeHost* host, const gfx::Point& root_location) { | 57 void MoveCursorTo(aura::WindowTreeHost* host, const gfx::Point& root_location) { |
| 50 gfx::Point3F host_location_3f(root_location); | 58 gfx::Point3F host_location_3f(root_location); |
| 51 host->GetRootTransform().TransformPoint(&host_location_3f); | 59 host->GetRootTransform().TransformPoint(&host_location_3f); |
| 52 host->MoveCursorToHostLocation( | 60 host->MoveCursorToHostLocation( |
| 53 gfx::ToCeiledPoint(host_location_3f.AsPointF())); | 61 gfx::ToCeiledPoint(host_location_3f.AsPointF())); |
| 54 } | 62 } |
| 55 | 63 |
| 56 } // namespace | 64 } // namespace |
| 57 | 65 |
| 58 namespace ash { | 66 namespace ash { |
| 59 | 67 |
| 60 //////////////////////////////////////////////////////////////////////////////// | 68 //////////////////////////////////////////////////////////////////////////////// |
| 61 // MagnificationControllerImpl: | 69 // MagnificationControllerImpl: |
| 62 | 70 |
| 63 class MagnificationControllerImpl : virtual public MagnificationController, | 71 class MagnificationControllerImpl : virtual public MagnificationController, |
| 64 public ui::EventHandler, | 72 public ui::EventHandler, |
| 65 public ui::ImplicitAnimationObserver, | 73 public ui::ImplicitAnimationObserver, |
| 66 public aura::WindowObserver { | 74 public aura::WindowObserver, |
| 75 public ui::InputMethodObserver { |
| 67 public: | 76 public: |
| 68 MagnificationControllerImpl(); | 77 MagnificationControllerImpl(); |
| 69 virtual ~MagnificationControllerImpl(); | 78 virtual ~MagnificationControllerImpl(); |
| 70 | 79 |
| 71 // MagnificationController overrides: | 80 // MagnificationController overrides: |
| 72 virtual void SetEnabled(bool enabled) override; | 81 virtual void SetEnabled(bool enabled) override; |
| 73 virtual bool IsEnabled() const override; | 82 virtual bool IsEnabled() const override; |
| 74 virtual void SetScale(float scale, bool animate) override; | 83 virtual void SetScale(float scale, bool animate) override; |
| 75 virtual float GetScale() const override { return scale_; } | 84 virtual float GetScale() const override { return scale_; } |
| 76 virtual void MoveWindow(int x, int y, bool animate) override; | 85 virtual void MoveWindow(int x, int y, bool animate) override; |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 137 gfx::Size GetHostSizeDIP() const; | 146 gfx::Size GetHostSizeDIP() const; |
| 138 | 147 |
| 139 // Correct the givin scale value if nessesary. | 148 // Correct the givin scale value if nessesary. |
| 140 void ValidateScale(float* scale); | 149 void ValidateScale(float* scale); |
| 141 | 150 |
| 142 // ui::EventHandler overrides: | 151 // ui::EventHandler overrides: |
| 143 virtual void OnMouseEvent(ui::MouseEvent* event) override; | 152 virtual void OnMouseEvent(ui::MouseEvent* event) override; |
| 144 virtual void OnScrollEvent(ui::ScrollEvent* event) override; | 153 virtual void OnScrollEvent(ui::ScrollEvent* event) override; |
| 145 virtual void OnTouchEvent(ui::TouchEvent* event) override; | 154 virtual void OnTouchEvent(ui::TouchEvent* event) override; |
| 146 | 155 |
| 156 // Moves the view port when |point| is located within |
| 157 // |x_panning_margin| and |y_pannin_margin| to the edge of the visible |
| 158 // window region. The view port will be moved so that the |point| will be |
| 159 // moved to the point where it has |x_target_margin| and |y_target_margin| |
| 160 // to the edge of the visible region. |
| 161 void MoveMagnifierWindow(const gfx::Point& point, |
| 162 int x_panning_margin, |
| 163 int y_panning_margin, |
| 164 int x_target_margin, |
| 165 int y_target_margin); |
| 166 |
| 167 // ui::InputMethodObserver: |
| 168 virtual void OnTextInputTypeChanged( |
| 169 const ui::TextInputClient* client) override {} |
| 170 virtual void OnFocus() override {} |
| 171 virtual void OnBlur() override {} |
| 172 virtual void OnTextInputStateChanged( |
| 173 const ui::TextInputClient* client) override {} |
| 174 virtual void OnInputMethodDestroyed( |
| 175 const ui::InputMethod* input_method) override {} |
| 176 virtual void OnShowImeIfNeeded() override {} |
| 177 virtual void OnCaretBoundsChanged(const ui::TextInputClient* client) override; |
| 178 |
| 147 // Target root window. This must not be NULL. | 179 // Target root window. This must not be NULL. |
| 148 aura::Window* root_window_; | 180 aura::Window* root_window_; |
| 149 | 181 |
| 150 // True if the magnified window is currently animating a change. Otherwise, | 182 // True if the magnified window is currently animating a change. Otherwise, |
| 151 // false. | 183 // false. |
| 152 bool is_on_animation_; | 184 bool is_on_animation_; |
| 153 | 185 |
| 154 bool is_enabled_; | 186 bool is_enabled_; |
| 155 | 187 |
| 156 // True if the cursor needs to move the given position after the animation | 188 // True if the cursor needs to move the given position after the animation |
| 157 // will be finished. When using this, set |position_after_animation_| as well. | 189 // will be finished. When using this, set |position_after_animation_| as well. |
| 158 bool move_cursor_after_animation_; | 190 bool move_cursor_after_animation_; |
| 159 // Stores the position of cursor to be moved after animation. | 191 // Stores the position of cursor to be moved after animation. |
| 160 gfx::Point position_after_animation_; | 192 gfx::Point position_after_animation_; |
| 161 | 193 |
| 162 // Stores the last mouse cursor (or last touched) location. This value is | 194 // Stores the last mouse cursor (or last touched) location. This value is |
| 163 // used on zooming to keep this location visible. | 195 // used on zooming to keep this location visible. |
| 164 gfx::Point point_of_interest_; | 196 gfx::Point point_of_interest_; |
| 165 | 197 |
| 166 // Current scale, origin (left-top) position of the magnification window. | 198 // Current scale, origin (left-top) position of the magnification window. |
| 167 float scale_; | 199 float scale_; |
| 168 gfx::PointF origin_; | 200 gfx::PointF origin_; |
| 169 | 201 |
| 170 ScrollDirection scroll_direction_; | 202 ScrollDirection scroll_direction_; |
| 171 | 203 |
| 204 ui::InputMethod* input_method_; // Not owned. |
| 205 |
| 172 DISALLOW_COPY_AND_ASSIGN(MagnificationControllerImpl); | 206 DISALLOW_COPY_AND_ASSIGN(MagnificationControllerImpl); |
| 173 }; | 207 }; |
| 174 | 208 |
| 175 //////////////////////////////////////////////////////////////////////////////// | 209 //////////////////////////////////////////////////////////////////////////////// |
| 176 // MagnificationControllerImpl: | 210 // MagnificationControllerImpl: |
| 177 | 211 |
| 178 MagnificationControllerImpl::MagnificationControllerImpl() | 212 MagnificationControllerImpl::MagnificationControllerImpl() |
| 179 : root_window_(Shell::GetPrimaryRootWindow()), | 213 : root_window_(Shell::GetPrimaryRootWindow()), |
| 180 is_on_animation_(false), | 214 is_on_animation_(false), |
| 181 is_enabled_(false), | 215 is_enabled_(false), |
| 182 move_cursor_after_animation_(false), | 216 move_cursor_after_animation_(false), |
| 183 scale_(kNonMagnifiedScale), | 217 scale_(kNonMagnifiedScale), |
| 184 scroll_direction_(SCROLL_NONE) { | 218 scroll_direction_(SCROLL_NONE), |
| 219 input_method_(NULL) { |
| 185 Shell::GetInstance()->AddPreTargetHandler(this); | 220 Shell::GetInstance()->AddPreTargetHandler(this); |
| 186 root_window_->AddObserver(this); | 221 root_window_->AddObserver(this); |
| 187 point_of_interest_ = root_window_->bounds().CenterPoint(); | 222 point_of_interest_ = root_window_->bounds().CenterPoint(); |
| 188 } | 223 } |
| 189 | 224 |
| 190 MagnificationControllerImpl::~MagnificationControllerImpl() { | 225 MagnificationControllerImpl::~MagnificationControllerImpl() { |
| 226 if (input_method_) |
| 227 input_method_->RemoveObserver(this); |
| 228 |
| 191 root_window_->RemoveObserver(this); | 229 root_window_->RemoveObserver(this); |
| 192 | 230 |
| 193 Shell::GetInstance()->RemovePreTargetHandler(this); | 231 Shell::GetInstance()->RemovePreTargetHandler(this); |
| 194 } | 232 } |
| 195 | 233 |
| 196 void MagnificationControllerImpl::RedrawKeepingMousePosition( | 234 void MagnificationControllerImpl::RedrawKeepingMousePosition( |
| 197 float scale, bool animate) { | 235 float scale, bool animate) { |
| 198 gfx::Point mouse_in_root = point_of_interest_; | 236 gfx::Point mouse_in_root = point_of_interest_; |
| 199 | 237 |
| 200 // mouse_in_root is invalid value when the cursor is hidden. | 238 // mouse_in_root is invalid value when the cursor is hidden. |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 310 new_origin.Offset(0, kMoveOffset); | 348 new_origin.Offset(0, kMoveOffset); |
| 311 break; | 349 break; |
| 312 } | 350 } |
| 313 RedrawDIP(new_origin, scale_, true); | 351 RedrawDIP(new_origin, scale_, true); |
| 314 } | 352 } |
| 315 | 353 |
| 316 void MagnificationControllerImpl::OnMouseMove(const gfx::Point& location) { | 354 void MagnificationControllerImpl::OnMouseMove(const gfx::Point& location) { |
| 317 DCHECK(root_window_); | 355 DCHECK(root_window_); |
| 318 | 356 |
| 319 gfx::Point mouse(location); | 357 gfx::Point mouse(location); |
| 320 | |
| 321 int x = origin_.x(); | |
| 322 int y = origin_.y(); | |
| 323 bool start_zoom = false; | |
| 324 | |
| 325 const gfx::Rect window_rect = gfx::ToEnclosingRect(GetWindowRectDIP(scale_)); | |
| 326 const int left = window_rect.x(); | |
| 327 const int right = window_rect.right(); | |
| 328 int margin = kPanningMergin / scale_; // No need to consider DPI. | 358 int margin = kPanningMergin / scale_; // No need to consider DPI. |
| 329 | 359 MoveMagnifierWindow(mouse, margin, margin, margin, margin); |
| 330 int x_diff = 0; | |
| 331 | |
| 332 if (mouse.x() < left + margin) { | |
| 333 // Panning left. | |
| 334 x_diff = mouse.x() - (left + margin); | |
| 335 start_zoom = true; | |
| 336 } else if (right - margin < mouse.x()) { | |
| 337 // Panning right. | |
| 338 x_diff = mouse.x() - (right - margin); | |
| 339 start_zoom = true; | |
| 340 } | |
| 341 x = left + x_diff; | |
| 342 | |
| 343 const int top = window_rect.y(); | |
| 344 const int bottom = window_rect.bottom(); | |
| 345 | |
| 346 int y_diff = 0; | |
| 347 if (mouse.y() < top + margin) { | |
| 348 // Panning up. | |
| 349 y_diff = mouse.y() - (top + margin); | |
| 350 start_zoom = true; | |
| 351 } else if (bottom - margin < mouse.y()) { | |
| 352 // Panning down. | |
| 353 y_diff = mouse.y() - (bottom - margin); | |
| 354 start_zoom = true; | |
| 355 } | |
| 356 y = top + y_diff; | |
| 357 | |
| 358 if (start_zoom && !is_on_animation_) { | |
| 359 // No animation on panning. | |
| 360 bool animate = false; | |
| 361 bool ret = RedrawDIP(gfx::Point(x, y), scale_, animate); | |
| 362 | |
| 363 if (ret) { | |
| 364 // If the magnified region is moved, hides the mouse cursor and moves it. | |
| 365 if (x_diff != 0 || y_diff != 0) | |
| 366 MoveCursorTo(root_window_->GetHost(), mouse); | |
| 367 } | |
| 368 } | |
| 369 } | 360 } |
| 370 | 361 |
| 371 void MagnificationControllerImpl::AfterAnimationMoveCursorTo( | 362 void MagnificationControllerImpl::AfterAnimationMoveCursorTo( |
| 372 const gfx::Point& location) { | 363 const gfx::Point& location) { |
| 373 DCHECK(root_window_); | 364 DCHECK(root_window_); |
| 374 | 365 |
| 375 aura::client::CursorClient* cursor_client = | 366 aura::client::CursorClient* cursor_client = |
| 376 aura::client::GetCursorClient(root_window_); | 367 aura::client::GetCursorClient(root_window_); |
| 377 if (cursor_client) { | 368 if (cursor_client) { |
| 378 // When cursor is invisible, do not move or show the cursor after the | 369 // When cursor is invisible, do not move or show the cursor after the |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 510 | 501 |
| 511 void MagnificationControllerImpl::SetScrollDirection( | 502 void MagnificationControllerImpl::SetScrollDirection( |
| 512 ScrollDirection direction) { | 503 ScrollDirection direction) { |
| 513 scroll_direction_ = direction; | 504 scroll_direction_ = direction; |
| 514 StartOrStopScrollIfNecessary(); | 505 StartOrStopScrollIfNecessary(); |
| 515 } | 506 } |
| 516 | 507 |
| 517 void MagnificationControllerImpl::SetEnabled(bool enabled) { | 508 void MagnificationControllerImpl::SetEnabled(bool enabled) { |
| 518 Shell* shell = Shell::GetInstance(); | 509 Shell* shell = Shell::GetInstance(); |
| 519 if (enabled) { | 510 if (enabled) { |
| 511 if (!input_method_) { |
| 512 input_method_ = |
| 513 root_window_->GetProperty(aura::client::kRootWindowInputMethodKey); |
| 514 if (input_method_) |
| 515 input_method_->AddObserver(this); |
| 516 } |
| 517 |
| 520 float scale = | 518 float scale = |
| 521 Shell::GetInstance()->accessibility_delegate()-> | 519 Shell::GetInstance()->accessibility_delegate()-> |
| 522 GetSavedScreenMagnifierScale(); | 520 GetSavedScreenMagnifierScale(); |
| 523 if (scale <= 0.0f) | 521 if (scale <= 0.0f) |
| 524 scale = kInitialMagnifiedScale; | 522 scale = kInitialMagnifiedScale; |
| 525 ValidateScale(&scale); | 523 ValidateScale(&scale); |
| 526 | 524 |
| 527 // Do nothing, if already enabled with same scale. | 525 // Do nothing, if already enabled with same scale. |
| 528 if (is_enabled_ && scale == scale_) | 526 if (is_enabled_ && scale == scale_) |
| 529 return; | 527 return; |
| 530 | 528 |
| 531 is_enabled_ = enabled; | 529 is_enabled_ = enabled; |
| 532 RedrawKeepingMousePosition(scale, true); | 530 RedrawKeepingMousePosition(scale, true); |
| 533 shell->accessibility_delegate()->SaveScreenMagnifierScale(scale); | 531 shell->accessibility_delegate()->SaveScreenMagnifierScale(scale); |
| 534 } else { | 532 } else { |
| 535 // Do nothing, if already disabled. | 533 // Do nothing, if already disabled. |
| 536 if (!is_enabled_) | 534 if (!is_enabled_) |
| 537 return; | 535 return; |
| 538 | 536 |
| 537 if (input_method_) { |
| 538 input_method_->RemoveObserver(this); |
| 539 input_method_ = NULL; |
| 540 } |
| 541 |
| 539 RedrawKeepingMousePosition(kNonMagnifiedScale, true); | 542 RedrawKeepingMousePosition(kNonMagnifiedScale, true); |
| 540 is_enabled_ = enabled; | 543 is_enabled_ = enabled; |
| 541 } | 544 } |
| 542 } | 545 } |
| 543 | 546 |
| 544 bool MagnificationControllerImpl::IsEnabled() const { | 547 bool MagnificationControllerImpl::IsEnabled() const { |
| 545 return is_enabled_; | 548 return is_enabled_; |
| 546 } | 549 } |
| 547 | 550 |
| 548 //////////////////////////////////////////////////////////////////////////////// | 551 //////////////////////////////////////////////////////////////////////////////// |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 590 void MagnificationControllerImpl::OnTouchEvent(ui::TouchEvent* event) { | 593 void MagnificationControllerImpl::OnTouchEvent(ui::TouchEvent* event) { |
| 591 aura::Window* target = static_cast<aura::Window*>(event->target()); | 594 aura::Window* target = static_cast<aura::Window*>(event->target()); |
| 592 aura::Window* current_root = target->GetRootWindow(); | 595 aura::Window* current_root = target->GetRootWindow(); |
| 593 if (current_root == root_window_) { | 596 if (current_root == root_window_) { |
| 594 gfx::Rect root_bounds = current_root->bounds(); | 597 gfx::Rect root_bounds = current_root->bounds(); |
| 595 if (root_bounds.Contains(event->root_location())) | 598 if (root_bounds.Contains(event->root_location())) |
| 596 point_of_interest_ = event->root_location(); | 599 point_of_interest_ = event->root_location(); |
| 597 } | 600 } |
| 598 } | 601 } |
| 599 | 602 |
| 603 void MagnificationControllerImpl::MoveMagnifierWindow(const gfx::Point& point, |
| 604 int x_panning_margin, |
| 605 int y_panning_margin, |
| 606 int x_target_margin, |
| 607 int y_target_margin) { |
| 608 DCHECK(root_window_); |
| 609 int x = origin_.x(); |
| 610 int y = origin_.y(); |
| 611 bool start_zoom = false; |
| 612 |
| 613 const gfx::Rect window_rect = gfx::ToEnclosingRect(GetWindowRectDIP(scale_)); |
| 614 const int left = window_rect.x(); |
| 615 const int right = window_rect.right(); |
| 616 |
| 617 int x_diff = 0; |
| 618 if (point.x() < left + x_panning_margin) { |
| 619 // Panning left. |
| 620 x_diff = point.x() - (left + x_target_margin); |
| 621 start_zoom = true; |
| 622 } else if (right - x_panning_margin < point.x()) { |
| 623 // Panning right. |
| 624 x_diff = point.x() - (right - x_target_margin); |
| 625 start_zoom = true; |
| 626 } |
| 627 x = left + x_diff; |
| 628 |
| 629 const int top = window_rect.y(); |
| 630 const int bottom = window_rect.bottom(); |
| 631 |
| 632 int y_diff = 0; |
| 633 if (point.y() < top + y_panning_margin) { |
| 634 // Panning up. |
| 635 y_diff = point.y() - (top + y_target_margin); |
| 636 start_zoom = true; |
| 637 } else if (bottom - y_panning_margin < point.y()) { |
| 638 // Panning down. |
| 639 y_diff = point.y() - (bottom - y_target_margin); |
| 640 start_zoom = true; |
| 641 } |
| 642 y = top + y_diff; |
| 643 if (start_zoom && !is_on_animation_) { |
| 644 // No animation on panning. |
| 645 bool animate = false; |
| 646 bool ret = RedrawDIP(gfx::Point(x, y), scale_, animate); |
| 647 |
| 648 if (ret) { |
| 649 // If the magnified region is moved, hides the mouse cursor and moves it. |
| 650 if (x_diff != 0 || y_diff != 0) |
| 651 MoveCursorTo(root_window_->GetHost(), point); |
| 652 } |
| 653 } |
| 654 } |
| 655 |
| 656 void MagnificationControllerImpl::OnCaretBoundsChanged( |
| 657 const ui::TextInputClient* client) { |
| 658 // caret bounds in screen coordinates. |
| 659 const gfx::Rect caret_bounds = client->GetCaretBounds(); |
| 660 // Note: OnCaretBoundsChanged could be fired OnTextInputTypeChanged during |
| 661 // which the caret position is not set a meaning position, and we do not |
| 662 // need to adjust the view port position based on the bogus caret position. |
| 663 // This is only a transition period, the caret position will be fixed upon |
| 664 // focusing right after. |
| 665 if (caret_bounds.width() == 0 && caret_bounds.height() == 0) |
| 666 return; |
| 667 |
| 668 gfx::Point caret_origin = caret_bounds.origin(); |
| 669 // caret_origin in |root_window_| coordinates. |
| 670 wm::ConvertPointFromScreen(root_window_, &caret_origin); |
| 671 |
| 672 // Visible window_rect in |root_window_| coordinates. |
| 673 const gfx::Rect visible_window_rect = |
| 674 gfx::ToEnclosingRect(GetWindowRectDIP(scale_)); |
| 675 |
| 676 const int panning_margin = kCaretPanningMargin / scale_; |
| 677 MoveMagnifierWindow(caret_origin, |
| 678 panning_margin, |
| 679 panning_margin, |
| 680 visible_window_rect.width() / 2, |
| 681 visible_window_rect.height() / 2); |
| 682 } |
| 683 |
| 600 //////////////////////////////////////////////////////////////////////////////// | 684 //////////////////////////////////////////////////////////////////////////////// |
| 601 // MagnificationController: | 685 // MagnificationController: |
| 602 | 686 |
| 603 // static | 687 // static |
| 604 MagnificationController* MagnificationController::CreateInstance() { | 688 MagnificationController* MagnificationController::CreateInstance() { |
| 605 return new MagnificationControllerImpl(); | 689 return new MagnificationControllerImpl(); |
| 606 } | 690 } |
| 607 | 691 |
| 608 } // namespace ash | 692 } // namespace ash |
| OLD | NEW |