21 #include <QtQuick/QQuickView>
22 #include <QtGui/QGuiApplication>
23 #include <QtQml/QQmlEngine>
24 #include <QtQml/QQmlContext>
25 #include <qpa/qplatformnativeinterface.h>
34 #include "MouseTouchAdaptor.h"
35 #include "ApplicationArguments.h"
37 #include <unity-mir/qmirserver.h>
40 int startShell(
int argc,
const char** argv,
void* server)
42 const bool isUbuntuMirServer = qgetenv(
"QT_QPA_PLATFORM") ==
"ubuntumirserver";
44 QGuiApplication::setApplicationName(
"Unity 8");
45 QGuiApplication *application;
46 if (isUbuntuMirServer) {
47 QLibrary unityMir(
"unity-mir", 1);
50 typedef QGuiApplication* (*createServerApplication_t)(
int&,
const char **,
void*);
51 createServerApplication_t createQMirServerApplication = (createServerApplication_t) unityMir.resolve(
"createQMirServerApplication");
52 if (!createQMirServerApplication) {
53 qDebug() <<
"unable to resolve symbol: createQMirServerApplication";
57 application = createQMirServerApplication(argc, argv, server);
59 application =
new QGuiApplication(argc, (
char**)argv);
62 QString indicatorProfile = qgetenv(
"UNITY_INDICATOR_PROFILE");
63 if (indicatorProfile.isEmpty()) {
64 indicatorProfile =
"phone";
69 QStringList args = application->arguments();
70 ApplicationArguments qmlArgs(args);
74 if (args.contains(QLatin1String(
"-testability")) || getenv(
"QT_LOAD_TESTABILITY")) {
75 QLibrary testLib(QLatin1String(
"qttestability"));
77 typedef void (*TasInitialize)(void);
78 TasInitialize initFunction = (TasInitialize)testLib.resolve(
"qt_testability_init");
82 qCritical(
"Library qttestability resolve failed!");
85 qCritical(
"Library qttestability load failed!");
89 bindtextdomain(
"unity8", translationDirectory().toUtf8().data());
91 QQuickView* view =
new QQuickView();
92 view->setResizeMode(QQuickView::SizeRootObjectToView);
93 view->setTitle(
"Qml Phone Shell");
94 view->engine()->setBaseUrl(QUrl::fromLocalFile(::qmlDirectory()));
95 view->rootContext()->setContextProperty(
"applicationArguments", &qmlArgs);
96 view->rootContext()->setContextProperty(
"indicatorProfile", indicatorProfile);
97 if (args.contains(QLatin1String(
"-frameless"))) {
98 view->setFlags(Qt::FramelessWindowHint);
103 MouseTouchAdaptor *mouseTouchAdaptor = 0;
104 if (args.contains(QLatin1String(
"-mousetouch"))) {
105 mouseTouchAdaptor =
new MouseTouchAdaptor;
106 application->installNativeEventFilter(mouseTouchAdaptor);
109 QPlatformNativeInterface* nativeInterface = QGuiApplication::platformNativeInterface();
115 nativeInterface->setProperty(
"ubuntuSessionType", 1);
116 view->setProperty(
"role", 2);
118 QUrl source(::qmlDirectory()+
"Shell.qml");
119 prependImportPaths(view->engine(), ::overrideImportPaths());
120 if (!isUbuntuMirServer) {
121 prependImportPaths(view->engine(), ::nonMirImportPaths());
123 appendImportPaths(view->engine(), ::fallbackImportPaths());
125 view->setSource(source);
126 view->setColor(
"transparent");
128 if (qgetenv(
"QT_QPA_PLATFORM") ==
"ubuntu" || isUbuntuMirServer || args.contains(QLatin1String(
"-fullscreen"))) {
129 view->showFullScreen();
134 int result = application->exec();
137 delete mouseTouchAdaptor;
143 int main(
int argc,
const char *argv[])
150 setenv(
"QML_FORCE_THREADED_RENDERER",
"1", 1);
151 setenv(
"QML_FIXED_ANIMATION_STEP",
"1", 1);
154 if (qgetenv(
"QT_QPA_PLATFORM").startsWith(
"ubuntumir")) {
155 setenv(
"QT_QPA_PLATFORM",
"ubuntumirserver", 1);
160 QLibrary unityMir(
"unity-mir", 1);
162 if (!unityMir.isLoaded()) {
163 qDebug() <<
"Library unity-mir not found/loaded";
167 typedef QMirServer* (*createServer_t)(int,
const char **);
168 createServer_t createQMirServer = (createServer_t) unityMir.resolve(
"createQMirServer");
169 if (!createQMirServer) {
170 qDebug() <<
"unable to resolve symbol: createQMirServer";
174 QMirServer* mirServer = createQMirServer(argc, argv);
176 typedef int (*runWithClient_t)(QMirServer*, std::function<int(int, const char**, void*)>);
177 runWithClient_t runWithClient = (runWithClient_t) unityMir.resolve(
"runQMirServerWithClient");
178 if (!runWithClient) {
179 qDebug() <<
"unable to resolve symbol: runWithClient";
183 return runWithClient(mirServer, startShell);
185 if (qgetenv(
"UPSTART_JOB") ==
"unity8") {
190 return startShell(argc, argv,
nullptr);