| Index: ash/wm/workspace/workspace_window_resizer.cc
|
| diff --git a/ash/wm/workspace/workspace_window_resizer.cc b/ash/wm/workspace/workspace_window_resizer.cc
|
| index 1229c23b861c2240d0abe893d6ce19b2be8d8bfc..92be2c7643f4372c6f4eaf0a94f3f869da7c117b 100644
|
| --- a/ash/wm/workspace/workspace_window_resizer.cc
|
| +++ b/ash/wm/workspace/workspace_window_resizer.cc
|
| @@ -10,14 +10,13 @@
|
| #include <vector>
|
|
|
| #include "ash/display/display_controller.h"
|
| -#include "ash/display/mouse_cursor_event_filter.h"
|
| #include "ash/screen_ash.h"
|
| #include "ash/shell.h"
|
| #include "ash/shell_window_ids.h"
|
| #include "ash/wm/coordinate_conversion.h"
|
| #include "ash/wm/cursor_manager.h"
|
| #include "ash/wm/default_window_resizer.h"
|
| -#include "ash/wm/drag_window_controller.h"
|
| +#include "ash/wm/drag_window_resizer.h"
|
| #include "ash/wm/property_util.h"
|
| #include "ash/wm/window_util.h"
|
| #include "ash/wm/workspace/phantom_window_controller.h"
|
| @@ -41,6 +40,11 @@ scoped_ptr<WindowResizer> CreateWindowResizer(aura::Window* window,
|
| if (!wm::CanResizeWindow(window) && window_component != HTCAPTION)
|
| return scoped_ptr<WindowResizer>();
|
|
|
| + WindowResizer::Details details(window, point_in_parent, window_component);
|
| + if (!details.is_resizable)
|
| + return scoped_ptr<WindowResizer>();
|
| +
|
| + WindowResizer* window_resizer = NULL;
|
| if (window->parent() &&
|
| window->parent()->id() == internal::kShellWindowId_WorkspaceContainer) {
|
| // Allow dragging maximized windows if it's not tracked by workspace. This
|
| @@ -48,19 +52,14 @@ scoped_ptr<WindowResizer> CreateWindowResizer(aura::Window* window,
|
| if (!wm::IsWindowNormal(window) &&
|
| (window_component != HTCAPTION || GetTrackedByWorkspace(window)))
|
| return scoped_ptr<WindowResizer>();
|
| - return make_scoped_ptr<WindowResizer>(
|
| - internal::WorkspaceWindowResizer::Create(window,
|
| - point_in_parent,
|
| - window_component,
|
| - std::vector<aura::Window*>()));
|
| + window_resizer = new internal::WorkspaceWindowResizer(
|
| + details, std::vector<aura::Window*>());
|
| } else if (wm::IsWindowNormal(window)) {
|
| - return make_scoped_ptr<WindowResizer>(DefaultWindowResizer::Create(
|
| - window,
|
| - point_in_parent,
|
| - window_component));
|
| - } else {
|
| - return scoped_ptr<WindowResizer>();
|
| + window_resizer = new DefaultWindowResizer(details);
|
| }
|
| + if (window_resizer)
|
| + window_resizer = new internal::DragWindowResizer(window_resizer, details);
|
| + return make_scoped_ptr<WindowResizer>(window_resizer);
|
| }
|
|
|
| namespace internal {
|
| @@ -70,32 +69,12 @@ namespace {
|
| // Duration of the animation when snapping the window into place.
|
| const int kSnapDurationMS = 100;
|
|
|
| -// The maximum opacity of the drag phantom window.
|
| -const float kMaxOpacity = 0.8f;
|
| -
|
| // Returns true if should snap to the edge.
|
| bool ShouldSnapToEdge(int distance_from_edge, int grid_size) {
|
| return distance_from_edge < grid_size &&
|
| distance_from_edge > -grid_size * 2;
|
| }
|
|
|
| -// Returns true if Ash has more than one root window.
|
| -bool HasSecondaryRootWindow() {
|
| - return Shell::GetAllRootWindows().size() > 1;
|
| -}
|
| -
|
| -// When there are two root windows, returns one of the root windows which is not
|
| -// |root_window|. Returns NULL if only one root window exists.
|
| -aura::RootWindow* GetAnotherRootWindow(aura::RootWindow* root_window) {
|
| - Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
|
| - if (root_windows.size() < 2)
|
| - return NULL;
|
| - DCHECK_EQ(2U, root_windows.size());
|
| - if (root_windows[0] == root_window)
|
| - return root_windows[1];
|
| - return root_windows[0];
|
| -}
|
| -
|
| // Returns the coordinate along the secondary axis to snap to.
|
| int CoordinateAlongSecondaryAxis(SecondaryMagnetismEdge edge,
|
| int leading,
|
| @@ -307,13 +286,7 @@ class WindowSize {
|
|
|
| WorkspaceWindowResizer::~WorkspaceWindowResizer() {
|
| Shell* shell = Shell::GetInstance();
|
| - shell->mouse_cursor_filter()->set_mouse_warp_mode(
|
| - MouseCursorEventFilter::WARP_ALWAYS);
|
| - shell->mouse_cursor_filter()->HideSharedEdgeIndicator();
|
| shell->cursor_manager()->UnlockCursor();
|
| -
|
| - if (destroyed_)
|
| - *destroyed_ = true;
|
| }
|
|
|
| // static
|
| @@ -362,26 +335,12 @@ void WorkspaceWindowResizer::Drag(const gfx::Point& location_in_parent,
|
|
|
| if (!attached_windows_.empty())
|
| LayoutAttachedWindows(&bounds);
|
| - if (bounds != window()->bounds()) {
|
| - bool destroyed = false;
|
| - destroyed_ = &destroyed;
|
| + if (bounds != window()->bounds())
|
| window()->SetBounds(bounds);
|
| - if (destroyed)
|
| - return;
|
| - destroyed_ = NULL;
|
| - }
|
| - // Show a phantom window for dragging in another root window.
|
| - if (HasSecondaryRootWindow())
|
| - UpdateDragWindow(bounds, in_original_root);
|
| - else
|
| - drag_window_controller_.reset();
|
| -
|
| }
|
|
|
| void WorkspaceWindowResizer::CompleteDrag(int event_flags) {
|
| wm::SetUserHasChangedWindowPositionOrSize(details_.window, true);
|
| - window()->layer()->SetOpacity(details_.initial_opacity);
|
| - drag_window_controller_.reset();
|
| snap_phantom_window_controller_.reset();
|
| if (!did_move_or_resize_ || details_.window_component != HTCAPTION)
|
| return;
|
| @@ -403,29 +362,10 @@ void WorkspaceWindowResizer::CompleteDrag(int event_flags) {
|
| window()->SetBounds(snap_sizer_->target_bounds());
|
| return;
|
| }
|
| - gfx::Rect bounds(GetFinalBounds(window()->bounds()));
|
| -
|
| - // Check if the destination is another display.
|
| - gfx::Point last_mouse_location_in_screen = last_mouse_location_;
|
| - wm::ConvertPointToScreen(window()->parent(), &last_mouse_location_in_screen);
|
| - gfx::Screen* screen = Shell::GetScreen();
|
| - const gfx::Display dst_display =
|
| - screen->GetDisplayNearestPoint(last_mouse_location_in_screen);
|
| -
|
| - if (dst_display.id() !=
|
| - screen->GetDisplayNearestWindow(window()->GetRootWindow()).id()) {
|
| - // Don't animate when moving to another display.
|
| - const gfx::Rect dst_bounds =
|
| - ScreenAsh::ConvertRectToScreen(window()->parent(), bounds);
|
| - window()->SetBoundsInScreen(dst_bounds, dst_display);
|
| - }
|
| }
|
|
|
| void WorkspaceWindowResizer::RevertDrag() {
|
| - window()->layer()->SetOpacity(details_.initial_opacity);
|
| - drag_window_controller_.reset();
|
| snap_phantom_window_controller_.reset();
|
| - Shell::GetInstance()->mouse_cursor_filter()->HideSharedEdgeIndicator();
|
|
|
| if (!did_move_or_resize_)
|
| return;
|
| @@ -469,27 +409,12 @@ WorkspaceWindowResizer::WorkspaceWindowResizer(
|
| total_initial_size_(0),
|
| snap_type_(SNAP_NONE),
|
| num_mouse_moves_since_bounds_change_(0),
|
| - destroyed_(NULL),
|
| magnetism_window_(NULL) {
|
| DCHECK(details_.is_resizable);
|
|
|
| Shell* shell = Shell::GetInstance();
|
| shell->cursor_manager()->LockCursor();
|
|
|
| - // The pointer should be confined in one display during resizing a window
|
| - // because the window cannot span two displays at the same time anyway. The
|
| - // exception is window/tab dragging operation. During that operation,
|
| - // |mouse_warp_mode_| should be set to WARP_DRAG so that the user could move a
|
| - // window/tab to another display.
|
| - MouseCursorEventFilter* mouse_cursor_filter = shell->mouse_cursor_filter();
|
| - mouse_cursor_filter->set_mouse_warp_mode(
|
| - ShouldAllowMouseWarp() ?
|
| - MouseCursorEventFilter::WARP_DRAG : MouseCursorEventFilter::WARP_NONE);
|
| - if (ShouldAllowMouseWarp()) {
|
| - mouse_cursor_filter->ShowSharedEdgeIndicator(
|
| - details.window->GetRootWindow());
|
| - }
|
| -
|
| // Only support attaching to the right/bottom.
|
| DCHECK(attached_windows_.empty() ||
|
| (details.window_component == HTRIGHT ||
|
| @@ -818,51 +743,6 @@ int WorkspaceWindowResizer::PrimaryAxisCoordinate(int x, int y) const {
|
| return 0;
|
| }
|
|
|
| -void WorkspaceWindowResizer::UpdateDragWindow(const gfx::Rect& bounds,
|
| - bool in_original_root) {
|
| - if (!did_move_or_resize_ || details_.window_component != HTCAPTION ||
|
| - !ShouldAllowMouseWarp()) {
|
| - return;
|
| - }
|
| -
|
| - // It's available. Show a phantom window on the display if needed.
|
| - aura::RootWindow* another_root =
|
| - GetAnotherRootWindow(window()->GetRootWindow());
|
| - const gfx::Rect root_bounds_in_screen(another_root->GetBoundsInScreen());
|
| - const gfx::Rect bounds_in_screen =
|
| - ScreenAsh::ConvertRectToScreen(window()->parent(), bounds);
|
| - gfx::Rect bounds_in_another_root =
|
| - gfx::IntersectRects(root_bounds_in_screen, bounds_in_screen);
|
| -
|
| - const float fraction_in_another_window =
|
| - (bounds_in_another_root.width() * bounds_in_another_root.height()) /
|
| - static_cast<float>(bounds.width() * bounds.height());
|
| - const float phantom_opacity =
|
| - !in_original_root ? 1 : (kMaxOpacity * fraction_in_another_window);
|
| - const float window_opacity =
|
| - in_original_root ? 1 : (kMaxOpacity * (1 - fraction_in_another_window));
|
| -
|
| - if (fraction_in_another_window > 0) {
|
| - if (!drag_window_controller_.get()) {
|
| - drag_window_controller_.reset(
|
| - new DragWindowController(window()));
|
| - // Always show the drag phantom on the |another_root| window.
|
| - drag_window_controller_->SetDestinationDisplay(
|
| - Shell::GetScreen()->GetDisplayMatching(
|
| - another_root->GetBoundsInScreen()));
|
| - drag_window_controller_->Show();
|
| - } else {
|
| - // No animation.
|
| - drag_window_controller_->SetBounds(bounds_in_screen);
|
| - }
|
| - drag_window_controller_->SetOpacity(phantom_opacity);
|
| - window()->layer()->SetOpacity(window_opacity);
|
| - } else {
|
| - drag_window_controller_.reset();
|
| - window()->layer()->SetOpacity(1.0f);
|
| - }
|
| -}
|
| -
|
| void WorkspaceWindowResizer::UpdateSnapPhantomWindow(const gfx::Point& location,
|
| const gfx::Rect& bounds) {
|
| if (!did_move_or_resize_ || details_.window_component != HTCAPTION)
|
| @@ -940,11 +820,5 @@ WorkspaceWindowResizer::SnapType WorkspaceWindowResizer::GetSnapType(
|
| return SNAP_NONE;
|
| }
|
|
|
| -bool WorkspaceWindowResizer::ShouldAllowMouseWarp() const {
|
| - return (details_.window_component == HTCAPTION) &&
|
| - (window()->GetProperty(aura::client::kModalKey) == ui::MODAL_TYPE_NONE) &&
|
| - (window()->type() == aura::client::WINDOW_TYPE_NORMAL);
|
| -}
|
| -
|
| } // namespace internal
|
| } // namespace ash
|
|
|