on xenial help sign in
Fix ownership of QML singletons
23ca9d6Daniel d'Andrada
tests/mocks/Unity/Application/ApplicationInfo.cpp+6−1
@@ -80,7 +80,12 @@ void ApplicationInfo::createSurface()
80 surfaceName.append(QString(" %1").arg(m_surfaceList.count()+1));
80 surfaceName.append(QString(" %1").arg(m_surfaceList.count()+1));
81 }
81 }
82
82
83+ auto surfaceManager = SurfaceManager::instance();
84+ if (!surfaceManager) {
85+ return;
86+ }
87+
83− auto surface = SurfaceManager::singleton()->createSurface(surfaceName,
88+ auto surface = surfaceManager->createSurface(surfaceName,
84 Mir::NormalType,
89 Mir::NormalType,
85 fullscreen() ? Mir::FullscreenState : Mir::MaximizedState,
90 fullscreen() ? Mir::FullscreenState : Mir::MaximizedState,
86 m_screenshotFileName);
91 m_screenshotFileName);
tests/mocks/Unity/Application/ApplicationManager.cpp+7−2
@@ -474,12 +474,17 @@ void ApplicationManager::updateFocusedApplication()
474 ApplicationInfo *focusedApplication = nullptr;
474 ApplicationInfo *focusedApplication = nullptr;
475 ApplicationInfo *previouslyFocusedApplication = nullptr;
475 ApplicationInfo *previouslyFocusedApplication = nullptr;
476
476
477+ auto controller = MirFocusController::instance();
478+ if (!controller) {
479+ return;
480+ }
481+
477− MirSurface *surface = static_cast<MirSurface*>(MirFocusController::instance()->focusedSurface());
482+ MirSurface *surface = static_cast<MirSurface*>(controller->focusedSurface());
478 if (surface) {
483 if (surface) {
479 focusedApplication = findApplication(surface);
484 focusedApplication = findApplication(surface);
480 }
485 }
481
486
482− surface = static_cast<MirSurface*>(MirFocusController::instance()->previouslyFocusedSurface());
487+ surface = static_cast<MirSurface*>(controller->previouslyFocusedSurface());
483 if (surface) {
488 if (surface) {
484 previouslyFocusedApplication = findApplication(surface);
489 previouslyFocusedApplication = findApplication(surface);
485 }
490 }
tests/mocks/Unity/Application/MirSurface.cpp+23−8
@@ -60,9 +60,8 @@ MirSurface::MirSurface(const QString& name,
60 Mir::Type type,
60 Mir::Type type,
61 Mir::State state,
61 Mir::State state,
62 const QUrl& screenshot,
62 const QUrl& screenshot,
63− const QUrl &qmlFilePath,
63+ const QUrl &qmlFilePath)
64− QObject *parent)
65− : unity::shell::application::MirSurfaceInterface(parent)
64+ : unity::shell::application::MirSurfaceInterface(nullptr)
66 , m_name(name)
65 , m_name(name)
67 , m_type(type)
66 , m_type(type)
68 , m_state(state)
67 , m_state(state)
@@ -95,7 +94,7 @@ MirSurface::~MirSurface()
95 DEBUG_MSG("");
94 DEBUG_MSG("");
96
95
97 auto controller = MirFocusController::instance();
96 auto controller = MirFocusController::instance();
98− if (controller->focusedSurface() == this) {
97+ if (controller && controller->focusedSurface() == this) {
99 controller->clear();
98 controller->clear();
100 }
99 }
101}
100}
@@ -436,7 +435,12 @@ void MirSurface::requestFocus()
436void MirSurface::setFocused(bool value)
435void MirSurface::setFocused(bool value)
437{
436{
438 DEBUG_MSG(value);
437 DEBUG_MSG(value);
438+
439 auto controller = MirFocusController::instance();
439 auto controller = MirFocusController::instance();
440+ if (!controller) {
441+ return;
442+ }
443+
440 if (value) {
444 if (value) {
441 controller->setFocusedSurface(this);
445 controller->setFocusedSurface(this);
442 } else if (controller->focusedSurface() == this) {
446 } else if (controller->focusedSurface() == this) {
@@ -446,7 +450,9 @@ void MirSurface::setFocused(bool value)
446
450
447bool MirSurface::focused() const
451bool MirSurface::focused() const
448{
452{
449− return MirFocusController::instance()->focusedSurface() == this;
453+ auto controller = MirFocusController::instance();
454+
455+ return controller ? controller->focusedSurface() == this : false;
450}
456}
451
457
452#if MIRSURFACE_DEBUG
458#if MIRSURFACE_DEBUG
@@ -479,12 +485,21 @@ void MirFocusController::setFocusedSurface(MirSurfaceInterface *surface)
479
485
480MirFocusController* MirFocusController::instance()
486MirFocusController* MirFocusController::instance()
481{
487{
482− if (!m_instance) {
483− m_instance = new MirFocusController;
484− }
485 return m_instance;
488 return m_instance;
486}
489}
487
490
491+MirFocusController::MirFocusController()
492+{
493+ Q_ASSERT(m_instance == nullptr);
494+ m_instance = this;
495+}
496+
497+MirFocusController::~MirFocusController()
498+{
499+ Q_ASSERT(m_instance == this);
500+ m_instance = nullptr;
501+}
502+
488void MirFocusController::clear()
503void MirFocusController::clear()
489{
504{
490 m_focusedSurface = m_previouslyFocusedSurface = nullptr;
505 m_focusedSurface = m_previouslyFocusedSurface = nullptr;
tests/mocks/Unity/Application/MirSurface.h+3−3
@@ -34,7 +34,8 @@ class MirFocusController : public unity::shell::application::MirFocusControllerI
34{
34{
35 Q_OBJECT
35 Q_OBJECT
36public:
36public:
37− MirFocusController(){}
37+ MirFocusController();
38+ virtual ~MirFocusController();
38 static MirFocusController* instance();
39 static MirFocusController* instance();
39
40
40 void setFocusedSurface(unity::shell::application::MirSurfaceInterface *surface) override;
41 void setFocusedSurface(unity::shell::application::MirSurfaceInterface *surface) override;
@@ -63,8 +64,7 @@ public:
63 Mir::Type type,
64 Mir::Type type,
64 Mir::State state,
65 Mir::State state,
65 const QUrl& screenshot,
66 const QUrl& screenshot,
66− const QUrl &qmlFilePath = QUrl(),
67+ const QUrl &qmlFilePath = QUrl());
67− QObject *parent = nullptr);
68 virtual ~MirSurface();
68 virtual ~MirSurface();
69
69
70 ////
70 ////
tests/mocks/Unity/Application/SurfaceManager.cpp+11−5
@@ -23,11 +23,8 @@
23
23
24SurfaceManager *SurfaceManager::the_surface_manager = nullptr;
24SurfaceManager *SurfaceManager::the_surface_manager = nullptr;
25
25
26−SurfaceManager *SurfaceManager::singleton()
26+SurfaceManager *SurfaceManager::instance()
27{
27{
28− if (!the_surface_manager) {
29− the_surface_manager = new SurfaceManager();
30− }
31 return the_surface_manager;
28 return the_surface_manager;
32}
29}
33
30
@@ -35,7 +32,10 @@ SurfaceManager::SurfaceManager(QObject *parent) :
35 QObject(parent)
32 QObject(parent)
36 , m_virtualKeyboard(nullptr)
33 , m_virtualKeyboard(nullptr)
37{
34{
35+ Q_ASSERT(the_surface_manager == nullptr);
36+ the_surface_manager = this;
37+
38− m_virtualKeyboard = new VirtualKeyboard(this);
38+ m_virtualKeyboard = new VirtualKeyboard;
39 connect(m_virtualKeyboard, &QObject::destroyed, this, [this](QObject *obj) {
39 connect(m_virtualKeyboard, &QObject::destroyed, this, [this](QObject *obj) {
40 MirSurface* surface = qobject_cast<MirSurface*>(obj);
40 MirSurface* surface = qobject_cast<MirSurface*>(obj);
41 m_virtualKeyboard = nullptr;
41 m_virtualKeyboard = nullptr;
@@ -44,6 +44,12 @@ SurfaceManager::SurfaceManager(QObject *parent) :
44 });
44 });
45}
45}
46
46
47+SurfaceManager::~SurfaceManager()
48+{
49+ Q_ASSERT(the_surface_manager == this);
50+ the_surface_manager = nullptr;
51+}
52+
47MirSurface *SurfaceManager::createSurface(const QString& name,
53MirSurface *SurfaceManager::createSurface(const QString& name,
48 Mir::Type type,
54 Mir::Type type,
49 Mir::State state,
55 Mir::State state,
tests/mocks/Unity/Application/SurfaceManager.h+3−2
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2014-2015 Canonical, Ltd.
2+ * Copyright (C) 2014-2016 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
5 * it under the terms of the GNU General Public License as published by
@@ -37,8 +37,9 @@ class SurfaceManager : public QObject
37
37
38public:
38public:
39 explicit SurfaceManager(QObject *parent = 0);
39 explicit SurfaceManager(QObject *parent = 0);
40+ virtual ~SurfaceManager();
40
41
41− static SurfaceManager *singleton();
42+ static SurfaceManager *instance();
42
43
43 Q_INVOKABLE MirSurface* createSurface(const QString& name,
44 Q_INVOKABLE MirSurface* createSurface(const QString& name,
44 Mir::Type type,
45 Mir::Type type,
tests/mocks/Unity/Application/VirtualKeyboard.cpp+2−3
@@ -22,13 +22,12 @@
22
22
23#include <QDebug>
23#include <QDebug>
24
24
25−VirtualKeyboard::VirtualKeyboard(QObject *parent)
25+VirtualKeyboard::VirtualKeyboard()
26 : MirSurface("input-method",
26 : MirSurface("input-method",
27 Mir::InputMethodType,
27 Mir::InputMethodType,
28 Mir::MinimizedState,
28 Mir::MinimizedState,
29 QUrl("qrc:///Unity/Application/vkb_portrait.png"),
29 QUrl("qrc:///Unity/Application/vkb_portrait.png"),
30− QUrl("qrc:///Unity/Application/VirtualKeyboard.qml"),
30+ QUrl("qrc:///Unity/Application/VirtualKeyboard.qml"))
31− parent)
32{
31{
33}
32}
34
33
tests/mocks/Unity/Application/VirtualKeyboard.h+1−1
@@ -25,7 +25,7 @@ class VirtualKeyboard : public MirSurface
25{
25{
26 Q_OBJECT
26 Q_OBJECT
27public:
27public:
28− explicit VirtualKeyboard(QObject *parent = nullptr);
28+ explicit VirtualKeyboard();
29 ~VirtualKeyboard();
29 ~VirtualKeyboard();
30};
30};
31
31
tests/mocks/Unity/Application/plugin.cpp+4−2
@@ -36,7 +36,8 @@ static QObject* applicationManagerSingleton(QQmlEngine* engine, QJSEngine* scrip
36static QObject* surfaceManagerSingleton(QQmlEngine* engine, QJSEngine* scriptEngine) {
36static QObject* surfaceManagerSingleton(QQmlEngine* engine, QJSEngine* scriptEngine) {
37 Q_UNUSED(engine);
37 Q_UNUSED(engine);
38 Q_UNUSED(scriptEngine);
38 Q_UNUSED(scriptEngine);
39− return SurfaceManager::singleton();
39+ // QQmlEngine takes ownership over it (ie, it's deleted on ~QQmlEngine)
40+ return new SurfaceManager;
40}
41}
41
42
42static QObject* ubuntuKeyboardInfoSingleton(QQmlEngine*, QJSEngine*) {
43static QObject* ubuntuKeyboardInfoSingleton(QQmlEngine*, QJSEngine*) {
@@ -45,7 +46,8 @@ static QObject* ubuntuKeyboardInfoSingleton(QQmlEngine*, QJSEngine*) {
45
46
46static QObject* mirFocusControllerSingleton(QQmlEngine*, QJSEngine*)
47static QObject* mirFocusControllerSingleton(QQmlEngine*, QJSEngine*)
47{
48{
48− return MirFocusController::instance();
49+ // QQmlEngine takes ownership over it (ie, it's deleted on ~QQmlEngine)
50+ return new MirFocusController;
49}
51}
50
52
51void FakeUnityApplicationQmlPlugin::registerTypes(const char *uri)
53void FakeUnityApplicationQmlPlugin::registerTypes(const char *uri)