X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=homescreen%2Fsrc%2Fmain.cpp;h=c9107277e1dcadd0f7e77f52d1976abc82750c17;hb=d4f3ddfbad7a64937f00f13ba964e18d33effbb0;hp=2c2f7c0d580427a37290f2e8444b4ff5cee1f561;hpb=20f629dd6d8628611d950073c4f7a0446c40365a;p=apps%2Fhomescreen.git diff --git a/homescreen/src/main.cpp b/homescreen/src/main.cpp index 2c2f7c0..c910727 100644 --- a/homescreen/src/main.cpp +++ b/homescreen/src/main.cpp @@ -25,51 +25,83 @@ #include "homescreenhandler.h" #include "hmi-debug.h" -#include +// meson will define these +#include QT_QPA_HEADER #include -#include "wayland-agl-shell-client-protocol.h" -#include "wayland-agl-shell-desktop-client-protocol.h" +#include "agl-shell-client-protocol.h" #include "shell.h" +#ifndef MIN +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#endif + struct shell_data { struct agl_shell *shell; - struct agl_shell_desktop *shell_desktop; + HomescreenHandler *homescreenHandler; + bool wait_for_bound; + bool bound_ok; + int ver; }; static void -agl_shell_desktop_application(void *data, - struct agl_shell_desktop *agl_shell_desktop, - const char *app_id) +agl_shell_bound_ok(void *data, struct agl_shell *agl_shell) { - HomescreenHandler *homescreenHandler = static_cast(data); + struct shell_data *shell_data = static_cast(data); + shell_data->wait_for_bound = false; - if (homescreenHandler) - homescreenHandler->addAppToStack(app_id); + shell_data->bound_ok = true; } 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) +agl_shell_bound_fail(void *data, struct agl_shell *agl_shell) { - HomescreenHandler *homescreenHandler = static_cast(data); + struct shell_data *shell_data = static_cast(data); + shell_data->wait_for_bound = false; - if (homescreenHandler && state == AGL_SHELL_DESKTOP_APP_STATE_DESTROYED) - homescreenHandler->deactivateApp(app_id); + shell_data->bound_ok = false; } -static const struct agl_shell_desktop_listener shell_desktop_listener = { - agl_shell_desktop_application, - agl_shell_desktop_state_app +static void +agl_shell_app_state(void *data, struct agl_shell *agl_shell, + const char *app_id, uint32_t state) +{ + struct shell_data *shell_data = static_cast(data); + HomescreenHandler *homescreenHandler = shell_data->homescreenHandler; + + if (!homescreenHandler) + return; + + switch (state) { + case AGL_SHELL_APP_STATE_STARTED: + qDebug() << "Got AGL_SHELL_APP_STATE_STARTED for app_id " << app_id; + homescreenHandler->processAppStatusEvent(app_id, "started"); + break; + case AGL_SHELL_APP_STATE_TERMINATED: + qDebug() << "Got AGL_SHELL_APP_STATE_TERMINATED for app_id " << app_id; + // handled by HomescreenHandler::processAppStatusEvent + break; + case AGL_SHELL_APP_STATE_ACTIVATED: + qDebug() << "Got AGL_SHELL_APP_STATE_ACTIVATED for app_id " << app_id; + homescreenHandler->addAppToStack(app_id); + break; + default: + break; + } +} + + +#ifdef AGL_SHELL_BOUND_OK_SINCE_VERSION +static const struct agl_shell_listener shell_listener = { + agl_shell_bound_ok, + agl_shell_bound_fail, + agl_shell_app_state, }; +#endif static void global_add(void *data, struct wl_registry *reg, uint32_t name, - const char *interface, uint32_t) + const char *interface, uint32_t ver) { struct shell_data *shell_data = static_cast(data); @@ -77,15 +109,20 @@ global_add(void *data, struct wl_registry *reg, uint32_t name, return; if (strcmp(interface, agl_shell_interface.name) == 0) { - shell_data->shell = static_cast( - wl_registry_bind(reg, name, &agl_shell_interface, 1) - ); - } + if (ver >= 2) { + shell_data->shell = + static_cast( + wl_registry_bind(reg, name, &agl_shell_interface, MIN(3, ver))); +#ifdef AGL_SHELL_BOUND_OK_SINCE_VERSION + agl_shell_add_listener(shell_data->shell, &shell_listener, data); +#endif + } else { + shell_data->shell = + static_cast( + wl_registry_bind(reg, name, &agl_shell_interface, 1)); + } + shell_data->ver = ver; - if (strcmp(interface, agl_shell_desktop_interface.name) == 0) { - shell_data->shell_desktop = static_cast( - wl_registry_bind(reg, name, &agl_shell_desktop_interface, 1) - ); } } @@ -117,6 +154,14 @@ getWlOutput(QPlatformNativeInterface *native, QScreen *screen) return static_cast(output); } +static struct wl_display * +getWlDisplay(QPlatformNativeInterface *native) +{ + return static_cast( + native->nativeResourceForIntegration("display") + ); +} + static void register_agl_shell(QPlatformNativeInterface *native, struct shell_data *shell_data) @@ -124,9 +169,7 @@ register_agl_shell(QPlatformNativeInterface *native, struct shell_data *shell_da struct wl_display *wl; struct wl_registry *registry; - wl = static_cast( - native->nativeResourceForIntegration("display") - ); + wl = getWlDisplay(native); registry = wl_display_get_registry(wl); wl_registry_add_listener(registry, ®istry_listener, shell_data); @@ -248,7 +291,8 @@ int main(int argc, char *argv[]) QGuiApplication app(argc, argv); const char *screen_name; bool is_demo_val = false; - struct shell_data shell_data = { nullptr, nullptr }; + int ret = 0; + struct shell_data shell_data = { nullptr, nullptr, true, false, 0 }; QPlatformNativeInterface *native = qApp->platformNativeInterface(); screen_name = getenv("HOMESCREEN_START_SCREEN"); @@ -271,12 +315,23 @@ int main(int argc, char *argv[]) "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); + + qDebug() << "agl-shell interface is at version " << shell_data.ver; + if (shell_data.ver >= 2) { + while (ret != -1 && shell_data.wait_for_bound) { + ret = wl_display_dispatch(getWlDisplay(native)); + + if (shell_data.wait_for_bound) + continue; + } + + if (!shell_data.bound_ok) { + qInfo() << "agl_shell extension already in use by other shell client."; + exit(EXIT_FAILURE); + } } + std::shared_ptr agl_shell{shell_data.shell, agl_shell_destroy}; Shell *aglShell = new Shell(agl_shell, &app); @@ -286,9 +341,9 @@ int main(int argc, char *argv[]) ApplicationLauncher *launcher = new ApplicationLauncher(); launcher->setCurrent(QStringLiteral("launcher")); - HomescreenHandler* homescreenHandler = new HomescreenHandler(aglShell, launcher); - agl_shell_desktop_add_listener(shell_data.shell_desktop, &shell_desktop_listener, homescreenHandler); + HomescreenHandler* homescreenHandler = new HomescreenHandler(aglShell, launcher); + shell_data.homescreenHandler = homescreenHandler; QQmlApplicationEngine engine; QQmlContext *context = engine.rootContext();