Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(67)

Side by Side Diff: ash/wm/toplevel_window_event_handler.cc

Issue 12441010: Attach panel while dragging to bring it in front of other panels. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Comments, etc. Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698