From d357b74493c737a51f6a81dcaf30b4433ce22af0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20R=C3=B8dal?= Date: Fri, 13 Apr 2012 20:31:41 +0200 Subject: 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 Reviewed-by: Girish Ramakrishnan --- src/plugins/generic/evdevtouch/qevdevtouch.cpp | 34 ++++++++++++++------------ 1 file changed, 19 insertions(+), 15 deletions(-) (limited to 'src/plugins/generic/evdevtouch') diff --git a/src/plugins/generic/evdevtouch/qevdevtouch.cpp b/src/plugins/generic/evdevtouch/qevdevtouch.cpp index c9c49839d6..1c3e8952e9 100644 --- a/src/plugins/generic/evdevtouch/qevdevtouch.cpp +++ b/src/plugins/generic/evdevtouch/qevdevtouch.cpp @@ -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(buffer) + n, sizeof(buffer) - n); + int result = QT_READ(m_fd, reinterpret_cast(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; } } -- cgit v1.2.3