diff --git a/kcms/mouse/backends/x11/x11_libinput_dummydevice.cpp b/kcms/mouse/backends/x11/x11_libinput_dummydevice.cpp --- a/kcms/mouse/backends/x11/x11_libinput_dummydevice.cpp +++ b/kcms/mouse/backends/x11/x11_libinput_dummydevice.cpp @@ -20,24 +20,28 @@ #include -#include #include #include +#include + +static Atom s_touchpadAtom; template -static void XI2ForallPointerDevices(Display* dpy, const Callback& callback) +static void XIForallPointerDevices(Display* dpy, const Callback& callback) { int ndevices_return; - XIDeviceInfo* info = XIQueryDevice(dpy, XIAllDevices, &ndevices_return); + XDeviceInfo *info = XListInputDevices(dpy, &ndevices_return); if (!info) { return; } for (int i = 0; i < ndevices_return; ++i) { - if ((info + i)->use == XISlavePointer) { - callback(info + i); + XDeviceInfo *dev = info + i; + if ((dev->use == IsXPointer || dev->use == IsXExtensionPointer) && + dev->type != s_touchpadAtom) { + callback(dev); } } - XIFreeDeviceInfo(info); + XFreeDeviceList(info); } struct ScopedXDeleter { @@ -61,16 +65,17 @@ template<> void valueWriterPart(bool val, Atom valAtom, Display *dpy) { - XI2ForallPointerDevices(dpy, [&] (XIDeviceInfo *info) { + XIForallPointerDevices(dpy, [&] (XDeviceInfo *info) { + int deviceid = info->id; Status status; Atom type_return; int format_return; unsigned long num_items_return; unsigned long bytes_after_return; unsigned char *_data = nullptr; //data returned is an 1 byte boolean - status = XIGetProperty(dpy, info->deviceid, valAtom, 0, 1, + status = XIGetProperty(dpy, deviceid, valAtom, 0, 1, False, XA_INTEGER, &type_return, &format_return, &num_items_return, &bytes_after_return, &_data); if (status != Success) { @@ -87,16 +92,17 @@ unsigned char sendVal = val ? 1 : 0; - XIChangeProperty(dpy, info->deviceid, valAtom, XA_INTEGER, + XIChangeProperty(dpy, deviceid, valAtom, XA_INTEGER, 8, XIPropModeReplace, &sendVal, 1); }); } template<> void valueWriterPart(qreal val, Atom valAtom, Display *dpy) { - XI2ForallPointerDevices(dpy, [&] (XIDeviceInfo *info) { + XIForallPointerDevices(dpy, [&] (XDeviceInfo *info) { + int deviceid = info->id; Status status; Atom float_type = XInternAtom (dpy, "FLOAT", False); Atom type_return; @@ -106,7 +112,7 @@ unsigned char *_data = nullptr; //data returned is an 1 byte boolean - status = XIGetProperty(dpy, info->deviceid, valAtom, 0, 1, + status = XIGetProperty(dpy, deviceid, valAtom, 0, 1, False, float_type, &type_return, &format_return, &num_items_return, &bytes_after_return, &_data); if (status != Success) { @@ -125,7 +131,7 @@ float *sendPtr = (float*)buffer; *sendPtr = val; - XIChangeProperty(dpy, info->deviceid, valAtom, float_type, + XIChangeProperty(dpy, deviceid, valAtom, float_type, format_return, XIPropModeReplace, buffer, 1); }); @@ -161,6 +167,8 @@ m_supportsNaturalScroll.val = true; m_naturalScrollEnabledByDefault.val = false; + + s_touchpadAtom = XInternAtom(m_dpy, XI_TOUCHPAD, True); } X11LibinputDummyDevice::~X11LibinputDummyDevice()