Chromium Code Reviews| 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; |