| Index: ash/magnifier/magnification_controller.cc
|
| diff --git a/ash/magnifier/magnification_controller.cc b/ash/magnifier/magnification_controller.cc
|
| index d014cd40f928f68462c27ceaa29dfe4ec43d9cab..1303628a3840300c0daaabfa082b98c9ccae9bd2 100644
|
| --- a/ash/magnifier/magnification_controller.cc
|
| +++ b/ash/magnifier/magnification_controller.cc
|
| @@ -17,6 +17,9 @@
|
| #include "ui/compositor/layer.h"
|
| #include "ui/compositor/layer_animation_observer.h"
|
| #include "ui/compositor/scoped_layer_animation_settings.h"
|
| +#include "ui/gfx/point_conversions.h"
|
| +#include "ui/gfx/point_f.h"
|
| +#include "ui/gfx/rect_conversions.h"
|
| #include "ui/gfx/screen.h"
|
| #include "ui/views/corewm/compound_event_filter.h"
|
|
|
| @@ -51,7 +54,9 @@ class MagnificationControllerImpl : virtual public MagnificationController,
|
| virtual float GetScale() const OVERRIDE { return scale_; }
|
| virtual void MoveWindow(int x, int y, bool animate) OVERRIDE;
|
| virtual void MoveWindow(const gfx::Point& point, bool animate) OVERRIDE;
|
| - virtual gfx::Point GetWindowPosition() const OVERRIDE { return origin_; }
|
| + virtual gfx::Point GetWindowPosition() const OVERRIDE {
|
| + return gfx::ToFlooredPoint(origin_);
|
| + }
|
| virtual void EnsureRectIsVisible(const gfx::Rect& rect,
|
| bool animate) OVERRIDE;
|
| virtual void EnsurePointIsVisible(const gfx::Point& point,
|
| @@ -65,8 +70,8 @@ class MagnificationControllerImpl : virtual public MagnificationController,
|
| // given scale. Returns true if the window is changed; otherwise, false.
|
| // These methods should be called internally just after the scale and/or
|
| // the position are changed to redraw the window.
|
| - bool Redraw(const gfx::Point& position, float scale, bool animate);
|
| - bool RedrawDIP(const gfx::Point& position, float scale, bool animate);
|
| + bool Redraw(const gfx::PointF& position, float scale, bool animate);
|
| + bool RedrawDIP(const gfx::PointF& position, float scale, bool animate);
|
|
|
| // Redraw with the given zoom scale keeping the mouse cursor location. In
|
| // other words, zoom (or unzoom) centering around the cursor.
|
| @@ -86,6 +91,11 @@ class MagnificationControllerImpl : virtual public MagnificationController,
|
| bool animate);
|
| void OnMouseMove(const gfx::Point& location);
|
|
|
| + // Move the mouse cursot to the given point. Actual move will be done when
|
| + // the animation is completed. This should be called after animation is
|
| + // started.
|
| + void MoveCursorToAfterAnimation(const gfx::Point& location);
|
| +
|
| // Switch Magnified RootWindow to |new_root_window|. This does following:
|
| // - Unzoom the current root_window.
|
| // - Zoom the given new root_window |new_root_window|.
|
| @@ -109,7 +119,7 @@ class MagnificationControllerImpl : virtual public MagnificationController,
|
| }
|
|
|
| // Returns the rect of the magnification window.
|
| - gfx::Rect GetWindowRectDIP(float scale) const;
|
| + gfx::RectF GetWindowRectDIP(float scale) const;
|
| // Returns the size of the root window.
|
| gfx::Size GetHostSizeDIP() const;
|
|
|
| @@ -131,9 +141,15 @@ class MagnificationControllerImpl : virtual public MagnificationController,
|
|
|
| bool is_enabled_;
|
|
|
| + // True if the cursor needs to move the given position after the animation
|
| + // will be finished. When using this, set |position_after_animation_| as well.
|
| + bool move_cursor_after_animation_;
|
| + // Stores the position of cursor to be moved after animation.
|
| + gfx::Point position_after_animation_;
|
| +
|
| // Current scale, origin (left-top) position of the magnification window.
|
| float scale_;
|
| - gfx::Point origin_;
|
| + gfx::PointF origin_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(MagnificationControllerImpl);
|
| };
|
| @@ -145,6 +161,7 @@ MagnificationControllerImpl::MagnificationControllerImpl()
|
| : root_window_(ash::Shell::GetPrimaryRootWindow()),
|
| is_on_zooming_(false),
|
| is_enabled_(false),
|
| + move_cursor_after_animation_(false),
|
| scale_(std::numeric_limits<double>::min()) {
|
| Shell::GetInstance()->AddPreTargetHandler(this);
|
| }
|
| @@ -156,25 +173,34 @@ MagnificationControllerImpl::~MagnificationControllerImpl() {
|
| void MagnificationControllerImpl::RedrawKeepingMousePosition(
|
| float scale, bool animate) {
|
| gfx::Point mouse_in_root = root_window_->GetLastMouseLocationInRoot();
|
| - const gfx::Point origin =
|
| - gfx::Point(mouse_in_root.x() * (1.0f - 1.0f / scale),
|
| - mouse_in_root.y() * (1.0f - 1.0f / scale));
|
| - Redraw(origin, scale, animate);
|
| +
|
| + // mouse_in_root is invalid value when the cursor is hidden.
|
| + if (!root_window_->bounds().Contains(mouse_in_root))
|
| + return;
|
| +
|
| + const gfx::PointF origin =
|
| + gfx::PointF(mouse_in_root.x() -
|
| + (scale_ / scale) * (mouse_in_root.x() - origin_.x()),
|
| + mouse_in_root.y() -
|
| + (scale_ / scale) * (mouse_in_root.y() - origin_.y()));
|
| + bool changed = Redraw(origin, scale, animate);
|
| + if (changed && origin_ != origin)
|
| + MoveCursorToAfterAnimation(mouse_in_root);
|
| }
|
|
|
| -bool MagnificationControllerImpl::Redraw(const gfx::Point& position,
|
| +bool MagnificationControllerImpl::Redraw(const gfx::PointF& position,
|
| float scale,
|
| bool animate) {
|
| - const gfx::Point position_in_dip =
|
| + const gfx::PointF position_in_dip =
|
| ui::ConvertPointToDIP(root_window_->layer(), position);
|
| return RedrawDIP(position_in_dip, scale, animate);
|
| }
|
|
|
| -bool MagnificationControllerImpl::RedrawDIP(const gfx::Point& position_in_dip,
|
| +bool MagnificationControllerImpl::RedrawDIP(const gfx::PointF& position_in_dip,
|
| float scale,
|
| bool animate) {
|
| - int x = position_in_dip.x();
|
| - int y = position_in_dip.y();
|
| + float x = position_in_dip.x();
|
| + float y = position_in_dip.y();
|
|
|
| ValidateScale(&scale);
|
|
|
| @@ -184,9 +210,9 @@ bool MagnificationControllerImpl::RedrawDIP(const gfx::Point& position_in_dip,
|
| y = 0;
|
|
|
| const gfx::Size host_size_in_dip = GetHostSizeDIP();
|
| - const gfx::Size window_size_in_dip = GetWindowRectDIP(scale).size();
|
| - int max_x = host_size_in_dip.width() - window_size_in_dip.width();
|
| - int max_y = host_size_in_dip.height() - window_size_in_dip.height();
|
| + const gfx::SizeF window_size_in_dip = GetWindowRectDIP(scale).size();
|
| + float max_x = host_size_in_dip.width() - window_size_in_dip.width();
|
| + float max_y = host_size_in_dip.height() - window_size_in_dip.height();
|
| if (x > max_x)
|
| x = max_x;
|
| if (y > max_y)
|
| @@ -239,7 +265,7 @@ void MagnificationControllerImpl::EnsureRectIsVisibleDIP(
|
| bool animate) {
|
| ValidateScale(&scale);
|
|
|
| - const gfx::Rect window_rect = GetWindowRectDIP(scale);
|
| + const gfx::Rect window_rect = gfx::ToEnclosingRect(GetWindowRectDIP(scale));
|
| if (scale == scale_ && window_rect.Contains(target_rect))
|
| return;
|
|
|
| @@ -280,7 +306,7 @@ void MagnificationControllerImpl::OnMouseMove(const gfx::Point& location) {
|
| int y = origin_.y();
|
| bool start_zoom = false;
|
|
|
| - const gfx::Rect window_rect = GetWindowRectDIP(scale_);
|
| + const gfx::Rect window_rect = gfx::ToEnclosingRect(GetWindowRectDIP(scale_));
|
| const int left = window_rect.x();
|
| const int right = window_rect.right();
|
| const int width_margin = static_cast<int>(0.1f * window_rect.width());
|
| @@ -317,32 +343,35 @@ void MagnificationControllerImpl::OnMouseMove(const gfx::Point& location) {
|
| int x_diff = origin_.x() - window_rect.x();
|
| int y_diff = origin_.y() - window_rect.y();
|
| // If the magnified region is moved, hides the mouse cursor and moves it.
|
| - if (x_diff != 0 || y_diff != 0) {
|
| - aura::client::CursorClient* cursor_client =
|
| - aura::client::GetCursorClient(root_window_);
|
| - if (cursor_client)
|
| - cursor_client->ShowCursor(false);
|
| - mouse.set_x(mouse.x() - (origin_.x() - window_rect.x()));
|
| - mouse.set_y(mouse.y() - (origin_.y() - window_rect.y()));
|
| - root_window_->MoveCursorTo(mouse);
|
| - }
|
| + if (x_diff != 0 || y_diff != 0)
|
| + MoveCursorToAfterAnimation(mouse);
|
| }
|
| }
|
| }
|
|
|
| +void MagnificationControllerImpl::MoveCursorToAfterAnimation(
|
| + const gfx::Point& location) {
|
| + aura::client::CursorClient* cursor_client =
|
| + aura::client::GetCursorClient(root_window_);
|
| + if (cursor_client)
|
| + cursor_client->ShowCursor(false);
|
| + move_cursor_after_animation_ = true;
|
| + position_after_animation_ = location;
|
| +}
|
| +
|
| gfx::Size MagnificationControllerImpl::GetHostSizeDIP() const {
|
| return ui::ConvertSizeToDIP(root_window_->layer(),
|
| root_window_->GetHostSize());
|
| }
|
|
|
| -gfx::Rect MagnificationControllerImpl::GetWindowRectDIP(float scale) const {
|
| +gfx::RectF MagnificationControllerImpl::GetWindowRectDIP(float scale) const {
|
| const gfx::Size size_in_dip =
|
| ui::ConvertSizeToDIP(root_window_->layer(),
|
| root_window_->GetHostSize());
|
| - const int width = size_in_dip.width() / scale;
|
| - const int height = size_in_dip.height() / scale;
|
| + const float width = size_in_dip.width() / scale;
|
| + const float height = size_in_dip.height() / scale;
|
|
|
| - return gfx::Rect(origin_.x(), origin_.y(), width, height);
|
| + return gfx::RectF(origin_.x(), origin_.y(), width, height);
|
| }
|
|
|
| bool MagnificationControllerImpl::IsMagnified() const {
|
| @@ -366,6 +395,11 @@ void MagnificationControllerImpl::ValidateScale(float* scale) {
|
| void MagnificationControllerImpl::OnImplicitAnimationsCompleted() {
|
| aura::client::CursorClient* cursor_client =
|
| aura::client::GetCursorClient(root_window_);
|
| + if (move_cursor_after_animation_) {
|
| + root_window_->MoveCursorTo(position_after_animation_);
|
| + move_cursor_after_animation_ = false;
|
| + }
|
| + gfx::Point mouse_in_root = root_window_->GetLastMouseLocationInRoot();
|
| if (cursor_client)
|
| cursor_client->ShowCursor(true);
|
| is_on_zooming_ = false;
|
|
|