| 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,
|
|
|