From 5e3f3879517c5af3285f3bc4f7b0007a29beafe1 Mon Sep 17 00:00:00 2001 From: Boram Bae Date: Mon, 18 Oct 2021 20:19:13 +0900 Subject: [PATCH 1/9] Support top-layer mode * Add top to FlutterDesktopWindowProperties as a member * If top is true, the window type will be NOTIFICATION with the top level priority Signed-off-by: Boram Bae --- shell/platform/tizen/BUILD.gn | 6 +- shell/platform/tizen/flutter_tizen.cc | 2 +- shell/platform/tizen/flutter_tizen_engine.cc | 7 +- shell/platform/tizen/flutter_tizen_engine.h | 3 +- shell/platform/tizen/public/flutter_tizen.h | 2 + shell/platform/tizen/tizen_renderer.cc | 2 + shell/platform/tizen/tizen_renderer.h | 2 + .../tizen/tizen_renderer_ecore_wl2.cc | 182 +++++++++++++++++- .../platform/tizen/tizen_renderer_ecore_wl2.h | 19 ++ .../platform/tizen/tizen_renderer_evas_gl.cc | 14 +- shell/platform/tizen/tizen_renderer_evas_gl.h | 1 + 11 files changed, 228 insertions(+), 12 deletions(-) diff --git a/shell/platform/tizen/BUILD.gn b/shell/platform/tizen/BUILD.gn index 44ecd83653f7a..759d51cb795cc 100644 --- a/shell/platform/tizen/BUILD.gn +++ b/shell/platform/tizen/BUILD.gn @@ -192,6 +192,7 @@ template("embedder") { "ecore_evas", "elementary", "evas", + "capi-ui-efl-util", ] public_configs += [ ":evas_gl_renderer" ] @@ -201,7 +202,10 @@ template("embedder") { "tizen_vsync_waiter.cc", ] - libs += [ "ecore_wl2" ] + libs += [ + "ecore_wl2", + "tizen-extension-client", + ] } public_deps = [ ":flutter_engine" ] diff --git a/shell/platform/tizen/flutter_tizen.cc b/shell/platform/tizen/flutter_tizen.cc index 50c609bcbfd3a..ed4e22f4c7bec 100644 --- a/shell/platform/tizen/flutter_tizen.cc +++ b/shell/platform/tizen/flutter_tizen.cc @@ -38,7 +38,7 @@ FlutterDesktopEngineRef FlutterDesktopRunEngine( engine->InitializeRenderer( window_properties.x, window_properties.y, window_properties.width, window_properties.height, window_properties.transparent, - window_properties.focusable); + window_properties.focusable, window_properties.top); } if (!engine->RunEngine(engine_properties.entrypoint)) { FT_LOG(Error) << "Failed to start the Flutter engine."; diff --git a/shell/platform/tizen/flutter_tizen_engine.cc b/shell/platform/tizen/flutter_tizen_engine.cc index 4727fafd5273d..5cf79b6e206a0 100644 --- a/shell/platform/tizen/flutter_tizen_engine.cc +++ b/shell/platform/tizen/flutter_tizen_engine.cc @@ -88,12 +88,13 @@ void FlutterTizenEngine::InitializeRenderer(int32_t x, int32_t width, int32_t height, bool transparent, - bool focusable) { + bool focusable, + bool top) { TizenRenderer::WindowGeometry geometry = {x, y, width, height}; #ifdef TIZEN_RENDERER_EVAS_GL renderer_ = std::make_unique(geometry, transparent, - focusable, *this); + focusable, top, *this); render_loop_ = std::make_unique( std::this_thread::get_id(), // main thread @@ -106,7 +107,7 @@ void FlutterTizenEngine::InitializeRenderer(int32_t x, renderer_.get()); #else renderer_ = std::make_unique(geometry, transparent, - focusable, *this); + focusable, top, *this); tizen_vsync_waiter_ = std::make_unique(this); #endif diff --git a/shell/platform/tizen/flutter_tizen_engine.h b/shell/platform/tizen/flutter_tizen_engine.h index f9b03864d00c5..5c168285f75aa 100644 --- a/shell/platform/tizen/flutter_tizen_engine.h +++ b/shell/platform/tizen/flutter_tizen_engine.h @@ -67,7 +67,8 @@ class FlutterTizenEngine : public TizenRenderer::Delegate { int32_t width, int32_t height, bool transparent, - bool focusable); + bool focusable, + bool top); // Starts running the engine with the given entrypoint. If null, defaults to // main(). diff --git a/shell/platform/tizen/public/flutter_tizen.h b/shell/platform/tizen/public/flutter_tizen.h index f7e1f90024765..a10921dea916c 100644 --- a/shell/platform/tizen/public/flutter_tizen.h +++ b/shell/platform/tizen/public/flutter_tizen.h @@ -38,6 +38,8 @@ typedef struct { bool transparent; // Whether the window should be focusable or not. bool focusable; + // Whether the window should be on top layer or not. + bool top; } FlutterDesktopWindowProperties; // Properties for configuring a Flutter engine instance. diff --git a/shell/platform/tizen/tizen_renderer.cc b/shell/platform/tizen/tizen_renderer.cc index 5bd94fd6e6bda..bd167d039ef15 100644 --- a/shell/platform/tizen/tizen_renderer.cc +++ b/shell/platform/tizen/tizen_renderer.cc @@ -9,10 +9,12 @@ namespace flutter { TizenRenderer::TizenRenderer(WindowGeometry geometry, bool transparent, bool focusable, + bool top, Delegate& delegate) : initial_geometry_(geometry), transparent_(transparent), focusable_(focusable), + top_(top), delegate_(delegate) {} TizenRenderer::~TizenRenderer() = default; diff --git a/shell/platform/tizen/tizen_renderer.h b/shell/platform/tizen/tizen_renderer.h index 06358041be9eb..317844da1fb4b 100644 --- a/shell/platform/tizen/tizen_renderer.h +++ b/shell/platform/tizen/tizen_renderer.h @@ -50,11 +50,13 @@ class TizenRenderer { explicit TizenRenderer(WindowGeometry geometry, bool transparent, bool focusable, + bool top, Delegate& delegate); WindowGeometry initial_geometry_; bool transparent_; bool focusable_; + bool top_; Delegate& delegate_; bool is_valid_ = false; diff --git a/shell/platform/tizen/tizen_renderer_ecore_wl2.cc b/shell/platform/tizen/tizen_renderer_ecore_wl2.cc index eb9d0b1d109a1..231b656baffe5 100644 --- a/shell/platform/tizen/tizen_renderer_ecore_wl2.cc +++ b/shell/platform/tizen/tizen_renderer_ecore_wl2.cc @@ -6,16 +6,125 @@ #include #include - #include "flutter/shell/platform/tizen/logger.h" namespace flutter { +const uint32_t MAX_TIZEN_CLIENT_VERSION = 7; + +static void RegistryGlobalCallback(void* data, + struct wl_registry* registry, + uint32_t name, + const char* interface, + uint32_t version) { + auto* renderer = static_cast(data); + if (renderer) { + renderer->RegistryGlobalCallback(data, registry, name, interface, version); + } +} + +static void RegistryGlobalCallbackRemove(void* data, + struct wl_registry* registry, + uint32_t id) { + auto* renderer = static_cast(data); + if (renderer) { + renderer->RegistryGlobalCallbackRemove(data, registry, id); + } +} + +static void TizenPolicyConformant(void* data, + struct tizen_policy* tizenPolicy, + struct wl_surface* surface, + uint32_t isConformant) {} + +static void TizenPolicyConformantArea(void* data, + struct tizen_policy* tizenPolicy, + struct wl_surface* surface, + uint32_t conformantPart, + uint32_t state, + int32_t x, + int32_t y, + int32_t w, + int32_t h) {} + +static void TizenPolicyNotificationChangeDone(void* data, + struct tizen_policy* tizenPolicy, + struct wl_surface* surface, + int32_t level, + uint32_t state) { + auto* renderer = static_cast(data); + if (renderer) { + renderer->TizenPolicyNotificationChangeDone(data, tizenPolicy, surface, + level, state); + } +} + +static void TizenPolicyTransientForDone(void* data, + struct tizen_policy* tizenPolicy, + uint32_t childId) {} + +static void TizenPolicyScreenModeChangeDone(void* data, + struct tizen_policy* tizenPolicy, + struct wl_surface* surface, + uint32_t mode, + uint32_t state) {} + +static void TizenPolicyIconifyStateChanged(void* data, + struct tizen_policy* tizenPolicy, + struct wl_surface* surface, + uint32_t iconified, + uint32_t force) {} + +static void TizenPolicySupportedAuxiliaryHints(void* data, + struct tizen_policy* tizenPolicy, + struct wl_surface* surface, + struct wl_array* hints, + uint32_t numNints) {} + +static void TizenPolicyAllowedAuxiliaryHint(void* data, + struct tizen_policy* tizenPolicy, + struct wl_surface* surface, + int id) {} + +static void TizenPolicyAuxiliaryMessage(void* data, + struct tizen_policy* tizenPolicy, + struct wl_surface* surface, + const char* key, + const char* val, + struct wl_array* options) {} + +static void TizenPolicyConformantRegion(void* data, + struct tizen_policy* tizenPolicy, + struct wl_surface* surface, + uint32_t conformantPart, + uint32_t state, + int32_t x, + int32_t y, + int32_t w, + int32_t h, + uint32_t serial) {} + +const struct wl_registry_listener registryListener = { + RegistryGlobalCallback, RegistryGlobalCallbackRemove}; + +const struct tizen_policy_listener tizenPolicyListener = { + TizenPolicyConformant, + TizenPolicyConformantArea, + TizenPolicyNotificationChangeDone, + TizenPolicyTransientForDone, + TizenPolicyScreenModeChangeDone, + TizenPolicyIconifyStateChanged, + TizenPolicySupportedAuxiliaryHints, + TizenPolicyAllowedAuxiliaryHint, + TizenPolicyAuxiliaryMessage, + TizenPolicyConformantRegion}; + TizenRendererEcoreWl2::TizenRendererEcoreWl2(WindowGeometry geometry, bool transparent, bool focusable, + bool top, Delegate& delegate) - : TizenRenderer(geometry, transparent, focusable, delegate) { + : TizenRenderer(geometry, transparent, focusable, top, delegate) { InitializeRenderer(); } @@ -286,7 +395,25 @@ bool TizenRendererEcoreWl2::SetupDisplay(int32_t* width, int32_t* height) { if (initial_geometry_.h > 0) { *height = initial_geometry_.h; } - + if (top_) { + wl_display_ = ecore_wl2_display_get(ecore_wl2_display_); + if (wl_display_) { + wl_display* displayWrapper = + static_cast(wl_proxy_create_wrapper(wl_display_)); + if (displayWrapper) { + wl_event_queue_ = wl_display_create_queue(wl_display_); + if (wl_event_queue_) { + wl_proxy_set_queue(reinterpret_cast(displayWrapper), + wl_event_queue_); + + wl_registry* registry = wl_display_get_registry(displayWrapper); + wl_registry_add_listener(registry, ®istryListener, this); + } + + wl_proxy_wrapper_destroy(displayWrapper); + } + } + } return true; } @@ -296,7 +423,17 @@ bool TizenRendererEcoreWl2::SetupEcoreWlWindow(int32_t width, int32_t height) { ecore_wl2_window_ = ecore_wl2_window_new(ecore_wl2_display_, nullptr, x, y, width, height); - ecore_wl2_window_type_set(ecore_wl2_window_, ECORE_WL2_WINDOW_TYPE_TOPLEVEL); + ecore_wl2_window_type_set(ecore_wl2_window_, + top_ ? ECORE_WL2_WINDOW_TYPE_NOTIFICATION + : ECORE_WL2_WINDOW_TYPE_TOPLEVEL); + if (top_) { + while (!tizen_policy_) { + wl_display_dispatch_queue(wl_display_, wl_event_queue_); + } + tizen_policy_set_notification_level( + tizen_policy_, ecore_wl2_window_surface_get(ecore_wl2_window_), + TIZEN_POLICY_LEVEL_TOP); + } ecore_wl2_window_position_set(ecore_wl2_window_, x, y); ecore_wl2_window_aux_hint_add(ecore_wl2_window_, 0, "wm.policy.win.user.geometry", "1"); @@ -564,4 +701,41 @@ bool TizenRendererEcoreWl2::IsSupportedExtention(const char* name) { return false; } +void TizenRendererEcoreWl2::RegistryGlobalCallback(void* data, + struct wl_registry* registry, + uint32_t name, + const char* interface, + uint32_t version) { + if (strcmp(interface, tizen_policy_interface.name) == 0) { + uint32_t clientVersion = std::min(version, MAX_TIZEN_CLIENT_VERSION); + + tizen_policy_ = static_cast(wl_registry_bind( + registry, name, &tizen_policy_interface, clientVersion)); + if (!tizen_policy_) { + FT_LOG(Error) << "wl_registry_bind(tizen_policy_interface) is failed."; + return; + } + + tizen_policy_add_listener(tizen_policy_, &tizenPolicyListener, data); + + FT_LOG(Info) << "tizen_policy_add_listener is called."; + } +} + +void TizenRendererEcoreWl2::RegistryGlobalCallbackRemove( + void* data, + struct wl_registry* registry, + uint32_t id) { + tizen_policy_ = nullptr; +} + +void TizenRendererEcoreWl2::TizenPolicyNotificationChangeDone( + void* data, + struct tizen_policy* tizenPolicy, + struct wl_surface* surface, + int32_t level, + uint32_t state) { + FT_LOG(Info) << " level = " << level << ", state = " << state; +} + } // namespace flutter diff --git a/shell/platform/tizen/tizen_renderer_ecore_wl2.h b/shell/platform/tizen/tizen_renderer_ecore_wl2.h index 7924995bcf2d2..a0614e7524aa2 100644 --- a/shell/platform/tizen/tizen_renderer_ecore_wl2.h +++ b/shell/platform/tizen/tizen_renderer_ecore_wl2.h @@ -8,6 +8,7 @@ #define EFL_BETA_API_SUPPORT #include #include +#include #include #include "flutter/shell/platform/tizen/tizen_renderer.h" @@ -19,6 +20,7 @@ class TizenRendererEcoreWl2 : public TizenRenderer { explicit TizenRendererEcoreWl2(WindowGeometry geometry, bool transparent, bool focusable, + bool top, Delegate& delegate); virtual ~TizenRendererEcoreWl2(); @@ -42,6 +44,19 @@ class TizenRendererEcoreWl2 : public TizenRenderer { void SetRotate(int angle) override; void SetPreferredOrientations(const std::vector& rotations) override; bool IsSupportedExtention(const char* name) override; + void RegistryGlobalCallback(void* data, + struct wl_registry* registry, + uint32_t name, + const char* interface, + uint32_t version); + void RegistryGlobalCallbackRemove(void* data, + struct wl_registry* registry, + uint32_t id); + void TizenPolicyNotificationChangeDone(void* data, + struct tizen_policy* tizenPolicy, + struct wl_surface* surface, + int32_t level, + uint32_t state); private: bool InitializeRenderer(); @@ -77,6 +92,10 @@ class TizenRendererEcoreWl2 : public TizenRenderer { EGLSurface egl_resource_surface_ = EGL_NO_SURFACE; std::string egl_extention_str_; + + wl_display* wl_display_ = nullptr; + wl_event_queue* wl_event_queue_ = nullptr; + tizen_policy* tizen_policy_ = nullptr; }; } // namespace flutter diff --git a/shell/platform/tizen/tizen_renderer_evas_gl.cc b/shell/platform/tizen/tizen_renderer_evas_gl.cc index ad8175184ea52..320ef3100b8cd 100644 --- a/shell/platform/tizen/tizen_renderer_evas_gl.cc +++ b/shell/platform/tizen/tizen_renderer_evas_gl.cc @@ -10,13 +10,16 @@ EVAS_GL_GLOBAL_GLES3_DEFINE(); #include "flutter/shell/platform/tizen/logger.h" +#include + namespace flutter { TizenRendererEvasGL::TizenRendererEvasGL(WindowGeometry geometry, bool transparent, bool focusable, + bool top, Delegate& delegate) - : TizenRenderer(geometry, transparent, focusable, delegate) { + : TizenRenderer(geometry, transparent, focusable, top, delegate) { InitializeRenderer(); // Clear once to remove noise. @@ -639,10 +642,17 @@ Evas_Object* TizenRendererEvasGL::SetupEvasWindow(int32_t* width, int32_t* height) { elm_config_accel_preference_set("hw:opengl"); - evas_window_ = elm_win_add(NULL, NULL, ELM_WIN_BASIC); + evas_window_ = + elm_win_add(NULL, NULL, top_ ? ELM_WIN_NOTIFICATION : ELM_WIN_BASIC); if (!evas_window_) { return nullptr; } + + if (top_) { + efl_util_set_notification_window_level(evas_window_, + EFL_UTIL_NOTIFICATION_LEVEL_TOP); + } + auto* ecore_evas = ecore_evas_ecore_evas_get(evas_object_evas_get(evas_window_)); diff --git a/shell/platform/tizen/tizen_renderer_evas_gl.h b/shell/platform/tizen/tizen_renderer_evas_gl.h index af0f7bb0ec2fc..2be936247795f 100644 --- a/shell/platform/tizen/tizen_renderer_evas_gl.h +++ b/shell/platform/tizen/tizen_renderer_evas_gl.h @@ -19,6 +19,7 @@ class TizenRendererEvasGL : public TizenRenderer { explicit TizenRendererEvasGL(WindowGeometry geometry, bool transparent, bool focusable, + bool top, Delegate& delegate); virtual ~TizenRendererEvasGL(); From 1fcc78fe38d1bd007c22ef0b9408541281e79e6e Mon Sep 17 00:00:00 2001 From: Boram Bae Date: Tue, 19 Oct 2021 15:25:59 +0900 Subject: [PATCH 2/9] Update based on review Signed-off-by: Boram Bae --- shell/platform/tizen/flutter_tizen.cc | 2 +- shell/platform/tizen/flutter_tizen_engine.cc | 10 +++++----- shell/platform/tizen/flutter_tizen_engine.h | 2 +- shell/platform/tizen/public/flutter_tizen.h | 2 +- shell/platform/tizen/tizen_renderer.cc | 4 ++-- shell/platform/tizen/tizen_renderer.h | 4 ++-- shell/platform/tizen/tizen_renderer_ecore_wl2.cc | 12 ++++++------ shell/platform/tizen/tizen_renderer_ecore_wl2.h | 2 +- shell/platform/tizen/tizen_renderer_evas_gl.cc | 10 +++++----- shell/platform/tizen/tizen_renderer_evas_gl.h | 2 +- 10 files changed, 25 insertions(+), 25 deletions(-) diff --git a/shell/platform/tizen/flutter_tizen.cc b/shell/platform/tizen/flutter_tizen.cc index ed4e22f4c7bec..ddfd81698c374 100644 --- a/shell/platform/tizen/flutter_tizen.cc +++ b/shell/platform/tizen/flutter_tizen.cc @@ -38,7 +38,7 @@ FlutterDesktopEngineRef FlutterDesktopRunEngine( engine->InitializeRenderer( window_properties.x, window_properties.y, window_properties.width, window_properties.height, window_properties.transparent, - window_properties.focusable, window_properties.top); + window_properties.focusable, window_properties.top_level); } if (!engine->RunEngine(engine_properties.entrypoint)) { FT_LOG(Error) << "Failed to start the Flutter engine."; diff --git a/shell/platform/tizen/flutter_tizen_engine.cc b/shell/platform/tizen/flutter_tizen_engine.cc index 5cf79b6e206a0..43ecf846ffe15 100644 --- a/shell/platform/tizen/flutter_tizen_engine.cc +++ b/shell/platform/tizen/flutter_tizen_engine.cc @@ -89,12 +89,12 @@ void FlutterTizenEngine::InitializeRenderer(int32_t x, int32_t height, bool transparent, bool focusable, - bool top) { + bool top_level) { TizenRenderer::WindowGeometry geometry = {x, y, width, height}; #ifdef TIZEN_RENDERER_EVAS_GL - renderer_ = std::make_unique(geometry, transparent, - focusable, top, *this); + renderer_ = std::make_unique( + geometry, transparent, focusable, top_level, *this); render_loop_ = std::make_unique( std::this_thread::get_id(), // main thread @@ -106,8 +106,8 @@ void FlutterTizenEngine::InitializeRenderer(int32_t x, }, renderer_.get()); #else - renderer_ = std::make_unique(geometry, transparent, - focusable, top, *this); + renderer_ = std::make_unique( + geometry, transparent, focusable, top_level, *this); tizen_vsync_waiter_ = std::make_unique(this); #endif diff --git a/shell/platform/tizen/flutter_tizen_engine.h b/shell/platform/tizen/flutter_tizen_engine.h index 5c168285f75aa..51bd0f9b3a6e6 100644 --- a/shell/platform/tizen/flutter_tizen_engine.h +++ b/shell/platform/tizen/flutter_tizen_engine.h @@ -68,7 +68,7 @@ class FlutterTizenEngine : public TizenRenderer::Delegate { int32_t height, bool transparent, bool focusable, - bool top); + bool top_level); // Starts running the engine with the given entrypoint. If null, defaults to // main(). diff --git a/shell/platform/tizen/public/flutter_tizen.h b/shell/platform/tizen/public/flutter_tizen.h index a10921dea916c..0f14c8914b91b 100644 --- a/shell/platform/tizen/public/flutter_tizen.h +++ b/shell/platform/tizen/public/flutter_tizen.h @@ -39,7 +39,7 @@ typedef struct { // Whether the window should be focusable or not. bool focusable; // Whether the window should be on top layer or not. - bool top; + bool top_level; } FlutterDesktopWindowProperties; // Properties for configuring a Flutter engine instance. diff --git a/shell/platform/tizen/tizen_renderer.cc b/shell/platform/tizen/tizen_renderer.cc index bd167d039ef15..e04082634fb84 100644 --- a/shell/platform/tizen/tizen_renderer.cc +++ b/shell/platform/tizen/tizen_renderer.cc @@ -9,12 +9,12 @@ namespace flutter { TizenRenderer::TizenRenderer(WindowGeometry geometry, bool transparent, bool focusable, - bool top, + bool top_level, Delegate& delegate) : initial_geometry_(geometry), transparent_(transparent), focusable_(focusable), - top_(top), + top_level_(top_level), delegate_(delegate) {} TizenRenderer::~TizenRenderer() = default; diff --git a/shell/platform/tizen/tizen_renderer.h b/shell/platform/tizen/tizen_renderer.h index 317844da1fb4b..c8dc232cb9d37 100644 --- a/shell/platform/tizen/tizen_renderer.h +++ b/shell/platform/tizen/tizen_renderer.h @@ -50,13 +50,13 @@ class TizenRenderer { explicit TizenRenderer(WindowGeometry geometry, bool transparent, bool focusable, - bool top, + bool top_level, Delegate& delegate); WindowGeometry initial_geometry_; bool transparent_; bool focusable_; - bool top_; + bool top_level_; Delegate& delegate_; bool is_valid_ = false; diff --git a/shell/platform/tizen/tizen_renderer_ecore_wl2.cc b/shell/platform/tizen/tizen_renderer_ecore_wl2.cc index 231b656baffe5..a67a2c2b81fcc 100644 --- a/shell/platform/tizen/tizen_renderer_ecore_wl2.cc +++ b/shell/platform/tizen/tizen_renderer_ecore_wl2.cc @@ -122,9 +122,9 @@ const struct tizen_policy_listener tizenPolicyListener = { TizenRendererEcoreWl2::TizenRendererEcoreWl2(WindowGeometry geometry, bool transparent, bool focusable, - bool top, + bool top_level, Delegate& delegate) - : TizenRenderer(geometry, transparent, focusable, top, delegate) { + : TizenRenderer(geometry, transparent, focusable, top_level, delegate) { InitializeRenderer(); } @@ -395,7 +395,7 @@ bool TizenRendererEcoreWl2::SetupDisplay(int32_t* width, int32_t* height) { if (initial_geometry_.h > 0) { *height = initial_geometry_.h; } - if (top_) { + if (top_level_) { wl_display_ = ecore_wl2_display_get(ecore_wl2_display_); if (wl_display_) { wl_display* displayWrapper = @@ -424,9 +424,9 @@ bool TizenRendererEcoreWl2::SetupEcoreWlWindow(int32_t width, int32_t height) { ecore_wl2_window_ = ecore_wl2_window_new(ecore_wl2_display_, nullptr, x, y, width, height); ecore_wl2_window_type_set(ecore_wl2_window_, - top_ ? ECORE_WL2_WINDOW_TYPE_NOTIFICATION - : ECORE_WL2_WINDOW_TYPE_TOPLEVEL); - if (top_) { + top_level_ ? ECORE_WL2_WINDOW_TYPE_NOTIFICATION + : ECORE_WL2_WINDOW_TYPE_TOPLEVEL); + if (top_level_) { while (!tizen_policy_) { wl_display_dispatch_queue(wl_display_, wl_event_queue_); } diff --git a/shell/platform/tizen/tizen_renderer_ecore_wl2.h b/shell/platform/tizen/tizen_renderer_ecore_wl2.h index a0614e7524aa2..03d8a8f014b32 100644 --- a/shell/platform/tizen/tizen_renderer_ecore_wl2.h +++ b/shell/platform/tizen/tizen_renderer_ecore_wl2.h @@ -20,7 +20,7 @@ class TizenRendererEcoreWl2 : public TizenRenderer { explicit TizenRendererEcoreWl2(WindowGeometry geometry, bool transparent, bool focusable, - bool top, + bool top_level, Delegate& delegate); virtual ~TizenRendererEcoreWl2(); diff --git a/shell/platform/tizen/tizen_renderer_evas_gl.cc b/shell/platform/tizen/tizen_renderer_evas_gl.cc index 320ef3100b8cd..46eb639d6942a 100644 --- a/shell/platform/tizen/tizen_renderer_evas_gl.cc +++ b/shell/platform/tizen/tizen_renderer_evas_gl.cc @@ -17,9 +17,9 @@ namespace flutter { TizenRendererEvasGL::TizenRendererEvasGL(WindowGeometry geometry, bool transparent, bool focusable, - bool top, + bool top_level, Delegate& delegate) - : TizenRenderer(geometry, transparent, focusable, top, delegate) { + : TizenRenderer(geometry, transparent, focusable, top_level, delegate) { InitializeRenderer(); // Clear once to remove noise. @@ -642,13 +642,13 @@ Evas_Object* TizenRendererEvasGL::SetupEvasWindow(int32_t* width, int32_t* height) { elm_config_accel_preference_set("hw:opengl"); - evas_window_ = - elm_win_add(NULL, NULL, top_ ? ELM_WIN_NOTIFICATION : ELM_WIN_BASIC); + evas_window_ = elm_win_add(NULL, NULL, + top_level_ ? ELM_WIN_NOTIFICATION : ELM_WIN_BASIC); if (!evas_window_) { return nullptr; } - if (top_) { + if (top_level_) { efl_util_set_notification_window_level(evas_window_, EFL_UTIL_NOTIFICATION_LEVEL_TOP); } diff --git a/shell/platform/tizen/tizen_renderer_evas_gl.h b/shell/platform/tizen/tizen_renderer_evas_gl.h index 2be936247795f..07a6e28b00f01 100644 --- a/shell/platform/tizen/tizen_renderer_evas_gl.h +++ b/shell/platform/tizen/tizen_renderer_evas_gl.h @@ -19,7 +19,7 @@ class TizenRendererEvasGL : public TizenRenderer { explicit TizenRendererEvasGL(WindowGeometry geometry, bool transparent, bool focusable, - bool top, + bool top_level, Delegate& delegate); virtual ~TizenRendererEvasGL(); From ab500d76b19fd9bfcfb2d735d0b892c7da4ab2a3 Mon Sep 17 00:00:00 2001 From: Boram Bae Date: Mon, 25 Oct 2021 12:15:27 +0900 Subject: [PATCH 3/9] Destroy wl_event_queue Signed-off-by: Boram Bae --- shell/platform/tizen/tizen_renderer_ecore_wl2.cc | 7 +++++++ shell/platform/tizen/tizen_renderer_ecore_wl2.h | 2 ++ 2 files changed, 9 insertions(+) diff --git a/shell/platform/tizen/tizen_renderer_ecore_wl2.cc b/shell/platform/tizen/tizen_renderer_ecore_wl2.cc index a67a2c2b81fcc..493537267a806 100644 --- a/shell/platform/tizen/tizen_renderer_ecore_wl2.cc +++ b/shell/platform/tizen/tizen_renderer_ecore_wl2.cc @@ -369,6 +369,7 @@ void TizenRendererEcoreWl2::DestroyRenderer() { DestroyEglSurface(); DestroyEglWindow(); DestroyEcoreWlWindow(); + DestroyWlEventQueue(); ShutdownDisplay(); } @@ -738,4 +739,10 @@ void TizenRendererEcoreWl2::TizenPolicyNotificationChangeDone( FT_LOG(Info) << " level = " << level << ", state = " << state; } +void TizenRendererEcoreWl2::DestroyWlEventQueue() { + if (wl_event_queue_) { + wl_event_queue_destroy(wl_event_queue_); + } +} + } // namespace flutter diff --git a/shell/platform/tizen/tizen_renderer_ecore_wl2.h b/shell/platform/tizen/tizen_renderer_ecore_wl2.h index 03d8a8f014b32..e53f952bc2a90 100644 --- a/shell/platform/tizen/tizen_renderer_ecore_wl2.h +++ b/shell/platform/tizen/tizen_renderer_ecore_wl2.h @@ -80,6 +80,8 @@ class TizenRendererEcoreWl2 : public TizenRenderer { static Eina_Bool RotationEventCb(void* data, int type, void* event); void SendRotationChangeDone(); + void DestroyWlEventQueue(); + Ecore_Wl2_Display* ecore_wl2_display_ = nullptr; Ecore_Wl2_Window* ecore_wl2_window_ = nullptr; Ecore_Wl2_Egl_Window* ecore_wl2_egl_window_ = nullptr; From d3d5b1a1ae61f33ea1c3e1fed1f06c0984175543 Mon Sep 17 00:00:00 2001 From: Boram Bae Date: Tue, 26 Oct 2021 10:30:07 +0900 Subject: [PATCH 4/9] Fix build break on host * Fix naming convention Signed-off-by: Boram Bae --- shell/platform/tizen/BUILD.gn | 2 +- .../platform/tizen/flutter_tizen_engine_unittest.cc | 2 +- shell/platform/tizen/tizen_renderer_ecore_wl2.cc | 12 ++++++------ shell/platform/tizen/tizen_renderer_evas_gl.cc | 6 ++++-- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/shell/platform/tizen/BUILD.gn b/shell/platform/tizen/BUILD.gn index 759d51cb795cc..ddd3dd6809cd1 100644 --- a/shell/platform/tizen/BUILD.gn +++ b/shell/platform/tizen/BUILD.gn @@ -169,6 +169,7 @@ template("embedder") { "capi-base-common", "capi-system-info", "capi-system-system-settings", + "capi-ui-efl-util", "dlog", "feedback", "tbm", @@ -192,7 +193,6 @@ template("embedder") { "ecore_evas", "elementary", "evas", - "capi-ui-efl-util", ] public_configs += [ ":evas_gl_renderer" ] diff --git a/shell/platform/tizen/flutter_tizen_engine_unittest.cc b/shell/platform/tizen/flutter_tizen_engine_unittest.cc index 6dabbbb07db9a..8a9f09cff8d1a 100644 --- a/shell/platform/tizen/flutter_tizen_engine_unittest.cc +++ b/shell/platform/tizen/flutter_tizen_engine_unittest.cc @@ -44,7 +44,7 @@ class FlutterTizenEngineTestHeaded : public FlutterTizenEngineTest { protected: void SetUp() { FlutterTizenEngineTest::SetUp(); - engine_->InitializeRenderer(0, 0, 800, 600, false, true); + engine_->InitializeRenderer(0, 0, 800, 600, false, true, false); } }; diff --git a/shell/platform/tizen/tizen_renderer_ecore_wl2.cc b/shell/platform/tizen/tizen_renderer_ecore_wl2.cc index 493537267a806..9994eac9cc4f6 100644 --- a/shell/platform/tizen/tizen_renderer_ecore_wl2.cc +++ b/shell/platform/tizen/tizen_renderer_ecore_wl2.cc @@ -10,7 +10,7 @@ namespace flutter { -const uint32_t MAX_TIZEN_CLIENT_VERSION = 7; +const uint32_t kMaxTizenClientVersion = 7; static void RegistryGlobalCallback(void* data, struct wl_registry* registry, @@ -104,10 +104,10 @@ static void TizenPolicyConformantRegion(void* data, int32_t h, uint32_t serial) {} -const struct wl_registry_listener registryListener = { +const struct wl_registry_listener kRegistryListener = { RegistryGlobalCallback, RegistryGlobalCallbackRemove}; -const struct tizen_policy_listener tizenPolicyListener = { +const struct tizen_policy_listener kTizenPolicyListener = { TizenPolicyConformant, TizenPolicyConformantArea, TizenPolicyNotificationChangeDone, @@ -408,7 +408,7 @@ bool TizenRendererEcoreWl2::SetupDisplay(int32_t* width, int32_t* height) { wl_event_queue_); wl_registry* registry = wl_display_get_registry(displayWrapper); - wl_registry_add_listener(registry, ®istryListener, this); + wl_registry_add_listener(registry, &kRegistryListener, this); } wl_proxy_wrapper_destroy(displayWrapper); @@ -708,7 +708,7 @@ void TizenRendererEcoreWl2::RegistryGlobalCallback(void* data, const char* interface, uint32_t version) { if (strcmp(interface, tizen_policy_interface.name) == 0) { - uint32_t clientVersion = std::min(version, MAX_TIZEN_CLIENT_VERSION); + uint32_t clientVersion = std::min(version, kMaxTizenClientVersion); tizen_policy_ = static_cast(wl_registry_bind( registry, name, &tizen_policy_interface, clientVersion)); @@ -717,7 +717,7 @@ void TizenRendererEcoreWl2::RegistryGlobalCallback(void* data, return; } - tizen_policy_add_listener(tizen_policy_, &tizenPolicyListener, data); + tizen_policy_add_listener(tizen_policy_, &kTizenPolicyListener, data); FT_LOG(Info) << "tizen_policy_add_listener is called."; } diff --git a/shell/platform/tizen/tizen_renderer_evas_gl.cc b/shell/platform/tizen/tizen_renderer_evas_gl.cc index 46eb639d6942a..0c71a98ff6753 100644 --- a/shell/platform/tizen/tizen_renderer_evas_gl.cc +++ b/shell/platform/tizen/tizen_renderer_evas_gl.cc @@ -10,7 +10,9 @@ EVAS_GL_GLOBAL_GLES3_DEFINE(); #include "flutter/shell/platform/tizen/logger.h" +#ifndef __X64_SHELL__ #include +#endif namespace flutter { @@ -647,12 +649,12 @@ Evas_Object* TizenRendererEvasGL::SetupEvasWindow(int32_t* width, if (!evas_window_) { return nullptr; } - +#ifndef __X64_SHELL__ if (top_level_) { efl_util_set_notification_window_level(evas_window_, EFL_UTIL_NOTIFICATION_LEVEL_TOP); } - +#endif auto* ecore_evas = ecore_evas_ecore_evas_get(evas_object_evas_get(evas_window_)); From c1f72fbc0c475ed3490924b195cf137900ec8c77 Mon Sep 17 00:00:00 2001 From: Boram Bae Date: Tue, 26 Oct 2021 13:59:39 +0900 Subject: [PATCH 5/9] Remove unnecessary code Signed-off-by: Boram Bae --- .../tizen/tizen_renderer_ecore_wl2.cc | 196 ++++++------------ .../platform/tizen/tizen_renderer_ecore_wl2.h | 25 +-- 2 files changed, 71 insertions(+), 150 deletions(-) diff --git a/shell/platform/tizen/tizen_renderer_ecore_wl2.cc b/shell/platform/tizen/tizen_renderer_ecore_wl2.cc index 9994eac9cc4f6..42f3bdf986ad8 100644 --- a/shell/platform/tizen/tizen_renderer_ecore_wl2.cc +++ b/shell/platform/tizen/tizen_renderer_ecore_wl2.cc @@ -8,116 +8,50 @@ #include #include "flutter/shell/platform/tizen/logger.h" -namespace flutter { +namespace { const uint32_t kMaxTizenClientVersion = 7; -static void RegistryGlobalCallback(void* data, - struct wl_registry* registry, - uint32_t name, - const char* interface, - uint32_t version) { - auto* renderer = static_cast(data); - if (renderer) { - renderer->RegistryGlobalCallback(data, registry, name, interface, version); - } -} - -static void RegistryGlobalCallbackRemove(void* data, - struct wl_registry* registry, - uint32_t id) { - auto* renderer = static_cast(data); - if (renderer) { - renderer->RegistryGlobalCallbackRemove(data, registry, id); - } -} - -static void TizenPolicyConformant(void* data, - struct tizen_policy* tizenPolicy, - struct wl_surface* surface, - uint32_t isConformant) {} - -static void TizenPolicyConformantArea(void* data, - struct tizen_policy* tizenPolicy, - struct wl_surface* surface, - uint32_t conformantPart, - uint32_t state, - int32_t x, - int32_t y, - int32_t w, - int32_t h) {} - -static void TizenPolicyNotificationChangeDone(void* data, - struct tizen_policy* tizenPolicy, - struct wl_surface* surface, - int32_t level, - uint32_t state) { - auto* renderer = static_cast(data); - if (renderer) { - renderer->TizenPolicyNotificationChangeDone(data, tizenPolicy, surface, - level, state); - } -} - -static void TizenPolicyTransientForDone(void* data, - struct tizen_policy* tizenPolicy, - uint32_t childId) {} - -static void TizenPolicyScreenModeChangeDone(void* data, - struct tizen_policy* tizenPolicy, - struct wl_surface* surface, - uint32_t mode, - uint32_t state) {} - -static void TizenPolicyIconifyStateChanged(void* data, - struct tizen_policy* tizenPolicy, - struct wl_surface* surface, - uint32_t iconified, - uint32_t force) {} - -static void TizenPolicySupportedAuxiliaryHints(void* data, - struct tizen_policy* tizenPolicy, - struct wl_surface* surface, - struct wl_array* hints, - uint32_t numNints) {} - -static void TizenPolicyAllowedAuxiliaryHint(void* data, - struct tizen_policy* tizenPolicy, - struct wl_surface* surface, - int id) {} - -static void TizenPolicyAuxiliaryMessage(void* data, - struct tizen_policy* tizenPolicy, - struct wl_surface* surface, - const char* key, - const char* val, - struct wl_array* options) {} - -static void TizenPolicyConformantRegion(void* data, - struct tizen_policy* tizenPolicy, - struct wl_surface* surface, - uint32_t conformantPart, - uint32_t state, - int32_t x, - int32_t y, - int32_t w, - int32_t h, - uint32_t serial) {} - const struct wl_registry_listener kRegistryListener = { - RegistryGlobalCallback, RegistryGlobalCallbackRemove}; + [](void* data, + struct wl_registry* registry, + uint32_t name, + const char* interface, + uint32_t version) { + auto* renderer = static_cast(data); + if (renderer) { + renderer->OnEnabledWlRegistryGlobalObject(data, registry, name, + interface, version); + } + }, + [](void* data, struct wl_registry* registry, uint32_t id) { + auto* renderer = static_cast(data); + if (renderer) { + renderer->OnDisabledWlRegistryGlobalObject(data, registry, id); + } + }}; const struct tizen_policy_listener kTizenPolicyListener = { - TizenPolicyConformant, - TizenPolicyConformantArea, - TizenPolicyNotificationChangeDone, - TizenPolicyTransientForDone, - TizenPolicyScreenModeChangeDone, - TizenPolicyIconifyStateChanged, - TizenPolicySupportedAuxiliaryHints, - TizenPolicyAllowedAuxiliaryHint, - TizenPolicyAuxiliaryMessage, - TizenPolicyConformantRegion}; + nullptr, + nullptr, + [](void* data, + struct tizen_policy* policy, + struct wl_surface* surface, + int32_t level, + uint32_t state) { + FT_LOG(Debug) << "Notification policy is changed(level: " << level + << ", state: " << state << ")."; + }, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr}; +} // namespace + +namespace flutter { TizenRendererEcoreWl2::TizenRendererEcoreWl2(WindowGeometry geometry, bool transparent, @@ -369,7 +303,6 @@ void TizenRendererEcoreWl2::DestroyRenderer() { DestroyEglSurface(); DestroyEglWindow(); DestroyEcoreWlWindow(); - DestroyWlEventQueue(); ShutdownDisplay(); } @@ -399,19 +332,18 @@ bool TizenRendererEcoreWl2::SetupDisplay(int32_t* width, int32_t* height) { if (top_level_) { wl_display_ = ecore_wl2_display_get(ecore_wl2_display_); if (wl_display_) { - wl_display* displayWrapper = + wl_display* display_wrapper = static_cast(wl_proxy_create_wrapper(wl_display_)); - if (displayWrapper) { + if (display_wrapper) { wl_event_queue_ = wl_display_create_queue(wl_display_); if (wl_event_queue_) { - wl_proxy_set_queue(reinterpret_cast(displayWrapper), + wl_proxy_set_queue(reinterpret_cast(display_wrapper), wl_event_queue_); - wl_registry* registry = wl_display_get_registry(displayWrapper); + wl_registry* registry = wl_display_get_registry(display_wrapper); wl_registry_add_listener(registry, &kRegistryListener, this); } - - wl_proxy_wrapper_destroy(displayWrapper); + wl_proxy_wrapper_destroy(display_wrapper); } } } @@ -424,10 +356,16 @@ bool TizenRendererEcoreWl2::SetupEcoreWlWindow(int32_t width, int32_t height) { ecore_wl2_window_ = ecore_wl2_window_new(ecore_wl2_display_, nullptr, x, y, width, height); + + // Change the window type to use the tizen policy for notification window + // according to top_level_. + // Note: ECORE_WL2_WINDOW_TYPE_TOPLEVEL is similar to "ELM_WIN_BASIC" and it + // does not mean that the window always will be overlaid on other apps :( ecore_wl2_window_type_set(ecore_wl2_window_, top_level_ ? ECORE_WL2_WINDOW_TYPE_NOTIFICATION : ECORE_WL2_WINDOW_TYPE_TOPLEVEL); if (top_level_) { + // Wait until tizen_policy_ is initialized. while (!tizen_policy_) { wl_display_dispatch_queue(wl_display_, wl_event_queue_); } @@ -485,6 +423,10 @@ void TizenRendererEcoreWl2::DestroyEcoreWlWindow() { } void TizenRendererEcoreWl2::ShutdownDisplay() { + if (wl_event_queue_) { + wl_event_queue_destroy(wl_event_queue_); + } + if (ecore_wl2_display_) { ecore_wl2_display_disconnect(ecore_wl2_display_); ecore_wl2_display_ = nullptr; @@ -702,11 +644,13 @@ bool TizenRendererEcoreWl2::IsSupportedExtention(const char* name) { return false; } -void TizenRendererEcoreWl2::RegistryGlobalCallback(void* data, - struct wl_registry* registry, - uint32_t name, - const char* interface, - uint32_t version) { +void TizenRendererEcoreWl2::OnEnabledWlRegistryGlobalObject( + void* data, + struct wl_registry* registry, + uint32_t name, + const char* interface, + uint32_t version) { + // To use the Tizen Policy, initialize tizen_policy handle and add a listener if (strcmp(interface, tizen_policy_interface.name) == 0) { uint32_t clientVersion = std::min(version, kMaxTizenClientVersion); @@ -716,33 +660,15 @@ void TizenRendererEcoreWl2::RegistryGlobalCallback(void* data, FT_LOG(Error) << "wl_registry_bind(tizen_policy_interface) is failed."; return; } - tizen_policy_add_listener(tizen_policy_, &kTizenPolicyListener, data); - - FT_LOG(Info) << "tizen_policy_add_listener is called."; } } -void TizenRendererEcoreWl2::RegistryGlobalCallbackRemove( +void TizenRendererEcoreWl2::OnDisabledWlRegistryGlobalObject( void* data, struct wl_registry* registry, uint32_t id) { tizen_policy_ = nullptr; } -void TizenRendererEcoreWl2::TizenPolicyNotificationChangeDone( - void* data, - struct tizen_policy* tizenPolicy, - struct wl_surface* surface, - int32_t level, - uint32_t state) { - FT_LOG(Info) << " level = " << level << ", state = " << state; -} - -void TizenRendererEcoreWl2::DestroyWlEventQueue() { - if (wl_event_queue_) { - wl_event_queue_destroy(wl_event_queue_); - } -} - } // namespace flutter diff --git a/shell/platform/tizen/tizen_renderer_ecore_wl2.h b/shell/platform/tizen/tizen_renderer_ecore_wl2.h index e53f952bc2a90..8b0391e6130ff 100644 --- a/shell/platform/tizen/tizen_renderer_ecore_wl2.h +++ b/shell/platform/tizen/tizen_renderer_ecore_wl2.h @@ -44,19 +44,16 @@ class TizenRendererEcoreWl2 : public TizenRenderer { void SetRotate(int angle) override; void SetPreferredOrientations(const std::vector& rotations) override; bool IsSupportedExtention(const char* name) override; - void RegistryGlobalCallback(void* data, - struct wl_registry* registry, - uint32_t name, - const char* interface, - uint32_t version); - void RegistryGlobalCallbackRemove(void* data, - struct wl_registry* registry, - uint32_t id); - void TizenPolicyNotificationChangeDone(void* data, - struct tizen_policy* tizenPolicy, - struct wl_surface* surface, - int32_t level, - uint32_t state); + + // Callbacks for wl_registry_listener + void OnEnabledWlRegistryGlobalObject(void* data, + struct wl_registry* registry, + uint32_t name, + const char* interface, + uint32_t version); + void OnDisabledWlRegistryGlobalObject(void* data, + struct wl_registry* registry, + uint32_t id); private: bool InitializeRenderer(); @@ -80,8 +77,6 @@ class TizenRendererEcoreWl2 : public TizenRenderer { static Eina_Bool RotationEventCb(void* data, int type, void* event); void SendRotationChangeDone(); - void DestroyWlEventQueue(); - Ecore_Wl2_Display* ecore_wl2_display_ = nullptr; Ecore_Wl2_Window* ecore_wl2_window_ = nullptr; Ecore_Wl2_Egl_Window* ecore_wl2_egl_window_ = nullptr; From bd246af15c6cfbe5e574c182b13134646804ffea Mon Sep 17 00:00:00 2001 From: Boram Bae Date: Wed, 27 Oct 2021 18:24:10 +0900 Subject: [PATCH 6/9] Add repeat count to prevent infinite wait Signed-off-by: Boram Bae --- .../tizen/tizen_renderer_ecore_wl2.cc | 23 ++++++++++++------- .../platform/tizen/tizen_renderer_ecore_wl2.h | 2 +- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/shell/platform/tizen/tizen_renderer_ecore_wl2.cc b/shell/platform/tizen/tizen_renderer_ecore_wl2.cc index 42f3bdf986ad8..0e86322d620d7 100644 --- a/shell/platform/tizen/tizen_renderer_ecore_wl2.cc +++ b/shell/platform/tizen/tizen_renderer_ecore_wl2.cc @@ -366,12 +366,19 @@ bool TizenRendererEcoreWl2::SetupEcoreWlWindow(int32_t width, int32_t height) { : ECORE_WL2_WINDOW_TYPE_TOPLEVEL); if (top_level_) { // Wait until tizen_policy_ is initialized. - while (!tizen_policy_) { + size_t repeat_count = 3; + while (!tizen_policy_ && repeat_count--) { wl_display_dispatch_queue(wl_display_, wl_event_queue_); } - tizen_policy_set_notification_level( - tizen_policy_, ecore_wl2_window_surface_get(ecore_wl2_window_), - TIZEN_POLICY_LEVEL_TOP); + if (tizen_policy_ == nullptr) { + FT_LOG(Error) + << "Failed to initialize the tizen policy handle, the top_level " + "attribute is ignored."; + } else { + tizen_policy_set_notification_level( + tizen_policy_, ecore_wl2_window_surface_get(ecore_wl2_window_), + TIZEN_POLICY_LEVEL_TOP); + } } ecore_wl2_window_position_set(ecore_wl2_window_, x, y); ecore_wl2_window_aux_hint_add(ecore_wl2_window_, 0, @@ -650,14 +657,14 @@ void TizenRendererEcoreWl2::OnEnabledWlRegistryGlobalObject( uint32_t name, const char* interface, uint32_t version) { - // To use the Tizen Policy, initialize tizen_policy handle and add a listener + // To use the Tizen Policy, initialize tizen_policy handle and add a listener. if (strcmp(interface, tizen_policy_interface.name) == 0) { - uint32_t clientVersion = std::min(version, kMaxTizenClientVersion); + uint32_t client_version = std::min(version, kMaxTizenClientVersion); tizen_policy_ = static_cast(wl_registry_bind( - registry, name, &tizen_policy_interface, clientVersion)); + registry, name, &tizen_policy_interface, client_version)); if (!tizen_policy_) { - FT_LOG(Error) << "wl_registry_bind(tizen_policy_interface) is failed."; + FT_LOG(Error) << "wl_registry_bind(tizen_policy_interface) failed."; return; } tizen_policy_add_listener(tizen_policy_, &kTizenPolicyListener, data); diff --git a/shell/platform/tizen/tizen_renderer_ecore_wl2.h b/shell/platform/tizen/tizen_renderer_ecore_wl2.h index 8b0391e6130ff..b638aa28f4803 100644 --- a/shell/platform/tizen/tizen_renderer_ecore_wl2.h +++ b/shell/platform/tizen/tizen_renderer_ecore_wl2.h @@ -45,7 +45,7 @@ class TizenRendererEcoreWl2 : public TizenRenderer { void SetPreferredOrientations(const std::vector& rotations) override; bool IsSupportedExtention(const char* name) override; - // Callbacks for wl_registry_listener + // Callbacks for wl_registry_listener. void OnEnabledWlRegistryGlobalObject(void* data, struct wl_registry* registry, uint32_t name, From 1360e8b7326a094b1197b8e4301f31536336fbb0 Mon Sep 17 00:00:00 2001 From: Boram Bae Date: Tue, 2 Nov 2021 13:57:36 +0900 Subject: [PATCH 7/9] Retrieve global objects to bind tizen policy Signed-off-by: Boram Bae --- .../tizen/tizen_renderer_ecore_wl2.cc | 129 ++++-------------- .../platform/tizen/tizen_renderer_ecore_wl2.h | 13 +- 2 files changed, 29 insertions(+), 113 deletions(-) diff --git a/shell/platform/tizen/tizen_renderer_ecore_wl2.cc b/shell/platform/tizen/tizen_renderer_ecore_wl2.cc index 0e86322d620d7..c7af4f5754483 100644 --- a/shell/platform/tizen/tizen_renderer_ecore_wl2.cc +++ b/shell/platform/tizen/tizen_renderer_ecore_wl2.cc @@ -6,50 +6,8 @@ #include #include -#include "flutter/shell/platform/tizen/logger.h" - -namespace { - -const uint32_t kMaxTizenClientVersion = 7; -const struct wl_registry_listener kRegistryListener = { - [](void* data, - struct wl_registry* registry, - uint32_t name, - const char* interface, - uint32_t version) { - auto* renderer = static_cast(data); - if (renderer) { - renderer->OnEnabledWlRegistryGlobalObject(data, registry, name, - interface, version); - } - }, - [](void* data, struct wl_registry* registry, uint32_t id) { - auto* renderer = static_cast(data); - if (renderer) { - renderer->OnDisabledWlRegistryGlobalObject(data, registry, id); - } - }}; - -const struct tizen_policy_listener kTizenPolicyListener = { - nullptr, - nullptr, - [](void* data, - struct tizen_policy* policy, - struct wl_surface* surface, - int32_t level, - uint32_t state) { - FT_LOG(Debug) << "Notification policy is changed(level: " << level - << ", state: " << state << ")."; - }, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr}; -} // namespace +#include "flutter/shell/platform/tizen/logger.h" namespace flutter { @@ -329,24 +287,7 @@ bool TizenRendererEcoreWl2::SetupDisplay(int32_t* width, int32_t* height) { if (initial_geometry_.h > 0) { *height = initial_geometry_.h; } - if (top_level_) { - wl_display_ = ecore_wl2_display_get(ecore_wl2_display_); - if (wl_display_) { - wl_display* display_wrapper = - static_cast(wl_proxy_create_wrapper(wl_display_)); - if (display_wrapper) { - wl_event_queue_ = wl_display_create_queue(wl_display_); - if (wl_event_queue_) { - wl_proxy_set_queue(reinterpret_cast(display_wrapper), - wl_event_queue_); - - wl_registry* registry = wl_display_get_registry(display_wrapper); - wl_registry_add_listener(registry, &kRegistryListener, this); - } - wl_proxy_wrapper_destroy(display_wrapper); - } - } - } + return true; } @@ -365,21 +306,9 @@ bool TizenRendererEcoreWl2::SetupEcoreWlWindow(int32_t width, int32_t height) { top_level_ ? ECORE_WL2_WINDOW_TYPE_NOTIFICATION : ECORE_WL2_WINDOW_TYPE_TOPLEVEL); if (top_level_) { - // Wait until tizen_policy_ is initialized. - size_t repeat_count = 3; - while (!tizen_policy_ && repeat_count--) { - wl_display_dispatch_queue(wl_display_, wl_event_queue_); - } - if (tizen_policy_ == nullptr) { - FT_LOG(Error) - << "Failed to initialize the tizen policy handle, the top_level " - "attribute is ignored."; - } else { - tizen_policy_set_notification_level( - tizen_policy_, ecore_wl2_window_surface_get(ecore_wl2_window_), - TIZEN_POLICY_LEVEL_TOP); - } + SetTizenPolicyNotificationlevel(TIZEN_POLICY_LEVEL_TOP); } + ecore_wl2_window_position_set(ecore_wl2_window_, x, y); ecore_wl2_window_aux_hint_add(ecore_wl2_window_, 0, "wm.policy.win.user.geometry", "1"); @@ -430,10 +359,6 @@ void TizenRendererEcoreWl2::DestroyEcoreWlWindow() { } void TizenRendererEcoreWl2::ShutdownDisplay() { - if (wl_event_queue_) { - wl_event_queue_destroy(wl_event_queue_); - } - if (ecore_wl2_display_) { ecore_wl2_display_disconnect(ecore_wl2_display_); ecore_wl2_display_ = nullptr; @@ -651,31 +576,33 @@ bool TizenRendererEcoreWl2::IsSupportedExtention(const char* name) { return false; } -void TizenRendererEcoreWl2::OnEnabledWlRegistryGlobalObject( - void* data, - struct wl_registry* registry, - uint32_t name, - const char* interface, - uint32_t version) { - // To use the Tizen Policy, initialize tizen_policy handle and add a listener. - if (strcmp(interface, tizen_policy_interface.name) == 0) { - uint32_t client_version = std::min(version, kMaxTizenClientVersion); - - tizen_policy_ = static_cast(wl_registry_bind( - registry, name, &tizen_policy_interface, client_version)); - if (!tizen_policy_) { - FT_LOG(Error) << "wl_registry_bind(tizen_policy_interface) failed."; - return; +void TizenRendererEcoreWl2::SetTizenPolicyNotificationlevel(int level) { + Eina_Iterator* itr = ecore_wl2_display_globals_get(ecore_wl2_display_); + struct wl_registry* registry = + ecore_wl2_display_registry_get(ecore_wl2_display_); + + if (itr && registry) { + Ecore_Wl2_Global* global = nullptr; + + // Retrieve global objects to bind tizen policy + EINA_ITERATOR_FOREACH(itr, global) { + if (strcmp(global->interface, tizen_policy_interface.name) == 0) { + tizen_policy_ = static_cast( + wl_registry_bind(registry, global->id, &tizen_policy_interface, 1)); + break; + } } - tizen_policy_add_listener(tizen_policy_, &kTizenPolicyListener, data); } -} -void TizenRendererEcoreWl2::OnDisabledWlRegistryGlobalObject( - void* data, - struct wl_registry* registry, - uint32_t id) { - tizen_policy_ = nullptr; + if (tizen_policy_ == nullptr) { + FT_LOG(Error) + << "Failed to initialize the tizen policy handle, the top_level " + "attribute is ignored."; + return; + } + + tizen_policy_set_notification_level( + tizen_policy_, ecore_wl2_window_surface_get(ecore_wl2_window_), level); } } // namespace flutter diff --git a/shell/platform/tizen/tizen_renderer_ecore_wl2.h b/shell/platform/tizen/tizen_renderer_ecore_wl2.h index b638aa28f4803..915aa852893d9 100644 --- a/shell/platform/tizen/tizen_renderer_ecore_wl2.h +++ b/shell/platform/tizen/tizen_renderer_ecore_wl2.h @@ -45,16 +45,6 @@ class TizenRendererEcoreWl2 : public TizenRenderer { void SetPreferredOrientations(const std::vector& rotations) override; bool IsSupportedExtention(const char* name) override; - // Callbacks for wl_registry_listener. - void OnEnabledWlRegistryGlobalObject(void* data, - struct wl_registry* registry, - uint32_t name, - const char* interface, - uint32_t version); - void OnDisabledWlRegistryGlobalObject(void* data, - struct wl_registry* registry, - uint32_t id); - private: bool InitializeRenderer(); void Show(); @@ -73,6 +63,7 @@ class TizenRendererEcoreWl2 : public TizenRenderer { bool ChooseEGLConfiguration(); void PrintEGLError(); void DestroyEglSurface(); + void SetTizenPolicyNotificationlevel(int level); static Eina_Bool RotationEventCb(void* data, int type, void* event); void SendRotationChangeDone(); @@ -90,8 +81,6 @@ class TizenRendererEcoreWl2 : public TizenRenderer { std::string egl_extention_str_; - wl_display* wl_display_ = nullptr; - wl_event_queue* wl_event_queue_ = nullptr; tizen_policy* tizen_policy_ = nullptr; }; From bd6df39bb49f035efeb56308f3625726dbe9efe9 Mon Sep 17 00:00:00 2001 From: Boram Bae Date: Tue, 2 Nov 2021 15:00:39 +0900 Subject: [PATCH 8/9] Update based on review Signed-off-by: Boram Bae --- shell/platform/tizen/tizen_renderer_ecore_wl2.cc | 10 +++++----- shell/platform/tizen/tizen_renderer_ecore_wl2.h | 3 ++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/shell/platform/tizen/tizen_renderer_ecore_wl2.cc b/shell/platform/tizen/tizen_renderer_ecore_wl2.cc index c7af4f5754483..d18da8bac7df6 100644 --- a/shell/platform/tizen/tizen_renderer_ecore_wl2.cc +++ b/shell/platform/tizen/tizen_renderer_ecore_wl2.cc @@ -306,7 +306,7 @@ bool TizenRendererEcoreWl2::SetupEcoreWlWindow(int32_t width, int32_t height) { top_level_ ? ECORE_WL2_WINDOW_TYPE_NOTIFICATION : ECORE_WL2_WINDOW_TYPE_TOPLEVEL); if (top_level_) { - SetTizenPolicyNotificationlevel(TIZEN_POLICY_LEVEL_TOP); + SetTizenPolicyNotificationLevel(TIZEN_POLICY_LEVEL_TOP); } ecore_wl2_window_position_set(ecore_wl2_window_, x, y); @@ -576,16 +576,16 @@ bool TizenRendererEcoreWl2::IsSupportedExtention(const char* name) { return false; } -void TizenRendererEcoreWl2::SetTizenPolicyNotificationlevel(int level) { - Eina_Iterator* itr = ecore_wl2_display_globals_get(ecore_wl2_display_); +void TizenRendererEcoreWl2::SetTizenPolicyNotificationLevel(int level) { + Eina_Iterator* iter = ecore_wl2_display_globals_get(ecore_wl2_display_); struct wl_registry* registry = ecore_wl2_display_registry_get(ecore_wl2_display_); - if (itr && registry) { + if (iter && registry) { Ecore_Wl2_Global* global = nullptr; // Retrieve global objects to bind tizen policy - EINA_ITERATOR_FOREACH(itr, global) { + EINA_ITERATOR_FOREACH(iter, global) { if (strcmp(global->interface, tizen_policy_interface.name) == 0) { tizen_policy_ = static_cast( wl_registry_bind(registry, global->id, &tizen_policy_interface, 1)); diff --git a/shell/platform/tizen/tizen_renderer_ecore_wl2.h b/shell/platform/tizen/tizen_renderer_ecore_wl2.h index 915aa852893d9..df4b0c35f83c5 100644 --- a/shell/platform/tizen/tizen_renderer_ecore_wl2.h +++ b/shell/platform/tizen/tizen_renderer_ecore_wl2.h @@ -9,6 +9,7 @@ #include #include #include + #include #include "flutter/shell/platform/tizen/tizen_renderer.h" @@ -63,7 +64,7 @@ class TizenRendererEcoreWl2 : public TizenRenderer { bool ChooseEGLConfiguration(); void PrintEGLError(); void DestroyEglSurface(); - void SetTizenPolicyNotificationlevel(int level); + void SetTizenPolicyNotificationLevel(int level); static Eina_Bool RotationEventCb(void* data, int type, void* event); void SendRotationChangeDone(); From a6ca740469b0a62a4df1d1af94ca6ec3696f09b3 Mon Sep 17 00:00:00 2001 From: Boram Bae Date: Tue, 2 Nov 2021 15:35:17 +0900 Subject: [PATCH 9/9] Free Eina_Iterator after using it Signed-off-by: Boram Bae --- shell/platform/tizen/tizen_renderer_ecore_wl2.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/shell/platform/tizen/tizen_renderer_ecore_wl2.cc b/shell/platform/tizen/tizen_renderer_ecore_wl2.cc index d18da8bac7df6..75c91dd1cf295 100644 --- a/shell/platform/tizen/tizen_renderer_ecore_wl2.cc +++ b/shell/platform/tizen/tizen_renderer_ecore_wl2.cc @@ -593,6 +593,7 @@ void TizenRendererEcoreWl2::SetTizenPolicyNotificationLevel(int level) { } } } + eina_iterator_free(iter); if (tizen_policy_ == nullptr) { FT_LOG(Error)