eglfs: Mouse hotplugging support
On Embedded Linux with libudev support hotplugging was already working, except that the mouse cursor was not shown and hidden. This is now corrected so that the cursor disappears when all mice become disconnected and reappears if a mouse gets plugged in later on. [ChangeLog][QtGui] Mouse hotplugging is now fully supported in eglfs when running on Embedded Linux systems with libudev support enabled. Task-number: QTBUG-36374 Change-Id: Iec7c1557ba6085e3958dd357460cc032896fb174 Reviewed-by: Andy Nichols <andy.nichols@digia.com>
This commit is contained in:
parent
231cac6119
commit
6953f3a501
@ -27,6 +27,9 @@ contains(QT_CONFIG,egl) {
|
||||
$$PWD/qeglplatformintegration.cpp
|
||||
}
|
||||
|
||||
# Avoid X11 header collision
|
||||
DEFINES += MESA_EGL_NO_X11_HEADERS
|
||||
|
||||
contains(QT_CONFIG,xlib) {
|
||||
HEADERS += \
|
||||
$$PWD/qxlibeglintegration_p.h
|
||||
|
@ -39,7 +39,6 @@
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "qeglplatformcursor_p.h"
|
||||
#include <qpa/qwindowsysteminterface.h>
|
||||
#include <QtGui/QOpenGLContext>
|
||||
#include <QtGui/QOpenGLShaderProgram>
|
||||
@ -50,6 +49,9 @@
|
||||
|
||||
#include <QtPlatformSupport/private/qdevicediscovery_p.h>
|
||||
|
||||
#include "qeglplatformcursor_p.h"
|
||||
#include "qeglplatformintegration_p.h"
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
/*!
|
||||
@ -66,15 +68,12 @@ QEGLPlatformCursor::QEGLPlatformCursor(QPlatformScreen *screen)
|
||||
m_program(0),
|
||||
m_vertexCoordEntry(0),
|
||||
m_textureCoordEntry(0),
|
||||
m_textureEntry(0)
|
||||
m_textureEntry(0),
|
||||
m_deviceListener(0)
|
||||
{
|
||||
QByteArray hideCursorVal = qgetenv("QT_QPA_EGLFS_HIDECURSOR");
|
||||
if (hideCursorVal.isEmpty()) {
|
||||
QScopedPointer<QDeviceDiscovery> dis(QDeviceDiscovery::create(QDeviceDiscovery::Device_Mouse));
|
||||
m_visible = !dis->scanConnectedDevices().isEmpty();
|
||||
} else {
|
||||
if (!hideCursorVal.isEmpty())
|
||||
m_visible = hideCursorVal.toInt() == 0;
|
||||
}
|
||||
if (!m_visible)
|
||||
return;
|
||||
|
||||
@ -92,6 +91,45 @@ QEGLPlatformCursor::QEGLPlatformCursor(QPlatformScreen *screen)
|
||||
QEGLPlatformCursor::~QEGLPlatformCursor()
|
||||
{
|
||||
resetResources();
|
||||
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();
|
||||
}
|
||||
|
||||
void QEGLPlatformCursorDeviceListener::onDeviceRemoved()
|
||||
{
|
||||
--m_mouseCount;
|
||||
m_cursor->updateMouseStatus();
|
||||
}
|
||||
|
||||
void QEGLPlatformCursor::resetResources()
|
||||
|
@ -48,6 +48,25 @@
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
class QOpenGLShaderProgram;
|
||||
class QDeviceDiscovery;
|
||||
class QEGLPlatformCursor;
|
||||
|
||||
class QEGLPlatformCursorDeviceListener : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
QEGLPlatformCursorDeviceListener(QDeviceDiscovery *dd, QEGLPlatformCursor *cursor);
|
||||
bool hasMouse() const;
|
||||
|
||||
private slots:
|
||||
void onDeviceAdded();
|
||||
void onDeviceRemoved();
|
||||
|
||||
private:
|
||||
QEGLPlatformCursor *m_cursor;
|
||||
int m_mouseCount;
|
||||
};
|
||||
|
||||
class QEGLPlatformCursor : public QPlatformCursor
|
||||
{
|
||||
@ -66,6 +85,9 @@ public:
|
||||
void paintOnScreen();
|
||||
void resetResources();
|
||||
|
||||
void setMouseDeviceDiscovery(QDeviceDiscovery *dd);
|
||||
void updateMouseStatus();
|
||||
|
||||
private:
|
||||
#ifndef QT_NO_CURSOR
|
||||
bool setCurrentCursor(QCursor *cursor);
|
||||
@ -107,6 +129,7 @@ private:
|
||||
int m_vertexCoordEntry;
|
||||
int m_textureCoordEntry;
|
||||
int m_textureEntry;
|
||||
QEGLPlatformCursorDeviceListener *m_deviceListener;
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
@ -41,6 +41,7 @@
|
||||
|
||||
#include <QtGui/QWindow>
|
||||
#include <QtGui/QOpenGLContext>
|
||||
#include <QtGui/QGuiApplication>
|
||||
#include <qpa/qwindowsysteminterface.h>
|
||||
#include <qpa/qplatforminputcontextfactory_p.h>
|
||||
|
||||
@ -49,11 +50,18 @@
|
||||
#include <QtPlatformSupport/private/qgenericunixeventdispatcher_p.h>
|
||||
#include <QtPlatformSupport/private/qfbvthandler_p.h>
|
||||
|
||||
#if !defined(QT_NO_EVDEV) && (!defined(Q_OS_ANDROID) || defined(Q_OS_ANDROID_NO_SDK))
|
||||
#include <QtPlatformSupport/private/qevdevmousemanager_p.h>
|
||||
#include <QtPlatformSupport/private/qevdevkeyboardmanager_p.h>
|
||||
#include <QtPlatformSupport/private/qevdevtouch_p.h>
|
||||
#endif
|
||||
|
||||
#include "qeglplatformintegration_p.h"
|
||||
#include "qeglplatformcontext_p.h"
|
||||
#include "qeglplatformwindow_p.h"
|
||||
#include "qeglplatformbackingstore_p.h"
|
||||
#include "qeglplatformscreen_p.h"
|
||||
#include "qeglplatformcursor_p.h"
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
@ -256,4 +264,18 @@ QPlatformNativeInterface::NativeResourceForContextFunction QEGLPlatformIntegrati
|
||||
return 0;
|
||||
}
|
||||
|
||||
void QEGLPlatformIntegration::createInputHandlers()
|
||||
{
|
||||
#if !defined(QT_NO_EVDEV) && (!defined(Q_OS_ANDROID) || defined(Q_OS_ANDROID_NO_SDK))
|
||||
new QEvdevKeyboardManager(QLatin1String("EvdevKeyboard"), QString() /* spec */, this);
|
||||
QEvdevMouseManager *mouseMgr = new QEvdevMouseManager(QLatin1String("EvdevMouse"), QString() /* spec */, this);
|
||||
Q_FOREACH (QScreen *screen, QGuiApplication::screens()) {
|
||||
QEGLPlatformCursor *cursor = static_cast<QEGLPlatformCursor *>(screen->handle()->cursor());
|
||||
if (cursor)
|
||||
cursor->setMouseDeviceDiscovery(mouseMgr->deviceDiscovery());
|
||||
}
|
||||
new QEvdevTouchScreenHandlerThread(QString() /* spec */, this);
|
||||
#endif
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
@ -85,6 +85,8 @@ protected:
|
||||
virtual QEGLPlatformWindow *createWindow(QWindow *window) const = 0;
|
||||
virtual EGLNativeDisplayType nativeDisplay() const { return EGL_DEFAULT_DISPLAY; }
|
||||
|
||||
void createInputHandlers();
|
||||
|
||||
private:
|
||||
QEGLPlatformScreen *m_screen;
|
||||
EGLDisplay m_display;
|
||||
|
@ -59,6 +59,8 @@ 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, Qt::MouseButtons buttons);
|
||||
void handleWheelEvent(int delta, Qt::Orientation orientation);
|
||||
|
@ -43,6 +43,7 @@
|
||||
|
||||
#include "qeglfswindow.h"
|
||||
#include "qeglfshooks.h"
|
||||
#include "qeglfscontext.h"
|
||||
|
||||
#include <QtGui/private/qguiapplication_p.h>
|
||||
|
||||
@ -50,12 +51,6 @@
|
||||
#include <QtPlatformSupport/private/qeglplatformcontext_p.h>
|
||||
#include <QtPlatformSupport/private/qeglpbuffer_p.h>
|
||||
|
||||
#if !defined(QT_NO_EVDEV) && (!defined(Q_OS_ANDROID) || defined(Q_OS_ANDROID_NO_SDK))
|
||||
#include <QtPlatformSupport/private/qevdevmousemanager_p.h>
|
||||
#include <QtPlatformSupport/private/qevdevkeyboardmanager_p.h>
|
||||
#include <QtPlatformSupport/private/qevdevtouch_p.h>
|
||||
#endif
|
||||
|
||||
#include <qpa/qplatformwindow.h>
|
||||
#include <QtGui/QSurfaceFormat>
|
||||
#include <QtGui/QOpenGLContext>
|
||||
@ -63,8 +58,6 @@
|
||||
#include <QtGui/QOffscreenSurface>
|
||||
#include <qpa/qplatformcursor.h>
|
||||
|
||||
#include "qeglfscontext.h"
|
||||
|
||||
#include <EGL/egl.h>
|
||||
|
||||
static void initResources()
|
||||
@ -167,13 +160,4 @@ EGLConfig QEglFSIntegration::chooseConfig(EGLDisplay display, const QSurfaceForm
|
||||
return chooser.chooseConfig();
|
||||
}
|
||||
|
||||
void QEglFSIntegration::createInputHandlers()
|
||||
{
|
||||
#if !defined(QT_NO_EVDEV) && (!defined(Q_OS_ANDROID) || defined(Q_OS_ANDROID_NO_SDK))
|
||||
new QEvdevKeyboardManager(QLatin1String("EvdevKeyboard"), QString() /* spec */, this);
|
||||
new QEvdevMouseManager(QLatin1String("EvdevMouse"), QString() /* spec */, this);
|
||||
new QEvdevTouchScreenHandlerThread(QString() /* spec */, this);
|
||||
#endif
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
@ -70,8 +70,6 @@ protected:
|
||||
EGLNativeDisplayType nativeDisplay() const Q_DECL_OVERRIDE;
|
||||
|
||||
private:
|
||||
void createInputHandlers();
|
||||
|
||||
bool mDisableInputHandlers;
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user