Chromium Code Reviews| 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 2b65c2ae4f5a4aa91bf634f01a9f0a0435e9772e..c5a6f1bdb389e70008e984550203e3a8b841b3fb 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 |
| @@ -94,20 +94,30 @@ uint32_t X11WholeScreenMoveLoop::Dispatch(const base::NativeEvent& event) { |
| bool X11WholeScreenMoveLoop::RunMoveLoop(aura::Window* source, |
| gfx::NativeCursor cursor) { |
| // Start a capture on the host, so that it continues to receive events during |
| - // the drag. |
| - ScopedCapturer capturer(source->GetDispatcher()->host()); |
| - |
| - DCHECK(!in_move_loop_); // Can only handle one nested loop at a time. |
| - in_move_loop_ = true; |
| - |
| - XDisplay* display = gfx::GetXDisplay(); |
| - |
| - grab_input_window_ = CreateDragInputWindow(display); |
| - if (!drag_image_.isNull()) |
| - CreateDragImageWindow(); |
| - base::MessagePumpX11::Current()->AddDispatcherForWindow( |
| - this, grab_input_window_); |
| - |
| + // the drag. This may be second time we are capturing the mouse events - the |
| + // first being when a mouse is first clicked. That first capture needs to be |
|
sadrul
2014/02/19 21:43:49
first *pressed
varkha
2014/02/19 21:47:59
Done.
|
| + // released before the call to GrabPointerWithCursor below, otherwise it may |
| + // get released while we still need the pointer grab, which is why we restrict |
| + // the scope here. |
| + { |
| + ScopedCapturer capturer(source->GetDispatcher()->host()); |
| + |
| + DCHECK(!in_move_loop_); // Can only handle one nested loop at a time. |
| + in_move_loop_ = true; |
| + |
| + XDisplay* display = gfx::GetXDisplay(); |
| + |
| + grab_input_window_ = CreateDragInputWindow(display); |
| + if (!drag_image_.isNull()) |
| + CreateDragImageWindow(); |
| + base::MessagePumpX11::Current()->AddDispatcherForWindow( |
| + this, grab_input_window_); |
| + // Releasing ScopedCapturer ensures that any other instance of |
| + // X11ScopedCapture will not prematurely release grab that will be acquired |
| + // below. |
| + } |
| + // TODO(varkha): Consider integrating GrabPointerWithCursor with |
| + // ScopedCapturer to avoid possibility of logically keeping multiple grabs. |
| if (!GrabPointerWithCursor(cursor)) |
| return false; |