Add VIS vehicle signal support
[apps/homescreen.git] / homescreen / src / main.cpp
index 376644f..74ec4f4 100644 (file)
 
 #include <weather.h>
 #include <bluetooth.h>
+
 #include "applicationlauncher.h"
 #include "statusbarmodel.h"
 #include "mastervolume.h"
 #include "homescreenhandler.h"
 #include "hmi-debug.h"
-#include "chromecontroller.h"
 
 #include <qpa/qplatformnativeinterface.h>
 #include <wayland-client.h>
 
 #include "wayland-agl-shell-client-protocol.h"
+#include "wayland-agl-shell-desktop-client-protocol.h"
 #include "shell.h"
 
+struct shell_data {
+       struct agl_shell *shell;
+       struct agl_shell_desktop *shell_desktop;
+};
+
+static void
+agl_shell_desktop_application(void *data,
+                             struct agl_shell_desktop *agl_shell_desktop,
+                             const char *app_id)
+{
+       HomescreenHandler *homescreenHandler = static_cast<HomescreenHandler *>(data);
+
+       if (homescreenHandler)
+               homescreenHandler->addAppToStack(app_id);
+}
+
+static void
+agl_shell_desktop_state_app(void *data,
+                           struct agl_shell_desktop *agl_shell_desktop,
+                           const char *app_id,
+                           const char *app_data,
+                           uint32_t state,
+                           uint32_t role)
+{
+       HomescreenHandler *homescreenHandler = static_cast<HomescreenHandler *>(data);
+
+       if (homescreenHandler && state == AGL_SHELL_DESKTOP_APP_STATE_DESTROYED)
+               homescreenHandler->appTerminated(app_id);
+}
+
+static const struct agl_shell_desktop_listener shell_desktop_listener = {
+   agl_shell_desktop_application,
+   agl_shell_desktop_state_app
+};
+
 static void
 global_add(void *data, struct wl_registry *reg, uint32_t name,
           const char *interface, uint32_t)
 {
-       struct agl_shell **shell = static_cast<struct agl_shell **>(data);
+       struct shell_data *shell_data = static_cast<struct shell_data *>(data);
+
+       if (!shell_data)
+               return;
 
        if (strcmp(interface, agl_shell_interface.name) == 0) {
-               *shell = static_cast<struct agl_shell *>(
+               shell_data->shell = static_cast<struct agl_shell *>(
                        wl_registry_bind(reg, name, &agl_shell_interface, 1)
                );
        }
+
+       if (strcmp(interface, agl_shell_desktop_interface.name) == 0) {
+               shell_data->shell_desktop = static_cast<struct agl_shell_desktop *>(
+                       wl_registry_bind(reg, name, &agl_shell_desktop_interface, 1)
+               );
+       }
 }
 
 static void
@@ -83,25 +128,22 @@ getWlOutput(QPlatformNativeInterface *native, QScreen *screen)
 }
 
 
-static struct agl_shell *
-register_agl_shell(QPlatformNativeInterface *native)
+static void
+register_agl_shell(QPlatformNativeInterface *native, struct shell_data *shell_data)
 {
        struct wl_display *wl;
        struct wl_registry *registry;
-       struct agl_shell *shell = nullptr;
 
        wl = static_cast<struct wl_display *>(
                        native->nativeResourceForIntegration("display")
        );
        registry = wl_display_get_registry(wl);
 
-       wl_registry_add_listener(registry, &registry_listener, &shell);
+       wl_registry_add_listener(registry, &registry_listener, shell_data);
 
        /* Roundtrip to get all globals advertised by the compositor */
        wl_display_roundtrip(wl);
        wl_registry_destroy(registry);
-
-       return shell;
 }
 
 static struct wl_surface *
@@ -137,8 +179,9 @@ find_screen(const char *screen_name)
 static void
 load_agl_shell_app(QPlatformNativeInterface *native,
                   QQmlApplicationEngine *engine,
-                  struct agl_shell *agl_shell, QUrl &bindingAddress,
-                  const char *screen_name, bool is_demo)
+                  struct agl_shell *agl_shell,
+                  const char *screen_name,
+                   bool is_demo)
 {
        struct wl_surface *bg, *top, *bottom;
        struct wl_output *output;
@@ -182,12 +225,11 @@ load_agl_shell_app(QPlatformNativeInterface *native,
                "first screen " << qApp->screens().first()->name();
        output = getWlOutput(native, screen);
 
-
        /* engine.rootObjects() works only if we had a load() */
        StatusBarModel *statusBar = qobj_top->findChild<StatusBarModel *>("statusBar");
        if (statusBar) {
                qDebug() << "got statusBar objectname, doing init()";
-               statusBar->init(bindingAddress, engine->rootContext());
+               statusBar->init(engine->rootContext());
        }
 
        agl_shell_set_panel(agl_shell, top, output, AGL_SHELL_EDGE_TOP);
@@ -206,17 +248,18 @@ load_agl_shell_app(QPlatformNativeInterface *native,
 int main(int argc, char *argv[])
 {
     setenv("QT_QPA_PLATFORM", "wayland", 1);
+    setenv("QT_QUICK_CONTROLS_STYLE", "AGL", 1);
     QGuiApplication a(argc, argv);
     const char *screen_name;
     bool is_demo_val = false;
+    struct shell_data shell_data = { nullptr, nullptr };
 
     QPlatformNativeInterface *native = qApp->platformNativeInterface();
-    struct agl_shell *agl_shell = nullptr;
     screen_name = getenv("HOMESCREEN_START_SCREEN");
 
     const char *is_demo = getenv("HOMESCREEN_DEMO_CI");
     if (is_demo && strcmp(is_demo, "1") == 0)
-           is_demo_val = true;
+        is_demo_val = true;
 
     QCoreApplication::setOrganizationDomain("LinuxFoundation");
     QCoreApplication::setOrganizationName("AutomotiveGradeLinux");
@@ -225,72 +268,47 @@ int main(int argc, char *argv[])
     /* we need to have an app_id */
     a.setDesktopFileName("homescreen");
 
-    QCommandLineParser parser;
-    parser.addPositionalArgument("port", a.translate("main", "port for binding"));
-    parser.addPositionalArgument("secret", a.translate("main", "secret for binding"));
-    parser.addHelpOption();
-    parser.addVersionOption();
-    parser.process(a);
-    QStringList positionalArguments = parser.positionalArguments();
-
-    int port = 1700;
-    QString token = "wm";
-    QString graphic_role = "homescreen"; // defined in layers.json in Window Manager
-
-    if (positionalArguments.length() == 2) {
-        port = positionalArguments.takeFirst().toInt();
-        token = positionalArguments.takeFirst();
+    register_agl_shell(native, &shell_data);
+    if (!shell_data.shell) {
+        fprintf(stderr, "agl_shell extension is not advertised. "
+                "Are you sure that agl-compositor is running?\n");
+        exit(EXIT_FAILURE);
     }
-
-    HMI_DEBUG("HomeScreen","port = %d, token = %s", port, token.toStdString().c_str());
-
-    agl_shell = register_agl_shell(native);
-    if (!agl_shell) {
-           fprintf(stderr, "agl_shell extension is not advertised. "
-                           "Are you sure that agl-compositor is running?\n");
-           exit(EXIT_FAILURE);
+    if (!shell_data.shell_desktop) {
+        fprintf(stderr, "agl_shell_desktop extension is not advertised. "
+                "Are you sure that agl-compositor is running?\n");
+        exit(EXIT_FAILURE);
     }
 
-    std::shared_ptr<struct agl_shell> shell{agl_shell, agl_shell_destroy};
-    Shell *aglShell = new Shell(shell, &a);
+    std::shared_ptr<struct agl_shell> agl_shell{shell_data.shell, agl_shell_destroy};
+    Shell *aglShell = new Shell(agl_shell, &a);
 
     // import C++ class to QML
     qmlRegisterType<StatusBarModel>("HomeScreen", 1, 0, "StatusBarModel");
     qmlRegisterType<MasterVolume>("MasterVolume", 1, 0, "MasterVolume");
-    qmlRegisterUncreatableType<ChromeController>("SpeechChrome", 1, 0, "SpeechChromeController",
-                                                 QLatin1String("SpeechChromeController is uncreatable."));
 
     ApplicationLauncher *launcher = new ApplicationLauncher();
     launcher->setCurrent(QStringLiteral("launcher"));
     HomescreenHandler* homescreenHandler = new HomescreenHandler(aglShell, launcher);
-    homescreenHandler->init(port, token.toStdString().c_str());
-
-    QUrl bindingAddress;
-    bindingAddress.setScheme(QStringLiteral("ws"));
-    bindingAddress.setHost(QStringLiteral("localhost"));
-    bindingAddress.setPort(port);
-    bindingAddress.setPath(QStringLiteral("/api"));
+    homescreenHandler->init();
 
-    QUrlQuery query;
-    query.addQueryItem(QStringLiteral("token"), token);
-    bindingAddress.setQuery(query);
+    agl_shell_desktop_add_listener(shell_data.shell_desktop, &shell_desktop_listener, homescreenHandler);
 
     QQmlApplicationEngine engine;
     QQmlContext *context = engine.rootContext();
-    context->setContextProperty("bindingAddress", bindingAddress);
 
     context->setContextProperty("homescreenHandler", homescreenHandler);
     context->setContextProperty("launcher", launcher);
-    context->setContextProperty("weather", new Weather(bindingAddress));
-    context->setContextProperty("bluetooth", new Bluetooth(bindingAddress, context));
-    context->setContextProperty("speechChromeController", new ChromeController(bindingAddress, &engine));
+    context->setContextProperty("weather", new Weather());
+    context->setContextProperty("bluetooth", new Bluetooth(false, context));
+
     // we add it here even if we don't use it
     context->setContextProperty("shell", aglShell);
 
     /* instead of loading main.qml we load one-by-one each of the QMLs,
      * divided now between several surfaces: panels, background.
      */
-    load_agl_shell_app(native, &engine, agl_shell, bindingAddress, screen_name, is_demo_val);
+    load_agl_shell_app(native, &engine, shell_data.shell, screen_name, is_demo_val);
 
     return a.exec();
 }