Commit 6be4dd2d authored by David Faure's avatar David Faure
Browse files

Compress notifications about new mouse/keyboard.

When resuming from suspend, I get 5 "new pointer" and 5 "new keyboard"
events (on a laptop with USB mouse/keyboard, but also stuff like
"Thinkpad Extra Buttons" adds more notifications than one would expect)

KGlobalAccelImpl::x11MappingNotify is still called 15 times, but
that's better than 145 times...

"new pointer" notifications end up calling `kcminit mouse`, better
also compress that.

(cherry picked from commit 199cad52)
parent 288c2335
......@@ -23,6 +23,7 @@
#include <QCoreApplication>
#include <QDebug>
#include <QX11Info>
#include <QTimer>
#include <X11/X.h>
#include <X11/Xatom.h>
......@@ -54,8 +55,20 @@ XInputEventNotifier::XInputEventNotifier(QWidget *parent)
, // TODO: destruct properly?
xinputEventType(-1)
, udevNotifier(nullptr)
, keyboardNotificationTimer(new QTimer(this))
, mouseNotificationTimer(new QTimer(this))
{
Q_UNUSED(parent)
// emit signal only once, even after X11 re-enables N keyboards after resuming from suspend
keyboardNotificationTimer->setSingleShot(true);
keyboardNotificationTimer->setInterval(500);
connect(keyboardNotificationTimer, &QTimer::timeout, this, &XInputEventNotifier::newKeyboardDevice);
// same for mouse
mouseNotificationTimer->setSingleShot(true);
mouseNotificationTimer->setInterval(500);
connect(mouseNotificationTimer, &QTimer::timeout, this, &XInputEventNotifier::newPointerDevice);
}
void XInputEventNotifier::start()
......@@ -76,10 +89,18 @@ bool XInputEventNotifier::processOtherEvents(xcb_generic_event_t *event)
{
int newDeviceType = getNewDeviceEventType(event);
if (newDeviceType == DEVICE_KEYBOARD) {
Q_EMIT emit(newKeyboardDevice());
} else if (newDeviceType == DEVICE_POINTER) {
Q_EMIT emit(newPointerDevice());
Q_EMIT emit(newKeyboardDevice()); // arghhh, looks like X resets xkb map even when only pointer device is connected
if (!keyboardNotificationTimer->isActive()) {
keyboardNotificationTimer->start();
}
}
else if (newDeviceType == DEVICE_POINTER) {
if (!mouseNotificationTimer->isActive()) {
mouseNotificationTimer->start();
}
// arghhh, looks like X resets xkb map even when only pointer device is connected
if (!keyboardNotificationTimer->isActive()) {
keyboardNotificationTimer->start();
}
}
return true;
}
......
......@@ -24,6 +24,7 @@
#include <X11/Xlib.h>
#include <fixx11h.h>
class QTimer;
class UdevDeviceNotifier;
class XInputEventNotifier : public XEventNotifier
......@@ -31,7 +32,7 @@ class XInputEventNotifier : public XEventNotifier
Q_OBJECT
public:
XInputEventNotifier(QWidget *parent = nullptr);
explicit XInputEventNotifier(QWidget *parent = nullptr);
void start() override;
void stop() override;
......@@ -51,6 +52,8 @@ private:
int xinputEventType;
Display *display;
UdevDeviceNotifier *udevNotifier;
QTimer* keyboardNotificationTimer;
QTimer* mouseNotificationTimer;
};
#endif /* XINPUT_HELPER_H_ */
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment