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

Unified Diff: ui/base/x/x11_util.cc

Issue 749063003: Fix grabbing capture when the mouse is pressed on Desktop Linux. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years 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/base/x/x11_util.cc
diff --git a/ui/base/x/x11_util.cc b/ui/base/x/x11_util.cc
index 03625c6de02f0782c1b8d3861f447c156daa0377..d61c5f9bc882e790e2b24cb2001453fbbadcf1dc 100644
--- a/ui/base/x/x11_util.cc
+++ b/ui/base/x/x11_util.cc
@@ -284,6 +284,51 @@ bool IsXInput2Available() {
return DeviceDataManagerX11::GetInstance()->IsXInput2Available();
}
+int GrabPointer(XID window, bool owner_events, ::Cursor cursor) {
+ if (IsXInput2Available()) {
+ // Do an XINPUT2 pointer grab. If there is an active XINPUT2 pointer grab
+ // as a result of normal button press, XGrabPointer() will fail.
+ const std::vector<int>& master_pointers =
+ DeviceDataManagerX11::GetInstance()->master_pointers();
+ int success = GrabSuccess;
+ for (size_t i = 0; i < master_pointers.size(); ++i) {
+ unsigned char mask[XIMaskLen(XI_LASTEVENT)];
+ memset(mask, 0, sizeof(mask));
+ XISetMask(mask, XI_ButtonPress);
+ XISetMask(mask, XI_ButtonRelease);
+ XISetMask(mask, XI_Motion);
+ XIEventMask evmask;
+ evmask.deviceid = XIAllDevices;
sadrul 2014/12/22 21:08:59 Should you use master_pointers[i] here?
pkotwicz 2014/12/23 00:29:49 It seems to work either way. I haven't seen any do
+ evmask.mask_len = sizeof(mask);
+ evmask.mask = mask;
+ success = XIGrabDevice(gfx::GetXDisplay(), master_pointers[i], window,
+ CurrentTime, cursor, GrabModeAsync, GrabModeAsync,
+ owner_events, &evmask);
+ // Assume that the grab will succeed on either all or none of the master
+ // pointers.
+ if (success != GrabSuccess)
+ return success;
+ }
+ return success;
+ } else {
pkotwicz 2014/12/01 22:42:48 Should I try XGrabPointer() if XIGrabDevice() fail
sadrul 2014/12/22 21:08:59 Sure. Let's try that. Also, remove else.
pkotwicz 2014/12/23 00:29:49 Done.
+ int event_mask = PointerMotionMask | ButtonReleaseMask | ButtonPressMask;
+ return XGrabPointer(gfx::GetXDisplay(), window, owner_events, event_mask,
+ GrabModeAsync, GrabModeAsync, None,
+ cursor, CurrentTime);
+ }
+}
+
+void UngrabPointer() {
+ if (IsXInput2Available()) {
+ const std::vector<int>& master_pointers =
+ DeviceDataManagerX11::GetInstance()->master_pointers();
+ for (size_t i = 0; i < master_pointers.size(); ++i)
+ XIUngrabDevice(gfx::GetXDisplay(), master_pointers[i], CurrentTime);
+ } else {
+ XUngrabPointer(gfx::GetXDisplay(), CurrentTime);
+ }
+}
+
static SharedMemorySupport DoQuerySharedMemorySupport(XDisplay* dpy) {
int dummy;
Bool pixmaps_supported;

Powered by Google App Engine
This is Rietveld 408576698