From 10472dce9202e4460b2d908bdbe0cd65291f77e5 Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Fri, 9 Jan 2015 14:48:01 +0100 Subject: Unify input device hotplugging support for embedded On embedded the mouse cursor will now appear and reappear regardless of how the input handling code is loaded (via a generic plugin or compiled-in to the platform plugin). Instead of passing around QDeviceDiscovery instances that only works when compiling-in the code into the platform plugin, introduce a new internal central QInputDeviceManager. The single instance of this provides a place to store any future input device related signals and properties. Also introduce mouse hotplugging support to linuxfb. [ChangeLog][QtGui] The mouse cursor on Embedded Linux is now handling hotplugging correctly with eglfs and linuxfb regardless of how the input handling code is loaded (via a generic plugin or built in to the platform plugin). Change-Id: I147c1b04a193baf216598015264f2c06e1b20f84 Reviewed-by: Andy Nichols --- src/gui/kernel/kernel.pri | 7 +- src/gui/kernel/qguiapplication.cpp | 13 ++++ src/gui/kernel/qguiapplication_p.h | 5 ++ src/gui/kernel/qinputdevicemanager.cpp | 64 ++++++++++++++++++ src/gui/kernel/qinputdevicemanager_p.h | 77 ++++++++++++++++++++++ src/gui/kernel/qinputdevicemanager_p_p.h | 69 +++++++++++++++++++ .../eglconvenience/qeglplatformcursor.cpp | 37 +++-------- .../eglconvenience/qeglplatformcursor_p.h | 11 ++-- .../eglconvenience/qeglplatformintegration.cpp | 7 +- src/platformsupport/fbconvenience/qfbcursor.cpp | 46 ++++++++++++- src/platformsupport/fbconvenience/qfbcursor_p.h | 23 ++++++- .../input/evdevkeyboard/qevdevkeyboardmanager.cpp | 12 +++- .../input/evdevmouse/qevdevmousemanager.cpp | 7 ++ .../input/evdevmouse/qevdevmousemanager_p.h | 6 +- .../input/libinput/qlibinputhandler.cpp | 40 ++++++++++- .../input/libinput/qlibinputhandler_p.h | 2 + .../platforms/linuxfb/qlinuxfbintegration.cpp | 7 +- src/plugins/platforms/linuxfb/qlinuxfbscreen.cpp | 21 +----- 18 files changed, 373 insertions(+), 81 deletions(-) create mode 100644 src/gui/kernel/qinputdevicemanager.cpp create mode 100644 src/gui/kernel/qinputdevicemanager_p.h create mode 100644 src/gui/kernel/qinputdevicemanager_p_p.h diff --git a/src/gui/kernel/kernel.pri b/src/gui/kernel/kernel.pri index 6479acd3fc..41574fa0bb 100644 --- a/src/gui/kernel/kernel.pri +++ b/src/gui/kernel/kernel.pri @@ -74,7 +74,9 @@ HEADERS += \ kernel/qpaintdevicewindow_p.h \ kernel/qrasterwindow.h \ kernel/qplatformgraphicsbuffer.h \ - kernel/qplatformgraphicsbufferhelper.h + kernel/qplatformgraphicsbufferhelper.h \ + kernel/qinputdevicemanager_p.h \ + kernel/qinputdevicemanager_p_p.h SOURCES += \ kernel/qgenericpluginfactory.cpp \ @@ -130,7 +132,8 @@ SOURCES += \ kernel/qrasterwindow.cpp \ kernel/qplatformgraphicsbuffer.cpp \ kernel/qplatformgraphicsbufferhelper.cpp \ - kernel/qplatformhardwarecompositor.cpp + kernel/qplatformhardwarecompositor.cpp \ + kernel/qinputdevicemanager.cpp contains(QT_CONFIG, opengl)|contains(QT_CONFIG, opengles2) { HEADERS += \ diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp index a2953259ff..23deb2c4b2 100644 --- a/src/gui/kernel/qguiapplication.cpp +++ b/src/gui/kernel/qguiapplication.cpp @@ -75,6 +75,7 @@ #include "private/qwindow_p.h" #include "private/qcursor_p.h" #include "private/qopenglcontext_p.h" +#include "private/qinputdevicemanager_p.h" #include "private/qdnd_p.h" #include @@ -164,6 +165,8 @@ static QBasicMutex applicationFontMutex; QFont *QGuiApplicationPrivate::app_font = 0; bool QGuiApplicationPrivate::obey_desktop_settings = true; +QInputDeviceManager *QGuiApplicationPrivate::m_inputDeviceManager = 0; + static qreal fontSmoothingGamma = 1.7; extern void qRegisterGuiVariant(); @@ -3470,6 +3473,16 @@ void QGuiApplicationPrivate::setMouseEventFlags(QMouseEvent *event, Qt::MouseEve event->caps |= (value & Qt::MouseEventFlagMask) << MouseFlagsShift; } +QInputDeviceManager *QGuiApplicationPrivate::inputDeviceManager() +{ + Q_ASSERT(QGuiApplication::instance()); + + if (!m_inputDeviceManager) + m_inputDeviceManager = new QInputDeviceManager(QGuiApplication::instance()); + + return m_inputDeviceManager; +} + #include "moc_qguiapplication.cpp" QT_END_NAMESPACE diff --git a/src/gui/kernel/qguiapplication_p.h b/src/gui/kernel/qguiapplication_p.h index 8b444e1d34..471316d7ed 100644 --- a/src/gui/kernel/qguiapplication_p.h +++ b/src/gui/kernel/qguiapplication_p.h @@ -66,6 +66,7 @@ struct QDrawHelperGammaTables; #ifndef QT_NO_DRAGANDDROP class QDrag; #endif // QT_NO_DRAGANDDROP +class QInputDeviceManager; class Q_GUI_EXPORT QGuiApplicationPrivate : public QCoreApplicationPrivate { @@ -272,6 +273,8 @@ public: static Qt::MouseEventSource wheelEventSource(const QWheelEvent *event); + static QInputDeviceManager *inputDeviceManager(); + const QDrawHelperGammaTables *gammaTables(); // hook reimplemented in QApplication to apply the QStyle function on the QIcon @@ -301,6 +304,8 @@ private: QAtomicPointer m_gammaTables; bool ownGlobalShareContext; + + static QInputDeviceManager *m_inputDeviceManager; }; Q_GUI_EXPORT uint qHash(const QGuiApplicationPrivate::ActiveTouchPointsKey &k); diff --git a/src/gui/kernel/qinputdevicemanager.cpp b/src/gui/kernel/qinputdevicemanager.cpp new file mode 100644 index 0000000000..925a89c85b --- /dev/null +++ b/src/gui/kernel/qinputdevicemanager.cpp @@ -0,0 +1,64 @@ +/**************************************************************************** +** +** Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qinputdevicemanager_p.h" +#include "qinputdevicemanager_p_p.h" + +QT_BEGIN_NAMESPACE + +QInputDeviceManager::QInputDeviceManager(QObject *parent) + : QObject(*new QInputDeviceManagerPrivate, parent) +{ +} + +int QInputDeviceManager::deviceCount(DeviceType type) const +{ + Q_D(const QInputDeviceManager); + return d->deviceCount(type); +} + +int QInputDeviceManagerPrivate::deviceCount(QInputDeviceManager::DeviceType type) const +{ + return m_deviceCount.value(type); +} + +void QInputDeviceManagerPrivate::setDeviceCount(QInputDeviceManager::DeviceType type, int count) +{ + Q_Q(QInputDeviceManager); + if (m_deviceCount.value(type) != count) { + m_deviceCount[type] = count; + emit q->deviceListChanged(type); + } +} + +QT_END_NAMESPACE diff --git a/src/gui/kernel/qinputdevicemanager_p.h b/src/gui/kernel/qinputdevicemanager_p.h new file mode 100644 index 0000000000..ca334e4645 --- /dev/null +++ b/src/gui/kernel/qinputdevicemanager_p.h @@ -0,0 +1,77 @@ +/**************************************************************************** +** +** Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QINPUTDEVICEMANAGER_P_H +#define QINPUTDEVICEMANAGER_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include + +QT_BEGIN_NAMESPACE + +class QInputDeviceManagerPrivate; + +class Q_GUI_EXPORT QInputDeviceManager : public QObject +{ + Q_OBJECT + Q_DECLARE_PRIVATE(QInputDeviceManager) + +public: + enum DeviceType { + DeviceTypeUnknown, + DeviceTypePointer, + DeviceTypeKeyboard, + DeviceTypeTouch + }; + + QInputDeviceManager(QObject *parent = 0); + + int deviceCount(DeviceType type) const; + +signals: + void deviceListChanged(DeviceType type); +}; + +QT_END_NAMESPACE + +#endif // QINPUTDEVICEMANAGER_P_H diff --git a/src/gui/kernel/qinputdevicemanager_p_p.h b/src/gui/kernel/qinputdevicemanager_p_p.h new file mode 100644 index 0000000000..7583fbe030 --- /dev/null +++ b/src/gui/kernel/qinputdevicemanager_p_p.h @@ -0,0 +1,69 @@ +/**************************************************************************** +** +** Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QINPUTDEVICEMANAGER_P_P_H +#define QINPUTDEVICEMANAGER_P_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include "qinputdevicemanager_p.h" + +QT_BEGIN_NAMESPACE + +class Q_GUI_EXPORT QInputDeviceManagerPrivate : public QObjectPrivate +{ + Q_DECLARE_PUBLIC(QInputDeviceManager) + +public: + static QInputDeviceManagerPrivate *get(QInputDeviceManager *mgr) { return mgr->d_func(); } + + int deviceCount(QInputDeviceManager::DeviceType type) const; + void setDeviceCount(QInputDeviceManager::DeviceType type, int count); + + QMap m_deviceCount; +}; + +QT_END_NAMESPACE + +#endif // QINPUTDEVICEMANAGER_P_P_H diff --git a/src/platformsupport/eglconvenience/qeglplatformcursor.cpp b/src/platformsupport/eglconvenience/qeglplatformcursor.cpp index cf41bd2f1b..b07f8cd470 100644 --- a/src/platformsupport/eglconvenience/qeglplatformcursor.cpp +++ b/src/platformsupport/eglconvenience/qeglplatformcursor.cpp @@ -39,7 +39,7 @@ #include #include -#include +#include #include "qeglplatformcursor_p.h" #include "qeglplatformintegration_p.h" @@ -79,6 +79,11 @@ QEGLPlatformCursor::QEGLPlatformCursor(QPlatformScreen *screen) QCursor cursor(Qt::ArrowCursor); setCurrentCursor(&cursor); #endif + + m_deviceListener = new QEGLPlatformCursorDeviceListener(this); + connect(QGuiApplicationPrivate::inputDeviceManager(), &QInputDeviceManager::deviceListChanged, + m_deviceListener, &QEGLPlatformCursorDeviceListener::onDeviceListChanged); + updateMouseStatus(); } QEGLPlatformCursor::~QEGLPlatformCursor() @@ -87,42 +92,20 @@ QEGLPlatformCursor::~QEGLPlatformCursor() delete m_deviceListener; } -void QEGLPlatformCursor::setMouseDeviceDiscovery(QDeviceDiscovery *dd) -{ - if (m_visible && dd) { - m_deviceListener = new QEGLPlatformCursorDeviceListener(dd, this); - updateMouseStatus(); - } -} - void QEGLPlatformCursor::updateMouseStatus() { m_visible = m_deviceListener->hasMouse(); } -QEGLPlatformCursorDeviceListener::QEGLPlatformCursorDeviceListener(QDeviceDiscovery *dd, QEGLPlatformCursor *cursor) - : m_cursor(cursor) -{ - m_mouseCount = dd->scanConnectedDevices().count(); - connect(dd, SIGNAL(deviceDetected(QString)), SLOT(onDeviceAdded())); - connect(dd, SIGNAL(deviceRemoved(QString)), SLOT(onDeviceRemoved())); -} - bool QEGLPlatformCursorDeviceListener::hasMouse() const { - return m_mouseCount > 0; -} - -void QEGLPlatformCursorDeviceListener::onDeviceAdded() -{ - ++m_mouseCount; - m_cursor->updateMouseStatus(); + return QGuiApplicationPrivate::inputDeviceManager()->deviceCount(QInputDeviceManager::DeviceTypePointer) > 0; } -void QEGLPlatformCursorDeviceListener::onDeviceRemoved() +void QEGLPlatformCursorDeviceListener::onDeviceListChanged(QInputDeviceManager::DeviceType type) { - --m_mouseCount; - m_cursor->updateMouseStatus(); + if (type == QInputDeviceManager::DeviceTypePointer) + m_cursor->updateMouseStatus(); } void QEGLPlatformCursor::resetResources() diff --git a/src/platformsupport/eglconvenience/qeglplatformcursor_p.h b/src/platformsupport/eglconvenience/qeglplatformcursor_p.h index bf2aeef378..8d111e26ed 100644 --- a/src/platformsupport/eglconvenience/qeglplatformcursor_p.h +++ b/src/platformsupport/eglconvenience/qeglplatformcursor_p.h @@ -48,11 +48,11 @@ #include #include #include +#include QT_BEGIN_NAMESPACE class QOpenGLShaderProgram; -class QDeviceDiscovery; class QEGLPlatformCursor; class QEGLPlatformCursorDeviceListener : public QObject @@ -60,16 +60,14 @@ class QEGLPlatformCursorDeviceListener : public QObject Q_OBJECT public: - QEGLPlatformCursorDeviceListener(QDeviceDiscovery *dd, QEGLPlatformCursor *cursor); + QEGLPlatformCursorDeviceListener(QEGLPlatformCursor *cursor) : m_cursor(cursor) { } bool hasMouse() const; -private slots: - void onDeviceAdded(); - void onDeviceRemoved(); +public slots: + void onDeviceListChanged(QInputDeviceManager::DeviceType type); private: QEGLPlatformCursor *m_cursor; - int m_mouseCount; }; class QEGLPlatformCursorUpdater : public QObject @@ -108,7 +106,6 @@ public: void paintOnScreen(); void resetResources(); - void setMouseDeviceDiscovery(QDeviceDiscovery *dd); void updateMouseStatus(); private: diff --git a/src/platformsupport/eglconvenience/qeglplatformintegration.cpp b/src/platformsupport/eglconvenience/qeglplatformintegration.cpp index e2a215d35f..ef794f0e1b 100644 --- a/src/platformsupport/eglconvenience/qeglplatformintegration.cpp +++ b/src/platformsupport/eglconvenience/qeglplatformintegration.cpp @@ -352,12 +352,7 @@ void QEGLPlatformIntegration::createInputHandlers() { #if !defined(QT_NO_EVDEV) && (!defined(Q_OS_ANDROID) || defined(Q_OS_ANDROID_NO_SDK)) m_kbdMgr = new QEvdevKeyboardManager(QLatin1String("EvdevKeyboard"), QString() /* spec */, this); - QEvdevMouseManager *mouseMgr = new QEvdevMouseManager(QLatin1String("EvdevMouse"), QString() /* spec */, this); - Q_FOREACH (QScreen *screen, QGuiApplication::screens()) { - QEGLPlatformCursor *cursor = qobject_cast(screen->handle()->cursor()); - if (cursor) - cursor->setMouseDeviceDiscovery(mouseMgr->deviceDiscovery()); - } + new QEvdevMouseManager(QLatin1String("EvdevMouse"), QString() /* spec */, this); #ifndef QT_NO_TSLIB const bool useTslib = qEnvironmentVariableIntValue("QT_QPA_EGLFS_TSLIB"); if (useTslib) diff --git a/src/platformsupport/fbconvenience/qfbcursor.cpp b/src/platformsupport/fbconvenience/qfbcursor.cpp index 806556b1e4..8d6a695d68 100644 --- a/src/platformsupport/fbconvenience/qfbcursor.cpp +++ b/src/platformsupport/fbconvenience/qfbcursor.cpp @@ -34,14 +34,47 @@ #include "qfbcursor_p.h" #include "qfbscreen_p.h" #include +#include QT_BEGIN_NAMESPACE +bool QFbCursorDeviceListener::hasMouse() const +{ + return QGuiApplicationPrivate::inputDeviceManager()->deviceCount(QInputDeviceManager::DeviceTypePointer) > 0; +} + +void QFbCursorDeviceListener::onDeviceListChanged(QInputDeviceManager::DeviceType type) +{ + if (type == QInputDeviceManager::DeviceTypePointer) + m_cursor->updateMouseStatus(); +} + QFbCursor::QFbCursor(QFbScreen *screen) - : mScreen(screen), mDirty(false), mOnScreen(false) + : mVisible(true), + mScreen(screen), + mDirty(false), + mOnScreen(false), + mGraphic(0), + mDeviceListener(0) { + QByteArray hideCursorVal = qgetenv("QT_QPA_FB_HIDECURSOR"); + if (!hideCursorVal.isEmpty()) + mVisible = hideCursorVal.toInt() == 0; + if (!mVisible) + return; + mGraphic = new QPlatformCursorImage(0, 0, 0, 0, 0, 0); setCursor(Qt::ArrowCursor); + + mDeviceListener = new QFbCursorDeviceListener(this); + connect(QGuiApplicationPrivate::inputDeviceManager(), &QInputDeviceManager::deviceListChanged, + mDeviceListener, &QFbCursorDeviceListener::onDeviceListChanged); + updateMouseStatus(); +} + +QFbCursor::~QFbCursor() +{ + delete mDeviceListener; } QRect QFbCursor::getCurrentRect() @@ -68,6 +101,9 @@ void QFbCursor::pointerEvent(const QMouseEvent & e) QRect QFbCursor::drawCursor(QPainter & painter) { + if (!mVisible) + return QRect(); + mDirty = false; if (mCurrentRect.isNull()) return QRect(); @@ -131,15 +167,19 @@ void QFbCursor::changeCursor(QCursor * widgetCursor, QWindow *window) void QFbCursor::setDirty() { + if (!mVisible) + return; + if (!mDirty) { mDirty = true; mScreen->scheduleUpdate(); } } -void QFbCursor::setMouseDeviceDiscovery(QDeviceDiscovery *dd) +void QFbCursor::updateMouseStatus() { - Q_UNUSED(dd); + mVisible = mDeviceListener->hasMouse(); + mScreen->setDirty(mVisible ? getCurrentRect() : lastPainted()); } QT_END_NAMESPACE diff --git a/src/platformsupport/fbconvenience/qfbcursor_p.h b/src/platformsupport/fbconvenience/qfbcursor_p.h index 75501a0ff0..bec781fb21 100644 --- a/src/platformsupport/fbconvenience/qfbcursor_p.h +++ b/src/platformsupport/fbconvenience/qfbcursor_p.h @@ -46,11 +46,27 @@ // #include +#include QT_BEGIN_NAMESPACE class QFbScreen; -class QDeviceDiscovery; +class QFbCursor; + +class QFbCursorDeviceListener : public QObject +{ + Q_OBJECT + +public: + QFbCursorDeviceListener(QFbCursor *cursor) : m_cursor(cursor) { } + bool hasMouse() const; + +public slots: + void onDeviceListChanged(QInputDeviceManager::DeviceType type); + +private: + QFbCursor *m_cursor; +}; class QFbCursor : public QPlatformCursor { @@ -58,6 +74,7 @@ class QFbCursor : public QPlatformCursor public: QFbCursor(QFbScreen *screen); + ~QFbCursor(); // output methods QRect dirtyRect(); @@ -74,7 +91,7 @@ public: virtual bool isOnScreen() const { return mOnScreen; } virtual QRect lastPainted() const { return mPrevRect; } - void setMouseDeviceDiscovery(QDeviceDiscovery *dd); + void updateMouseStatus(); private: void setCursor(const uchar *data, const uchar *mask, int width, int height, int hotX, int hotY); @@ -82,12 +99,14 @@ private: void setCursor(const QImage &image, int hotx, int hoty); QRect getCurrentRect(); + bool mVisible; QFbScreen *mScreen; QRect mCurrentRect; // next place to draw the cursor QRect mPrevRect; // last place the cursor was drawn bool mDirty; bool mOnScreen; QPlatformCursorImage *mGraphic; + QFbCursorDeviceListener *mDeviceListener; }; QT_END_NAMESPACE diff --git a/src/platformsupport/input/evdevkeyboard/qevdevkeyboardmanager.cpp b/src/platformsupport/input/evdevkeyboard/qevdevkeyboardmanager.cpp index 4614fbd499..8853da8371 100644 --- a/src/platformsupport/input/evdevkeyboard/qevdevkeyboardmanager.cpp +++ b/src/platformsupport/input/evdevkeyboard/qevdevkeyboardmanager.cpp @@ -37,6 +37,9 @@ #include #include +#include +#include + QT_BEGIN_NAMESPACE Q_DECLARE_LOGGING_CATEGORY(qLcEvdevKey) @@ -97,10 +100,13 @@ void QEvdevKeyboardManager::addKeyboard(const QString &deviceNode) qCDebug(qLcEvdevKey) << "Adding keyboard at" << deviceNode; QEvdevKeyboardHandler *keyboard; keyboard = QEvdevKeyboardHandler::create(deviceNode, m_spec, m_defaultKeymapFile); - if (keyboard) + if (keyboard) { m_keyboards.insert(deviceNode, keyboard); - else + QInputDeviceManagerPrivate::get(QGuiApplicationPrivate::inputDeviceManager())->setDeviceCount( + QInputDeviceManager::DeviceTypeKeyboard, m_keyboards.count()); + } else { qWarning("Failed to open keyboard device %s", qPrintable(deviceNode)); + } } void QEvdevKeyboardManager::removeKeyboard(const QString &deviceNode) @@ -109,6 +115,8 @@ void QEvdevKeyboardManager::removeKeyboard(const QString &deviceNode) qCDebug(qLcEvdevKey) << "Removing keyboard at" << deviceNode; QEvdevKeyboardHandler *keyboard = m_keyboards.value(deviceNode); m_keyboards.remove(deviceNode); + QInputDeviceManagerPrivate::get(QGuiApplicationPrivate::inputDeviceManager())->setDeviceCount( + QInputDeviceManager::DeviceTypeKeyboard, m_keyboards.count()); delete keyboard; } } diff --git a/src/platformsupport/input/evdevmouse/qevdevmousemanager.cpp b/src/platformsupport/input/evdevmouse/qevdevmousemanager.cpp index a0c9c9f34d..17e6b0cafa 100644 --- a/src/platformsupport/input/evdevmouse/qevdevmousemanager.cpp +++ b/src/platformsupport/input/evdevmouse/qevdevmousemanager.cpp @@ -38,6 +38,9 @@ #include #include #include +#include +#include +#include QT_BEGIN_NAMESPACE @@ -141,6 +144,8 @@ void QEvdevMouseManager::addMouse(const QString &deviceNode) connect(handler, SIGNAL(handleMouseEvent(int,int,bool,Qt::MouseButtons)), this, SLOT(handleMouseEvent(int,int,bool,Qt::MouseButtons))); connect(handler, SIGNAL(handleWheelEvent(int,Qt::Orientation)), this, SLOT(handleWheelEvent(int,Qt::Orientation))); m_mice.insert(deviceNode, handler); + QInputDeviceManagerPrivate::get(QGuiApplicationPrivate::inputDeviceManager())->setDeviceCount( + QInputDeviceManager::DeviceTypePointer, m_mice.count()); } else { qWarning("evdevmouse: Failed to open mouse device %s", qPrintable(deviceNode)); } @@ -152,6 +157,8 @@ void QEvdevMouseManager::removeMouse(const QString &deviceNode) qCDebug(qLcEvdevMouse) << "Removing mouse at" << deviceNode; QEvdevMouseHandler *handler = m_mice.value(deviceNode); m_mice.remove(deviceNode); + QInputDeviceManagerPrivate::get(QGuiApplicationPrivate::inputDeviceManager())->setDeviceCount( + QInputDeviceManager::DeviceTypePointer, m_mice.count()); delete handler; } } diff --git a/src/platformsupport/input/evdevmouse/qevdevmousemanager_p.h b/src/platformsupport/input/evdevmouse/qevdevmousemanager_p.h index 14aa6a8fd2..d30a2b337f 100644 --- a/src/platformsupport/input/evdevmouse/qevdevmousemanager_p.h +++ b/src/platformsupport/input/evdevmouse/qevdevmousemanager_p.h @@ -47,14 +47,14 @@ #include "qevdevmousehandler_p.h" -#include - #include #include #include QT_BEGIN_NAMESPACE +class QDeviceDiscovery; + class QEvdevMouseManager : public QObject { Q_OBJECT @@ -62,8 +62,6 @@ public: QEvdevMouseManager(const QString &key, const QString &specification, QObject *parent = 0); ~QEvdevMouseManager(); - QDeviceDiscovery *deviceDiscovery() { return m_deviceDiscovery; } - public slots: void handleMouseEvent(int x, int y, bool abs, Qt::MouseButtons buttons); void handleWheelEvent(int delta, Qt::Orientation orientation); diff --git a/src/platformsupport/input/libinput/qlibinputhandler.cpp b/src/platformsupport/input/libinput/qlibinputhandler.cpp index cab4527d0a..0ed605019c 100644 --- a/src/platformsupport/input/libinput/qlibinputhandler.cpp +++ b/src/platformsupport/input/libinput/qlibinputhandler.cpp @@ -41,6 +41,8 @@ #include #include #include +#include +#include QT_BEGIN_NAMESPACE @@ -146,8 +148,25 @@ void QLibInputHandler::processEvent(libinput_event *ev) const char *sysname = libinput_device_get_sysname(dev); // node name without path const char *name = libinput_device_get_name(dev); emit deviceAdded(QString::fromUtf8(sysname), QString::fromUtf8(name)); - if (libinput_device_has_capability(dev, LIBINPUT_DEVICE_CAP_TOUCH)) + + QInputDeviceManagerPrivate *inputManagerPriv = QInputDeviceManagerPrivate::get( + QGuiApplicationPrivate::inputDeviceManager()); + if (libinput_device_has_capability(dev, LIBINPUT_DEVICE_CAP_TOUCH)) { m_touch->registerDevice(dev); + int &count(m_devCount[QInputDeviceManager::DeviceTypeTouch]); + ++count; + inputManagerPriv->setDeviceCount(QInputDeviceManager::DeviceTypeTouch, count); + } + if (libinput_device_has_capability(dev, LIBINPUT_DEVICE_CAP_POINTER)) { + int &count(m_devCount[QInputDeviceManager::DeviceTypePointer]); + ++count; + inputManagerPriv->setDeviceCount(QInputDeviceManager::DeviceTypePointer, count); + } + if (libinput_device_has_capability(dev, LIBINPUT_DEVICE_CAP_KEYBOARD)) { + int &count(m_devCount[QInputDeviceManager::DeviceTypeKeyboard]); + ++count; + inputManagerPriv->setDeviceCount(QInputDeviceManager::DeviceTypeKeyboard, count); + } break; } case LIBINPUT_EVENT_DEVICE_REMOVED: @@ -155,8 +174,25 @@ void QLibInputHandler::processEvent(libinput_event *ev) const char *sysname = libinput_device_get_sysname(dev); const char *name = libinput_device_get_name(dev); emit deviceRemoved(QString::fromUtf8(sysname), QString::fromUtf8(name)); - if (libinput_device_has_capability(dev, LIBINPUT_DEVICE_CAP_TOUCH)) + + QInputDeviceManagerPrivate *inputManagerPriv = QInputDeviceManagerPrivate::get( + QGuiApplicationPrivate::inputDeviceManager()); + if (libinput_device_has_capability(dev, LIBINPUT_DEVICE_CAP_TOUCH)) { m_touch->unregisterDevice(dev); + int &count(m_devCount[QInputDeviceManager::DeviceTypeTouch]); + --count; + inputManagerPriv->setDeviceCount(QInputDeviceManager::DeviceTypeTouch, count); + } + if (libinput_device_has_capability(dev, LIBINPUT_DEVICE_CAP_POINTER)) { + int &count(m_devCount[QInputDeviceManager::DeviceTypePointer]); + --count; + inputManagerPriv->setDeviceCount(QInputDeviceManager::DeviceTypePointer, count); + } + if (libinput_device_has_capability(dev, LIBINPUT_DEVICE_CAP_KEYBOARD)) { + int &count(m_devCount[QInputDeviceManager::DeviceTypeKeyboard]); + --count; + inputManagerPriv->setDeviceCount(QInputDeviceManager::DeviceTypeKeyboard, count); + } break; } case LIBINPUT_EVENT_POINTER_BUTTON: diff --git a/src/platformsupport/input/libinput/qlibinputhandler_p.h b/src/platformsupport/input/libinput/qlibinputhandler_p.h index a1cfaca3ce..6d376c4ca3 100644 --- a/src/platformsupport/input/libinput/qlibinputhandler_p.h +++ b/src/platformsupport/input/libinput/qlibinputhandler_p.h @@ -36,6 +36,7 @@ #include #include +#include // // W A R N I N G @@ -84,6 +85,7 @@ private: QScopedPointer m_pointer; QScopedPointer m_keyboard; QScopedPointer m_touch; + QMap m_devCount; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/linuxfb/qlinuxfbintegration.cpp b/src/plugins/platforms/linuxfb/qlinuxfbintegration.cpp index 1600ee3f2b..6785464cea 100644 --- a/src/plugins/platforms/linuxfb/qlinuxfbintegration.cpp +++ b/src/plugins/platforms/linuxfb/qlinuxfbintegration.cpp @@ -130,12 +130,7 @@ void QLinuxFbIntegration::createInputHandlers() { #if !defined(QT_NO_EVDEV) && (!defined(Q_OS_ANDROID) || defined(Q_OS_ANDROID_NO_SDK)) new QEvdevKeyboardManager(QLatin1String("EvdevKeyboard"), QString(), this); - QEvdevMouseManager *mouseMgr = new QEvdevMouseManager(QLatin1String("EvdevMouse"), QString(), this); - Q_FOREACH (QScreen *screen, QGuiApplication::screens()) { - QFbCursor *cursor = qobject_cast(screen->handle()->cursor()); - if (cursor) - cursor->setMouseDeviceDiscovery(mouseMgr->deviceDiscovery()); - } + new QEvdevMouseManager(QLatin1String("EvdevMouse"), QString(), this); #ifndef QT_NO_TSLIB const bool useTslib = qEnvironmentVariableIntValue("QT_QPA_FB_TSLIB"); if (useTslib) diff --git a/src/plugins/platforms/linuxfb/qlinuxfbscreen.cpp b/src/plugins/platforms/linuxfb/qlinuxfbscreen.cpp index a66c9fa252..592ce90b16 100644 --- a/src/plugins/platforms/linuxfb/qlinuxfbscreen.cpp +++ b/src/plugins/platforms/linuxfb/qlinuxfbscreen.cpp @@ -55,10 +55,6 @@ #include -#if !defined(QT_NO_EVDEV) && (!defined(Q_OS_ANDROID) || defined(Q_OS_ANDROID_NO_SDK)) -#include -#endif - QT_BEGIN_NAMESPACE static int openFramebufferDevice(const QString &dev) @@ -393,22 +389,7 @@ bool QLinuxFbScreen::initialize() QFbScreen::initializeCompositor(); mFbScreenImage = QImage(mMmap.data, geometry.width(), geometry.height(), mBytesPerLine, mFormat); - QByteArray hideCursorVal = qgetenv("QT_QPA_FB_HIDECURSOR"); -#if !defined(Q_OS_ANDROID) || defined(Q_OS_ANDROID_NO_SDK) - bool hideCursor = false; -#else - bool hideCursor = true; // default to true to prevent the cursor showing up with the subclass on Android -#endif - if (hideCursorVal.isEmpty()) { -#if !defined(QT_NO_EVDEV) && (!defined(Q_OS_ANDROID) || defined(Q_OS_ANDROID_NO_SDK)) - QScopedPointer dis(QDeviceDiscovery::create(QDeviceDiscovery::Device_Mouse)); - hideCursor = dis->scanConnectedDevices().isEmpty(); -#endif - } else { - hideCursor = hideCursorVal.toInt() != 0; - } - if (!hideCursor) - mCursor = new QFbCursor(this); + mCursor = new QFbCursor(this); mTtyFd = openTtyDevice(ttyDevice); if (mTtyFd == -1) -- cgit v1.2.3