@@ -25,13 +25,17 @@
25#include <QtQml/QQmlContext>
25#include <QtQml/QQmlContext>
26#include <qpa/qplatformnativeinterface.h>
26#include <qpa/qplatformnativeinterface.h>
27#include <QLibrary>
27#include <QLibrary>
28#include <libintl.h>
29#include <libintl.h>
31#include "paths.h"
33#include "paths.h"
32#include "MouseTouchAdaptor.h"
34#include "MouseTouchAdaptor.h"
33#include "ApplicationArguments.h"
35#include "ApplicationArguments.h"
37+#include <unity-mir/qmirserver.h>
35namespace {
39namespace {
37void prependImportPaths(QQmlEngine *engine, const QStringList &paths)
41void prependImportPaths(QQmlEngine *engine, const QStringList &paths)
@@ -72,7 +76,7 @@ void resolveIconTheme() {
73} // namespace {
77} // namespace {
75−int main(int argc, char** argv)
79+int startShell(int argc, const char** argv, void* server)
77 /* Workaround Qt platform integration plugin not advertising itself
81 /* Workaround Qt platform integration plugin not advertising itself
78 as having the following capabilities:
82 as having the following capabilities:
@@ -82,12 +86,29 @@ int main(int argc, char** argv)
82 setenv("QML_FORCE_THREADED_RENDERER", "1", 1);
86 setenv("QML_FORCE_THREADED_RENDERER", "1", 1);
83 setenv("QML_FIXED_ANIMATION_STEP", "1", 1);
87 setenv("QML_FIXED_ANIMATION_STEP", "1", 1);
89+ const bool isUbuntuMirServer = qgetenv("QT_QPA_PLATFORM") == "ubuntumirserver";
85 QGuiApplication::setApplicationName("Unity 8");
91 QGuiApplication::setApplicationName("Unity 8");
86− QGuiApplication application(argc, argv);
92+ QGuiApplication *application;
93+ if (isUbuntuMirServer) {
94+ QLibrary unityMir("unity-mir");
97+ typedef QGuiApplication* (*createServerApplication_t)(int&, const char **, void*);
98+ createServerApplication_t createQMirServerApplication = (createServerApplication_t) unityMir.resolve("createQMirServerApplication");
99+ if (!createQMirServerApplication) {
100+ qDebug() << "unable to resolve symbol: createQMirServerApplication";
104+ application = createQMirServerApplication(argc, argv, server);
106+ application = new QGuiApplication(argc, (char**)argv);
88 resolveIconTheme();
109 resolveIconTheme();
90− QStringList args = application.arguments();
111+ QStringList args = application->arguments();
91 ApplicationArguments qmlArgs(args);
112 ApplicationArguments qmlArgs(args);
93 // The testability driver is only loaded by QApplication but not by QGuiApplication.
114 // The testability driver is only loaded by QApplication but not by QGuiApplication.
@@ -124,7 +145,7 @@ int main(int argc, char** argv)
124 if (args.contains(QLatin1String("-mousetouch"))) {
145 if (args.contains(QLatin1String("-mousetouch"))) {
125 mouseTouchAdaptor = new MouseTouchAdaptor;
146 mouseTouchAdaptor = new MouseTouchAdaptor;
126 mouseTouchAdaptor->setTargetWindow(view);
147 mouseTouchAdaptor->setTargetWindow(view);
127− application.installNativeEventFilter(mouseTouchAdaptor);
148+ application->installNativeEventFilter(mouseTouchAdaptor);
130 QPlatformNativeInterface* nativeInterface = QGuiApplication::platformNativeInterface();
151 QPlatformNativeInterface* nativeInterface = QGuiApplication::platformNativeInterface();
@@ -139,18 +160,64 @@ int main(int argc, char** argv)
139 QUrl source("Shell.qml");
160 QUrl source("Shell.qml");
140 prependImportPaths(view->engine(), ::overrideImportPaths());
161 prependImportPaths(view->engine(), ::overrideImportPaths());
141 appendImportPaths(view->engine(), ::fallbackImportPaths());
162 appendImportPaths(view->engine(), ::fallbackImportPaths());
164+ QStringList importPath = view->engine()->importPathList().filter("qt5/imports");
165+ if (isUbuntuMirServer) {
166+ importPath.first().append("/Unity-Mir");
167+ view->engine()->addImportPath(importPath.first());
142 view->setSource(source);
170 view->setSource(source);
143 view->setColor("transparent");
171 view->setColor("transparent");
145− if (qgetenv("QT_QPA_PLATFORM") == "ubuntu" || args.contains(QLatin1String("-fullscreen"))) {
173+ if (qgetenv("QT_QPA_PLATFORM") == "ubuntu" || isUbuntuMirServer || args.contains(QLatin1String("-fullscreen"))) {
146 view->showFullScreen();
174 view->showFullScreen();
148 view->show();
176 view->show();
151− int result = application.exec();
179+ int result = application->exec();
153 delete mouseTouchAdaptor;
181 delete mouseTouchAdaptor;
155 return result;
184 return result;
187+int main(int argc, const char *argv[])
189+ // For ubuntumirserver/ubuntumirclient
190+ if (qgetenv("QT_QPA_PLATFORM").startsWith("ubuntumir")) {
191+ setenv("QT_QPA_PLATFORM", "ubuntumirserver", 1);
193+ // If we use unity-mir directly, we automatically link to the Mir-server
194+ // platform-api bindings, which result in unexpected behaviour when
195+ // running the non-Mir scenario.
196+ QLibrary unityMir("unity-mir");
198+ if (!unityMir.isLoaded()) {
199+ qDebug() << "Library unity-mir not found/loaded";
203+ typedef QMirServer* (*createServer_t)(int, const char **);
204+ createServer_t createQMirServer = (createServer_t) unityMir.resolve("createQMirServer");
205+ if (!createQMirServer) {
206+ qDebug() << "unable to resolve symbol: createQMirServer";
210+ QMirServer* mirServer = createQMirServer(argc, argv);
212+ typedef int (*runWithClient_t)(QMirServer*, std::function<int(int, const char**, void*)>);
213+ runWithClient_t runWithClient = (runWithClient_t) unityMir.resolve("runQMirServerWithClient");
214+ if (!runWithClient) {
215+ qDebug() << "unable to resolve symbol: runWithClient";
219+ return runWithClient(mirServer, startShell);
221+ return startShell(argc, argv, nullptr);