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