Index: ui/views/widget/desktop_aura/x11_whole_screen_move_loop.cc |
diff --git a/ui/views/widget/desktop_aura/x11_whole_screen_move_loop.cc b/ui/views/widget/desktop_aura/x11_whole_screen_move_loop.cc |
index 1db4a2226ef5bbe561958d839092029211a053d2..6c0b3c6b9e7962b9c3410a2a6916458ee80179f8 100644 |
--- a/ui/views/widget/desktop_aura/x11_whole_screen_move_loop.cc |
+++ b/ui/views/widget/desktop_aura/x11_whole_screen_move_loop.cc |
@@ -62,6 +62,7 @@ X11WholeScreenMoveLoop::X11WholeScreenMoveLoop( |
should_reset_mouse_flags_(false), |
grab_input_window_(None), |
canceled_(false), |
+ has_grab_(false), |
weak_factory_(this) { |
last_xmotion_.type = LASTEvent; |
} |
@@ -136,6 +137,11 @@ uint32_t X11WholeScreenMoveLoop::DispatchEvent(const ui::PlatformEvent& event) { |
} |
break; |
} |
+ case FocusOut: { |
+ if (xev->xfocus.mode != NotifyGrab) |
+ has_grab_ = false; |
+ break; |
+ } |
case GenericEvent: { |
ui::EventType type = ui::EventTypeFromNative(xev); |
switch (type) { |
@@ -253,8 +259,11 @@ void X11WholeScreenMoveLoop::EndMoveLoop() { |
// Ungrab before we let go of the window. |
XDisplay* display = gfx::GetXDisplay(); |
- XUngrabPointer(display, CurrentTime); |
- XUngrabKeyboard(display, CurrentTime); |
+ // Only ungrab pointer if capture was not switched to another window. |
+ if (has_grab_) { |
+ XUngrabPointer(display, CurrentTime); |
+ XUngrabKeyboard(display, CurrentTime); |
+ } |
// Restore the previous dispatcher. |
nested_dispatcher_.reset(); |
@@ -295,6 +304,7 @@ bool X11WholeScreenMoveLoop::GrabPointerAndKeyboard(gfx::NativeCursor cursor) { |
DLOG(ERROR) << "Grabbing pointer for dragging failed: " |
<< ui::GetX11ErrorString(display, ret); |
} else { |
+ has_grab_ = true; |
XUngrabKeyboard(display, CurrentTime); |
ret = XGrabKeyboard( |
display, |