diff options
21 files changed, 118 insertions, 61 deletions
diff --git a/.qmake.conf b/.qmake.conf index 6fb07da..6cfd011 100644 --- a/.qmake.conf +++ b/.qmake.conf @@ -3,4 +3,4 @@ load(qt_build_config) CONFIG += warning_clean DEFINES += QT_NO_FOREACH -MODULE_VERSION = 5.10.1 +MODULE_VERSION = 5.11.0 diff --git a/examples/gamepad/simple/gamepadmonitor.cpp b/examples/gamepad/simple/gamepadmonitor.cpp index f527ff2..f0721ba 100644 --- a/examples/gamepad/simple/gamepadmonitor.cpp +++ b/examples/gamepad/simple/gamepadmonitor.cpp @@ -52,13 +52,17 @@ #include <QtGamepad/QGamepad> #include <QDebug> +#include <QLoggingCategory> GamepadMonitor::GamepadMonitor(QObject *parent) : QObject(parent) , m_gamepad(0) { + QLoggingCategory::setFilterRules(QStringLiteral("qt.gamepad.debug=true")); + auto gamepads = QGamepadManager::instance()->connectedGamepads(); if (gamepads.isEmpty()) { + qDebug() << "Did not find any connected gamepads"; return; } diff --git a/src/gamepad/gamepad.pro b/src/gamepad/gamepad.pro index 92d68cc..ceb45df 100644 --- a/src/gamepad/gamepad.pro +++ b/src/gamepad/gamepad.pro @@ -27,9 +27,6 @@ SOURCES += \ ANDROID_BUNDLED_JAR_DEPENDENCIES = \ - jar/QtAndroidGamepad-bundled.jar - -ANDROID_JAR_DEPENDENCIES = \ jar/QtAndroidGamepad.jar ANDROID_LIB_DEPENDENCIES = \ diff --git a/src/gamepad/qgamepad.cpp b/src/gamepad/qgamepad.cpp index f4db27e..7af71fc 100644 --- a/src/gamepad/qgamepad.cpp +++ b/src/gamepad/qgamepad.cpp @@ -102,8 +102,10 @@ public: bool buttonGuide; void setConnected(bool isConnected); + void setName(const QString &name); void _q_handleGamepadConnected(int id); + void _q_handleGamepadNameChanged(int id, const QString &name); void _q_handleGamepadDisconnected(int id); void _q_handleGamepadAxisEvent(int id, QGamepadManager::GamepadAxis axis, double value); void _q_handleGamepadButtonPressEvent(int id, QGamepadManager::GamepadButton button, double value); @@ -119,6 +121,15 @@ void QGamepadPrivate::setConnected(bool isConnected) } } +void QGamepadPrivate::setName(const QString &theName) +{ + Q_Q(QGamepad); + if (name != theName) { + name = theName; + emit q->nameChanged(name); + } +} + /*! * \internal */\ @@ -132,6 +143,15 @@ void QGamepadPrivate::_q_handleGamepadConnected(int id) /*! * \internal */\ +void QGamepadPrivate::_q_handleGamepadNameChanged(int id, const QString &name) +{ + if (id == deviceId) + setName(name); +} + +/*! + * \internal + */\ void QGamepadPrivate::_q_handleGamepadDisconnected(int id) { if (id == deviceId) { @@ -363,12 +383,14 @@ QGamepad::QGamepad(int deviceId, QObject *parent) Q_D(QGamepad); d->gamepadManager = QGamepadManager::instance(); connect(d->gamepadManager, SIGNAL(gamepadConnected(int)), this, SLOT(_q_handleGamepadConnected(int))); + connect(d->gamepadManager, SIGNAL(gamepadNameChanged(int, QString)), this, SLOT(_q_handleGamepadNameChanged(int, QString))); connect(d->gamepadManager, SIGNAL(gamepadDisconnected(int)), this, SLOT(_q_handleGamepadDisconnected(int))); connect(d->gamepadManager, SIGNAL(gamepadAxisEvent(int,QGamepadManager::GamepadAxis,double)), this, SLOT(_q_handleGamepadAxisEvent(int,QGamepadManager::GamepadAxis,double))); connect(d->gamepadManager, SIGNAL(gamepadButtonPressEvent(int,QGamepadManager::GamepadButton,double)), this, SLOT(_q_handleGamepadButtonPressEvent(int,QGamepadManager::GamepadButton,double))); connect(d->gamepadManager, SIGNAL(gamepadButtonReleaseEvent(int,QGamepadManager::GamepadButton)), this, SLOT(_q_handleGamepadButtonReleaseEvent(int,QGamepadManager::GamepadButton))); d->setConnected(d->gamepadManager->isGamepadConnected(deviceId)); + d->setName(d->gamepadManager->gamepadName(deviceId)); } /*! diff --git a/src/gamepad/qgamepad.h b/src/gamepad/qgamepad.h index fcc08f3..33390f8 100644 --- a/src/gamepad/qgamepad.h +++ b/src/gamepad/qgamepad.h @@ -142,6 +142,7 @@ private: Q_DECLARE_PRIVATE(QGamepad) Q_DISABLE_COPY(QGamepad) Q_PRIVATE_SLOT(d_func(), void _q_handleGamepadConnected(int)) + Q_PRIVATE_SLOT(d_func(), void _q_handleGamepadNameChanged(int, const QString &)) Q_PRIVATE_SLOT(d_func(), void _q_handleGamepadDisconnected(int)) Q_PRIVATE_SLOT(d_func(), void _q_handleGamepadAxisEvent(int, QGamepadManager::GamepadAxis, double)) Q_PRIVATE_SLOT(d_func(), void _q_handleGamepadButtonPressEvent(int, QGamepadManager::GamepadButton, double)) diff --git a/src/gamepad/qgamepadbackend_p.h b/src/gamepad/qgamepadbackend_p.h index 0ce46de..41d7472 100644 --- a/src/gamepad/qgamepadbackend_p.h +++ b/src/gamepad/qgamepadbackend_p.h @@ -34,8 +34,8 @@ ** ****************************************************************************/ -#ifndef QGAMEPADBACKEND_H -#define QGAMEPADBACKEND_H +#ifndef QGAMEPADBACKEND_P_H +#define QGAMEPADBACKEND_P_H // // W A R N I N G @@ -102,6 +102,7 @@ Q_SIGNALS: void axisConfigured(int deviceId, QGamepadManager::GamepadAxis axis); void configurationCanceled(int deviceId); void gamepadAdded(int deviceId); + void gamepadNamed(int deviceId, const QString &name); void gamepadRemoved(int deviceId); void gamepadAxisMoved(int deviceId, QGamepadManager::GamepadAxis axis, double value); void gamepadButtonPressed(int deviceId, QGamepadManager::GamepadButton button, double value); @@ -113,4 +114,4 @@ protected: QT_END_NAMESPACE -#endif // QGAMEPADBACKEND_H +#endif // QGAMEPADBACKEND_P_H diff --git a/src/gamepad/qgamepadbackendplugin_p.h b/src/gamepad/qgamepadbackendplugin_p.h index 19f53c8..158cec1 100644 --- a/src/gamepad/qgamepadbackendplugin_p.h +++ b/src/gamepad/qgamepadbackendplugin_p.h @@ -34,8 +34,8 @@ ** ****************************************************************************/ -#ifndef QGAMEPADBACKENDPLUGIN_H -#define QGAMEPADBACKENDPLUGIN_H +#ifndef QGAMEPADBACKENDPLUGIN_P_H +#define QGAMEPADBACKENDPLUGIN_P_H // // W A R N I N G @@ -75,4 +75,4 @@ public slots: QT_END_NAMESPACE -#endif // QGAMEPADBACKENDPLUGIN_H +#endif // QGAMEPADBACKENDPLUGIN_P_H diff --git a/src/gamepad/qgamepadmanager.cpp b/src/gamepad/qgamepadmanager.cpp index 32d7642..4c86e62 100644 --- a/src/gamepad/qgamepadmanager.cpp +++ b/src/gamepad/qgamepadmanager.cpp @@ -60,10 +60,11 @@ public: void loadBackend(); QGamepadBackend *gamepadBackend; - QSet<int> connectedGamepads; + QMap<int, QString> connectedGamepads; //private slots void _q_forwardGamepadConnected(int deviceId); + void _q_forwardGamepadNameChanged(int deviceId, const QString &name); void _q_forwardGamepadDisconnected(int deviceId); void _q_forwardGamepadAxisEvent(int deviceId, QGamepadManager::GamepadAxis axis, double value); void _q_forwardGamepadButtonPressEvent(int deviceId, QGamepadManager::GamepadButton button, double value); @@ -73,11 +74,18 @@ public: void QGamepadManagerPrivate::_q_forwardGamepadConnected(int deviceId) { Q_Q(QGamepadManager); - connectedGamepads.insert(deviceId); + connectedGamepads.insert(deviceId, QString()); emit q->gamepadConnected(deviceId); emit q->connectedGamepadsChanged(); } +void QGamepadManagerPrivate::_q_forwardGamepadNameChanged(int deviceId, const QString &name) +{ + Q_Q(QGamepadManager); + connectedGamepads.insert(deviceId, name); + emit q->gamepadNameChanged(deviceId, name); +} + void QGamepadManagerPrivate::_q_forwardGamepadDisconnected(int deviceId) { Q_Q(QGamepadManager); @@ -148,6 +156,7 @@ QGamepadManager::QGamepadManager() : qRegisterMetaType<QGamepadManager::GamepadAxis>("QGamepadManager::GamepadAxis"); connect(d->gamepadBackend, SIGNAL(gamepadAdded(int)), this, SLOT(_q_forwardGamepadConnected(int))); + connect(d->gamepadBackend, SIGNAL(gamepadNamed(int, QString)), this, SLOT(_q_forwardGamepadNameChanged(int, QString))); connect(d->gamepadBackend, SIGNAL(gamepadRemoved(int)), this, SLOT(_q_forwardGamepadDisconnected(int))); connect(d->gamepadBackend, SIGNAL(gamepadAxisMoved(int,QGamepadManager::GamepadAxis,double)), this, SLOT(_q_forwardGamepadAxisEvent(int,QGamepadManager::GamepadAxis,double))); connect(d->gamepadBackend, SIGNAL(gamepadButtonPressed(int,QGamepadManager::GamepadButton,double)), this, SLOT(_q_forwardGamepadButtonPressEvent(int,QGamepadManager::GamepadButton,double))); @@ -192,13 +201,25 @@ bool QGamepadManager::isGamepadConnected(int deviceId) const } /*! + Returns the name of the gamepad identified by \a deviceId. + If \a deviceId does not identify a connected gamepad, returns an empty string. + + \since 5.11 +*/ +QString QGamepadManager::gamepadName(int deviceId) const +{ + Q_D(const QGamepadManager); + return d->connectedGamepads.value(deviceId); +} + +/*! Returns a QList containing the \l {QGamepad::}{deviceId} values of the connected gamepads. */ const QList<int> QGamepadManager::connectedGamepads() const { Q_D(const QGamepadManager); - return d->connectedGamepads.toList(); + return d->connectedGamepads.keys(); } /*! diff --git a/src/gamepad/qgamepadmanager.h b/src/gamepad/qgamepadmanager.h index 20fda67..56b6e6f 100644 --- a/src/gamepad/qgamepadmanager.h +++ b/src/gamepad/qgamepadmanager.h @@ -34,11 +34,11 @@ ** ****************************************************************************/ -#ifndef JOYSTICKMANAGER_H -#define JOYSTICKMANAGER_H +#ifndef QGAMEPADMANAGER_H +#define QGAMEPADMANAGER_H #include <QtCore/QObject> -#include <QtCore/QSet> +#include <QtCore/QMap> #include <QtGamepad/qtgamepadglobal.h> QT_BEGIN_NAMESPACE @@ -90,6 +90,7 @@ public: static QGamepadManager* instance(); bool isGamepadConnected(int deviceId) const; + QString gamepadName(int deviceId) const; const QList<int> connectedGamepads() const; public Q_SLOTS: @@ -103,6 +104,7 @@ public Q_SLOTS: Q_SIGNALS: void connectedGamepadsChanged(); void gamepadConnected(int deviceId); + void gamepadNameChanged(int deviceId, const QString &name); void gamepadDisconnected(int deviceId); void gamepadAxisEvent(int deviceId, QGamepadManager::GamepadAxis axis, double value); void gamepadButtonPressEvent(int deviceId, QGamepadManager::GamepadButton button, double value); @@ -118,6 +120,7 @@ private: Q_DECLARE_PRIVATE(QGamepadManager) Q_DISABLE_COPY(QGamepadManager) Q_PRIVATE_SLOT(d_func(), void _q_forwardGamepadConnected(int)) + Q_PRIVATE_SLOT(d_func(), void _q_forwardGamepadNameChanged(int, const QString&)) Q_PRIVATE_SLOT(d_func(), void _q_forwardGamepadDisconnected(int)) Q_PRIVATE_SLOT(d_func(), void _q_forwardGamepadAxisEvent(int, QGamepadManager::GamepadAxis, double)) Q_PRIVATE_SLOT(d_func(), void _q_forwardGamepadButtonPressEvent(int, QGamepadManager::GamepadButton, double)) @@ -129,4 +132,4 @@ QT_END_NAMESPACE Q_DECLARE_METATYPE(QGamepadManager::GamepadButton) Q_DECLARE_METATYPE(QGamepadManager::GamepadAxis) -#endif // JOYSTICKMANAGER_H +#endif // QGAMEPADMANAGER_H diff --git a/src/plugins/gamepads/android/jar/bundledjar.pro b/src/plugins/gamepads/android/jar/bundledjar.pro deleted file mode 100644 index 65af1bb..0000000 --- a/src/plugins/gamepads/android/jar/bundledjar.pro +++ /dev/null @@ -1,3 +0,0 @@ -TARGET = QtAndroidGamepad-bundled -CONFIG += bundled_jar_file -include(jar.pri) diff --git a/src/plugins/gamepads/android/jar/distributedjar.pro b/src/plugins/gamepads/android/jar/distributedjar.pro deleted file mode 100644 index d34c90c..0000000 --- a/src/plugins/gamepads/android/jar/distributedjar.pro +++ /dev/null @@ -1,2 +0,0 @@ -TARGET = QtAndroidGamepad -include(jar.pri) diff --git a/src/plugins/gamepads/android/jar/jar.pri b/src/plugins/gamepads/android/jar/jar.pri deleted file mode 100644 index 13d36ac..0000000 --- a/src/plugins/gamepads/android/jar/jar.pri +++ /dev/null @@ -1,16 +0,0 @@ -load(qt_build_paths) -CONFIG += java - -DESTDIR = $$MODULE_BASE_OUTDIR/jar - -API_VERSION = android-16 - -JAVACLASSPATH += $$PWD/src - -JAVASOURCES += $$PWD/src/org/qtproject/qt5/android/gamepad/QtGamepad.java - -# install -target.path = $$[QT_INSTALL_PREFIX]/jar -INSTALLS += target - -OTHER_FILES += $$JAVASOURCES diff --git a/src/plugins/gamepads/android/jar/jar.pro b/src/plugins/gamepads/android/jar/jar.pro index 923e757..947a887 100644 --- a/src/plugins/gamepads/android/jar/jar.pro +++ b/src/plugins/gamepads/android/jar/jar.pro @@ -1,2 +1,18 @@ -TEMPLATE=subdirs -SUBDIRS += distributedjar.pro bundledjar.pro +TARGET = QtAndroidGamepad + +load(qt_build_paths) +CONFIG += java + +DESTDIR = $$MODULE_BASE_OUTDIR/jar + +API_VERSION = android-16 + +JAVACLASSPATH += $$PWD/src + +JAVASOURCES += $$PWD/src/org/qtproject/qt5/android/gamepad/QtGamepad.java + +# install +target.path = $$[QT_INSTALL_PREFIX]/jar +INSTALLS += target + +OTHER_FILES += $$JAVASOURCES diff --git a/src/plugins/gamepads/android/src/qandroidgamepadbackend_p.h b/src/plugins/gamepads/android/src/qandroidgamepadbackend_p.h index fc96c9b..b54f569 100644 --- a/src/plugins/gamepads/android/src/qandroidgamepadbackend_p.h +++ b/src/plugins/gamepads/android/src/qandroidgamepadbackend_p.h @@ -34,8 +34,8 @@ ** ****************************************************************************/ -#ifndef QSDLGAMEPADCONTROLLER_H -#define QSDLGAMEPADCONTROLLER_H +#ifndef QANDROIDGAMEPADBACKEND_P_H +#define QANDROIDGAMEPADBACKEND_P_H #include <QtCore/QHash> #include <QtCore/QMutex> @@ -132,4 +132,4 @@ private: QT_END_NAMESPACE -#endif // QSDLGAMEPADCONTROLLER_H +#endif // QANDROIDGAMEPADBACKEND_P_H diff --git a/src/plugins/gamepads/darwin/qdarwingamepadbackend.mm b/src/plugins/gamepads/darwin/qdarwingamepadbackend.mm index a1c95ae..1298c00 100644 --- a/src/plugins/gamepads/darwin/qdarwingamepadbackend.mm +++ b/src/plugins/gamepads/darwin/qdarwingamepadbackend.mm @@ -105,11 +105,8 @@ break; } } -#if QT_OSX_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_11) || QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_9_0) || defined(Q_OS_TVOS) + controller.playerIndex = GCControllerPlayerIndex(index); -#else - controller.playerIndex = index; -#endif QMetaObject::invokeMethod(backend, "darwinGamepadAdded", Qt::AutoConnection, Q_ARG(int, index)); @@ -503,7 +500,7 @@ QT_BEGIN_NAMESPACE QDarwinGamepadBackend::QDarwinGamepadBackend(QObject *parent) : QGamepadBackend(parent) - , m_darwinGamepadManager(Q_NULLPTR) + , m_darwinGamepadManager(nullptr) , m_isMonitoringActive(false) { m_darwinGamepadManager = [[QT_MANGLE_NAMESPACE(DarwinGamepadManager) alloc] initWithBackend:this]; diff --git a/src/plugins/gamepads/darwin/qdarwingamepadbackend_p.h b/src/plugins/gamepads/darwin/qdarwingamepadbackend_p.h index 8b21a15..326ccaf 100644 --- a/src/plugins/gamepads/darwin/qdarwingamepadbackend_p.h +++ b/src/plugins/gamepads/darwin/qdarwingamepadbackend_p.h @@ -34,8 +34,8 @@ ** ****************************************************************************/ -#ifndef QDARWINGAMEPADCONTROLLER_H -#define QDARWINGAMEPADCONTROLLER_H +#ifndef QDARWINGAMEPADBACKEND_P_H +#define QDARWINGAMEPADBACKEND_P_H #include <QtCore/QTimer> #include <QtCore/QMap> @@ -74,4 +74,4 @@ private: QT_END_NAMESPACE -#endif // QDARWINGAMEPADCONTROLLER_H +#endif // QDARWINGAMEPADBACKEND_P_H diff --git a/src/plugins/gamepads/evdev/qevdevgamepadbackend.cpp b/src/plugins/gamepads/evdev/qevdevgamepadbackend.cpp index 7fc8466..f0e7fab 100644 --- a/src/plugins/gamepads/evdev/qevdevgamepadbackend.cpp +++ b/src/plugins/gamepads/evdev/qevdevgamepadbackend.cpp @@ -331,6 +331,13 @@ bool QEvdevGamepadDevice::openDevice(const QByteArray &dev) } emit m_backend->gamepadAdded(m_productId); + + // same as libevdev::libevdev_set_fd() in libevdev.c + char buffer[256]; + memset(buffer, 0, sizeof(buffer)); + if (ioctl(m_fd, EVIOCGNAME(sizeof(buffer) - 1), buffer) >= 0) + emit m_backend->gamepadNamed(m_productId, QString::fromUtf8(buffer)); + } else { QT_CLOSE(m_fd); m_fd = -1; diff --git a/src/plugins/gamepads/evdev/qevdevgamepadbackend_p.h b/src/plugins/gamepads/evdev/qevdevgamepadbackend_p.h index 68e011c..a4b4919 100644 --- a/src/plugins/gamepads/evdev/qevdevgamepadbackend_p.h +++ b/src/plugins/gamepads/evdev/qevdevgamepadbackend_p.h @@ -34,8 +34,8 @@ ** ****************************************************************************/ -#ifndef QEVDEVGAMEPADCONTROLLER_H -#define QEVDEVGAMEPADCONTROLLER_H +#ifndef QEVDEVGAMEPADBACKEND_P_H +#define QEVDEVGAMEPADBACKEND_P_H #include <QtGamepad/QGamepadManager> #include <QtGamepad/private/qgamepadbackend_p.h> @@ -135,4 +135,4 @@ private: QT_END_NAMESPACE -#endif // QEVDEVGAMEPADCONTROLLER_H +#endif // QEVDEVGAMEPADBACKEND_P_H diff --git a/src/plugins/gamepads/sdl2/qsdlgamepadbackend.cpp b/src/plugins/gamepads/sdl2/qsdlgamepadbackend.cpp index 1ffba30..6a7cee6 100644 --- a/src/plugins/gamepads/sdl2/qsdlgamepadbackend.cpp +++ b/src/plugins/gamepads/sdl2/qsdlgamepadbackend.cpp @@ -191,10 +191,19 @@ void QSdlGamepadBackend::addController(int index) SDL_GameController *controller = SDL_GameControllerOpen(index); if (controller) { m_indexForController.insert(index, controller); - int instanceID = SDL_JoystickInstanceID(SDL_GameControllerGetJoystick(controller)); + + SDL_Joystick *joystick = SDL_GameControllerGetJoystick(controller); + + int instanceID = SDL_JoystickInstanceID(joystick); m_instanceIdForIndex.insert(instanceID, index); + + const char *name = SDL_JoystickName(joystick); + //qDebug() << "Controller " << index << " added with instanceId: " << instanceID; emit gamepadAdded(index); + + if (name) + emit gamepadNamed(index, QString::fromUtf8(name)); } } diff --git a/src/plugins/gamepads/sdl2/qsdlgamepadbackend_p.h b/src/plugins/gamepads/sdl2/qsdlgamepadbackend_p.h index daff498..dfd7176 100644 --- a/src/plugins/gamepads/sdl2/qsdlgamepadbackend_p.h +++ b/src/plugins/gamepads/sdl2/qsdlgamepadbackend_p.h @@ -34,8 +34,8 @@ ** ****************************************************************************/ -#ifndef QSDLGAMEPADCONTROLLER_H -#define QSDLGAMEPADCONTROLLER_H +#ifndef QSDLGAMEPADBACKEND_P_H +#define QSDLGAMEPADBACKEND_P_H #include <QtCore/QTimer> #include <QtCore/QMap> @@ -71,4 +71,4 @@ private: QT_END_NAMESPACE -#endif // QSDLGAMEPADCONTROLLER_H +#endif // QSDLGAMEPADBACKEND_P_H diff --git a/src/plugins/gamepads/xinput/qxinputgamepadbackend_p.h b/src/plugins/gamepads/xinput/qxinputgamepadbackend_p.h index b575ca1..28f5b23 100644 --- a/src/plugins/gamepads/xinput/qxinputgamepadbackend_p.h +++ b/src/plugins/gamepads/xinput/qxinputgamepadbackend_p.h @@ -33,8 +33,8 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ -#ifndef QXINPUTGAMEPADCONTROLLER_H -#define QXINPUTGAMEPADCONTROLLER_H +#ifndef QXINPUTGAMEPADBACKEND_P_H +#define QXINPUTGAMEPADBACKEND_P_H #include <QtGamepad/QGamepadManager> #include <QtGamepad/private/qgamepadbackend_p.h> @@ -60,4 +60,4 @@ private: QT_END_NAMESPACE -#endif // QXINPUTGAMEPADCONTROLLER_H +#endif // QXINPUTGAMEPADBACKEND_P_H |