| Index: base/message_pump_glib_x.cc
|
| diff --git a/base/message_pump_glib_x.cc b/base/message_pump_glib_x.cc
|
| index 35cfc1a533e158cd71b31f57b5501b88feac7c64..34313e5a6bb098d63f18930ac4a3ecfa9548bb08 100644
|
| --- a/base/message_pump_glib_x.cc
|
| +++ b/base/message_pump_glib_x.cc
|
| @@ -79,8 +79,7 @@ namespace base {
|
| MessagePumpGlibX::MessagePumpGlibX() : base::MessagePumpForUI(),
|
| #if defined(HAVE_XINPUT2)
|
| xiopcode_(-1),
|
| - masters_(),
|
| - floats_(),
|
| + pointer_devices_(),
|
| #endif
|
| gdksource_(NULL),
|
| dispatching_event_(false),
|
| @@ -112,29 +111,17 @@ void MessagePumpGlibX::SetupXInput2ForXWindow(Window xwindow) {
|
| XISetMask(mask, XI_ButtonRelease);
|
| XISetMask(mask, XI_Motion);
|
|
|
| - // It is not necessary to select for slave devices. XInput2 provides enough
|
| - // information to the event callback to decide which slave device triggered
|
| - // the event, thus decide whether the 'pointer event' is a 'mouse event' or a
|
| - // 'touch event'.
|
| - // If the touch device has 'GrabDevice' set and 'SendCoreEvents' unset (which
|
| - // is possible), then the device is detected as a floating device, and a
|
| - // floating device is not connected to a master device. So it is necessary to
|
| - // also select on the floating devices.
|
| - std::set<int> devices;
|
| - std::set_union(masters_.begin(), masters_.end(),
|
| - floats_.begin(), floats_.end(),
|
| - std::inserter(devices, devices.begin()));
|
| - XIEventMask evmasks[devices.size()];
|
| + XIEventMask evmasks[pointer_devices_.size()];
|
| int count = 0;
|
| - for (std::set<int>::const_iterator iter = devices.begin();
|
| - iter != devices.end();
|
| + for (std::set<int>::const_iterator iter = pointer_devices_.begin();
|
| + iter != pointer_devices_.end();
|
| ++iter, ++count) {
|
| evmasks[count].deviceid = *iter;
|
| evmasks[count].mask_len = sizeof(mask);
|
| evmasks[count].mask = mask;
|
| }
|
|
|
| - XISelectEvents(xdisplay, xwindow, evmasks, devices.size());
|
| + XISelectEvents(xdisplay, xwindow, evmasks, pointer_devices_.size());
|
|
|
| // TODO(sad): Setup masks for keyboard events.
|
|
|
| @@ -297,16 +284,21 @@ void MessagePumpGlibX::InitializeXInput2(void) {
|
| SetupGtkWidgetRealizeNotifier(this);
|
|
|
| // Instead of asking X for the list of devices all the time, let's maintain a
|
| - // list of slave (physical) and master (virtual) pointer devices.
|
| + // list of pointer devices we care about.
|
| + // It is not necessary to select for slave devices. XInput2 provides enough
|
| + // information to the event callback to decide which slave device triggered
|
| + // the event, thus decide whether the 'pointer event' is a 'mouse event' or a
|
| + // 'touch event'.
|
| + // If the touch device has 'GrabDevice' set and 'SendCoreEvents' unset (which
|
| + // is possible), then the device is detected as a floating device, and a
|
| + // floating device is not connected to a master device. So it is necessary to
|
| + // also select on the floating devices.
|
| int count = 0;
|
| XIDeviceInfo* devices = XIQueryDevice(xdisplay, XIAllDevices, &count);
|
| for (int i = 0; i < count; i++) {
|
| XIDeviceInfo* devinfo = devices + i;
|
| - if (devinfo->use == XIFloatingSlave) {
|
| - floats_.insert(devinfo->deviceid);
|
| - } else if (devinfo->use == XIMasterPointer) {
|
| - masters_.insert(devinfo->deviceid);
|
| - }
|
| + if (devinfo->use == XIFloatingSlave || devinfo->use == XIMasterPointer)
|
| + pointer_devices_.insert(devinfo->deviceid);
|
| }
|
| XIFreeDeviceInfo(devices);
|
|
|
|
|