Fixed broken logic in evdev input plugins.

If we do multiple reads we need to accumulate the total amount of bytes
read, instead of just taking the last read amount into account.

Change-Id: Iaa9b90c269f3ed9d09dae67452ca816d9db6217f
Reviewed-by: Johannes Zellner <johannes.zellner@nokia.com>
Reviewed-by: Girish Ramakrishnan <girish.1.ramakrishnan@nokia.com>
This commit is contained in:
Samuel Rødal 2012-04-13 20:31:41 +02:00 committed by Qt by Nokia
parent a9a1bf3359
commit d357b74493
3 changed files with 41 additions and 29 deletions

View File

@ -168,16 +168,20 @@ void QEvdevKeyboardHandler::readKeycode()
int n = 0;
forever {
n = qt_safe_read(m_fd, reinterpret_cast<char *>(buffer) + n, sizeof(buffer) - n);
int result = qt_safe_read(m_fd, reinterpret_cast<char *>(buffer) + n, sizeof(buffer) - n);
if (n == 0) {
if (result == 0) {
qWarning("Got EOF from the input device.");
return;
} else if (n < 0 && (errno != EINTR && errno != EAGAIN)) {
qWarning("Could not read from input device: %s", strerror(errno));
return;
} else if (n % sizeof(buffer[0]) == 0) {
break;
} else if (result < 0) {
if (errno != EINTR && errno != EAGAIN) {
qWarning("Could not read from input device: %s", strerror(errno));
return;
}
} else {
n += result;
if (n % sizeof(buffer[0]) == 0)
break;
}
}

View File

@ -145,16 +145,20 @@ void QEvdevMouseHandler::readMouseData()
bool pendingMouseEvent = false;
int eventCompressCount = 0;
forever {
n = QT_READ(m_fd, reinterpret_cast<char *>(buffer) + n, sizeof(buffer) - n);
int result = QT_READ(m_fd, reinterpret_cast<char *>(buffer) + n, sizeof(buffer) - n);
if (n == 0) {
if (result == 0) {
qWarning("Got EOF from the input device.");
return;
} else if (n < 0 && (errno != EINTR && errno != EAGAIN)) {
qWarning("Could not read from input device: %s", strerror(errno));
return;
} else if (n % sizeof(buffer[0]) == 0) {
break;
} else if (result < 0) {
if (errno != EINTR && errno != EAGAIN) {
qWarning("Could not read from input device: %s", strerror(errno));
return;
}
} else {
n += result;
if (n % sizeof(buffer[0]) == 0)
break;
}
}

View File

@ -253,26 +253,30 @@ void QTouchScreenHandler::readData()
int n = 0;
for (; ;) {
#ifdef USE_MTDEV
n = mtdev_get(m_mtdev, m_fd, buffer, sizeof(buffer) / sizeof(::input_event));
if (n > 0)
n *= sizeof(::input_event);
int result = mtdev_get(m_mtdev, m_fd, buffer, sizeof(buffer) / sizeof(::input_event));
if (result > 0)
result *= sizeof(::input_event);
#else
n = QT_READ(m_fd, reinterpret_cast<char*>(buffer) + n, sizeof(buffer) - n);
int result = QT_READ(m_fd, reinterpret_cast<char*>(buffer) + n, sizeof(buffer) - n);
#endif
if (!n) {
if (!result) {
qWarning("Got EOF from input device");
return;
} else if (n < 0 && (errno != EINTR && errno != EAGAIN)) {
qWarning("Could not read from input device: %s", strerror(errno));
if (errno == ENODEV) { // device got disconnected -> stop reading
delete m_notify;
m_notify = 0;
QT_CLOSE(m_fd);
m_fd = -1;
} else if (result < 0) {
if (errno != EINTR && errno != EAGAIN) {
qWarning("Could not read from input device: %s", strerror(errno));
if (errno == ENODEV) { // device got disconnected -> stop reading
delete m_notify;
m_notify = 0;
QT_CLOSE(m_fd);
m_fd = -1;
}
return;
}
return;
} else if (n % sizeof(::input_event) == 0) {
break;
} else {
n += result;
if (n % sizeof(::input_event) == 0)
break;
}
}