on xenial help sign in
use QSignalMapper instead of sender()
9fcd9bcMichael Zanetti
src/DebuggingController.cpp+9−6
@@ -28,6 +28,7 @@
28DebuggingController::DebuggingController(QObject *parent):
28DebuggingController::DebuggingController(QObject *parent):
29 UnityDBusObject(QStringLiteral("/com/canonical/Unity8/Debugging"), QStringLiteral("com.canonical.Unity8"), true, parent)
29 UnityDBusObject(QStringLiteral("/com/canonical/Unity8/Debugging"), QStringLiteral("com.canonical.Unity8"), true, parent)
30{
30{
31+ connect(&m_mapper, SIGNAL(mapped(QObject*)), this, SLOT(applyRenderMode(QObject*)), Qt::DirectConnection);
31}
32}
32
33
33void DebuggingController::SetSceneGraphVisualizer(const QString &visualizer)
34void DebuggingController::SetSceneGraphVisualizer(const QString &visualizer)
@@ -43,7 +44,9 @@ void DebuggingController::SetSceneGraphVisualizer(const QString &visualizer)
43 // We do this by simply recreating the renderer.
44 // We do this by simply recreating the renderer.
44 QMutexLocker lock(&m_renderModeMutex);
45 QMutexLocker lock(&m_renderModeMutex);
45 m_pendingRenderMode = visualizer;
46 m_pendingRenderMode = visualizer;
47+ qDebug() << "connecting to mapper";
46− connect(qquickWindow, &QQuickWindow::beforeSynchronizing, this, &DebuggingController::applyRenderMode, Qt::DirectConnection);
48+ connect(qquickWindow, SIGNAL(beforeSynchronizing()), &m_mapper, SLOT(map()), Qt::DirectConnection);
49+ m_mapper.setMapping(qquickWindow, qquickWindow);
47#else
50#else
48 QQuickWindowPrivate *winPriv = QQuickWindowPrivate::get(qquickWindow);
51 QQuickWindowPrivate *winPriv = QQuickWindowPrivate::get(qquickWindow);
49 winPriv->customRenderMode = visualizer.toLatin1();
52 winPriv->customRenderMode = visualizer.toLatin1();
@@ -53,13 +56,13 @@ void DebuggingController::SetSceneGraphVisualizer(const QString &visualizer)
53 }
56 }
54}
57}
55
58
56−void DebuggingController::applyRenderMode() {
59+void DebuggingController::applyRenderMode(QObject* sender) {
57− qDebug() << "applyRenderMode called" << sender();
60+ qDebug() << "applyRenderMode called" << sender;
58− QQuickWindow *qquickWindow = dynamic_cast<QQuickWindow*>(sender());
61+ QQuickWindow *qquickWindow = dynamic_cast<QQuickWindow*>(sender);
59− qDebug() << "window is" << qquickWindow << sender() << sender()->metaObject()->className();
62+ qDebug() << "window is" << qquickWindow;
60
63
61 QMutexLocker lock(&m_renderModeMutex);
64 QMutexLocker lock(&m_renderModeMutex);
62− disconnect(qquickWindow, &QQuickWindow::beforeSynchronizing, this, &DebuggingController::applyRenderMode);
65+ disconnect(qquickWindow, SIGNAL(beforeSynchronizing()), &m_mapper, SLOT(map()));
63
66
64 qDebug() << "mutex locked";
67 qDebug() << "mutex locked";
65#if QT_VERSION >= QT_VERSION_CHECK(5, 5, 0)
68#if QT_VERSION >= QT_VERSION_CHECK(5, 5, 0)
src/DebuggingController.h+3−1
@@ -24,6 +24,7 @@
24#include <QQmlExtensionPlugin>
24#include <QQmlExtensionPlugin>
25#include <QQuickWindow>
25#include <QQuickWindow>
26#include <QMutex>
26#include <QMutex>
27+#include <QSignalMapper>
27
28
28#include "unitydbusobject.h"
29#include "unitydbusobject.h"
29
30
@@ -54,10 +55,11 @@ public Q_SLOTS:
54 Q_SCRIPTABLE void SetLoggingFilterRules(const QString &filterRules);
55 Q_SCRIPTABLE void SetLoggingFilterRules(const QString &filterRules);
55
56
56private Q_SLOTS:
57private Q_SLOTS:
57− void applyRenderMode();
58+ void applyRenderMode(QObject *sender);
58
59
59private:
60private:
60 QMutex m_renderModeMutex;
61 QMutex m_renderModeMutex;
61 QString m_pendingRenderMode;
62 QString m_pendingRenderMode;
63+ QSignalMapper m_mapper;
62};
64};
63#endif // DEBUGGINGCONTROLLER_H
65#endif // DEBUGGINGCONTROLLER_H