@@ -25,17 +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 <unity-mir/qmirserver.h>
32−#include <unity-mir/qmirserverapplication.h>
35#include "paths.h"
33#include "paths.h"
36#include "MouseTouchAdaptor.h"
34#include "MouseTouchAdaptor.h"
37#include "ApplicationArguments.h"
35#include "ApplicationArguments.h"
37+#include <unity-mir/qmirserver.h>
39namespace {
39namespace {
41void prependImportPaths(QQmlEngine *engine, const QStringList &paths)
41void prependImportPaths(QQmlEngine *engine, const QStringList &paths)
@@ -76,7 +76,7 @@ void resolveIconTheme() {
77} // namespace {
77} // namespace {
79−int startShell(int argc, const char** argv, ShellServerConfiguration* server)
79+int startShell(int argc, const char** argv, void* server)
81 /* Workaround Qt platform integration plugin not advertising itself
81 /* Workaround Qt platform integration plugin not advertising itself
82 as having the following capabilities:
82 as having the following capabilities:
@@ -91,7 +91,17 @@ int startShell(int argc, const char** argv, ShellServerConfiguration* server)
91 QGuiApplication::setApplicationName("Unity 8");
91 QGuiApplication::setApplicationName("Unity 8");
92 QGuiApplication *application;
92 QGuiApplication *application;
93 if (isUbuntuMirServer) {
93 if (isUbuntuMirServer) {
94+ QLibrary unityMir("/usr/lib/arm-linux-gnueabihf/libunity-mir.so.1.0.0");
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";
94− application = new QMirServerApplication(argc, (char**)argv, server);
104+ application = createQMirServerApplication(argc, argv, server);
96 application = new QGuiApplication(argc, (char**)argv);
106 application = new QGuiApplication(argc, (char**)argv);
@@ -179,8 +189,35 @@ int main(int argc, const char *argv[])
179 // For ubuntumirserver/ubuntumirclient
189 // For ubuntumirserver/ubuntumirclient
180 if (qgetenv("QT_QPA_PLATFORM").startsWith("ubuntumir")) {
190 if (qgetenv("QT_QPA_PLATFORM").startsWith("ubuntumir")) {
181 setenv("QT_QPA_PLATFORM", "ubuntumirserver", 1);
191 setenv("QT_QPA_PLATFORM", "ubuntumirserver", 1);
193+ // if we use unity-mir directly, we link straight to mirserver, which exports
194+ // the same symbols as qtubuntu, so if running on SF, the linker finds the mir
195+ // symbols first and uses them! Crash!
196+ // load the triangle library
197+ QLibrary unityMir("/usr/lib/arm-linux-gnueabihf/libunity-mir.so.1.0.0");
199+ if (!unityMir.isLoaded()) {
200+ qDebug() << "Library unity-mir not found/loaded";
204+ typedef QMirServer* (*createServer_t)(int, const char **);
205+ createServer_t createQMirServer = (createServer_t) unityMir.resolve("createQMirServer");
206+ if (!createQMirServer) {
207+ qDebug() << "unable to resolve symbol: createQMirServer";
182− QMirServer mirServer(argc, argv);
211+ QMirServer* mirServer = createQMirServer(argc, argv);
213+ typedef int (*runWithClient_t)(QMirServer*, std::function<int(int, const char**, void*)>);
214+ runWithClient_t runWithClient = (runWithClient_t) unityMir.resolve("runQMirServerWithClient");
215+ if (!runWithClient) {
216+ qDebug() << "unable to resolve symbol: runWithClient";
183− return mirServer.runWithClient(startShell);
220+ return runWithClient(mirServer, startShell);
185 return startShell(argc, argv, nullptr);
222 return startShell(argc, argv, nullptr);