summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@theqtcompany.com>2015-01-09 14:48:01 +0100
committerLaszlo Agocs <laszlo.agocs@theqtcompany.com>2015-01-21 12:32:04 +0100
commit10472dce9202e4460b2d908bdbe0cd65291f77e5 (patch)
tree4a0d970fcedb4e7b0b01c3f65cd9c7886473dfe0
parentf93c04e44a5bd08fea76a1147b1aa51953bce925 (diff)
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 <andy.nichols@theqtcompany.com>
-rw-r--r--src/gui/kernel/kernel.pri7
-rw-r--r--src/gui/kernel/qguiapplication.cpp13
-rw-r--r--src/gui/kernel/qguiapplication_p.h5
-rw-r--r--src/gui/kernel/qinputdevicemanager.cpp64
-rw-r--r--src/gui/kernel/qinputdevicemanager_p.h77
-rw-r--r--src/gui/kernel/qinputdevicemanager_p_p.h69
-rw-r--r--src/platformsupport/eglconvenience/qeglplatformcursor.cpp37
-rw-r--r--src/platformsupport/eglconvenience/qeglplatformcursor_p.h11
-rw-r--r--src/platformsupport/eglconvenience/qeglplatformintegration.cpp7
-rw-r--r--src/platformsupport/fbconvenience/qfbcursor.cpp46
-rw-r--r--src/platformsupport/fbconvenience/qfbcursor_p.h23
-rw-r--r--src/platformsupport/input/evdevkeyboard/qevdevkeyboardmanager.cpp12
-rw-r--r--src/platformsupport/input/evdevmouse/qevdevmousemanager.cpp7
-rw-r--r--src/platformsupport/input/evdevmouse/qevdevmousemanager_p.h6
-rw-r--r--src/platformsupport/input/libinput/qlibinputhandler.cpp40
-rw-r--r--src/platformsupport/input/libinput/qlibinputhandler_p.h2
-rw-r--r--src/plugins/platforms/linuxfb/qlinuxfbintegration.cpp7
-rw-r--r--src/plugins/platforms/linuxfb/qlinuxfbscreen.cpp21
18 files changed, 373 insertions, 81 deletions
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 <qpa/qplatformthemefactory_p.h>
@@ -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<QDrawHelperGammaTables> 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 <QtCore/qobject.h>
+
+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 <QtCore/qmap.h>
+#include <private/qobject_p.h>
+#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<QInputDeviceManager::DeviceType, int> 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 <QtCore/QJsonObject>
#include <QtDebug>
-#include <QtPlatformSupport/private/qdevicediscovery_p.h>
+#include <QtGui/private/qguiapplication_p.h>
#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 <qpa/qplatformcursor.h>
#include <qpa/qplatformscreen.h>
#include <QtGui/QOpenGLFunctions>
+#include <QtGui/private/qinputdevicemanager_p.h>
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<QEGLPlatformCursor *>(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 <QtGui/QPainter>
+#include <QtGui/private/qguiapplication_p.h>
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 <qpa/qplatformcursor.h>
+#include <QtGui/private/qinputdevicemanager_p.h>
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 <QCoreApplication>
#include <QLoggingCategory>
+#include <private/qguiapplication_p.h>
+#include <private/qinputdevicemanager_p_p.h>
+
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 <QScreen>
#include <QLoggingCategory>
#include <qpa/qwindowsysteminterface.h>
+#include <QtPlatformSupport/private/qdevicediscovery_p.h>
+#include <private/qguiapplication_p.h>
+#include <private/qinputdevicemanager_p_p.h>
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 <QtPlatformSupport/private/qdevicediscovery_p.h>
-
#include <QObject>
#include <QHash>
#include <QSocketNotifier>
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 <QtCore/QLoggingCategory>
#include <QtCore/QSocketNotifier>
#include <QtCore/private/qcore_unix_p.h>
+#include <private/qguiapplication_p.h>
+#include <private/qinputdevicemanager_p_p.h>
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 <QtCore/QObject>
#include <QtCore/QScopedPointer>
+#include <QtCore/QMap>
//
// W A R N I N G
@@ -84,6 +85,7 @@ private:
QScopedPointer<QLibInputPointer> m_pointer;
QScopedPointer<QLibInputKeyboard> m_keyboard;
QScopedPointer<QLibInputTouch> m_touch;
+ QMap<int, int> 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<QFbCursor *>(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 <linux/fb.h>
-#if !defined(QT_NO_EVDEV) && (!defined(Q_OS_ANDROID) || defined(Q_OS_ANDROID_NO_SDK))
-#include <QtPlatformSupport/private/qdevicediscovery_p.h>
-#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<QDeviceDiscovery> 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)