diff options
author | Scott Murray <scott.murray@konsulko.com> | 2022-07-27 19:19:58 -0400 |
---|---|---|
committer | Jan-Simon Moeller <jsmoeller@linuxfoundation.org> | 2022-07-29 23:01:27 +0000 |
commit | 71db09dfeb4ff55f1a95219be550708d4524c47d (patch) | |
tree | f0e7b506f2b0264fb6fb54fca626b49e4c0efe15 /meta-agl-flutter/recipes-graphics/toyota/files/0001-Allow-the-embedder-to-run-as-a-regular-normal-applic.patch | |
parent | eda84d25d819824d641cf89af1e4d61a5e946744 (diff) |
ivi-homescreen: improve AGL integration
Changes:
- For now add local patches for three changes that Marius has
submitted upstream that fix issues with respect to running as
a normal application against agl-compositor and configuration
via the JSON configuration file. The first of these patches has
been merged upstream, but bumping the level of meta-flutter to
get it brings other rework that it seems perhaps better to wait
on a tagged upstream release for.
- Add another patch to add a '--app-id' command-line option to
the embedder. This avoids needing to use a JSON configuration
file for simple (i.e. non-homescreen) applications when running
multiple apps against agl-compositor. The use of the example JSON
file for the ivi-homescreen recipe itself has been left alone for
now since it provides a reference for doing so.
- Rename the embedder binary from "homescreen" to "flutter" to
avoid collision with the existing Qt homescreen application in
meta-agl-demo. This allows integrating Flutter applications into
images using the Qt homescreen for testing in the period while a
Flutter replacement is worked on. Discussion about possibly
renaming the embedder to something more generic along these lines
has started with upstream.
- Split the embedder binary into a separate package from the
ivi-homescreen package that contains the systemd unit file.
We do not want the "homescreen" systemd unit when using the
embedder in other images that use applaunchd, so this split seems
the most straightforward way to avoid pulling it in.
- Remove installing the "homescreen" system level systemd unit, as
it does not get used in agl-image-flutter (it is installed as a
user unit instead).
Bug-AGL: SPEC-4485
Signed-off-by: Scott Murray <scott.murray@konsulko.com>
Change-Id: I9f02f4312cf8c77ab224a3de8114c7fc3f4f6d36
Diffstat (limited to 'meta-agl-flutter/recipes-graphics/toyota/files/0001-Allow-the-embedder-to-run-as-a-regular-normal-applic.patch')
-rw-r--r-- | meta-agl-flutter/recipes-graphics/toyota/files/0001-Allow-the-embedder-to-run-as-a-regular-normal-applic.patch | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/meta-agl-flutter/recipes-graphics/toyota/files/0001-Allow-the-embedder-to-run-as-a-regular-normal-applic.patch b/meta-agl-flutter/recipes-graphics/toyota/files/0001-Allow-the-embedder-to-run-as-a-regular-normal-applic.patch new file mode 100644 index 00000000..5b63e20e --- /dev/null +++ b/meta-agl-flutter/recipes-graphics/toyota/files/0001-Allow-the-embedder-to-run-as-a-regular-normal-applic.patch @@ -0,0 +1,181 @@ +From 7f3f913ec5bea1d94c04f8a029db659c33e56dbf Mon Sep 17 00:00:00 2001 +From: Marius Vlad <mv0@users.noreply.github.com> +Date: Sun, 24 Jul 2022 21:15:54 +0300 +Subject: [PATCH 1/3] Allow the embedder to run as a regular/normal application + (#71) + +* shell: Do not issue always the ready request + +Rather than sending the ready request always, just do it when we've +found at least a background type of surface. + +This way we can have a flutter instance as a regular application but +also as a shell client. + +This is a work-around for the time being, a much more suitable approach +would be to have a mechanism that tells us when the client has finished +loading or has it's first frame swapped (or something similar to that). + +Note that we need at least a background surface so not finding one +assumes that we're a regular application (WINDOW_NORMAL). + +Signed-off-by: Marius Vlad <marius.vlad@collabora.com> + +* shell: Do not attempt always bind to agl-shell interface + +This helps up running as a regular application in +situations where we already have a client bound to the agl-shell +interface. + +We can't really accept more than one client to bind to the interface and +without a change in the protocol to avoid racy situations, it seems more +natural for the embedder to infer if it actually needs to do that. + +When the protocol has been updated to include additional events to let +clients that they've lost the race, we can remove this change. + +Signed-off-by: Marius Vlad <marius.vlad@collabora.com> + +Co-authored-by: Marius Vlad <marius.vlad@collabora.com> +--- + shell/app.cc | 13 +++++++++++-- + shell/wayland/display.cc | 18 +++++++++++++++--- + shell/wayland/display.h | 8 +++++++- + shell/wayland/window.h | 2 +- + 4 files changed, 34 insertions(+), 7 deletions(-) + +diff --git a/shell/app.cc b/shell/app.cc +index 03c33ff..3ca183b 100644 +--- a/shell/app.cc ++++ b/shell/app.cc +@@ -25,8 +25,10 @@ + + App::App(const std::vector<Configuration::Config>& configs) + : m_wayland_display(std::make_shared<Display>(!configs[0].disable_cursor, +- configs[0].cursor_theme)) { ++ configs[0].cursor_theme, ++ configs)) { + FML_DLOG(INFO) << "+App::App"; ++ bool found_view_with_bg = false; + + size_t index = 0; + m_views.reserve(configs.size()); +@@ -35,9 +37,16 @@ App::App(const std::vector<Configuration::Config>& configs) + view->Initialize(); + m_views.emplace_back(std::move(view)); + index++; ++ ++ if (WaylandWindow::get_window_type(cfg.view.window_type) == ++ WaylandWindow::WINDOW_BG) ++ found_view_with_bg = true; + } + +- m_wayland_display->AglShellDoReady(); ++ // check that if we had a BG type and issue a ready() request for it, ++ // otherwise we're going to assume that this is a NORMAL/REGULAR application. ++ if (found_view_with_bg) ++ m_wayland_display->AglShellDoReady(); + + FML_DLOG(INFO) << "-App::App"; + } +diff --git a/shell/wayland/display.cc b/shell/wayland/display.cc +index 06eba8c..5d78471 100644 +--- a/shell/wayland/display.cc ++++ b/shell/wayland/display.cc +@@ -27,7 +27,9 @@ + #include "constants.h" + #include "engine.h" + +-Display::Display(bool enable_cursor, std::string cursor_theme_name) ++Display::Display(bool enable_cursor, ++ std::string cursor_theme_name, ++ const std::vector<Configuration::Config>& configs) + : m_xkb_context(xkb_context_new(XKB_CONTEXT_NO_FLAGS)), + m_buffer_scale(1), + m_last_buffer_scale(m_buffer_scale), +@@ -35,6 +37,15 @@ Display::Display(bool enable_cursor, std::string cursor_theme_name) + m_cursor_theme_name(std::move(cursor_theme_name)) { + FML_DLOG(INFO) << "+ Display()"; + ++ for (auto const& cfg : configs) { ++ // check if we actually need to bind to agl-shell ++ auto window_type = WaylandWindow::get_window_type(cfg.view.window_type); ++ if (window_type != WaylandWindow::WINDOW_NORMAL) { ++ m_bind_to_agl_shell = true; ++ break; ++ } ++ } ++ + m_display = wl_display_connect(nullptr); + if (m_display == nullptr) { + FML_LOG(ERROR) << "Failed to connect to Wayland display. " +@@ -46,7 +57,7 @@ Display::Display(bool enable_cursor, std::string cursor_theme_name) + wl_registry_add_listener(m_registry, ®istry_listener, this); + wl_display_dispatch(m_display); + +- if (!m_agl_shell) { ++ if (!m_agl_shell && m_bind_to_agl_shell) { + FML_LOG(INFO) << "agl_shell extension not present"; + } + +@@ -152,7 +163,8 @@ void Display::registry_handle_global(void* data, + wl_registry_bind(registry, name, &wl_seat_interface, + std::min(static_cast<uint32_t>(5), version))); + wl_seat_add_listener(d->m_seat, &seat_listener, d); +- } else if (strcmp(interface, agl_shell_interface.name) == 0) { ++ } else if (strcmp(interface, agl_shell_interface.name) == 0 && ++ d->m_bind_to_agl_shell) { + d->m_agl_shell = static_cast<struct agl_shell*>( + wl_registry_bind(registry, name, &agl_shell_interface, + std::min(static_cast<uint32_t>(1), version))); +diff --git a/shell/wayland/display.h b/shell/wayland/display.h +index af3d460..bf05b27 100644 +--- a/shell/wayland/display.h ++++ b/shell/wayland/display.h +@@ -32,11 +32,15 @@ + #include "static_plugins/text_input/text_input.h" + #include "xdg-shell-client-protocol.h" + ++#include "configuration/configuration.h" ++ + class Engine; + + class Display { + public: +- explicit Display(bool enable_cursor, std::string cursor_theme_name); ++ explicit Display(bool enable_cursor, ++ std::string cursor_theme_name, ++ const std::vector<Configuration::Config>& configs); + + ~Display(); + +@@ -96,6 +100,8 @@ class Display { + struct wl_shm* m_shm{}; + struct wl_surface* m_base_surface{}; + ++ bool m_bind_to_agl_shell = false; ++ + std::map<wl_surface*, Engine*> m_surface_engine_map; + wl_surface* m_active_surface{}; + Engine* m_active_engine{}; +diff --git a/shell/wayland/window.h b/shell/wayland/window.h +index c4fe5e6..4b5c726 100644 +--- a/shell/wayland/window.h ++++ b/shell/wayland/window.h +@@ -79,6 +79,7 @@ class WaylandWindow { + wl_surface* GetBaseSurface() { return m_base_surface; } + + uint32_t m_fps_counter; ++ static window_type get_window_type(const std::string& type); + + private: + struct shm_buffer { +@@ -157,5 +158,4 @@ class WaylandWindow { + + static const struct wl_callback_listener frame_listener; + +- static window_type get_window_type(const std::string& type); + }; +-- +2.35.3 + |