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

Unified Diff: ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.cc

Issue 262893002: Removes grab input window and extra grab and ungrab in X11WholeScreenMoveLoop Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Removes grab input window and extra grab and ungrab in X11WholeScreenMoveLoop (refactored) Created 6 years, 7 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 side-by-side diff with in-line comments
Download patch
Index: ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.cc
diff --git a/ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.cc b/ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.cc
index a569eaeee06c60f66f3e25a138164e01c3155337..fbf6fca2b881de83d128c0fcf6f00630f0163106 100644
--- a/ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.cc
+++ b/ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.cc
@@ -9,6 +9,7 @@
#include "base/event_types.h"
#include "base/lazy_instance.h"
#include "base/message_loop/message_loop.h"
+#include "ui/aura/client/capture_client.h"
#include "ui/aura/window.h"
#include "ui/aura/window_tree_host.h"
#include "ui/base/clipboard/clipboard.h"
@@ -546,17 +547,7 @@ void DesktopDragDropClientAuraX11::OnXdndStatus(
return;
}
- switch (negotiated_operation_) {
- case ui::DragDropTypes::DRAG_COPY:
- move_loop_.UpdateCursor(copy_grab_cursor_);
- break;
- case ui::DragDropTypes::DRAG_MOVE:
- move_loop_.UpdateCursor(move_grab_cursor_);
- break;
- default:
- move_loop_.UpdateCursor(grab_cursor_);
- break;
- }
+ UpdateCursor();
// Note: event.data.[2,3] specify a rectangle. It is a request by the other
// window to not send further XdndPosition messages while the cursor is
@@ -899,6 +890,50 @@ ui::SelectionFormatMap DesktopDragDropClientAuraX11::GetFormatMap() const {
ui::SelectionFormatMap();
}
+void DesktopDragDropClientAuraX11::UpdateCursor() {
+ if (!move_loop_.in_move_loop())
+ return;
+
+ // If we're still in the move loop, re-grab the pointer with the updated
+ // cursor. Note: we can be called from handling an XdndStatus message after
+ // EndMoveLoop() was called, but before we return from the nested RunLoop.
pkotwicz 2014/05/05 18:14:37 I do not completely understand this comment. move_
varkha 2014/05/05 19:06:04 Yes, with the source_current_window_ set to None i
+ aura::client::CaptureClient* capture_client =
+ aura::client::GetCaptureClient(root_window_);
+ if (!capture_client)
+ return;
+ aura::Window* capture_window = capture_client->GetGlobalCaptureWindow();
+ if (!capture_window)
+ return;
+
+ gfx::NativeCursor cursor = grab_cursor_;
+ switch (negotiated_operation_) {
+ case ui::DragDropTypes::DRAG_COPY:
+ cursor = copy_grab_cursor_;
+ break;
+ case ui::DragDropTypes::DRAG_MOVE:
+ cursor = move_grab_cursor_;
+ break;
+ default:
+ break;
+ }
+
pkotwicz 2014/05/05 18:14:37 Would XChangeActivePointerGrab() be more appropria
varkha 2014/05/05 19:06:04 Done. This also eliminates the need to get the cur
+ XUngrabPointer(xdisplay_, CurrentTime);
+ int ret = XGrabPointer(
+ xdisplay_,
+ capture_window->GetHost()->GetAcceleratedWidget(),
+ False,
+ ButtonPressMask | ButtonReleaseMask | PointerMotionMask,
+ GrabModeAsync,
+ GrabModeAsync,
+ None,
+ cursor.platform(),
+ CurrentTime);
+ if (ret != GrabSuccess) {
+ DLOG(ERROR) << "Grabbing pointer for dragging failed: "
+ << ui::GetX11ErrorString(xdisplay_, ret);
+ }
+}
+
void DesktopDragDropClientAuraX11::CompleteXdndPosition(
::Window source_window,
const gfx::Point& screen_point) {

Powered by Google App Engine
This is Rietveld 408576698