Index: ash/wm/toplevel_window_event_filter.cc |
diff --git a/ash/wm/toplevel_window_event_filter.cc b/ash/wm/toplevel_window_event_filter.cc |
index 78645fefc7b98f769c6a14ea3a656692d0357c41..353ed18557894e0421557a1316e9c813fe266924 100644 |
--- a/ash/wm/toplevel_window_event_filter.cc |
+++ b/ash/wm/toplevel_window_event_filter.cc |
@@ -34,6 +34,10 @@ ToplevelWindowEventFilter::~ToplevelWindowEventFilter() { |
bool ToplevelWindowEventFilter::PreHandleKeyEvent(aura::Window* target, |
aura::KeyEvent* event) { |
+ if (window_resizer_.get() && event->type() == ui::ET_KEY_PRESSED && |
+ event->key_code() == ui::VKEY_ESCAPE) { |
+ CompleteDrag(DRAG_REVERT); |
+ } |
return false; |
} |
@@ -62,11 +66,19 @@ bool ToplevelWindowEventFilter::PreHandleMouseEvent(aura::Window* target, |
return HandleDrag(target, event); |
case ui::ET_MOUSE_CAPTURE_CHANGED: |
case ui::ET_MOUSE_RELEASED: |
- CompleteDrag(target); |
+ CompleteDrag(event->type() == ui::ET_MOUSE_RELEASED ? |
+ DRAG_COMPLETE : DRAG_REVERT); |
if (in_move_loop_) { |
MessageLoop::current()->Quit(); |
in_move_loop_ = false; |
} |
+ // Completing the drag may result in hiding the window. If this happens |
+ // return true so no other filters/observers see the event. Otherwise they |
+ // see the event on a hidden window. |
+ if (event->type() == ui::ET_MOUSE_CAPTURE_CHANGED && |
+ !target->IsVisible()) { |
+ return true; |
+ } |
break; |
default: |
break; |
@@ -106,7 +118,7 @@ ui::GestureStatus ToplevelWindowEventFilter::PreHandleGestureEvent( |
case ui::ET_GESTURE_SCROLL_END: { |
if (!in_gesture_resize_) |
return ui::GESTURE_STATUS_UNKNOWN; |
- CompleteDrag(target); |
+ CompleteDrag(DRAG_COMPLETE); |
in_gesture_resize_ = false; |
break; |
} |
@@ -137,7 +149,10 @@ void ToplevelWindowEventFilter::EndMoveLoop() { |
return; |
in_move_loop_ = false; |
- window_resizer_.reset(); |
+ if (window_resizer_.get()) { |
+ window_resizer_->RevertDrag(); |
+ window_resizer_.reset(); |
+ } |
MessageLoopForUI::current()->Quit(); |
Shell::GetRootWindow()->PostNativeEvent(ui::CreateNoopEvent()); |
} |
@@ -149,10 +164,14 @@ WindowResizer* ToplevelWindowEventFilter::CreateWindowResizer( |
return new WindowResizer(window, point, window_component, grid_size_); |
} |
-void ToplevelWindowEventFilter::CompleteDrag(aura::Window* window) { |
+void ToplevelWindowEventFilter::CompleteDrag(DragCompletionStatus status) { |
scoped_ptr<WindowResizer> resizer(window_resizer_.release()); |
- if (resizer.get()) |
- resizer->CompleteDrag(); |
+ if (resizer.get()) { |
+ if (status == DRAG_COMPLETE) |
+ resizer->CompleteDrag(); |
+ else |
+ resizer->RevertDrag(); |
+ } |
} |
bool ToplevelWindowEventFilter::HandleDrag(aura::Window* target, |