aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAndrea Odetti <mariofutire@gmail.com>2017-10-03 18:04:42 +0100
committerAndrea Odetti <mariofutire@gmail.com>2017-10-06 18:23:20 +0000
commit0cea22b644881aaa3edb68267153e334b34d23f7 (patch)
tree18cd7f59993bf7bff9b987356a4a4beb55cbf4f5 /src
parente673d453e7431dc9af5be7394c3cc3cd9da3a9f7 (diff)
Propagate the gamepad name from the backend to QGamepad
Added signals and slots to forward the name to QGamepad. Previously the property name and signal nameChanged in QGamepad were never used. Now the plumbing is done and the 2 linux backends (evdev and SDL2) forward the name. Change-Id: I97261769524ddb23a31789e362e6de7bb30694f3 Reviewed-by: Andy Nichols <andy.nichols@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/gamepad/qgamepad.cpp22
-rw-r--r--src/gamepad/qgamepad.h1
-rw-r--r--src/gamepad/qgamepadbackend_p.h1
-rw-r--r--src/gamepad/qgamepadmanager.cpp27
-rw-r--r--src/gamepad/qgamepadmanager.h5
-rw-r--r--src/plugins/gamepads/evdev/qevdevgamepadbackend.cpp7
-rw-r--r--src/plugins/gamepads/sdl2/qsdlgamepadbackend.cpp5
7 files changed, 64 insertions, 4 deletions
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..a5e4ab3 100644
--- a/src/gamepad/qgamepadbackend_p.h
+++ b/src/gamepad/qgamepadbackend_p.h
@@ -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);
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..11f8589 100644
--- a/src/gamepad/qgamepadmanager.h
+++ b/src/gamepad/qgamepadmanager.h
@@ -38,7 +38,7 @@
#define JOYSTICKMANAGER_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))
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/sdl2/qsdlgamepadbackend.cpp b/src/plugins/gamepads/sdl2/qsdlgamepadbackend.cpp
index 1ffba30..b990868 100644
--- a/src/plugins/gamepads/sdl2/qsdlgamepadbackend.cpp
+++ b/src/plugins/gamepads/sdl2/qsdlgamepadbackend.cpp
@@ -193,8 +193,13 @@ void QSdlGamepadBackend::addController(int index)
m_indexForController.insert(index, controller);
int instanceID = SDL_JoystickInstanceID(SDL_GameControllerGetJoystick(controller));
m_instanceIdForIndex.insert(instanceID, index);
+ const char *name = SDL_GameControllerName(controller);
+
//qDebug() << "Controller " << index << " added with instanceId: " << instanceID;
emit gamepadAdded(index);
+
+ if (name)
+ emit gamepadNamed(index, QString::fromUtf8(name));
}
}