X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=app%2Fmain.cpp;fp=app%2Fmain.cpp;h=a34de351605103fd5e60d489a877f04b5368d96b;hb=7c1cdc5682a1e65d7110755003a1ef420edaebc9;hp=6fe54a55ca471d257f0af0c626d5e04591ac74b7;hpb=a44aaf342476a894aeb91edbc49b349aee93607b;p=apps%2Fhvac.git diff --git a/app/main.cpp b/app/main.cpp index 6fe54a5..a34de35 100644 --- a/app/main.cpp +++ b/app/main.cpp @@ -20,17 +20,94 @@ #include #include #include +#include + +#include +#include + +#include "shell-desktop.h" +#include "wayland-agl-shell-desktop-client-protocol.h" #include "translator.h" +/* this could be a combintion or some sort */ +#define OUTPUT_ID "Virtual-1" + +static void +global_add(void *data, struct wl_registry *reg, uint32_t name, + const char *interface, uint32_t) +{ + struct agl_shell_desktop **shell = static_cast(data); + + if (strcmp(interface, agl_shell_desktop_interface.name) == 0) { + *shell = static_cast( + wl_registry_bind(reg, name, &agl_shell_desktop_interface, 1) + ); + } +} + +static void +global_remove(void *data, struct wl_registry *reg, uint32_t id) +{ + /* Don't care */ + (void) data; + (void) reg; + (void) id; +} + +static const struct wl_registry_listener registry_listener = { + global_add, + global_remove, +}; + +static struct agl_shell_desktop * +register_agl_shell_desktop(QPlatformNativeInterface *native) +{ + struct wl_display *wl; + struct wl_registry *registry; + struct agl_shell_desktop *shell = nullptr; + + wl = static_cast(native->nativeResourceForIntegration("display")); + registry = wl_display_get_registry(wl); + + wl_registry_add_listener(registry, ®istry_listener, &shell); + + /* Roundtrip to get all globals advertised by the compositor */ + wl_display_roundtrip(wl); + wl_registry_destroy(registry); + + return shell; +} + +static QScreen * +find_qscreen(const char *screen_name) +{ + QList screens = qApp->screens(); + QScreen *found = nullptr; + QString qstr_name = QString::fromUtf8(screen_name, -1); + + for (QScreen *xscreen : screens) { + if (qstr_name == xscreen->name()) { + found = xscreen; + break; + } + } + + return found; +} + + int main(int argc, char *argv[]) { setenv("QT_QPA_PLATFORM", "wayland", 1); int port; QString token; + QString graphic_role = "hvac"; + struct agl_shell_desktop *agl_shell_desktop = nullptr; QCommandLineParser parser; QGuiApplication app(argc, argv); + app.setDesktopFileName(graphic_role); parser.addPositionalArgument("port", app.translate("main", "port for binding")); @@ -51,6 +128,20 @@ int main(int argc, char *argv[]) exit(EXIT_FAILURE); } + QPlatformNativeInterface *native = qApp->platformNativeInterface(); + agl_shell_desktop = register_agl_shell_desktop(native); + if (!agl_shell_desktop) { + qDebug() << "Could not find agl_shell_desktop extension. Is agl-compositor running?"; + exit(EXIT_FAILURE); + } + + std::shared_ptr shell{agl_shell_desktop, agl_shell_desktop_destroy}; + Shell *aglShell = new Shell(shell, nullptr); + + QScreen *screen_to_put = find_qscreen(OUTPUT_ID); + if (screen_to_put) + aglShell->set_window_on_screen(screen_to_put, graphic_role); + QUrl bindingAddress; bindingAddress.setScheme(QStringLiteral("ws")); bindingAddress.setHost(QStringLiteral("localhost"));