evdev: Stop reading on ENODEV
Touch does this correctly for some time already. Keyboard and mouse do not, leading to flooding the console with the Could not read from ... warning for ever when using the 'static' device discovery (no libudev) and unplugging a mouse or keyboard. Change-Id: I6bef44fbed4bc21cc2736b28d1166bf2b7d90edc Reviewed-by: Andy Nichols <andy.nichols@qt.io>bb10
parent
06f7f3fd36
commit
0a8d3f914c
|
|
@ -53,7 +53,7 @@ Q_LOGGING_CATEGORY(qLcEvdevKeyMap, "qt.qpa.input.keymap")
|
|||
#include "qevdevkeyboard_defaultmap_p.h"
|
||||
|
||||
QEvdevKeyboardHandler::QEvdevKeyboardHandler(const QString &device, int fd, bool disableZap, bool enableCompose, const QString &keymapFile)
|
||||
: m_device(device), m_fd(fd),
|
||||
: m_device(device), m_fd(fd), m_notify(Q_NULLPTR),
|
||||
m_modifiers(0), m_composing(0), m_dead_unicode(0xffff),
|
||||
m_no_zap(disableZap), m_do_compose(enableCompose),
|
||||
m_keymap(0), m_keymap_size(0), m_keycompose(0), m_keycompose_size(0)
|
||||
|
|
@ -68,9 +68,8 @@ QEvdevKeyboardHandler::QEvdevKeyboardHandler(const QString &device, int fd, bool
|
|||
unloadKeymap();
|
||||
|
||||
// socket notifier for events on the keyboard device
|
||||
QSocketNotifier *notifier;
|
||||
notifier = new QSocketNotifier(m_fd, QSocketNotifier::Read, this);
|
||||
connect(notifier, SIGNAL(activated(int)), this, SLOT(readKeycode()));
|
||||
m_notify = new QSocketNotifier(m_fd, QSocketNotifier::Read, this);
|
||||
connect(m_notify, SIGNAL(activated(int)), this, SLOT(readKeycode()));
|
||||
}
|
||||
|
||||
QEvdevKeyboardHandler::~QEvdevKeyboardHandler()
|
||||
|
|
@ -155,6 +154,14 @@ void QEvdevKeyboardHandler::readKeycode()
|
|||
} else if (result < 0) {
|
||||
if (errno != EINTR && errno != EAGAIN) {
|
||||
qErrnoWarning(errno, "evdevkeyboard: Could not read from input device");
|
||||
// If the device got disconnected, stop reading, otherwise we get flooded
|
||||
// by the above error over and over again.
|
||||
if (errno == ENODEV) {
|
||||
delete m_notify;
|
||||
m_notify = Q_NULLPTR;
|
||||
qt_safe_close(m_fd);
|
||||
m_fd = -1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -51,6 +51,8 @@
|
|||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
class QSocketNotifier;
|
||||
|
||||
namespace QEvdevKeyboardMap {
|
||||
const quint32 FileMagic = 0x514d4150; // 'QMAP'
|
||||
|
||||
|
|
@ -180,6 +182,7 @@ private:
|
|||
|
||||
QString m_device;
|
||||
int m_fd;
|
||||
QSocketNotifier *m_notify;
|
||||
|
||||
// keymap handling
|
||||
quint8 m_modifiers;
|
||||
|
|
|
|||
|
|
@ -105,9 +105,8 @@ QEvdevMouseHandler::QEvdevMouseHandler(const QString &device, int fd, bool abs,
|
|||
m_abs = getHardwareMaximum();
|
||||
|
||||
// socket notifier for events on the mouse device
|
||||
QSocketNotifier *notifier;
|
||||
notifier = new QSocketNotifier(m_fd, QSocketNotifier::Read, this);
|
||||
connect(notifier, SIGNAL(activated(int)), this, SLOT(readMouseData()));
|
||||
m_notify = new QSocketNotifier(m_fd, QSocketNotifier::Read, this);
|
||||
connect(m_notify, SIGNAL(activated(int)), this, SLOT(readMouseData()));
|
||||
}
|
||||
|
||||
QEvdevMouseHandler::~QEvdevMouseHandler()
|
||||
|
|
@ -196,6 +195,14 @@ void QEvdevMouseHandler::readMouseData()
|
|||
} else if (result < 0) {
|
||||
if (errno != EINTR && errno != EAGAIN) {
|
||||
qErrnoWarning(errno, "evdevmouse: Could not read from input device");
|
||||
// If the device got disconnected, stop reading, otherwise we get flooded
|
||||
// by the above error over and over again.
|
||||
if (errno == ENODEV) {
|
||||
delete m_notify;
|
||||
m_notify = Q_NULLPTR;
|
||||
qt_safe_close(m_fd);
|
||||
m_fd = -1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
|
|
|
|||
Loading…
Reference in New Issue