From f6da9ccc54349064d96f1394284f4c3066d23bcd Mon Sep 17 00:00:00 2001 From: xiaowei guan <60122246+xiaowei-guan@users.noreply.github.com> Date: Wed, 6 Dec 2023 08:57:59 +0800 Subject: [PATCH] Implement FlutterDesktopViewGetResourceId (#52) --- flutter/shell/platform/tizen/flutter_tizen.cc | 5 ++ .../platform/tizen/public/flutter_tizen.h | 4 ++ .../shell/platform/tizen/tizen_view_base.h | 2 + .../platform/tizen/tizen_view_elementary.cc | 4 ++ .../platform/tizen/tizen_view_elementary.h | 2 + .../shell/platform/tizen/tizen_view_nui.cc | 4 ++ flutter/shell/platform/tizen/tizen_view_nui.h | 2 + .../platform/tizen/tizen_window_ecore_wl2.cc | 60 +++++++++++++++++++ .../platform/tizen/tizen_window_ecore_wl2.h | 3 + .../platform/tizen/tizen_window_elementary.cc | 4 ++ .../platform/tizen/tizen_window_elementary.h | 2 + 11 files changed, 92 insertions(+) diff --git a/flutter/shell/platform/tizen/flutter_tizen.cc b/flutter/shell/platform/tizen/flutter_tizen.cc index 9d7046c..ec31a83 100644 --- a/flutter/shell/platform/tizen/flutter_tizen.cc +++ b/flutter/shell/platform/tizen/flutter_tizen.cc @@ -240,6 +240,11 @@ void* FlutterDesktopViewGetNativeHandle(FlutterDesktopViewRef view_ref) { return view->tizen_view()->GetNativeHandle(); } +uint32_t FlutterDesktopViewGetResourceId(FlutterDesktopViewRef view_ref) { + flutter::FlutterTizenView* view = ViewFromHandle(view_ref); + return view->tizen_view()->GetResourceId(); +} + void FlutterDesktopViewResize(FlutterDesktopViewRef view, int32_t width, int32_t height) { diff --git a/flutter/shell/platform/tizen/public/flutter_tizen.h b/flutter/shell/platform/tizen/public/flutter_tizen.h index 30d1b2a..a516ae0 100644 --- a/flutter/shell/platform/tizen/public/flutter_tizen.h +++ b/flutter/shell/platform/tizen/public/flutter_tizen.h @@ -204,6 +204,10 @@ FLUTTER_EXPORT void FlutterDesktopViewDestroy(FlutterDesktopViewRef view); FLUTTER_EXPORT void* FlutterDesktopViewGetNativeHandle( FlutterDesktopViewRef view); +// Returns the resource id of current window. +FLUTTER_EXPORT uint32_t +FlutterDesktopViewGetResourceId(FlutterDesktopViewRef view); + // Resizes the view. // @warning This API is a work-in-progress and may change. FLUTTER_EXPORT void FlutterDesktopViewResize(FlutterDesktopViewRef view, diff --git a/flutter/shell/platform/tizen/tizen_view_base.h b/flutter/shell/platform/tizen/tizen_view_base.h index 76f332f..40a1b8f 100644 --- a/flutter/shell/platform/tizen/tizen_view_base.h +++ b/flutter/shell/platform/tizen/tizen_view_base.h @@ -41,6 +41,8 @@ class TizenViewBase { // Returns the dpi of the screen. virtual int32_t GetDpi() = 0; + virtual uint32_t GetResourceId() = 0; + virtual void UpdateFlutterCursor(const std::string& kind) = 0; // Sets the delegate used to communicate state changes from render target to diff --git a/flutter/shell/platform/tizen/tizen_view_elementary.cc b/flutter/shell/platform/tizen/tizen_view_elementary.cc index a43840d..64f305f 100644 --- a/flutter/shell/platform/tizen/tizen_view_elementary.cc +++ b/flutter/shell/platform/tizen/tizen_view_elementary.cc @@ -362,6 +362,10 @@ uintptr_t TizenViewElementary::GetWindowId() { ecore_evas_ecore_evas_get(evas_object_evas_get(container_))); } +uint32_t TizenViewElementary::GetResourceId() { + return 0; +} + void TizenViewElementary::Show() { evas_object_show(container_); evas_object_show(image_); diff --git a/flutter/shell/platform/tizen/tizen_view_elementary.h b/flutter/shell/platform/tizen/tizen_view_elementary.h index e7bbf67..ffbd2d8 100644 --- a/flutter/shell/platform/tizen/tizen_view_elementary.h +++ b/flutter/shell/platform/tizen/tizen_view_elementary.h @@ -35,6 +35,8 @@ class TizenViewElementary : public TizenView { uintptr_t GetWindowId() override; + uint32_t GetResourceId() override; + void Show() override; void UpdateFlutterCursor(const std::string& kind) override; diff --git a/flutter/shell/platform/tizen/tizen_view_nui.cc b/flutter/shell/platform/tizen/tizen_view_nui.cc index e64b325..f3b9347 100644 --- a/flutter/shell/platform/tizen/tizen_view_nui.cc +++ b/flutter/shell/platform/tizen/tizen_view_nui.cc @@ -66,6 +66,10 @@ uintptr_t TizenViewNui::GetWindowId() { return default_window_id_; } +uint32_t TizenViewNui::GetResourceId() { + return 0; +} + void TizenViewNui::Show() { // Do nothing. } diff --git a/flutter/shell/platform/tizen/tizen_view_nui.h b/flutter/shell/platform/tizen/tizen_view_nui.h index ffa5f13..8efc960 100644 --- a/flutter/shell/platform/tizen/tizen_view_nui.h +++ b/flutter/shell/platform/tizen/tizen_view_nui.h @@ -38,6 +38,8 @@ class TizenViewNui : public TizenView { uintptr_t GetWindowId() override; + uint32_t GetResourceId() override; + void Show() override; void RequestRendering(); diff --git a/flutter/shell/platform/tizen/tizen_window_ecore_wl2.cc b/flutter/shell/platform/tizen/tizen_window_ecore_wl2.cc index 8a32e24..b316d6b 100644 --- a/flutter/shell/platform/tizen/tizen_window_ecore_wl2.cc +++ b/flutter/shell/platform/tizen/tizen_window_ecore_wl2.cc @@ -459,6 +459,66 @@ uintptr_t TizenWindowEcoreWl2::GetWindowId() { return ecore_wl2_window_id_get(ecore_wl2_window_); } +void HandleResourceId(void* data, tizen_resource* tizen_resource, uint32_t id) { + if (data) { + *reinterpret_cast(data) = id; + } +} + +uint32_t TizenWindowEcoreWl2::GetResourceId() { + if (resource_id_ > 0) { + return resource_id_; + } + struct wl_registry* registry = + ecore_wl2_display_registry_get(ecore_wl2_display_); + if (!registry) { + FT_LOG(Error) << "Could not retreive wl_registry from the display."; + return 0; + } + + static const struct tizen_resource_listener tz_resource_listener = { + HandleResourceId}; + Eina_Iterator* iter = ecore_wl2_display_globals_get(ecore_wl2_display_); + Ecore_Wl2_Global* global = nullptr; + struct tizen_surface* surface = nullptr; + EINA_ITERATOR_FOREACH(iter, global) { + if (strcmp(global->interface, "tizen_surface") == 0) { + surface = static_cast(wl_registry_bind( + registry, global->id, &tizen_surface_interface, global->version)); + break; + } + } + eina_iterator_free(iter); + if (!surface) { + FT_LOG(Error) << "Failed to initialize the tizen surface."; + return 0; + } + + struct tizen_resource* resource = tizen_surface_get_tizen_resource( + surface, ecore_wl2_window_surface_get(ecore_wl2_window_)); + + if (!resource) { + FT_LOG(Error) << "Failed to get tizen resource."; + tizen_surface_destroy(surface); + return 0; + } + + struct wl_event_queue* event_queue = wl_display_create_queue(wl2_display_); + if (!event_queue) { + FT_LOG(Error) << "Failed to create wl_event_queue."; + tizen_resource_destroy(resource); + tizen_surface_destroy(surface); + return 0; + } + wl_proxy_set_queue(reinterpret_cast(resource), event_queue); + tizen_resource_add_listener(resource, &tz_resource_listener, &resource_id_); + wl_display_roundtrip_queue(wl2_display_, event_queue); + tizen_resource_destroy(resource); + tizen_surface_destroy(surface); + wl_event_queue_destroy(event_queue); + return resource_id_; +} + void TizenWindowEcoreWl2::SetPreferredOrientations( const std::vector& rotations) { ecore_wl2_window_available_rotations_set(ecore_wl2_window_, rotations.data(), diff --git a/flutter/shell/platform/tizen/tizen_window_ecore_wl2.h b/flutter/shell/platform/tizen/tizen_window_ecore_wl2.h index ada8190..a447298 100644 --- a/flutter/shell/platform/tizen/tizen_window_ecore_wl2.h +++ b/flutter/shell/platform/tizen/tizen_window_ecore_wl2.h @@ -44,6 +44,8 @@ class TizenWindowEcoreWl2 : public TizenWindow { uintptr_t GetWindowId() override; + uint32_t GetResourceId() override; + void SetPreferredOrientations(const std::vector& rotations) override; void BindKeys(const std::vector& keys) override; @@ -77,6 +79,7 @@ class TizenWindowEcoreWl2 : public TizenWindow { std::vector ecore_event_handlers_; tizen_policy* tizen_policy_ = nullptr; + uint32_t resource_id_ = 0; }; } // namespace flutter diff --git a/flutter/shell/platform/tizen/tizen_window_elementary.cc b/flutter/shell/platform/tizen/tizen_window_elementary.cc index 12e9e04..5de664f 100644 --- a/flutter/shell/platform/tizen/tizen_window_elementary.cc +++ b/flutter/shell/platform/tizen/tizen_window_elementary.cc @@ -413,6 +413,10 @@ uintptr_t TizenWindowElementary::GetWindowId() { ecore_evas_ecore_evas_get(evas_object_evas_get(elm_win_))); } +uint32_t TizenWindowElementary::GetResourceId() { + return 0; +} + void TizenWindowElementary::SetPreferredOrientations( const std::vector& rotations) { elm_win_wm_rotation_available_rotations_set(elm_win_, rotations.data(), diff --git a/flutter/shell/platform/tizen/tizen_window_elementary.h b/flutter/shell/platform/tizen/tizen_window_elementary.h index a4616ec..15ffd05 100644 --- a/flutter/shell/platform/tizen/tizen_window_elementary.h +++ b/flutter/shell/platform/tizen/tizen_window_elementary.h @@ -45,6 +45,8 @@ class TizenWindowElementary : public TizenWindow { uintptr_t GetWindowId() override; + uint32_t GetResourceId() override; + void SetPreferredOrientations(const std::vector& rotations) override; void BindKeys(const std::vector& keys) override;