evdevkeyboard: Try opening as read-write first

switchLed writes to the device, and so O_RDONLY cannot be correct.

Change-Id: If79814804bcd3c6fb01617be9f1a73e54b9563bd
Pick-to: 6.2 5.15
Fixes: QTBUG-80653
Reviewed-by: Andy Nichols <andy.nichols@qt.io>
This commit is contained in:
Laszlo Agocs 2021-12-03 14:49:57 +01:00
parent d8b943849f
commit 9c05fdac81
2 changed files with 6 additions and 1 deletions

View File

@ -139,7 +139,11 @@ std::unique_ptr<QEvdevKeyboardHandler> QEvdevKeyboardHandler::create(const QStri
qCDebug(qLcEvdevKey, "Opening keyboard at %ls", qUtf16Printable(device));
QFdContainer fd(qt_safe_open(device.toLocal8Bit().constData(), O_RDONLY | O_NDELAY, 0));
QFdContainer fd(qt_safe_open(device.toLocal8Bit().constData(), O_RDWR | O_NDELAY, 0));
if (fd.get() < 0) {
qCDebug(qLcEvdevKey, "Keyboard device could not be opened as read-write, trying read-only");
fd.reset(qt_safe_open(device.toLocal8Bit().constData(), O_RDONLY | O_NDELAY, 0));
}
if (fd.get() >= 0) {
::ioctl(fd.get(), EVIOCGRAB, grab);
if (repeatDelay > 0 && repeatRate > 0) {

View File

@ -143,6 +143,7 @@ public:
int release() noexcept { int result = m_fd; m_fd = -1; return result; }
void reset() noexcept;
void reset(int fd) { reset(); m_fd = fd; }
};
class QEvdevKeyboardHandler : public QObject