on xenial help sign in
fix it up
b4029f1Michael Zanetti
src/DebuggingController.cpp+28−33
@@ -28,11 +28,16 @@
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);
32}
31}
33
32
34void DebuggingController::SetSceneGraphVisualizer(const QString &visualizer)
33void DebuggingController::SetSceneGraphVisualizer(const QString &visualizer)
35{
34{
35+ QByteArray pendingRenderMode;
36+ QStringList supportedRenderModes = {"clip", "overdraw", "changes", "batches"};
37+ if (supportedRenderModes.contains(visualizer)) {
38+ pendingRenderMode = visualizer.toLatin1();
39+ }
40+
36 Q_FOREACH (QWindow *window, QGuiApplication::allWindows()) {
41 Q_FOREACH (QWindow *window, QGuiApplication::allWindows()) {
37 QQuickWindow* qquickWindow = qobject_cast<QQuickWindow*>(window);
42 QQuickWindow* qquickWindow = qobject_cast<QQuickWindow*>(window);
38 if (qquickWindow) {
43 if (qquickWindow) {
@@ -43,10 +48,28 @@ void DebuggingController::SetSceneGraphVisualizer(const QString &visualizer)
43 // So we need to make the scenegraph recheck whether a custom render mode is set.
48 // So we need to make the scenegraph recheck whether a custom render mode is set.
44 // We do this by simply recreating the renderer.
49 // We do this by simply recreating the renderer.
45 QMutexLocker lock(&m_renderModeMutex);
50 QMutexLocker lock(&m_renderModeMutex);
46− m_pendingRenderMode = visualizer;
51+ QMetaObject::Connection conn;
47− qDebug() << "connecting to mapper";
52+ conn = connect(qquickWindow, &QQuickWindow::beforeSynchronizing, this, [this, qquickWindow, pendingRenderMode]() {
48− connect(qquickWindow, SIGNAL(beforeSynchronizing()), &m_mapper, SLOT(map()), Qt::DirectConnection);
53+ qDebug() << "Setting curstom render mode to:" << pendingRenderMode;
54+ QMutexLocker lock(&m_renderModeMutex);
55+ if (!m_mapper.contains(qquickWindow)) {
56+ return;
57+ }
58+ disconnect(m_mapper.take(qquickWindow));
59+
60+ QQuickWindowPrivate *winPriv = QQuickWindowPrivate::get(qquickWindow);
61+ QQuickItemPrivate *contentPriv = QQuickItemPrivate::get(qquickWindow->contentItem());
62+ QSGNode *rootNode = contentPriv->itemNode();
63+ while (rootNode->parent())
64+ rootNode = rootNode->parent();
65+
66+ winPriv->customRenderMode = pendingRenderMode;
67+ delete winPriv->renderer;
68+ winPriv->renderer = winPriv->context->createRenderer();
69+ winPriv->renderer->setRootNode(static_cast<QSGRootNode *>(rootNode));
70+ }, Qt::DirectConnection);
49− m_mapper.setMapping(qquickWindow, qquickWindow);
71+ m_mapper.insert(qquickWindow, conn);
72+
50#else
73#else
51 QQuickWindowPrivate *winPriv = QQuickWindowPrivate::get(qquickWindow);
74 QQuickWindowPrivate *winPriv = QQuickWindowPrivate::get(qquickWindow);
52 winPriv->customRenderMode = visualizer.toLatin1();
75 winPriv->customRenderMode = visualizer.toLatin1();
@@ -56,34 +79,6 @@ void DebuggingController::SetSceneGraphVisualizer(const QString &visualizer)
56 }
79 }
57}
80}
58
81
59−void DebuggingController::applyRenderMode(QObject* sender) {
60− qDebug() << "applyRenderMode called" << sender;
61− QQuickWindow *qquickWindow = dynamic_cast<QQuickWindow*>(sender);
62− qDebug() << "window is" << qquickWindow;
63−
64− QMutexLocker lock(&m_renderModeMutex);
65− disconnect(qquickWindow, SIGNAL(beforeSynchronizing()), &m_mapper, SLOT(map()));
66−
67− qDebug() << "mutex locked";
68−#if QT_VERSION >= QT_VERSION_CHECK(5, 5, 0)
69− QQuickWindowPrivate *winPriv = QQuickWindowPrivate::get(qquickWindow);
70− QQuickItemPrivate *contentPriv = QQuickItemPrivate::get(qquickWindow->contentItem());
71− qDebug() << "winPriv is" << winPriv << "contentPriv is" << contentPriv;
72− QSGNode *rootNode = contentPriv->itemNode();
73− while (rootNode->parent())
74− rootNode = rootNode->parent();
75−
76− qDebug() << "rootnode is" << rootNode;
77− winPriv->customRenderMode = m_pendingRenderMode.toLatin1();
78− delete winPriv->renderer;
79− qDebug() << "renderer deleted";
80− winPriv->renderer = winPriv->context->createRenderer();
81− qDebug() << "new renderer created";
82− winPriv->renderer->setRootNode(static_cast<QSGRootNode *>(rootNode));
83− qDebug() << "setting back old rootNode. done";
84−#endif
85−}
86−
87void DebuggingController::SetSlowAnimations(bool slowAnimations)
82void DebuggingController::SetSlowAnimations(bool slowAnimations)
88{
83{
89 QUnifiedTimer::instance()->setSlowModeEnabled(slowAnimations);
84 QUnifiedTimer::instance()->setSlowModeEnabled(slowAnimations);
src/DebuggingController.h+1−6
@@ -24,7 +24,6 @@
24#include <QQmlExtensionPlugin>
24#include <QQmlExtensionPlugin>
25#include <QQuickWindow>
25#include <QQuickWindow>
26#include <QMutex>
26#include <QMutex>
27−#include <QSignalMapper>
28
27
29#include "unitydbusobject.h"
28#include "unitydbusobject.h"
30
29
@@ -54,12 +53,8 @@ public Q_SLOTS:
54 */
53 */
55 Q_SCRIPTABLE void SetLoggingFilterRules(const QString &filterRules);
54 Q_SCRIPTABLE void SetLoggingFilterRules(const QString &filterRules);
56
55
57−private Q_SLOTS:
58− void applyRenderMode(QObject *sender);
59−
60private:
56private:
61 QMutex m_renderModeMutex;
57 QMutex m_renderModeMutex;
62− QString m_pendingRenderMode;
58+ QHash<QQuickWindow*, QMetaObject::Connection> m_mapper;
63− QSignalMapper m_mapper;
64};
59};
65#endif // DEBUGGINGCONTROLLER_H
60#endif // DEBUGGINGCONTROLLER_H