| 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/wm/toplevel_window_event_handler.h" | 5 #include "ash/wm/toplevel_window_event_handler.h" |
| 6 | 6 |
| 7 #include "ash/shell.h" | 7 #include "ash/shell.h" |
| 8 #include "ash/wm/property_util.h" | 8 #include "ash/wm/property_util.h" |
| 9 #include "ash/wm/resize_shadow_controller.h" | 9 #include "ash/wm/resize_shadow_controller.h" |
| 10 #include "ash/wm/window_resizer.h" | 10 #include "ash/wm/window_resizer.h" |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 52 // Wraps a WindowResizer and installs an observer on its target window. When | 52 // Wraps a WindowResizer and installs an observer on its target window. When |
| 53 // the window is destroyed ResizerWindowDestroyed() is invoked back on the | 53 // the window is destroyed ResizerWindowDestroyed() is invoked back on the |
| 54 // ToplevelWindowEventHandler to clean up. | 54 // ToplevelWindowEventHandler to clean up. |
| 55 class ToplevelWindowEventHandler::ScopedWindowResizer | 55 class ToplevelWindowEventHandler::ScopedWindowResizer |
| 56 : public aura::WindowObserver { | 56 : public aura::WindowObserver { |
| 57 public: | 57 public: |
| 58 ScopedWindowResizer(ToplevelWindowEventHandler* handler, | 58 ScopedWindowResizer(ToplevelWindowEventHandler* handler, |
| 59 WindowResizer* resizer); | 59 WindowResizer* resizer); |
| 60 virtual ~ScopedWindowResizer(); | 60 virtual ~ScopedWindowResizer(); |
| 61 | 61 |
| 62 WindowResizer* ReleaseResizer(); |
| 62 WindowResizer* resizer() { return resizer_.get(); } | 63 WindowResizer* resizer() { return resizer_.get(); } |
| 63 | 64 |
| 64 // WindowObserver overrides: | 65 // WindowObserver overrides: |
| 65 virtual void OnWindowPropertyChanged(aura::Window* window, | 66 virtual void OnWindowPropertyChanged(aura::Window* window, |
| 66 const void* key, | 67 const void* key, |
| 67 intptr_t old) OVERRIDE; | 68 intptr_t old) OVERRIDE; |
| 68 virtual void OnWindowDestroying(aura::Window* window) OVERRIDE; | 69 virtual void OnWindowDestroying(aura::Window* window) OVERRIDE; |
| 69 | 70 |
| 70 private: | 71 private: |
| 71 ToplevelWindowEventHandler* handler_; | 72 ToplevelWindowEventHandler* handler_; |
| 72 scoped_ptr<WindowResizer> resizer_; | 73 scoped_ptr<WindowResizer> resizer_; |
| 73 | 74 |
| 74 DISALLOW_COPY_AND_ASSIGN(ScopedWindowResizer); | 75 DISALLOW_COPY_AND_ASSIGN(ScopedWindowResizer); |
| 75 }; | 76 }; |
| 76 | 77 |
| 77 ToplevelWindowEventHandler::ScopedWindowResizer::ScopedWindowResizer( | 78 ToplevelWindowEventHandler::ScopedWindowResizer::ScopedWindowResizer( |
| 78 ToplevelWindowEventHandler* handler, | 79 ToplevelWindowEventHandler* handler, |
| 79 WindowResizer* resizer) | 80 WindowResizer* resizer) |
| 80 : handler_(handler), | 81 : handler_(handler), |
| 81 resizer_(resizer) { | 82 resizer_(resizer) { |
| 82 if (resizer_.get()) | 83 if (resizer_.get()) |
| 83 resizer_->GetTarget()->AddObserver(this); | 84 resizer_->GetTarget()->AddObserver(this); |
| 84 } | 85 } |
| 85 | 86 |
| 86 ToplevelWindowEventHandler::ScopedWindowResizer::~ScopedWindowResizer() { | 87 ToplevelWindowEventHandler::ScopedWindowResizer::~ScopedWindowResizer() { |
| 87 if (resizer_.get()) | 88 if (resizer_.get()) |
| 88 resizer_->GetTarget()->RemoveObserver(this); | 89 resizer_->GetTarget()->RemoveObserver(this); |
| 89 } | 90 } |
| 90 | 91 |
| 92 WindowResizer* |
| 93 ToplevelWindowEventHandler::ScopedWindowResizer::ReleaseResizer() { |
| 94 if (resizer_.get()) |
| 95 resizer_->GetTarget()->RemoveObserver(this); |
| 96 return resizer_.release(); |
| 97 } |
| 98 |
| 91 void ToplevelWindowEventHandler::ScopedWindowResizer::OnWindowPropertyChanged( | 99 void ToplevelWindowEventHandler::ScopedWindowResizer::OnWindowPropertyChanged( |
| 92 aura::Window* window, | 100 aura::Window* window, |
| 93 const void* key, | 101 const void* key, |
| 94 intptr_t old) { | 102 intptr_t old) { |
| 95 if (!wm::IsWindowNormal(window)) | 103 if (!wm::IsWindowNormal(window)) |
| 96 handler_->CompleteDrag(DRAG_COMPLETE, 0); | 104 handler_->CompleteDrag(DRAG_COMPLETE, 0); |
| 97 } | 105 } |
| 98 | 106 |
| 99 void ToplevelWindowEventHandler::ScopedWindowResizer::OnWindowDestroying( | 107 void ToplevelWindowEventHandler::ScopedWindowResizer::OnWindowDestroying( |
| 100 aura::Window* window) { | 108 aura::Window* window) { |
| (...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 316 void ToplevelWindowEventHandler::OnDisplayConfigurationChanging() { | 324 void ToplevelWindowEventHandler::OnDisplayConfigurationChanging() { |
| 317 if (in_move_loop_) { | 325 if (in_move_loop_) { |
| 318 move_cancelled_ = true; | 326 move_cancelled_ = true; |
| 319 EndMoveLoop(); | 327 EndMoveLoop(); |
| 320 } else if (window_resizer_.get()) { | 328 } else if (window_resizer_.get()) { |
| 321 window_resizer_->resizer()->RevertDrag(); | 329 window_resizer_->resizer()->RevertDrag(); |
| 322 window_resizer_.reset(); | 330 window_resizer_.reset(); |
| 323 } | 331 } |
| 324 } | 332 } |
| 325 | 333 |
| 334 void ToplevelWindowEventHandler::PassResizer(WindowResizerOwner* new_owner) { |
| 335 DCHECK(window_resizer_.get()); |
| 336 new_owner->AcceptResizer(window_resizer_->ReleaseResizer(), |
| 337 in_gesture_drag_); |
| 338 window_resizer_.reset(); |
| 339 } |
| 340 |
| 341 void ToplevelWindowEventHandler::AcceptResizer(WindowResizer* resizer, |
| 342 bool in_gesture_drag) { |
| 343 window_resizer_.reset(new ScopedWindowResizer(this, resizer)); |
| 344 in_gesture_drag_ = in_gesture_drag; |
| 345 } |
| 346 |
| 326 void ToplevelWindowEventHandler::CreateScopedWindowResizer( | 347 void ToplevelWindowEventHandler::CreateScopedWindowResizer( |
| 327 aura::Window* window, | 348 aura::Window* window, |
| 328 const gfx::Point& point_in_parent, | 349 const gfx::Point& point_in_parent, |
| 329 int window_component) { | 350 int window_component) { |
| 330 window_resizer_.reset(); | 351 window_resizer_.reset(); |
| 331 WindowResizer* resizer = | 352 WindowResizer* resizer = |
| 332 CreateWindowResizer(window, point_in_parent, window_component).release(); | 353 CreateWindowResizer(this, window, point_in_parent, |
| 354 window_component).release(); |
| 333 if (resizer) | 355 if (resizer) |
| 334 window_resizer_.reset(new ScopedWindowResizer(this, resizer)); | 356 window_resizer_.reset(new ScopedWindowResizer(this, resizer)); |
| 335 } | 357 } |
| 336 | 358 |
| 337 void ToplevelWindowEventHandler::CompleteDrag(DragCompletionStatus status, | 359 void ToplevelWindowEventHandler::CompleteDrag(DragCompletionStatus status, |
| 338 int event_flags) { | 360 int event_flags) { |
| 339 scoped_ptr<ScopedWindowResizer> resizer(window_resizer_.release()); | 361 scoped_ptr<ScopedWindowResizer> resizer(window_resizer_.release()); |
| 340 if (resizer.get()) { | 362 if (resizer.get()) { |
| 341 if (status == DRAG_COMPLETE) | 363 if (status == DRAG_COMPLETE) |
| 342 resizer->resizer()->CompleteDrag(event_flags); | 364 resizer->resizer()->CompleteDrag(event_flags); |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 456 void ToplevelWindowEventHandler::ResizerWindowDestroyed() { | 478 void ToplevelWindowEventHandler::ResizerWindowDestroyed() { |
| 457 // We explicitly don't invoke RevertDrag() since that may do things to window. | 479 // We explicitly don't invoke RevertDrag() since that may do things to window. |
| 458 // Instead we destroy the resizer. | 480 // Instead we destroy the resizer. |
| 459 window_resizer_.reset(); | 481 window_resizer_.reset(); |
| 460 | 482 |
| 461 // End the move loop. This does nothing if we're not in a move loop. | 483 // End the move loop. This does nothing if we're not in a move loop. |
| 462 EndMoveLoop(); | 484 EndMoveLoop(); |
| 463 } | 485 } |
| 464 | 486 |
| 465 } // namespace ash | 487 } // namespace ash |
| OLD | NEW |