From 4b3c327c36f82c8884e6bf0dc85b6e70082caa1c Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Tue, 10 May 2022 11:14:47 +0900 Subject: [PATCH 01/14] Introduce TizenViewElementary There are two ways to draw FlutterTizenView in Tizen. (TizenWindowElementary and TizenWindowEcore) Both ways are drawing on Window component(surface). We try to draw FlutterTizenView on the appropriate component provided by Tizen UIFW and support it to be place with other components. To do that, we created a TizenView class on the same level as TizenWindow and abstracted common methods to TizenBaseHandle. we can add FlutterTizenView to other UIFW of Tizen while adding TizenView{?}(maybe Tizen NUI). TizenBaseHandle -> TizenView -> TizenViewElementary -> TizenView{?} -> TizenWindow -> TizenWindowElementary -> TizenWindowEcore There are a few unimplemented things. This is a plan to be added later. - We need to add API related to App Event (Resume, etc..). - The plans for key input are not yet cleared up. --- shell/platform/tizen/BUILD.gn | 3 +- .../tizen/channels/platform_channel.cc | 16 +- .../tizen/channels/platform_channel.h | 8 +- .../platform/tizen/channels/window_channel.cc | 13 +- .../platform/tizen/channels/window_channel.h | 6 +- shell/platform/tizen/flutter_tizen.cc | 2 +- shell/platform/tizen/flutter_tizen_ecore.cc | 22 +- .../tizen/flutter_tizen_elementary.cc | 56 ++- shell/platform/tizen/flutter_tizen_engine.cc | 4 +- shell/platform/tizen/flutter_tizen_view.cc | 36 +- shell/platform/tizen/flutter_tizen_view.h | 6 +- shell/platform/tizen/public/flutter_tizen.h | 25 ++ shell/platform/tizen/tizen_base_handle.h | 78 ++++ .../platform/tizen/tizen_renderer_evas_gl.cc | 2 +- shell/platform/tizen/tizen_view.h | 40 ++ shell/platform/tizen/tizen_view_elementary.cc | 363 ++++++++++++++++++ shell/platform/tizen/tizen_view_elementary.h | 77 ++++ shell/platform/tizen/tizen_window.h | 63 +-- .../platform/tizen/tizen_window_ecore_wl2.cc | 10 +- shell/platform/tizen/tizen_window_ecore_wl2.h | 14 +- .../platform/tizen/tizen_window_elementary.cc | 10 +- .../platform/tizen/tizen_window_elementary.h | 13 +- 22 files changed, 744 insertions(+), 123 deletions(-) create mode 100644 shell/platform/tizen/tizen_base_handle.h create mode 100644 shell/platform/tizen/tizen_view.h create mode 100644 shell/platform/tizen/tizen_view_elementary.cc create mode 100644 shell/platform/tizen/tizen_view_elementary.h diff --git a/shell/platform/tizen/BUILD.gn b/shell/platform/tizen/BUILD.gn index 0100b97c15338..9650ff72c9646 100644 --- a/shell/platform/tizen/BUILD.gn +++ b/shell/platform/tizen/BUILD.gn @@ -190,6 +190,7 @@ template("embedder") { sources += [ "flutter_tizen_elementary.cc", "tizen_renderer_evas_gl.cc", + "tizen_view_elementary.cc", "tizen_window_elementary.cc", ] @@ -233,7 +234,7 @@ template("embedder") { embedder("flutter_tizen_mobile") { target_type = "shared_library" - use_evas_gl_renderer = false + use_evas_gl_renderer = true defines = [ "MOBILE_PROFILE" ] } diff --git a/shell/platform/tizen/channels/platform_channel.cc b/shell/platform/tizen/channels/platform_channel.cc index 5672bd73ef908..9bcc1376f9c73 100644 --- a/shell/platform/tizen/channels/platform_channel.cc +++ b/shell/platform/tizen/channels/platform_channel.cc @@ -58,12 +58,12 @@ std::string text_clipboard = ""; } // namespace PlatformChannel::PlatformChannel(BinaryMessenger* messenger, - TizenWindow* window) + TizenBaseHandle* handle) : channel_(std::make_unique>( messenger, kChannelName, &JsonMethodCodec::GetInstance())), - window_(window) { + handle_(handle) { channel_->SetMethodCallHandler( [this](const MethodCall& call, std::unique_ptr> result) { @@ -164,13 +164,13 @@ void PlatformChannel::HapticFeedbackVibrate(const std::string& feedback_type) { } void PlatformChannel::RestoreSystemUiOverlays() { - if (!window_) { + if (!handle_) { return; } #ifdef COMMON_PROFILE auto& shell = TizenShell::GetInstance(); - shell.InitializeSoftkey(window_->GetWindowId()); + shell.InitializeSoftkey(handle_->GetWindowId()); if (shell.IsSoftkeyShown()) { shell.ShowSoftkey(); @@ -182,13 +182,13 @@ void PlatformChannel::RestoreSystemUiOverlays() { void PlatformChannel::SetEnabledSystemUiOverlays( const std::vector& overlays) { - if (!window_) { + if (!handle_) { return; } #ifdef COMMON_PROFILE auto& shell = TizenShell::GetInstance(); - shell.InitializeSoftkey(window_->GetWindowId()); + shell.InitializeSoftkey(handle_->GetWindowId()); if (std::find(overlays.begin(), overlays.end(), kSystemUiOverlayBottom) != overlays.end()) { @@ -201,7 +201,7 @@ void PlatformChannel::SetEnabledSystemUiOverlays( void PlatformChannel::SetPreferredOrientations( const std::vector& orientations) { - if (!window_) { + if (!handle_) { return; } @@ -220,7 +220,7 @@ void PlatformChannel::SetPreferredOrientations( // default. rotations = {0, 90, 180, 270}; } - window_->SetPreferredOrientations(rotations); + handle_->SetPreferredOrientations(rotations); } } // namespace flutter diff --git a/shell/platform/tizen/channels/platform_channel.h b/shell/platform/tizen/channels/platform_channel.h index 4e11fdd5ca7af..29862eda7c14b 100644 --- a/shell/platform/tizen/channels/platform_channel.h +++ b/shell/platform/tizen/channels/platform_channel.h @@ -11,14 +11,14 @@ #include "flutter/shell/platform/common/client_wrapper/include/flutter/binary_messenger.h" #include "flutter/shell/platform/common/client_wrapper/include/flutter/method_channel.h" -#include "flutter/shell/platform/tizen/tizen_window.h" +#include "flutter/shell/platform/tizen/tizen_base_handle.h" #include "rapidjson/document.h" namespace flutter { class PlatformChannel { public: - explicit PlatformChannel(BinaryMessenger* messenger, TizenWindow* window); + explicit PlatformChannel(BinaryMessenger* messenger, TizenBaseHandle* handle); virtual ~PlatformChannel(); private: @@ -35,9 +35,9 @@ class PlatformChannel { std::unique_ptr> channel_; - // A reference to the window object managed by FlutterTizenView. + // A reference to the base handle object managed by FlutterTizenView. // This can be nullptr if the engine is running in headless mode. - TizenWindow* window_; + TizenBaseHandle* handle_; }; } // namespace flutter diff --git a/shell/platform/tizen/channels/window_channel.cc b/shell/platform/tizen/channels/window_channel.cc index b7e246cb06946..6de35db758a07 100644 --- a/shell/platform/tizen/channels/window_channel.cc +++ b/shell/platform/tizen/channels/window_channel.cc @@ -16,8 +16,9 @@ constexpr char kChannelName[] = "tizen/internal/window"; } // namespace -WindowChannel::WindowChannel(BinaryMessenger* messenger, TizenWindow* window) - : window_(window) { +WindowChannel::WindowChannel(BinaryMessenger* messenger, + TizenBaseHandle* handle) + : handle_(handle) { channel_ = std::make_unique>( messenger, kChannelName, &StandardMethodCodec::GetInstance()); channel_->SetMethodCallHandler( @@ -35,7 +36,7 @@ void WindowChannel::HandleMethodCall( const std::string& method_name = method_call.method_name(); if (method_name == "getWindowGeometry") { - TizenWindow::Geometry geometry = window_->GetWindowGeometry(); + TizenBaseHandle::Geometry geometry = handle_->GetRenderTargetGeometry(); EncodableMap map; map[EncodableValue("x")] = EncodableValue(geometry.left); map[EncodableValue("y")] = EncodableValue(geometry.top); @@ -57,11 +58,11 @@ void WindowChannel::HandleMethodCall( EncodableValueHolder width(arguments, "width"); EncodableValueHolder height(arguments, "height"); - TizenWindow::Geometry geometry = window_->GetWindowGeometry(); + TizenBaseHandle::Geometry geometry = handle_->GetRenderTargetGeometry(); // FIXME: Use SetWindowGeometry() instead of OnGeometryChanged() // After the SetWindowGeometry was successfully executed, I expected a // handler of ECORE_WL2_EVENT_WINDOW_CONFIGURE to be called, but it didn't. - window_->OnGeometryChanged({ + handle_->OnGeometryChanged({ x ? *x : geometry.left, y ? *y : geometry.top, width ? *width : geometry.width, @@ -70,7 +71,7 @@ void WindowChannel::HandleMethodCall( result->Success(); #endif } else if (method_name == "getScreenGeometry") { - TizenWindow::Geometry geometry = window_->GetScreenGeometry(); + TizenBaseHandle::Geometry geometry = handle_->GetScreenGeometry(); EncodableMap map; map[EncodableValue("width")] = EncodableValue(geometry.width); map[EncodableValue("height")] = EncodableValue(geometry.height); diff --git a/shell/platform/tizen/channels/window_channel.h b/shell/platform/tizen/channels/window_channel.h index 78c01ee2b94a1..6e64959ffbbb2 100644 --- a/shell/platform/tizen/channels/window_channel.h +++ b/shell/platform/tizen/channels/window_channel.h @@ -10,14 +10,14 @@ #include "flutter/shell/platform/common/client_wrapper/include/flutter/binary_messenger.h" #include "flutter/shell/platform/common/client_wrapper/include/flutter/encodable_value.h" #include "flutter/shell/platform/common/client_wrapper/include/flutter/method_channel.h" -#include "flutter/shell/platform/tizen/tizen_window.h" +#include "flutter/shell/platform/tizen/tizen_base_handle.h" namespace flutter { // Channel to get/set application's window size and device's screen size. class WindowChannel { public: - explicit WindowChannel(BinaryMessenger* messenger, TizenWindow* window); + explicit WindowChannel(BinaryMessenger* messenger, TizenBaseHandle* window); virtual ~WindowChannel(); private: @@ -27,7 +27,7 @@ class WindowChannel { std::unique_ptr> channel_; // A reference to the renderer object managed by FlutterTizenView. - TizenWindow* window_; + TizenBaseHandle* handle_; }; } // namespace flutter diff --git a/shell/platform/tizen/flutter_tizen.cc b/shell/platform/tizen/flutter_tizen.cc index 2f58bc48074a1..df4b42a745e78 100644 --- a/shell/platform/tizen/flutter_tizen.cc +++ b/shell/platform/tizen/flutter_tizen.cc @@ -71,7 +71,7 @@ void FlutterDesktopEngineShutdown(FlutterDesktopEngineRef engine_ref) { void* FlutterDesktopPluginRegistrarGetNativeWindow( FlutterDesktopPluginRegistrarRef registrar) { - return registrar->engine->view()->window()->GetWindowHandle(); + return registrar->engine->view()->handle()->GetWindowHandle(); } void FlutterDesktopPluginRegistrarEnableInputBlocking( diff --git a/shell/platform/tizen/flutter_tizen_ecore.cc b/shell/platform/tizen/flutter_tizen_ecore.cc index f6dc7bad22a59..84f504502969a 100644 --- a/shell/platform/tizen/flutter_tizen_ecore.cc +++ b/shell/platform/tizen/flutter_tizen_ecore.cc @@ -24,7 +24,7 @@ FlutterDesktopViewRef HandleForView(flutter::FlutterTizenView* view) { FlutterDesktopViewRef FlutterDesktopViewCreateFromNewWindow( const FlutterDesktopWindowProperties& window_properties, FlutterDesktopEngineRef engine) { - flutter::TizenWindow::Geometry window_geometry = { + flutter::TizenBaseHandle::Geometry window_geometry = { window_properties.x, window_properties.y, window_properties.width, @@ -52,3 +52,23 @@ FlutterDesktopViewRef FlutterDesktopViewCreateFromNewWindow( return HandleForView(view.release()); } + +FlutterDesktopViewRef FlutterDesktopViewCreateFromNewView( + const FlutterDesktopViewProperties& view_properties, + FlutterDesktopEngineRef engine, + void* elm_parent) { + // Not supported. + + return nullptr; +} + +void* FlutterDesktopViewGetEvasObject(FlutterDesktopEngineRef engine) { + // Not supported. + return nullptr; +} + +void FlutterDesktopViewResizeView(FlutterDesktopEngineRef engine, + int32_t width, + int32_t height) { + // Not supported. +} \ No newline at end of file diff --git a/shell/platform/tizen/flutter_tizen_elementary.cc b/shell/platform/tizen/flutter_tizen_elementary.cc index 29fbb3b1abb1c..fae38cd60e17a 100644 --- a/shell/platform/tizen/flutter_tizen_elementary.cc +++ b/shell/platform/tizen/flutter_tizen_elementary.cc @@ -6,6 +6,7 @@ #include "flutter/shell/platform/tizen/flutter_tizen_engine.h" #include "flutter/shell/platform/tizen/flutter_tizen_view.h" +#include "flutter/shell/platform/tizen/tizen_view_elementary.h" #include "flutter/shell/platform/tizen/tizen_window_elementary.h" namespace { @@ -24,7 +25,7 @@ FlutterDesktopViewRef HandleForView(flutter::FlutterTizenView* view) { FlutterDesktopViewRef FlutterDesktopViewCreateFromNewWindow( const FlutterDesktopWindowProperties& window_properties, FlutterDesktopEngineRef engine) { - flutter::TizenWindow::Geometry window_geometry = { + flutter::TizenBaseHandle::Geometry window_geometry = { window_properties.x, window_properties.y, window_properties.width, @@ -52,3 +53,56 @@ FlutterDesktopViewRef FlutterDesktopViewCreateFromNewWindow( return HandleForView(view.release()); } + +FlutterDesktopViewRef FlutterDesktopViewCreateFromNewView( + const FlutterDesktopViewProperties& view_properties, + FlutterDesktopEngineRef engine, + void* elm_parent) { + flutter::TizenBaseHandle::Geometry view_geometry = { + 0, + 0, + view_properties.width, + view_properties.height, + }; + + std::unique_ptr view = + std::make_unique( + view_geometry, (Evas_Object*)(view_properties.elm_parent)); + + auto flutter_view = + std::make_unique(std::move(view)); + + // Take ownership of the engine, starting it if necessary. + flutter_view->SetEngine( + std::unique_ptr(EngineFromHandle(engine))); + flutter_view->CreateRenderSurface(); + if (!flutter_view->engine()->IsRunning()) { + if (!flutter_view->engine()->RunEngine()) { + return nullptr; + } + } + + flutter_view->SendInitialGeometry(); + + return HandleForView(flutter_view.release()); +} + +void* FlutterDesktopViewGetEvasObject(FlutterDesktopEngineRef engine) { + flutter::TizenViewElementary* tizenView = + (flutter::TizenViewElementary*)EngineFromHandle(engine)->view()->handle(); + return tizenView->GetEvasContainer(); +} + +void FlutterDesktopViewResizeView(FlutterDesktopEngineRef engine, + int32_t width, + int32_t height) { + flutter::TizenViewElementary* tizenView = + (flutter::TizenViewElementary*)EngineFromHandle(engine)->view()->handle(); + flutter::TizenBaseHandle::Geometry view_geometry = { + 0, + 0, + width, + height, + }; + tizenView->OnGeometryChanged(view_geometry); +} diff --git a/shell/platform/tizen/flutter_tizen_engine.cc b/shell/platform/tizen/flutter_tizen_engine.cc index d28a5b5549a96..8ffddb0a42eab 100644 --- a/shell/platform/tizen/flutter_tizen_engine.cc +++ b/shell/platform/tizen/flutter_tizen_engine.cc @@ -536,8 +536,8 @@ void FlutterTizenEngine::OnUpdateSemanticsCustomActions( bridge->GetFlutterPlatformNodeDelegateFromID(0); std::shared_ptr window = FlutterPlatformAppDelegateTizen::GetInstance().GetWindow().lock(); - TizenWindow::Geometry geometry = - engine->view_->window()->GetWindowGeometry(); + TizenBaseHandle::Geometry geometry = + engine->view_->handle()->GetRenderTargetGeometry(); window->SetGeometry(geometry.left, geometry.top, geometry.width, geometry.height); window->SetRootNode(root); diff --git a/shell/platform/tizen/flutter_tizen_view.cc b/shell/platform/tizen/flutter_tizen_view.cc index 32e04361084de..6a466ccf46b5f 100644 --- a/shell/platform/tizen/flutter_tizen_view.cc +++ b/shell/platform/tizen/flutter_tizen_view.cc @@ -40,10 +40,10 @@ const std::vector kBindableSystemKeys = { namespace flutter { -FlutterTizenView::FlutterTizenView(std::unique_ptr window) - : window_(std::move(window)) { - window_->SetView(this); - window_->BindKeys(kBindableSystemKeys); +FlutterTizenView::FlutterTizenView(std::unique_ptr handle) + : handle_(std::move(handle)) { + handle_->SetView(this); + handle_->BindKeys(kBindableSystemKeys); } FlutterTizenView::~FlutterTizenView() {} @@ -58,17 +58,17 @@ void FlutterTizenView::SetEngine(std::unique_ptr engine) { // Set up window dependent channels. BinaryMessenger* messenger = internal_plugin_registrar_->messenger(); platform_channel_ = - std::make_unique(messenger, window_.get()); - window_channel_ = std::make_unique(messenger, window_.get()); + std::make_unique(messenger, handle_.get()); + window_channel_ = std::make_unique(messenger, handle_.get()); text_input_channel_ = std::make_unique( - internal_plugin_registrar_->messenger(), window_->input_method_context()); + internal_plugin_registrar_->messenger(), handle_->input_method_context()); } void FlutterTizenView::CreateRenderSurface() { if (engine_ && engine_->renderer()) { - TizenWindow::Geometry geometry = window_->GetWindowGeometry(); - engine_->renderer()->CreateSurface(window_->GetRenderTarget(), - window_->GetRenderTargetDisplay(), + TizenBaseHandle::Geometry geometry = handle_->GetRenderTargetGeometry(); + engine_->renderer()->CreateSurface(handle_->GetRenderTarget(), + handle_->GetRenderTargetDisplay(), geometry.width, geometry.height); } } @@ -111,7 +111,7 @@ void FlutterTizenView::OnResize(int32_t left, std::swap(width, height); } - window_->ResizeRenderTargetWithRotation({left, top, width, height}, + handle_->ResizeRenderTargetWithRotation({left, top, width, height}, rotation_degree_); SendWindowMetrics(left, top, width, height, 0.0); } @@ -120,7 +120,7 @@ void FlutterTizenView::OnRotate(int32_t degree) { rotation_degree_ = degree; // Compute renderer transformation based on the angle of rotation. double rad = (360 - rotation_degree_) * M_PI / 180; - TizenWindow::Geometry geometry = window_->GetWindowGeometry(); + TizenBaseHandle::Geometry geometry = handle_->GetRenderTargetGeometry(); int32_t width = geometry.width; int32_t height = geometry.height; @@ -144,7 +144,7 @@ void FlutterTizenView::OnRotate(int32_t degree) { std::swap(width, height); } - window_->ResizeRenderTargetWithRotation( + handle_->ResizeRenderTargetWithRotation( {geometry.left, geometry.top, width, height}, rotation_degree_); // Window position does not change on rotation regardless of its orientation. @@ -252,7 +252,7 @@ void FlutterTizenView::OnCommit(const std::string& str) { } void FlutterTizenView::SendInitialGeometry() { - OnRotate(window_->GetRotation()); + OnRotate(handle_->GetRotation()); } void FlutterTizenView::SendWindowMetrics(int32_t left, @@ -268,7 +268,7 @@ void FlutterTizenView::SendWindowMetrics(int32_t left, #ifdef TV_PROFILE double dpi = 72.0; #else - double dpi = static_cast(window_->GetDpi()); + double dpi = static_cast(handle_->GetDpi()); #endif double scale_factor = dpi / 90.0 * kProfileFactor; computed_pixel_ratio = std::max(scale_factor, 1.0); @@ -288,7 +288,7 @@ void FlutterTizenView::SendFlutterPointerEvent( size_t timestamp, FlutterPointerDeviceKind device_kind, int device_id) { - TizenWindow::Geometry geometry = window_->GetWindowGeometry(); + TizenBaseHandle::Geometry geometry = handle_->GetRenderTargetGeometry(); double new_x = x, new_y = y; if (rotation_degree_ == 90) { @@ -305,8 +305,8 @@ void FlutterTizenView::SendFlutterPointerEvent( FlutterPointerEvent event = {}; event.struct_size = sizeof(event); event.phase = phase; - event.x = new_x; - event.y = new_y; + event.x = new_x - geometry.left; + event.y = new_y - geometry.top; if (delta_x != 0 || delta_y != 0) { event.signal_kind = kFlutterPointerSignalKindScroll; } diff --git a/shell/platform/tizen/flutter_tizen_view.h b/shell/platform/tizen/flutter_tizen_view.h index f31b597c85d3f..45f855d2b55c0 100644 --- a/shell/platform/tizen/flutter_tizen_view.h +++ b/shell/platform/tizen/flutter_tizen_view.h @@ -20,7 +20,7 @@ namespace flutter { class FlutterTizenView { public: - FlutterTizenView(std::unique_ptr window); + FlutterTizenView(std::unique_ptr window); ~FlutterTizenView(); @@ -30,7 +30,7 @@ class FlutterTizenView { FlutterTizenEngine* engine() { return engine_.get(); } - TizenWindow* window() { return window_.get(); } + TizenBaseHandle* handle() { return handle_.get(); } // Creates rendering surface for Flutter engine to draw into. // Should be called before calling FlutterEngineRun using this view. @@ -127,7 +127,7 @@ class FlutterTizenView { std::unique_ptr engine_; // The window associated with this view. - std::unique_ptr window_; + std::unique_ptr handle_; // The plugin registrar managing internal plugins. std::unique_ptr internal_plugin_registrar_; diff --git a/shell/platform/tizen/public/flutter_tizen.h b/shell/platform/tizen/public/flutter_tizen.h index aeba4ec9e42b9..f3661e4b19a9b 100644 --- a/shell/platform/tizen/public/flutter_tizen.h +++ b/shell/platform/tizen/public/flutter_tizen.h @@ -43,6 +43,16 @@ typedef struct { bool top_level; } FlutterDesktopWindowProperties; +// Properties for configuring the initial settings of a Flutter view. +typedef struct { + // The width of the view, or the maximum width if the value is zero. + int32_t width; + // The height of the view, or the maximum height if the value is zero. + int32_t height; + // The evas image's parent instance handle. + void* elm_parent; +} FlutterDesktopViewProperties; + // Properties for configuring a Flutter engine instance. typedef struct { // The path to the flutter_assets folder for the application to be run. @@ -135,6 +145,21 @@ FLUTTER_EXPORT FlutterDesktopViewRef FlutterDesktopViewCreateFromNewWindow( const FlutterDesktopWindowProperties& window_properties, FlutterDesktopEngineRef engine); +// Creates a view that hosts and displays the given engine instance. +FLUTTER_EXPORT FlutterDesktopViewRef FlutterDesktopViewCreateFromNewView( + const FlutterDesktopViewProperties& view_properties, + FlutterDesktopEngineRef engine, + void* elm_parent); + +// Returns a handle to evas object that the FlutterView is drawn to. +FLUTTER_EXPORT void* FlutterDesktopViewGetEvasObject( + FlutterDesktopEngineRef engine); + +// Resize the FlutterView. +FLUTTER_EXPORT void FlutterDesktopViewResizeView(FlutterDesktopEngineRef engine, + int32_t width, + int32_t height); + // ========== Plugin Registrar (extensions) ========== // Returns the window associated with this registrar's engine instance. diff --git a/shell/platform/tizen/tizen_base_handle.h b/shell/platform/tizen/tizen_base_handle.h new file mode 100644 index 0000000000000..bfa49194e3212 --- /dev/null +++ b/shell/platform/tizen/tizen_base_handle.h @@ -0,0 +1,78 @@ +// Copyright 2022 Samsung Electronics Co., Ltd. All rights reserved. +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef EMBEDDER_TIZEN_BASE_HANDLE_H_ +#define EMBEDDER_TIZEN_BASE_HANDLE_H_ + +#include +#include +#include + +#include "flutter/shell/platform/tizen/tizen_input_method_context.h" + +namespace flutter { + +class FlutterTizenView; + +class TizenBaseHandle { + public: + struct Geometry { + int32_t left = 0, top = 0, width = 0, height = 0; + }; + + TizenBaseHandle(){}; + + virtual ~TizenBaseHandle() = default; + + // Returns a valid pointer the platform object that rendering can be bound to + // by rendering backend. + virtual void* GetRenderTarget(); + + virtual void* GetRenderTargetDisplay(); + + virtual void SetPreferredOrientations(const std::vector& rotations); + + virtual uintptr_t GetWindowId(); + + virtual void* GetWindowHandle(); + + // Returns the geometry of the current render target. + virtual Geometry GetRenderTargetGeometry() = 0; + + // Set the geometry of the current render target. + virtual void SetRenderTargetGeometry(Geometry geometry) = 0; + + // Returns the geometry of the display screen. + virtual Geometry GetScreenGeometry() = 0; + + virtual int32_t GetRotation() = 0; + + // Returns the dpi of the screen. + virtual int32_t GetDpi() = 0; + + // Sets the delegate used to communicate state changes from render target to + // view such as key presses, mouse position updates etc. + void SetView(FlutterTizenView* view) { view_ = view; } + + virtual void BindKeys(const std::vector& keys) = 0; + + virtual void ResizeRenderTargetWithRotation(Geometry geometry, + int32_t degree) = 0; + + // FIXME + // This is a temporary implementation that is only used by the window channel. + virtual void OnGeometryChanged(Geometry geometry) = 0; + + virtual void Show() = 0; + + virtual TizenInputMethodContext* input_method_context() = 0; + + protected: + FlutterTizenView* view_ = nullptr; +}; + +} // namespace flutter + +#endif // EMBEDDER_TIZEN_BASE_HANDLE_H_ diff --git a/shell/platform/tizen/tizen_renderer_evas_gl.cc b/shell/platform/tizen/tizen_renderer_evas_gl.cc index 1e453dd9c7412..fa779313d9b1f 100644 --- a/shell/platform/tizen/tizen_renderer_evas_gl.cc +++ b/shell/platform/tizen/tizen_renderer_evas_gl.cc @@ -26,7 +26,7 @@ bool TizenRendererEvasGL::CreateSurface(void* render_target, int32_t width, int32_t height) { evas_gl_ = evas_gl_new( - evas_object_evas_get(static_cast(render_target))); + evas_object_evas_get(static_cast(render_target_display))); if (!evas_gl_) { FT_LOG(Error) << "Could not create an Evas GL object."; return false; diff --git a/shell/platform/tizen/tizen_view.h b/shell/platform/tizen/tizen_view.h new file mode 100644 index 0000000000000..dd663cbd0e7a5 --- /dev/null +++ b/shell/platform/tizen/tizen_view.h @@ -0,0 +1,40 @@ +// Copyright 2022 Samsung Electronics Co., Ltd. All rights reserved. +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef EMBEDDER_TIZEN_VIEW_H_ +#define EMBEDDER_TIZEN_VIEW_H_ + +#include + +#include "flutter/shell/platform/tizen/tizen_base_handle.h" + +namespace flutter { + +class FlutterTizenView; + +class TizenView : public TizenBaseHandle { + public: + TizenView(); + + void* GetWindowHandle() override { return nullptr; } + + void* GetRenderTarget() override { return nullptr; } + + int32_t GetRotation() override { return 0; }; + + void SetPreferredOrientations(const std::vector& rotations) override{}; + + virtual ~TizenView() = default; + + protected: + explicit TizenView(TizenBaseHandle::Geometry geometry) + : initial_geometry_(geometry) {} + + TizenBaseHandle::Geometry initial_geometry_ = {0, 0, 0, 0}; +}; + +} // namespace flutter + +#endif // EMBEDDER_TIZEN_VIEW_H_ diff --git a/shell/platform/tizen/tizen_view_elementary.cc b/shell/platform/tizen/tizen_view_elementary.cc new file mode 100644 index 0000000000000..f66032793367b --- /dev/null +++ b/shell/platform/tizen/tizen_view_elementary.cc @@ -0,0 +1,363 @@ +// Copyright 2022 Samsung Electronics Co., Ltd. All rights reserved. +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "tizen_view_elementary.h" + +#include "flutter/shell/platform/tizen/flutter_tizen_view.h" +#include "flutter/shell/platform/tizen/logger.h" + +#include +#include + +namespace { + +static const int kScrollDirectionVertical = 0; +static const int kScrollDirectionHorizontal = 1; +static const int kScrollOffsetMultiplier = 20; + +uint32_t EvasModifierToEcoreEventModifiers(const Evas_Modifier* evas_modifier) { + uint32_t modifiers = 0; + if (evas_key_modifier_is_set(evas_modifier, "Control")) { + modifiers |= ECORE_EVENT_MODIFIER_CTRL; + } + if (evas_key_modifier_is_set(evas_modifier, "Alt")) { + modifiers |= ECORE_EVENT_MODIFIER_ALT; + } + if (evas_key_modifier_is_set(evas_modifier, "Shift")) { + modifiers |= ECORE_EVENT_MODIFIER_SHIFT; + } + return modifiers; +} + +void EvasObjectResize(Evas_Object* object, uint32_t width, uint32_t height) { + evas_object_resize(object, width, height); + evas_object_size_hint_min_set(object, width, height); + evas_object_size_hint_max_set(object, width, height); +} + +} // namespace + +namespace flutter { + +TizenViewElementary::TizenViewElementary(TizenBaseHandle::Geometry geometry, + Evas_Object* elm_parent) + : TizenView(geometry), elm_parent_(elm_parent) { + if (!CreateView()) { + FT_LOG(Error) << "Failed to create a platform view."; + return; + } + + RegisterEventHandlers(); + PrepareInputMethod(); + Show(); +} + +TizenViewElementary::~TizenViewElementary() { + UnregisterEventHandlers(); +} + +bool TizenViewElementary::CreateView() { + elm_config_accel_preference_set("hw:opengl"); + + Ecore_Evas* ecore_evas = + ecore_evas_ecore_evas_get(evas_object_evas_get(elm_parent_)); + + int32_t elm_parent_width, elm_parent_height; + evas_object_geometry_get(elm_parent_, nullptr, nullptr, &elm_parent_width, + &elm_parent_height); + + if (initial_geometry_.width == 0) { + initial_geometry_.width = elm_parent_width; + } + if (initial_geometry_.height == 0) { + initial_geometry_.height = elm_parent_height; + } + + int32_t ecore_evas_width, ecore_evas_height; + ecore_evas_screen_geometry_get(ecore_evas, nullptr, nullptr, + &ecore_evas_width, &ecore_evas_height); + if (ecore_evas_width == 0 || ecore_evas_height == 0) { + FT_LOG(Error) << "Invalid screen size: " << ecore_evas_width << " x " + << ecore_evas_height; + return false; + } + + if (initial_geometry_.width == 0) { + initial_geometry_.width = ecore_evas_width; + } + if (initial_geometry_.height == 0) { + initial_geometry_.height = ecore_evas_height; + } + + container_ = elm_table_add(elm_parent_); + EvasObjectResize(container_, initial_geometry_.width, + initial_geometry_.height); + evas_object_size_hint_weight_set(container_, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(container_, EVAS_HINT_FILL, EVAS_HINT_FILL); + + image_ = evas_object_image_filled_add(evas_object_evas_get(container_)); + EvasObjectResize(image_, initial_geometry_.width, initial_geometry_.height); + evas_object_image_size_set(image_, initial_geometry_.width, + initial_geometry_.height); + evas_object_image_alpha_set(image_, EINA_TRUE); + elm_table_pack(container_, image_, 0, 0, 1, 1); + + // FIXME: Button widgets can receive both mouse events and key events. But the + // button widget is temporary. It should be changed to the appropriate object + // that can be used as event layer. + event_layer_ = elm_button_add(container_); + elm_object_style_set(event_layer_, "transparent"); + evas_object_color_set(event_layer_, 0, 0, 0, 0); + EvasObjectResize(event_layer_, initial_geometry_.width, + initial_geometry_.height); + elm_table_pack(container_, event_layer_, 0, 0, 1, 1); + + if (!image_) { + return false; + } + + return true; +} + +void TizenViewElementary::RegisterEventHandlers() { + evas_object_callbacks_[EVAS_CALLBACK_MOUSE_DOWN] = + [](void* data, Evas* evas, Evas_Object* object, void* event_info) { + auto* self = reinterpret_cast(data); + if (self->view_) { + if (self->event_layer_ == object) { + auto* mouse_event = + reinterpret_cast(event_info); + self->view_->OnPointerDown( + mouse_event->canvas.x, mouse_event->canvas.y, + mouse_event->timestamp, kFlutterPointerDeviceKindTouch, + mouse_event->button); + } + } + }; + evas_object_event_callback_add( + event_layer_, EVAS_CALLBACK_MOUSE_DOWN, + evas_object_callbacks_[EVAS_CALLBACK_MOUSE_DOWN], this); + + evas_object_callbacks_[EVAS_CALLBACK_MOUSE_UP] = [](void* data, Evas* evas, + Evas_Object* object, + void* event_info) { + auto* self = reinterpret_cast(data); + if (self->view_) { + if (self->event_layer_ == object) { + auto* mouse_event = reinterpret_cast(event_info); + self->view_->OnPointerUp(mouse_event->canvas.x, mouse_event->canvas.y, + mouse_event->timestamp, + kFlutterPointerDeviceKindTouch, + mouse_event->button); + } + } + }; + evas_object_event_callback_add(event_layer_, EVAS_CALLBACK_MOUSE_UP, + evas_object_callbacks_[EVAS_CALLBACK_MOUSE_UP], + this); + + evas_object_callbacks_[EVAS_CALLBACK_MOUSE_MOVE] = + [](void* data, Evas* evas, Evas_Object* object, void* event_info) { + auto* self = reinterpret_cast(data); + if (self->view_) { + if (self->event_layer_ == object) { + auto* mouse_event = + reinterpret_cast(event_info); + mouse_event->event_flags = (Evas_Event_Flags)( + mouse_event->event_flags & EVAS_EVENT_FLAG_ON_HOLD); + self->view_->OnPointerMove( + mouse_event->cur.canvas.x, mouse_event->cur.canvas.y, + mouse_event->timestamp, kFlutterPointerDeviceKindTouch, + mouse_event->buttons); + } + } + }; + evas_object_event_callback_add( + event_layer_, EVAS_CALLBACK_MOUSE_MOVE, + evas_object_callbacks_[EVAS_CALLBACK_MOUSE_MOVE], this); + + evas_object_callbacks_[EVAS_CALLBACK_MOUSE_WHEEL] = [](void* data, Evas* evas, + Evas_Object* object, + void* event_info) { + auto* self = reinterpret_cast(data); + if (self->view_) { + if (self->event_layer_ == object) { + auto* wheel_event = + reinterpret_cast(event_info); + double delta_x = 0.0; + double delta_y = 0.0; + + if (wheel_event->direction == kScrollDirectionVertical) { + delta_y += wheel_event->z; + } else if (wheel_event->direction == kScrollDirectionHorizontal) { + delta_x += wheel_event->z; + } + + self->view_->OnScroll(wheel_event->x, wheel_event->y, delta_x, delta_y, + kScrollOffsetMultiplier, wheel_event->timestamp, + kFlutterPointerDeviceKindTouch, 0); + } + } + }; + evas_object_event_callback_add( + event_layer_, EVAS_CALLBACK_MOUSE_WHEEL, + evas_object_callbacks_[EVAS_CALLBACK_MOUSE_WHEEL], this); + + evas_object_callbacks_[EVAS_CALLBACK_KEY_DOWN] = [](void* data, Evas* evas, + Evas_Object* object, + void* event_info) { + auto* self = reinterpret_cast(data); + if (self->view_) { + if (self->event_layer_ == object) { + auto* key_event = reinterpret_cast(event_info); + int handled = false; + key_event->event_flags = EVAS_EVENT_FLAG_ON_HOLD; + if (self->input_method_context_->IsInputPanelShown()) { + handled = + self->input_method_context_->HandleEvasEventKeyDown(key_event); + } + if (!handled) { + self->view_->OnKey( + key_event->key, key_event->string, key_event->compose, + EvasModifierToEcoreEventModifiers(key_event->modifiers), + key_event->keycode, true); + } + } + } + }; + evas_object_event_callback_add(event_layer_, EVAS_CALLBACK_KEY_DOWN, + evas_object_callbacks_[EVAS_CALLBACK_KEY_DOWN], + this); + + evas_object_callbacks_[EVAS_CALLBACK_KEY_UP] = + [](void* data, Evas* evas, Evas_Object* object, void* event_info) { + auto* self = reinterpret_cast(data); + if (self->view_) { + if (self->event_layer_ == object) { + auto* key_event = reinterpret_cast(event_info); + int handled = false; + key_event->event_flags = EVAS_EVENT_FLAG_ON_HOLD; + if (self->input_method_context_->IsInputPanelShown()) { + handled = + self->input_method_context_->HandleEvasEventKeyUp(key_event); + } + if (!handled) { + self->view_->OnKey( + key_event->key, key_event->string, key_event->compose, + EvasModifierToEcoreEventModifiers(key_event->modifiers), + key_event->keycode, false); + } + } + } + }; + evas_object_event_callback_add(event_layer_, EVAS_CALLBACK_KEY_UP, + evas_object_callbacks_[EVAS_CALLBACK_KEY_UP], + this); +} + +void TizenViewElementary::UnregisterEventHandlers() { + evas_object_event_callback_del( + image_, EVAS_CALLBACK_MOUSE_DOWN, + evas_object_callbacks_[EVAS_CALLBACK_MOUSE_DOWN]); + evas_object_event_callback_del( + image_, EVAS_CALLBACK_MOUSE_UP, + evas_object_callbacks_[EVAS_CALLBACK_MOUSE_UP]); + evas_object_event_callback_del( + image_, EVAS_CALLBACK_MOUSE_MOVE, + evas_object_callbacks_[EVAS_CALLBACK_MOUSE_MOVE]); + evas_object_event_callback_del( + image_, EVAS_CALLBACK_MOUSE_WHEEL, + evas_object_callbacks_[EVAS_CALLBACK_MOUSE_WHEEL]); + evas_object_event_callback_del( + container_, EVAS_CALLBACK_KEY_DOWN, + evas_object_callbacks_[EVAS_CALLBACK_KEY_DOWN]); + evas_object_event_callback_del(container_, EVAS_CALLBACK_KEY_UP, + evas_object_callbacks_[EVAS_CALLBACK_KEY_UP]); +} + +TizenBaseHandle::Geometry TizenViewElementary::GetRenderTargetGeometry() { + Geometry result; + evas_object_geometry_get(image_, &result.left, &result.top, &result.width, + &result.height); + return result; +} + +void TizenViewElementary::SetRenderTargetGeometry(Geometry geometry) { + evas_object_resize(image_, geometry.width, geometry.height); + evas_object_size_hint_min_set(image_, geometry.width, geometry.height); + evas_object_size_hint_max_set(image_, geometry.width, geometry.height); + evas_object_move(image_, geometry.left, geometry.top); +} + +TizenBaseHandle::Geometry TizenViewElementary::GetScreenGeometry() { + Geometry result; + evas_object_geometry_get(image_, &result.left, &result.top, &result.width, + &result.height); + return result; +} + +int32_t TizenViewElementary::GetDpi() { + Ecore_Evas* ecore_evas = + ecore_evas_ecore_evas_get(evas_object_evas_get(image_)); + int32_t xdpi, ydpi; + ecore_evas_screen_dpi_get(ecore_evas, &xdpi, &ydpi); + return xdpi; +} + +uintptr_t TizenViewElementary::GetWindowId() { + return ecore_evas_window_get( + ecore_evas_ecore_evas_get(evas_object_evas_get(image_))); +} + +void TizenViewElementary::ResizeRenderTargetWithRotation(Geometry geometry, + int32_t angle) { + TizenRendererEvasGL* renderer_evas_gl = + reinterpret_cast(view_->engine()->renderer()); + renderer_evas_gl->ResizeSurface(geometry.width, geometry.height); +} + +void TizenViewElementary::BindKeys(const std::vector& keys) { + // Views do not need to have window info. + // However, it is necessary to bind a special key for each profile(in this + // case). This part is modified after refactoring related to the key event + // code. + Evas_Object* elm_win = (Evas_Object*)ecore_evas_data_get( + ecore_evas_ecore_evas_get(evas_object_evas_get(image_)), "elm_win"); + if (elm_win) { + for (const std::string& key : keys) { + eext_win_keygrab_set(elm_win, key.c_str()); + } + } +} + +void TizenViewElementary::Show() { + evas_object_show(container_); + evas_object_show(image_); + evas_object_show(event_layer_); +} + +void TizenViewElementary::OnGeometryChanged(Geometry geometry) { + SetRenderTargetGeometry(geometry); + view_->OnResize(geometry.left, geometry.top, geometry.width, geometry.height); +} + +void TizenViewElementary::PrepareInputMethod() { + input_method_context_ = + std::make_unique(GetWindowId()); + + // Set input method callbacks. + input_method_context_->SetOnPreeditStart( + [this]() { view_->OnComposeBegin(); }); + input_method_context_->SetOnPreeditChanged( + [this](std::string str, int cursor_pos) { + view_->OnComposeChange(str, cursor_pos); + }); + input_method_context_->SetOnPreeditEnd([this]() { view_->OnComposeEnd(); }); + input_method_context_->SetOnCommit( + [this](std::string str) { view_->OnCommit(str); }); +} + +} // namespace flutter diff --git a/shell/platform/tizen/tizen_view_elementary.h b/shell/platform/tizen/tizen_view_elementary.h new file mode 100644 index 0000000000000..2064ba98342af --- /dev/null +++ b/shell/platform/tizen/tizen_view_elementary.h @@ -0,0 +1,77 @@ +// Copyright 2022 Samsung Electronics Co., Ltd. All rights reserved. +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef EMBEDDER_TIZEN_VIEW_ELEMENTARY_H_ +#define EMBEDDER_TIZEN_VIEW_ELEMENTARY_H_ + +#include "flutter/shell/platform/tizen/tizen_view.h" + +#define EFL_BETA_API_SUPPORT +#include +#include + +#include + +namespace flutter { + +class TizenViewElementary : public TizenView { + public: + TizenViewElementary(TizenBaseHandle::Geometry geometry, + Evas_Object* elm_parent); + + ~TizenViewElementary(); + + Geometry GetRenderTargetGeometry() override; + + void SetRenderTargetGeometry(Geometry geometry) override; + + Geometry GetScreenGeometry() override; + + void* GetRenderTargetDisplay() override { return image_; } + + void* GetEvasContainer() { return container_; } + + int32_t GetDpi() override; + + uintptr_t GetWindowId() override; + + void ResizeRenderTargetWithRotation(Geometry geometry, + int32_t angle) override; + + void BindKeys(const std::vector& keys) override; + + void Show() override; + + void OnGeometryChanged(Geometry geometry) override; + + TizenInputMethodContext* input_method_context() override { + return input_method_context_.get(); + } + + private: + bool CreateView(); + + void RegisterEventHandlers(); + + void UnregisterEventHandlers(); + + void PrepareInputMethod(); + + Evas_Object* elm_parent_ = nullptr; + Evas_Object* image_ = nullptr; + Evas_Object* event_layer_ = nullptr; + Evas_Object* container_ = nullptr; + + std::unordered_map + evas_object_callbacks_; + std::vector ecore_event_key_handlers_; + + // The Tizen input method context. nullptr if not set. + std::unique_ptr input_method_context_; +}; + +} // namespace flutter + +#endif // EMBEDDER_TIZEN_VIEW_ELEMENTARY_H_ diff --git a/shell/platform/tizen/tizen_window.h b/shell/platform/tizen/tizen_window.h index a058e2684b71c..41624fdf99b94 100644 --- a/shell/platform/tizen/tizen_window.h +++ b/shell/platform/tizen/tizen_window.h @@ -10,67 +10,19 @@ #include #include -#include "flutter/shell/platform/tizen/tizen_input_method_context.h" +#include "flutter/shell/platform/tizen/tizen_base_handle.h" namespace flutter { class FlutterTizenView; -class TizenWindow { +class TizenWindow : public TizenBaseHandle { public: - struct Geometry { - int32_t left = 0, top = 0, width = 0, height = 0; - }; - + TizenWindow(); virtual ~TizenWindow() = default; - // Sets the delegate used to communicate state changes from window to view - // such as key presses, mouse position updates etc. - void SetView(FlutterTizenView* view) { view_ = view; } - - // Returns the geometry of the current window. - virtual Geometry GetWindowGeometry() = 0; - - // Set the geometry of the current window. - virtual void SetWindowGeometry(Geometry geometry) = 0; - - // Returns the geometry of the display screen. - virtual Geometry GetScreenGeometry() = 0; - - // Returns a valid pointer the platform object that rendering can be bound to - // by rendering backend. - virtual void* GetRenderTarget() = 0; - - virtual void* GetRenderTargetDisplay() = 0; - - virtual int32_t GetRotation() = 0; - - // Returns the dpi of the screen. - virtual int32_t GetDpi() = 0; - - virtual uintptr_t GetWindowId() = 0; - - virtual void* GetWindowHandle() = 0; - - virtual void ResizeRenderTargetWithRotation(Geometry geometry, - int32_t degree) = 0; - - virtual void SetPreferredOrientations(const std::vector& rotations) = 0; - - virtual void BindKeys(const std::vector& keys) = 0; - - virtual void Show() = 0; - - // FIXME - // This is a temporary implementation that is only used by the window channel. - virtual void OnGeometryChanged(Geometry geometry) = 0; - - TizenInputMethodContext* input_method_context() { - return input_method_context_.get(); - } - protected: - explicit TizenWindow(Geometry geometry, + explicit TizenWindow(TizenBaseHandle::Geometry geometry, bool transparent, bool focusable, bool top_level) @@ -79,15 +31,10 @@ class TizenWindow { focusable_(focusable), top_level_(top_level) {} - Geometry initial_geometry_ = {0, 0, 0, 0}; + TizenBaseHandle::Geometry initial_geometry_ = {0, 0, 0, 0}; bool transparent_ = false; bool focusable_ = false; bool top_level_ = false; - - FlutterTizenView* view_ = nullptr; - - // The Tizen input method context. nullptr if not set. - std::unique_ptr input_method_context_; }; } // namespace flutter diff --git a/shell/platform/tizen/tizen_window_ecore_wl2.cc b/shell/platform/tizen/tizen_window_ecore_wl2.cc index e1aef82ca21b6..43bf79f092a68 100644 --- a/shell/platform/tizen/tizen_window_ecore_wl2.cc +++ b/shell/platform/tizen/tizen_window_ecore_wl2.cc @@ -198,7 +198,7 @@ void TizenWindowEcoreWl2::RegisterEventHandlers() { if (rotation_event->win == self->GetWindowId()) { int32_t degree = rotation_event->angle; self->view_->OnRotate(degree); - Geometry geometry = self->GetWindowGeometry(); + Geometry geometry = self->GetRenderTargetGeometry(); ecore_wl2_window_rotation_change_done_send( self->ecore_wl2_window_, rotation_event->rotation, geometry.width, geometry.height); @@ -381,14 +381,14 @@ void TizenWindowEcoreWl2::DestroyWindow() { ecore_wl2_shutdown(); } -TizenWindow::Geometry TizenWindowEcoreWl2::GetWindowGeometry() { +TizenBaseHandle::Geometry TizenWindowEcoreWl2::GetRenderTargetGeometry() { Geometry result; ecore_wl2_window_geometry_get(ecore_wl2_window_, &result.left, &result.top, &result.width, &result.height); return result; } -void TizenWindowEcoreWl2::SetWindowGeometry(Geometry geometry) { +void TizenWindowEcoreWl2::SetRenderTargetGeometry(Geometry geometry) { ecore_wl2_window_geometry_set(ecore_wl2_window_, geometry.left, geometry.top, geometry.width, geometry.height); // FIXME: The changes set in `ecore_wl2_window_geometry_set` seems to apply @@ -397,7 +397,7 @@ void TizenWindowEcoreWl2::SetWindowGeometry(Geometry geometry) { ecore_wl2_window_position_set(ecore_wl2_window_, geometry.left, geometry.top); } -TizenWindow::Geometry TizenWindowEcoreWl2::GetScreenGeometry() { +TizenBaseHandle::Geometry TizenWindowEcoreWl2::GetScreenGeometry() { Geometry result = {}; ecore_wl2_display_screen_size_get(ecore_wl2_display_, &result.width, &result.height); @@ -448,7 +448,7 @@ void TizenWindowEcoreWl2::Show() { void TizenWindowEcoreWl2::OnGeometryChanged(Geometry geometry) { // This implementation mimics the situation in which the handler of // ECORE_WL2_EVENT_WINDOW_CONFIGURE is called. - SetWindowGeometry(geometry); + SetRenderTargetGeometry(geometry); view_->OnResize(geometry.left, geometry.top, geometry.width, geometry.height); } diff --git a/shell/platform/tizen/tizen_window_ecore_wl2.h b/shell/platform/tizen/tizen_window_ecore_wl2.h index 8b4f88fe10dc6..60c10e2c19798 100644 --- a/shell/platform/tizen/tizen_window_ecore_wl2.h +++ b/shell/platform/tizen/tizen_window_ecore_wl2.h @@ -6,6 +6,7 @@ #ifndef EMBEDDER_TIZEN_WINDOW_ECORE_WL2_H_ #define EMBEDDER_TIZEN_WINDOW_ECORE_WL2_H_ +#include "flutter/shell/platform/tizen/tizen_base_handle.h" #include "flutter/shell/platform/tizen/tizen_window.h" #define EFL_BETA_API_SUPPORT @@ -16,16 +17,16 @@ namespace flutter { class TizenWindowEcoreWl2 : public TizenWindow { public: - TizenWindowEcoreWl2(Geometry geometry, + TizenWindowEcoreWl2(TizenBaseHandle::Geometry geometry, bool transparent, bool focusable, bool top_level); ~TizenWindowEcoreWl2(); - Geometry GetWindowGeometry() override; + Geometry GetRenderTargetGeometry() override; - void SetWindowGeometry(Geometry geometry) override; + void SetRenderTargetGeometry(Geometry geometry) override; Geometry GetScreenGeometry() override; @@ -52,6 +53,10 @@ class TizenWindowEcoreWl2 : public TizenWindow { void OnGeometryChanged(Geometry geometry) override; + TizenInputMethodContext* input_method_context() override { + return input_method_context_.get(); + } + private: bool CreateWindow(); @@ -77,6 +82,9 @@ class TizenWindowEcoreWl2 : public TizenWindow { std::vector ecore_event_handlers_; tizen_policy* tizen_policy_ = nullptr; + + // The Tizen input method context. nullptr if not set. + std::unique_ptr input_method_context_; }; } // namespace flutter diff --git a/shell/platform/tizen/tizen_window_elementary.cc b/shell/platform/tizen/tizen_window_elementary.cc index c3e3341befb66..b8dffd9445f01 100644 --- a/shell/platform/tizen/tizen_window_elementary.cc +++ b/shell/platform/tizen/tizen_window_elementary.cc @@ -35,7 +35,7 @@ uint32_t EvasModifierToEcoreEventModifiers(const Evas_Modifier* evas_modifier) { namespace flutter { -TizenWindowElementary::TizenWindowElementary(Geometry geometry, +TizenWindowElementary::TizenWindowElementary(TizenBaseHandle::Geometry geometry, bool transparent, bool focusable, bool top_level) @@ -305,7 +305,7 @@ void TizenWindowElementary::UnregisterEventHandlers() { evas_object_callbacks_[EVAS_CALLBACK_KEY_UP]); } -TizenWindow::Geometry TizenWindowElementary::GetWindowGeometry() { +TizenBaseHandle::Geometry TizenWindowElementary::GetRenderTargetGeometry() { // FIXME : evas_object_geometry_get() and ecore_wl2_window_geometry_get() are // not equivalent. Geometry result; @@ -314,7 +314,7 @@ TizenWindow::Geometry TizenWindowElementary::GetWindowGeometry() { return result; } -void TizenWindowElementary::SetWindowGeometry(Geometry geometry) { +void TizenWindowElementary::SetRenderTargetGeometry(Geometry geometry) { evas_object_resize(elm_win_, geometry.width, geometry.height); evas_object_move(elm_win_, geometry.left, geometry.top); @@ -322,7 +322,7 @@ void TizenWindowElementary::SetWindowGeometry(Geometry geometry) { evas_object_move(image_, geometry.left, geometry.top); } -TizenWindow::Geometry TizenWindowElementary::GetScreenGeometry() { +TizenBaseHandle::Geometry TizenWindowElementary::GetScreenGeometry() { Geometry result; Ecore_Evas* ecore_evas = ecore_evas_ecore_evas_get(evas_object_evas_get(elm_win_)); @@ -374,7 +374,7 @@ void TizenWindowElementary::Show() { } void TizenWindowElementary::OnGeometryChanged(Geometry geometry) { - SetWindowGeometry(geometry); + SetRenderTargetGeometry(geometry); view_->OnResize(geometry.left, geometry.top, geometry.width, geometry.height); } diff --git a/shell/platform/tizen/tizen_window_elementary.h b/shell/platform/tizen/tizen_window_elementary.h index ac3fa9fcb4aeb..c9c84e249f2c9 100644 --- a/shell/platform/tizen/tizen_window_elementary.h +++ b/shell/platform/tizen/tizen_window_elementary.h @@ -16,16 +16,16 @@ namespace flutter { class TizenWindowElementary : public TizenWindow { public: - TizenWindowElementary(Geometry geometry, + TizenWindowElementary(TizenBaseHandle::Geometry geometry, bool transparent, bool focusable, bool top_level); ~TizenWindowElementary(); - Geometry GetWindowGeometry() override; + Geometry GetRenderTargetGeometry() override; - void SetWindowGeometry(Geometry geometry) override; + void SetRenderTargetGeometry(Geometry geometry) override; Geometry GetScreenGeometry() override; @@ -52,6 +52,10 @@ class TizenWindowElementary : public TizenWindow { void OnGeometryChanged(Geometry geometry) override; + TizenInputMethodContext* input_method_context() override { + return input_method_context_.get(); + } + private: bool CreateWindow(); @@ -71,6 +75,9 @@ class TizenWindowElementary : public TizenWindow { Evas_Smart_Cb rotation_changed_callback_; std::unordered_map evas_object_callbacks_; + + // The Tizen input method context. nullptr if not set. + std::unique_ptr input_method_context_; }; } // namespace flutter From 311e6b01e980ad77b8724e92c59214f6a4d95a51 Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Fri, 3 Jun 2022 14:53:51 +0900 Subject: [PATCH 02/14] Change class name TizenBaseHandle to TizenViewBase --- .../tizen/channels/platform_channel.cc | 16 +++--- .../tizen/channels/platform_channel.h | 8 +-- .../platform/tizen/channels/window_channel.cc | 12 ++--- .../platform/tizen/channels/window_channel.h | 8 +-- shell/platform/tizen/flutter_tizen.cc | 7 ++- shell/platform/tizen/flutter_tizen_ecore.cc | 10 ++-- .../tizen/flutter_tizen_elementary.cc | 26 +++++---- shell/platform/tizen/flutter_tizen_engine.cc | 4 +- shell/platform/tizen/flutter_tizen_view.cc | 53 +++++++++++------- shell/platform/tizen/flutter_tizen_view.h | 6 +-- shell/platform/tizen/public/flutter_tizen.h | 12 ++--- shell/platform/tizen/tizen_view.h | 18 +++---- ...{tizen_base_handle.h => tizen_view_base.h} | 12 ++--- shell/platform/tizen/tizen_view_elementary.cc | 54 ++++++++----------- shell/platform/tizen/tizen_view_elementary.h | 11 ++-- shell/platform/tizen/tizen_window.h | 16 ++++-- .../platform/tizen/tizen_window_ecore_wl2.cc | 4 +- shell/platform/tizen/tizen_window_ecore_wl2.h | 4 +- .../platform/tizen/tizen_window_elementary.cc | 6 +-- .../platform/tizen/tizen_window_elementary.h | 2 +- 20 files changed, 149 insertions(+), 140 deletions(-) rename shell/platform/tizen/{tizen_base_handle.h => tizen_view_base.h} (89%) diff --git a/shell/platform/tizen/channels/platform_channel.cc b/shell/platform/tizen/channels/platform_channel.cc index 9bcc1376f9c73..5672bd73ef908 100644 --- a/shell/platform/tizen/channels/platform_channel.cc +++ b/shell/platform/tizen/channels/platform_channel.cc @@ -58,12 +58,12 @@ std::string text_clipboard = ""; } // namespace PlatformChannel::PlatformChannel(BinaryMessenger* messenger, - TizenBaseHandle* handle) + TizenWindow* window) : channel_(std::make_unique>( messenger, kChannelName, &JsonMethodCodec::GetInstance())), - handle_(handle) { + window_(window) { channel_->SetMethodCallHandler( [this](const MethodCall& call, std::unique_ptr> result) { @@ -164,13 +164,13 @@ void PlatformChannel::HapticFeedbackVibrate(const std::string& feedback_type) { } void PlatformChannel::RestoreSystemUiOverlays() { - if (!handle_) { + if (!window_) { return; } #ifdef COMMON_PROFILE auto& shell = TizenShell::GetInstance(); - shell.InitializeSoftkey(handle_->GetWindowId()); + shell.InitializeSoftkey(window_->GetWindowId()); if (shell.IsSoftkeyShown()) { shell.ShowSoftkey(); @@ -182,13 +182,13 @@ void PlatformChannel::RestoreSystemUiOverlays() { void PlatformChannel::SetEnabledSystemUiOverlays( const std::vector& overlays) { - if (!handle_) { + if (!window_) { return; } #ifdef COMMON_PROFILE auto& shell = TizenShell::GetInstance(); - shell.InitializeSoftkey(handle_->GetWindowId()); + shell.InitializeSoftkey(window_->GetWindowId()); if (std::find(overlays.begin(), overlays.end(), kSystemUiOverlayBottom) != overlays.end()) { @@ -201,7 +201,7 @@ void PlatformChannel::SetEnabledSystemUiOverlays( void PlatformChannel::SetPreferredOrientations( const std::vector& orientations) { - if (!handle_) { + if (!window_) { return; } @@ -220,7 +220,7 @@ void PlatformChannel::SetPreferredOrientations( // default. rotations = {0, 90, 180, 270}; } - handle_->SetPreferredOrientations(rotations); + window_->SetPreferredOrientations(rotations); } } // namespace flutter diff --git a/shell/platform/tizen/channels/platform_channel.h b/shell/platform/tizen/channels/platform_channel.h index 29862eda7c14b..4e11fdd5ca7af 100644 --- a/shell/platform/tizen/channels/platform_channel.h +++ b/shell/platform/tizen/channels/platform_channel.h @@ -11,14 +11,14 @@ #include "flutter/shell/platform/common/client_wrapper/include/flutter/binary_messenger.h" #include "flutter/shell/platform/common/client_wrapper/include/flutter/method_channel.h" -#include "flutter/shell/platform/tizen/tizen_base_handle.h" +#include "flutter/shell/platform/tizen/tizen_window.h" #include "rapidjson/document.h" namespace flutter { class PlatformChannel { public: - explicit PlatformChannel(BinaryMessenger* messenger, TizenBaseHandle* handle); + explicit PlatformChannel(BinaryMessenger* messenger, TizenWindow* window); virtual ~PlatformChannel(); private: @@ -35,9 +35,9 @@ class PlatformChannel { std::unique_ptr> channel_; - // A reference to the base handle object managed by FlutterTizenView. + // A reference to the window object managed by FlutterTizenView. // This can be nullptr if the engine is running in headless mode. - TizenBaseHandle* handle_; + TizenWindow* window_; }; } // namespace flutter diff --git a/shell/platform/tizen/channels/window_channel.cc b/shell/platform/tizen/channels/window_channel.cc index 6de35db758a07..0ced3abad2ec1 100644 --- a/shell/platform/tizen/channels/window_channel.cc +++ b/shell/platform/tizen/channels/window_channel.cc @@ -17,8 +17,8 @@ constexpr char kChannelName[] = "tizen/internal/window"; } // namespace WindowChannel::WindowChannel(BinaryMessenger* messenger, - TizenBaseHandle* handle) - : handle_(handle) { + TizenWindow* window) + : window_(window) { channel_ = std::make_unique>( messenger, kChannelName, &StandardMethodCodec::GetInstance()); channel_->SetMethodCallHandler( @@ -36,7 +36,7 @@ void WindowChannel::HandleMethodCall( const std::string& method_name = method_call.method_name(); if (method_name == "getWindowGeometry") { - TizenBaseHandle::Geometry geometry = handle_->GetRenderTargetGeometry(); + TizenViewBase::Geometry geometry = window_->GetRenderTargetGeometry(); EncodableMap map; map[EncodableValue("x")] = EncodableValue(geometry.left); map[EncodableValue("y")] = EncodableValue(geometry.top); @@ -58,11 +58,11 @@ void WindowChannel::HandleMethodCall( EncodableValueHolder width(arguments, "width"); EncodableValueHolder height(arguments, "height"); - TizenBaseHandle::Geometry geometry = handle_->GetRenderTargetGeometry(); + TizenViewBase::Geometry geometry = window_->GetRenderTargetGeometry(); // FIXME: Use SetWindowGeometry() instead of OnGeometryChanged() // After the SetWindowGeometry was successfully executed, I expected a // handler of ECORE_WL2_EVENT_WINDOW_CONFIGURE to be called, but it didn't. - handle_->OnGeometryChanged({ + window_->OnGeometryChanged({ x ? *x : geometry.left, y ? *y : geometry.top, width ? *width : geometry.width, @@ -71,7 +71,7 @@ void WindowChannel::HandleMethodCall( result->Success(); #endif } else if (method_name == "getScreenGeometry") { - TizenBaseHandle::Geometry geometry = handle_->GetScreenGeometry(); + TizenViewBase::Geometry geometry = window_->GetScreenGeometry(); EncodableMap map; map[EncodableValue("width")] = EncodableValue(geometry.width); map[EncodableValue("height")] = EncodableValue(geometry.height); diff --git a/shell/platform/tizen/channels/window_channel.h b/shell/platform/tizen/channels/window_channel.h index 6e64959ffbbb2..a0cf1f39dbcef 100644 --- a/shell/platform/tizen/channels/window_channel.h +++ b/shell/platform/tizen/channels/window_channel.h @@ -10,14 +10,14 @@ #include "flutter/shell/platform/common/client_wrapper/include/flutter/binary_messenger.h" #include "flutter/shell/platform/common/client_wrapper/include/flutter/encodable_value.h" #include "flutter/shell/platform/common/client_wrapper/include/flutter/method_channel.h" -#include "flutter/shell/platform/tizen/tizen_base_handle.h" +#include "flutter/shell/platform/tizen/tizen_window.h" namespace flutter { // Channel to get/set application's window size and device's screen size. class WindowChannel { public: - explicit WindowChannel(BinaryMessenger* messenger, TizenBaseHandle* window); + explicit WindowChannel(BinaryMessenger* messenger, TizenWindow* window); virtual ~WindowChannel(); private: @@ -26,8 +26,8 @@ class WindowChannel { std::unique_ptr> channel_; - // A reference to the renderer object managed by FlutterTizenView. - TizenBaseHandle* handle_; + // A reference to the renderer object managed by FlutterTizenView.s + TizenWindow* window_; }; } // namespace flutter diff --git a/shell/platform/tizen/flutter_tizen.cc b/shell/platform/tizen/flutter_tizen.cc index df4b42a745e78..2cc0fe6a99b82 100644 --- a/shell/platform/tizen/flutter_tizen.cc +++ b/shell/platform/tizen/flutter_tizen.cc @@ -71,7 +71,12 @@ void FlutterDesktopEngineShutdown(FlutterDesktopEngineRef engine_ref) { void* FlutterDesktopPluginRegistrarGetNativeWindow( FlutterDesktopPluginRegistrarRef registrar) { - return registrar->engine->view()->handle()->GetWindowHandle(); + auto view_base = registrar->engine->view()->tizen_view(); + if (view_base->GetType() == "window") { + auto window = reinterpret_cast(view_base); + return window->GetWindowHandle(); + } + return nullptr; } void FlutterDesktopPluginRegistrarEnableInputBlocking( diff --git a/shell/platform/tizen/flutter_tizen_ecore.cc b/shell/platform/tizen/flutter_tizen_ecore.cc index 84f504502969a..d3734242591bd 100644 --- a/shell/platform/tizen/flutter_tizen_ecore.cc +++ b/shell/platform/tizen/flutter_tizen_ecore.cc @@ -24,7 +24,7 @@ FlutterDesktopViewRef HandleForView(flutter::FlutterTizenView* view) { FlutterDesktopViewRef FlutterDesktopViewCreateFromNewWindow( const FlutterDesktopWindowProperties& window_properties, FlutterDesktopEngineRef engine) { - flutter::TizenBaseHandle::Geometry window_geometry = { + flutter::TizenViewBase::Geometry window_geometry = { window_properties.x, window_properties.y, window_properties.width, @@ -53,21 +53,21 @@ FlutterDesktopViewRef FlutterDesktopViewCreateFromNewWindow( return HandleForView(view.release()); } -FlutterDesktopViewRef FlutterDesktopViewCreateFromNewView( +FlutterDesktopViewRef FlutterDesktopViewCreateFromElmParent( const FlutterDesktopViewProperties& view_properties, FlutterDesktopEngineRef engine, - void* elm_parent) { + void* parent) { // Not supported. return nullptr; } -void* FlutterDesktopViewGetEvasObject(FlutterDesktopEngineRef engine) { +void* FlutterDesktopViewGetEvasObject(FlutterDesktopViewRef view) { // Not supported. return nullptr; } -void FlutterDesktopViewResizeView(FlutterDesktopEngineRef engine, +void FlutterDesktopViewResizeView(FlutterDesktopViewRef view, int32_t width, int32_t height) { // Not supported. diff --git a/shell/platform/tizen/flutter_tizen_elementary.cc b/shell/platform/tizen/flutter_tizen_elementary.cc index fae38cd60e17a..a483a0128f819 100644 --- a/shell/platform/tizen/flutter_tizen_elementary.cc +++ b/shell/platform/tizen/flutter_tizen_elementary.cc @@ -25,7 +25,7 @@ FlutterDesktopViewRef HandleForView(flutter::FlutterTizenView* view) { FlutterDesktopViewRef FlutterDesktopViewCreateFromNewWindow( const FlutterDesktopWindowProperties& window_properties, FlutterDesktopEngineRef engine) { - flutter::TizenBaseHandle::Geometry window_geometry = { + flutter::TizenViewBase::Geometry window_geometry = { window_properties.x, window_properties.y, window_properties.width, @@ -54,20 +54,20 @@ FlutterDesktopViewRef FlutterDesktopViewCreateFromNewWindow( return HandleForView(view.release()); } -FlutterDesktopViewRef FlutterDesktopViewCreateFromNewView( +FlutterDesktopViewRef FlutterDesktopViewCreateFromElmParent( const FlutterDesktopViewProperties& view_properties, FlutterDesktopEngineRef engine, - void* elm_parent) { - flutter::TizenBaseHandle::Geometry view_geometry = { + void* parent) { + flutter::TizenViewBase::Geometry view_geometry = { 0, 0, view_properties.width, view_properties.height, }; - std::unique_ptr view = + std::unique_ptr view = std::make_unique( - view_geometry, (Evas_Object*)(view_properties.elm_parent)); + view_geometry, (Evas_Object*)(view_properties.parent)); auto flutter_view = std::make_unique(std::move(view)); @@ -87,18 +87,16 @@ FlutterDesktopViewRef FlutterDesktopViewCreateFromNewView( return HandleForView(flutter_view.release()); } -void* FlutterDesktopViewGetEvasObject(FlutterDesktopEngineRef engine) { - flutter::TizenViewElementary* tizenView = - (flutter::TizenViewElementary*)EngineFromHandle(engine)->view()->handle(); - return tizenView->GetEvasContainer(); +void* FlutterDesktopViewGetEvasObject(FlutterDesktopViewRef view) { + auto tizenView = reinterpret_cast(view); + return tizenView->GetRenderTarget(); } -void FlutterDesktopViewResizeView(FlutterDesktopEngineRef engine, +void FlutterDesktopViewResizeView(FlutterDesktopViewRef view, int32_t width, int32_t height) { - flutter::TizenViewElementary* tizenView = - (flutter::TizenViewElementary*)EngineFromHandle(engine)->view()->handle(); - flutter::TizenBaseHandle::Geometry view_geometry = { + auto tizenView = reinterpret_cast(view); + flutter::TizenViewBase::Geometry view_geometry = { 0, 0, width, diff --git a/shell/platform/tizen/flutter_tizen_engine.cc b/shell/platform/tizen/flutter_tizen_engine.cc index 8ffddb0a42eab..430eb81c21252 100644 --- a/shell/platform/tizen/flutter_tizen_engine.cc +++ b/shell/platform/tizen/flutter_tizen_engine.cc @@ -536,8 +536,8 @@ void FlutterTizenEngine::OnUpdateSemanticsCustomActions( bridge->GetFlutterPlatformNodeDelegateFromID(0); std::shared_ptr window = FlutterPlatformAppDelegateTizen::GetInstance().GetWindow().lock(); - TizenBaseHandle::Geometry geometry = - engine->view_->handle()->GetRenderTargetGeometry(); + TizenViewBase::Geometry geometry = + engine->view_->tizen_view()->GetRenderTargetGeometry(); window->SetGeometry(geometry.left, geometry.top, geometry.width, geometry.height); window->SetRootNode(root); diff --git a/shell/platform/tizen/flutter_tizen_view.cc b/shell/platform/tizen/flutter_tizen_view.cc index 6a466ccf46b5f..1dafdf13a67d9 100644 --- a/shell/platform/tizen/flutter_tizen_view.cc +++ b/shell/platform/tizen/flutter_tizen_view.cc @@ -40,10 +40,10 @@ const std::vector kBindableSystemKeys = { namespace flutter { -FlutterTizenView::FlutterTizenView(std::unique_ptr handle) - : handle_(std::move(handle)) { - handle_->SetView(this); - handle_->BindKeys(kBindableSystemKeys); +FlutterTizenView::FlutterTizenView(std::unique_ptr tizen_view) + : tizen_view_(std::move(tizen_view)) { + tizen_view_->SetView(this); + tizen_view_->BindKeys(kBindableSystemKeys); } FlutterTizenView::~FlutterTizenView() {} @@ -56,19 +56,27 @@ void FlutterTizenView::SetEngine(std::unique_ptr engine) { std::make_unique(engine_->plugin_registrar()); // Set up window dependent channels. - BinaryMessenger* messenger = internal_plugin_registrar_->messenger(); - platform_channel_ = - std::make_unique(messenger, handle_.get()); - window_channel_ = std::make_unique(messenger, handle_.get()); +BinaryMessenger* messenger = internal_plugin_registrar_->messenger(); + + if (tizen_view_->GetType() == "window") { + auto window = reinterpret_cast(tizen_view_.get()); + platform_channel_ = std::make_unique(messenger, window); + window_channel_ = std::make_unique(messenger, window); + } else { + platform_channel_ = std::make_unique(messenger, nullptr); + window_channel_ = std::make_unique(messenger, nullptr); + } + text_input_channel_ = std::make_unique( - internal_plugin_registrar_->messenger(), handle_->input_method_context()); + internal_plugin_registrar_->messenger(), + tizen_view_->input_method_context()); } void FlutterTizenView::CreateRenderSurface() { if (engine_ && engine_->renderer()) { - TizenBaseHandle::Geometry geometry = handle_->GetRenderTargetGeometry(); - engine_->renderer()->CreateSurface(handle_->GetRenderTarget(), - handle_->GetRenderTargetDisplay(), + TizenViewBase::Geometry geometry = tizen_view_->GetRenderTargetGeometry(); + engine_->renderer()->CreateSurface(tizen_view_->GetRenderTarget(), + tizen_view_->GetRenderTargetDisplay(), geometry.width, geometry.height); } } @@ -111,8 +119,8 @@ void FlutterTizenView::OnResize(int32_t left, std::swap(width, height); } - handle_->ResizeRenderTargetWithRotation({left, top, width, height}, - rotation_degree_); + tizen_view_->ResizeRenderTargetWithRotation({left, top, width, height}, + rotation_degree_); SendWindowMetrics(left, top, width, height, 0.0); } @@ -120,7 +128,7 @@ void FlutterTizenView::OnRotate(int32_t degree) { rotation_degree_ = degree; // Compute renderer transformation based on the angle of rotation. double rad = (360 - rotation_degree_) * M_PI / 180; - TizenBaseHandle::Geometry geometry = handle_->GetRenderTargetGeometry(); + TizenViewBase::Geometry geometry = tizen_view_->GetRenderTargetGeometry(); int32_t width = geometry.width; int32_t height = geometry.height; @@ -144,7 +152,7 @@ void FlutterTizenView::OnRotate(int32_t degree) { std::swap(width, height); } - handle_->ResizeRenderTargetWithRotation( + tizen_view_->ResizeRenderTargetWithRotation( {geometry.left, geometry.top, width, height}, rotation_degree_); // Window position does not change on rotation regardless of its orientation. @@ -252,7 +260,14 @@ void FlutterTizenView::OnCommit(const std::string& str) { } void FlutterTizenView::SendInitialGeometry() { - OnRotate(handle_->GetRotation()); + if (tizen_view_->GetType() == "window") { + auto window = reinterpret_cast(tizen_view_.get()); + OnRotate(window->GetRotation()); + } + else { + OnRotate(0); + } + } void FlutterTizenView::SendWindowMetrics(int32_t left, @@ -268,7 +283,7 @@ void FlutterTizenView::SendWindowMetrics(int32_t left, #ifdef TV_PROFILE double dpi = 72.0; #else - double dpi = static_cast(handle_->GetDpi()); + double dpi = static_cast(tizen_view_->GetDpi()); #endif double scale_factor = dpi / 90.0 * kProfileFactor; computed_pixel_ratio = std::max(scale_factor, 1.0); @@ -288,7 +303,7 @@ void FlutterTizenView::SendFlutterPointerEvent( size_t timestamp, FlutterPointerDeviceKind device_kind, int device_id) { - TizenBaseHandle::Geometry geometry = handle_->GetRenderTargetGeometry(); + TizenViewBase::Geometry geometry = tizen_view_->GetRenderTargetGeometry(); double new_x = x, new_y = y; if (rotation_degree_ == 90) { diff --git a/shell/platform/tizen/flutter_tizen_view.h b/shell/platform/tizen/flutter_tizen_view.h index 45f855d2b55c0..f89bf133b50bd 100644 --- a/shell/platform/tizen/flutter_tizen_view.h +++ b/shell/platform/tizen/flutter_tizen_view.h @@ -20,7 +20,7 @@ namespace flutter { class FlutterTizenView { public: - FlutterTizenView(std::unique_ptr window); + FlutterTizenView(std::unique_ptr tizen_view_); ~FlutterTizenView(); @@ -30,7 +30,7 @@ class FlutterTizenView { FlutterTizenEngine* engine() { return engine_.get(); } - TizenBaseHandle* handle() { return handle_.get(); } + TizenViewBase* tizen_view() { return tizen_view_.get(); } // Creates rendering surface for Flutter engine to draw into. // Should be called before calling FlutterEngineRun using this view. @@ -127,7 +127,7 @@ class FlutterTizenView { std::unique_ptr engine_; // The window associated with this view. - std::unique_ptr handle_; + std::unique_ptr tizen_view_; // The plugin registrar managing internal plugins. std::unique_ptr internal_plugin_registrar_; diff --git a/shell/platform/tizen/public/flutter_tizen.h b/shell/platform/tizen/public/flutter_tizen.h index f3661e4b19a9b..306b28325d3af 100644 --- a/shell/platform/tizen/public/flutter_tizen.h +++ b/shell/platform/tizen/public/flutter_tizen.h @@ -49,8 +49,8 @@ typedef struct { int32_t width; // The height of the view, or the maximum height if the value is zero. int32_t height; - // The evas image's parent instance handle. - void* elm_parent; + // The evas object's parent instance handle. + void* parent; } FlutterDesktopViewProperties; // Properties for configuring a Flutter engine instance. @@ -146,17 +146,17 @@ FLUTTER_EXPORT FlutterDesktopViewRef FlutterDesktopViewCreateFromNewWindow( FlutterDesktopEngineRef engine); // Creates a view that hosts and displays the given engine instance. -FLUTTER_EXPORT FlutterDesktopViewRef FlutterDesktopViewCreateFromNewView( +FLUTTER_EXPORT FlutterDesktopViewRef FlutterDesktopViewCreateFromElmParent( const FlutterDesktopViewProperties& view_properties, FlutterDesktopEngineRef engine, - void* elm_parent); + void* parent); // Returns a handle to evas object that the FlutterView is drawn to. FLUTTER_EXPORT void* FlutterDesktopViewGetEvasObject( - FlutterDesktopEngineRef engine); + FlutterDesktopViewRef view); // Resize the FlutterView. -FLUTTER_EXPORT void FlutterDesktopViewResizeView(FlutterDesktopEngineRef engine, +FLUTTER_EXPORT void FlutterDesktopViewResizeView(FlutterDesktopViewRef view, int32_t width, int32_t height); diff --git a/shell/platform/tizen/tizen_view.h b/shell/platform/tizen/tizen_view.h index dd663cbd0e7a5..5fece402eccd8 100644 --- a/shell/platform/tizen/tizen_view.h +++ b/shell/platform/tizen/tizen_view.h @@ -8,31 +8,25 @@ #include -#include "flutter/shell/platform/tizen/tizen_base_handle.h" +#include "flutter/shell/platform/tizen/tizen_view_base.h" namespace flutter { class FlutterTizenView; -class TizenView : public TizenBaseHandle { +class TizenView : public TizenViewBase { public: TizenView(); - void* GetWindowHandle() override { return nullptr; } - - void* GetRenderTarget() override { return nullptr; } - - int32_t GetRotation() override { return 0; }; - - void SetPreferredOrientations(const std::vector& rotations) override{}; - virtual ~TizenView() = default; + std::string GetType() override { return "view"; }; + protected: - explicit TizenView(TizenBaseHandle::Geometry geometry) + explicit TizenView(TizenViewBase::Geometry geometry) : initial_geometry_(geometry) {} - TizenBaseHandle::Geometry initial_geometry_ = {0, 0, 0, 0}; + TizenViewBase::Geometry initial_geometry_ = {0, 0, 0, 0}; }; } // namespace flutter diff --git a/shell/platform/tizen/tizen_base_handle.h b/shell/platform/tizen/tizen_view_base.h similarity index 89% rename from shell/platform/tizen/tizen_base_handle.h rename to shell/platform/tizen/tizen_view_base.h index bfa49194e3212..b0f2270a4a9df 100644 --- a/shell/platform/tizen/tizen_base_handle.h +++ b/shell/platform/tizen/tizen_view_base.h @@ -16,15 +16,15 @@ namespace flutter { class FlutterTizenView; -class TizenBaseHandle { +class TizenViewBase { public: struct Geometry { int32_t left = 0, top = 0, width = 0, height = 0; }; - TizenBaseHandle(){}; + TizenViewBase(){}; - virtual ~TizenBaseHandle() = default; + virtual ~TizenViewBase() = default; // Returns a valid pointer the platform object that rendering can be bound to // by rendering backend. @@ -32,11 +32,9 @@ class TizenBaseHandle { virtual void* GetRenderTargetDisplay(); - virtual void SetPreferredOrientations(const std::vector& rotations); virtual uintptr_t GetWindowId(); - virtual void* GetWindowHandle(); // Returns the geometry of the current render target. virtual Geometry GetRenderTargetGeometry() = 0; @@ -47,8 +45,6 @@ class TizenBaseHandle { // Returns the geometry of the display screen. virtual Geometry GetScreenGeometry() = 0; - virtual int32_t GetRotation() = 0; - // Returns the dpi of the screen. virtual int32_t GetDpi() = 0; @@ -69,6 +65,8 @@ class TizenBaseHandle { virtual TizenInputMethodContext* input_method_context() = 0; + virtual std::string GetType() = 0; + protected: FlutterTizenView* view_ = nullptr; }; diff --git a/shell/platform/tizen/tizen_view_elementary.cc b/shell/platform/tizen/tizen_view_elementary.cc index f66032793367b..131efcb83c598 100644 --- a/shell/platform/tizen/tizen_view_elementary.cc +++ b/shell/platform/tizen/tizen_view_elementary.cc @@ -41,9 +41,9 @@ void EvasObjectResize(Evas_Object* object, uint32_t width, uint32_t height) { namespace flutter { -TizenViewElementary::TizenViewElementary(TizenBaseHandle::Geometry geometry, - Evas_Object* elm_parent) - : TizenView(geometry), elm_parent_(elm_parent) { +TizenViewElementary::TizenViewElementary(TizenViewBase::Geometry geometry, + Evas_Object* parent) + : TizenView(geometry), parent_(parent) { if (!CreateView()) { FT_LOG(Error) << "Failed to create a platform view."; return; @@ -61,37 +61,23 @@ TizenViewElementary::~TizenViewElementary() { bool TizenViewElementary::CreateView() { elm_config_accel_preference_set("hw:opengl"); - Ecore_Evas* ecore_evas = - ecore_evas_ecore_evas_get(evas_object_evas_get(elm_parent_)); - - int32_t elm_parent_width, elm_parent_height; - evas_object_geometry_get(elm_parent_, nullptr, nullptr, &elm_parent_width, - &elm_parent_height); + int32_t parent_width, parent_height; + evas_object_geometry_get(parent_, nullptr, nullptr, &parent_width, + &parent_height); if (initial_geometry_.width == 0) { - initial_geometry_.width = elm_parent_width; + initial_geometry_.width = parent_width; } if (initial_geometry_.height == 0) { - initial_geometry_.height = elm_parent_height; + initial_geometry_.height = parent_height; } - int32_t ecore_evas_width, ecore_evas_height; - ecore_evas_screen_geometry_get(ecore_evas, nullptr, nullptr, - &ecore_evas_width, &ecore_evas_height); - if (ecore_evas_width == 0 || ecore_evas_height == 0) { - FT_LOG(Error) << "Invalid screen size: " << ecore_evas_width << " x " - << ecore_evas_height; + container_ = elm_table_add(parent_); + if (!container_) { + FT_LOG(Error) << "Failed to create a evas object container."; return false; } - if (initial_geometry_.width == 0) { - initial_geometry_.width = ecore_evas_width; - } - if (initial_geometry_.height == 0) { - initial_geometry_.height = ecore_evas_height; - } - - container_ = elm_table_add(elm_parent_); EvasObjectResize(container_, initial_geometry_.width, initial_geometry_.height); evas_object_size_hint_weight_set(container_, EVAS_HINT_EXPAND, @@ -99,6 +85,11 @@ bool TizenViewElementary::CreateView() { evas_object_size_hint_align_set(container_, EVAS_HINT_FILL, EVAS_HINT_FILL); image_ = evas_object_image_filled_add(evas_object_evas_get(container_)); + if (!image_) { + FT_LOG(Error) << "Failed to create a evas object image."; + return false; + } + EvasObjectResize(image_, initial_geometry_.width, initial_geometry_.height); evas_object_image_size_set(image_, initial_geometry_.width, initial_geometry_.height); @@ -109,16 +100,17 @@ bool TizenViewElementary::CreateView() { // button widget is temporary. It should be changed to the appropriate object // that can be used as event layer. event_layer_ = elm_button_add(container_); + if (!event_layer_) { + FT_LOG(Error) << "Failed to create a event layer"; + return false; + } + elm_object_style_set(event_layer_, "transparent"); evas_object_color_set(event_layer_, 0, 0, 0, 0); EvasObjectResize(event_layer_, initial_geometry_.width, initial_geometry_.height); elm_table_pack(container_, event_layer_, 0, 0, 1, 1); - if (!image_) { - return false; - } - return true; } @@ -278,7 +270,7 @@ void TizenViewElementary::UnregisterEventHandlers() { evas_object_callbacks_[EVAS_CALLBACK_KEY_UP]); } -TizenBaseHandle::Geometry TizenViewElementary::GetRenderTargetGeometry() { +TizenViewBase::Geometry TizenViewElementary::GetRenderTargetGeometry() { Geometry result; evas_object_geometry_get(image_, &result.left, &result.top, &result.width, &result.height); @@ -292,7 +284,7 @@ void TizenViewElementary::SetRenderTargetGeometry(Geometry geometry) { evas_object_move(image_, geometry.left, geometry.top); } -TizenBaseHandle::Geometry TizenViewElementary::GetScreenGeometry() { +TizenViewBase::Geometry TizenViewElementary::GetScreenGeometry() { Geometry result; evas_object_geometry_get(image_, &result.left, &result.top, &result.width, &result.height); diff --git a/shell/platform/tizen/tizen_view_elementary.h b/shell/platform/tizen/tizen_view_elementary.h index 2064ba98342af..edaeb4d2fd913 100644 --- a/shell/platform/tizen/tizen_view_elementary.h +++ b/shell/platform/tizen/tizen_view_elementary.h @@ -18,8 +18,7 @@ namespace flutter { class TizenViewElementary : public TizenView { public: - TizenViewElementary(TizenBaseHandle::Geometry geometry, - Evas_Object* elm_parent); + TizenViewElementary(TizenViewBase::Geometry geometry, Evas_Object* parent); ~TizenViewElementary(); @@ -29,9 +28,9 @@ class TizenViewElementary : public TizenView { Geometry GetScreenGeometry() override; - void* GetRenderTargetDisplay() override { return image_; } + void* GetRenderTarget() override { return container_; } - void* GetEvasContainer() { return container_; } + void* GetRenderTargetDisplay() override { return image_; } int32_t GetDpi() override; @@ -59,10 +58,10 @@ class TizenViewElementary : public TizenView { void PrepareInputMethod(); - Evas_Object* elm_parent_ = nullptr; + Evas_Object* parent_ = nullptr; + Evas_Object* container_ = nullptr; Evas_Object* image_ = nullptr; Evas_Object* event_layer_ = nullptr; - Evas_Object* container_ = nullptr; std::unordered_map evas_object_callbacks_; diff --git a/shell/platform/tizen/tizen_window.h b/shell/platform/tizen/tizen_window.h index 41624fdf99b94..0ef64e2d2f234 100644 --- a/shell/platform/tizen/tizen_window.h +++ b/shell/platform/tizen/tizen_window.h @@ -10,19 +10,27 @@ #include #include -#include "flutter/shell/platform/tizen/tizen_base_handle.h" +#include "flutter/shell/platform/tizen/tizen_view_base.h" namespace flutter { class FlutterTizenView; -class TizenWindow : public TizenBaseHandle { +class TizenWindow : public TizenViewBase { public: TizenWindow(); virtual ~TizenWindow() = default; + virtual void* GetWindowHandle(); + + virtual int32_t GetRotation() = 0; + + virtual void SetPreferredOrientations(const std::vector& rotations); + + std::string GetType() override { return "window"; }; + protected: - explicit TizenWindow(TizenBaseHandle::Geometry geometry, + explicit TizenWindow(TizenViewBase::Geometry geometry, bool transparent, bool focusable, bool top_level) @@ -31,7 +39,7 @@ class TizenWindow : public TizenBaseHandle { focusable_(focusable), top_level_(top_level) {} - TizenBaseHandle::Geometry initial_geometry_ = {0, 0, 0, 0}; + TizenViewBase::Geometry initial_geometry_ = {0, 0, 0, 0}; bool transparent_ = false; bool focusable_ = false; bool top_level_ = false; diff --git a/shell/platform/tizen/tizen_window_ecore_wl2.cc b/shell/platform/tizen/tizen_window_ecore_wl2.cc index 43bf79f092a68..0ed4bb18ed2c3 100644 --- a/shell/platform/tizen/tizen_window_ecore_wl2.cc +++ b/shell/platform/tizen/tizen_window_ecore_wl2.cc @@ -381,7 +381,7 @@ void TizenWindowEcoreWl2::DestroyWindow() { ecore_wl2_shutdown(); } -TizenBaseHandle::Geometry TizenWindowEcoreWl2::GetRenderTargetGeometry() { +TizenViewBase::Geometry TizenWindowEcoreWl2::GetRenderTargetGeometry() { Geometry result; ecore_wl2_window_geometry_get(ecore_wl2_window_, &result.left, &result.top, &result.width, &result.height); @@ -397,7 +397,7 @@ void TizenWindowEcoreWl2::SetRenderTargetGeometry(Geometry geometry) { ecore_wl2_window_position_set(ecore_wl2_window_, geometry.left, geometry.top); } -TizenBaseHandle::Geometry TizenWindowEcoreWl2::GetScreenGeometry() { +TizenViewBase::Geometry TizenWindowEcoreWl2::GetScreenGeometry() { Geometry result = {}; ecore_wl2_display_screen_size_get(ecore_wl2_display_, &result.width, &result.height); diff --git a/shell/platform/tizen/tizen_window_ecore_wl2.h b/shell/platform/tizen/tizen_window_ecore_wl2.h index 60c10e2c19798..0cab79e3152be 100644 --- a/shell/platform/tizen/tizen_window_ecore_wl2.h +++ b/shell/platform/tizen/tizen_window_ecore_wl2.h @@ -6,7 +6,7 @@ #ifndef EMBEDDER_TIZEN_WINDOW_ECORE_WL2_H_ #define EMBEDDER_TIZEN_WINDOW_ECORE_WL2_H_ -#include "flutter/shell/platform/tizen/tizen_base_handle.h" +#include "flutter/shell/platform/tizen/tizen_view_base.h" #include "flutter/shell/platform/tizen/tizen_window.h" #define EFL_BETA_API_SUPPORT @@ -17,7 +17,7 @@ namespace flutter { class TizenWindowEcoreWl2 : public TizenWindow { public: - TizenWindowEcoreWl2(TizenBaseHandle::Geometry geometry, + TizenWindowEcoreWl2(TizenViewBase::Geometry geometry, bool transparent, bool focusable, bool top_level); diff --git a/shell/platform/tizen/tizen_window_elementary.cc b/shell/platform/tizen/tizen_window_elementary.cc index b8dffd9445f01..29b562f8eb8c5 100644 --- a/shell/platform/tizen/tizen_window_elementary.cc +++ b/shell/platform/tizen/tizen_window_elementary.cc @@ -35,7 +35,7 @@ uint32_t EvasModifierToEcoreEventModifiers(const Evas_Modifier* evas_modifier) { namespace flutter { -TizenWindowElementary::TizenWindowElementary(TizenBaseHandle::Geometry geometry, +TizenWindowElementary::TizenWindowElementary(TizenViewBase::Geometry geometry, bool transparent, bool focusable, bool top_level) @@ -305,7 +305,7 @@ void TizenWindowElementary::UnregisterEventHandlers() { evas_object_callbacks_[EVAS_CALLBACK_KEY_UP]); } -TizenBaseHandle::Geometry TizenWindowElementary::GetRenderTargetGeometry() { +TizenViewBase::Geometry TizenWindowElementary::GetRenderTargetGeometry() { // FIXME : evas_object_geometry_get() and ecore_wl2_window_geometry_get() are // not equivalent. Geometry result; @@ -322,7 +322,7 @@ void TizenWindowElementary::SetRenderTargetGeometry(Geometry geometry) { evas_object_move(image_, geometry.left, geometry.top); } -TizenBaseHandle::Geometry TizenWindowElementary::GetScreenGeometry() { +TizenViewBase::Geometry TizenWindowElementary::GetScreenGeometry() { Geometry result; Ecore_Evas* ecore_evas = ecore_evas_ecore_evas_get(evas_object_evas_get(elm_win_)); diff --git a/shell/platform/tizen/tizen_window_elementary.h b/shell/platform/tizen/tizen_window_elementary.h index c9c84e249f2c9..a70057b3264eb 100644 --- a/shell/platform/tizen/tizen_window_elementary.h +++ b/shell/platform/tizen/tizen_window_elementary.h @@ -16,7 +16,7 @@ namespace flutter { class TizenWindowElementary : public TizenWindow { public: - TizenWindowElementary(TizenBaseHandle::Geometry geometry, + TizenWindowElementary(TizenViewBase::Geometry geometry, bool transparent, bool focusable, bool top_level); From ca61f5725c69eafd86a8dc79fa894fae9b7171e6 Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Fri, 3 Jun 2022 17:35:39 +0900 Subject: [PATCH 03/14] Change argument type --- shell/platform/tizen/flutter_tizen_elementary.cc | 10 +++++----- shell/platform/tizen/public/flutter_tizen.h | 2 -- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/shell/platform/tizen/flutter_tizen_elementary.cc b/shell/platform/tizen/flutter_tizen_elementary.cc index a483a0128f819..6aea5a08d75b4 100644 --- a/shell/platform/tizen/flutter_tizen_elementary.cc +++ b/shell/platform/tizen/flutter_tizen_elementary.cc @@ -67,7 +67,7 @@ FlutterDesktopViewRef FlutterDesktopViewCreateFromElmParent( std::unique_ptr view = std::make_unique( - view_geometry, (Evas_Object*)(view_properties.parent)); + view_geometry, (Evas_Object*)(parent)); auto flutter_view = std::make_unique(std::move(view)); @@ -88,19 +88,19 @@ FlutterDesktopViewRef FlutterDesktopViewCreateFromElmParent( } void* FlutterDesktopViewGetEvasObject(FlutterDesktopViewRef view) { - auto tizenView = reinterpret_cast(view); - return tizenView->GetRenderTarget(); + auto flutter_tizen_view = reinterpret_cast(view); + return flutter_tizen_view->tizen_view()->GetRenderTarget(); } void FlutterDesktopViewResizeView(FlutterDesktopViewRef view, int32_t width, int32_t height) { - auto tizenView = reinterpret_cast(view); + auto flutter_tizen_view = reinterpret_cast(view); flutter::TizenViewBase::Geometry view_geometry = { 0, 0, width, height, }; - tizenView->OnGeometryChanged(view_geometry); + flutter_tizen_view->tizen_view()->OnGeometryChanged(view_geometry); } diff --git a/shell/platform/tizen/public/flutter_tizen.h b/shell/platform/tizen/public/flutter_tizen.h index 306b28325d3af..f977c4a713b29 100644 --- a/shell/platform/tizen/public/flutter_tizen.h +++ b/shell/platform/tizen/public/flutter_tizen.h @@ -49,8 +49,6 @@ typedef struct { int32_t width; // The height of the view, or the maximum height if the value is zero. int32_t height; - // The evas object's parent instance handle. - void* parent; } FlutterDesktopViewProperties; // Properties for configuring a Flutter engine instance. From b3bb0d6c6201253d123f959019804d33d0706c91 Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Fri, 3 Jun 2022 17:40:37 +0900 Subject: [PATCH 04/14] Fix code format --- .../platform/tizen/channels/window_channel.cc | 3 +- .../tizen/flutter_tizen_elementary.cc | 4 +-- shell/platform/tizen/flutter_tizen_view.cc | 8 ++--- shell/platform/tizen/tizen_view_base.h | 2 -- shell/platform/tizen/tizen_view_elementary.cc | 34 +++++++++---------- 5 files changed, 23 insertions(+), 28 deletions(-) diff --git a/shell/platform/tizen/channels/window_channel.cc b/shell/platform/tizen/channels/window_channel.cc index 0ced3abad2ec1..ca32b68c8d3f5 100644 --- a/shell/platform/tizen/channels/window_channel.cc +++ b/shell/platform/tizen/channels/window_channel.cc @@ -16,8 +16,7 @@ constexpr char kChannelName[] = "tizen/internal/window"; } // namespace -WindowChannel::WindowChannel(BinaryMessenger* messenger, - TizenWindow* window) +WindowChannel::WindowChannel(BinaryMessenger* messenger, TizenWindow* window) : window_(window) { channel_ = std::make_unique>( messenger, kChannelName, &StandardMethodCodec::GetInstance()); diff --git a/shell/platform/tizen/flutter_tizen_elementary.cc b/shell/platform/tizen/flutter_tizen_elementary.cc index 6aea5a08d75b4..9b0e16fa5413a 100644 --- a/shell/platform/tizen/flutter_tizen_elementary.cc +++ b/shell/platform/tizen/flutter_tizen_elementary.cc @@ -66,8 +66,8 @@ FlutterDesktopViewRef FlutterDesktopViewCreateFromElmParent( }; std::unique_ptr view = - std::make_unique( - view_geometry, (Evas_Object*)(parent)); + std::make_unique(view_geometry, + (Evas_Object*)(parent)); auto flutter_view = std::make_unique(std::move(view)); diff --git a/shell/platform/tizen/flutter_tizen_view.cc b/shell/platform/tizen/flutter_tizen_view.cc index 1dafdf13a67d9..d198f6c9bab2c 100644 --- a/shell/platform/tizen/flutter_tizen_view.cc +++ b/shell/platform/tizen/flutter_tizen_view.cc @@ -56,10 +56,10 @@ void FlutterTizenView::SetEngine(std::unique_ptr engine) { std::make_unique(engine_->plugin_registrar()); // Set up window dependent channels. -BinaryMessenger* messenger = internal_plugin_registrar_->messenger(); + BinaryMessenger* messenger = internal_plugin_registrar_->messenger(); if (tizen_view_->GetType() == "window") { - auto window = reinterpret_cast(tizen_view_.get()); + auto window = reinterpret_cast(tizen_view_.get()); platform_channel_ = std::make_unique(messenger, window); window_channel_ = std::make_unique(messenger, window); } else { @@ -263,11 +263,9 @@ void FlutterTizenView::SendInitialGeometry() { if (tizen_view_->GetType() == "window") { auto window = reinterpret_cast(tizen_view_.get()); OnRotate(window->GetRotation()); - } - else { + } else { OnRotate(0); } - } void FlutterTizenView::SendWindowMetrics(int32_t left, diff --git a/shell/platform/tizen/tizen_view_base.h b/shell/platform/tizen/tizen_view_base.h index b0f2270a4a9df..994b98559a113 100644 --- a/shell/platform/tizen/tizen_view_base.h +++ b/shell/platform/tizen/tizen_view_base.h @@ -32,10 +32,8 @@ class TizenViewBase { virtual void* GetRenderTargetDisplay(); - virtual uintptr_t GetWindowId(); - // Returns the geometry of the current render target. virtual Geometry GetRenderTargetGeometry() = 0; diff --git a/shell/platform/tizen/tizen_view_elementary.cc b/shell/platform/tizen/tizen_view_elementary.cc index 131efcb83c598..1b041860ecba6 100644 --- a/shell/platform/tizen/tizen_view_elementary.cc +++ b/shell/platform/tizen/tizen_view_elementary.cc @@ -150,23 +150,23 @@ void TizenViewElementary::RegisterEventHandlers() { evas_object_event_callback_add(event_layer_, EVAS_CALLBACK_MOUSE_UP, evas_object_callbacks_[EVAS_CALLBACK_MOUSE_UP], this); - - evas_object_callbacks_[EVAS_CALLBACK_MOUSE_MOVE] = - [](void* data, Evas* evas, Evas_Object* object, void* event_info) { - auto* self = reinterpret_cast(data); - if (self->view_) { - if (self->event_layer_ == object) { - auto* mouse_event = - reinterpret_cast(event_info); - mouse_event->event_flags = (Evas_Event_Flags)( - mouse_event->event_flags & EVAS_EVENT_FLAG_ON_HOLD); - self->view_->OnPointerMove( - mouse_event->cur.canvas.x, mouse_event->cur.canvas.y, - mouse_event->timestamp, kFlutterPointerDeviceKindTouch, - mouse_event->buttons); - } - } - }; + evas_object_callbacks_[EVAS_CALLBACK_MOUSE_MOVE] = [](void* data, Evas* evas, + Evas_Object* object, + void* event_info) { + auto* self = reinterpret_cast(data); + if (self->view_) { + if (self->event_layer_ == object) { + auto* mouse_event = + reinterpret_cast(event_info); + mouse_event->event_flags = (Evas_Event_Flags)(mouse_event->event_flags & + EVAS_EVENT_FLAG_ON_HOLD); + self->view_->OnPointerMove( + mouse_event->cur.canvas.x, mouse_event->cur.canvas.y, + mouse_event->timestamp, kFlutterPointerDeviceKindTouch, + mouse_event->buttons); + } + } + }; evas_object_event_callback_add( event_layer_, EVAS_CALLBACK_MOUSE_MOVE, evas_object_callbacks_[EVAS_CALLBACK_MOUSE_MOVE], this); From 2e777e876b857c586dcb3563b2e7f000b7ab490a Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Tue, 7 Jun 2022 13:45:46 +0900 Subject: [PATCH 05/14] Fix abstraction level --- shell/platform/tizen/BUILD.gn | 2 +- shell/platform/tizen/tizen_view.h | 3 +-- shell/platform/tizen/tizen_view_base.h | 24 +++++++++++-------- shell/platform/tizen/tizen_view_elementary.h | 7 ------ shell/platform/tizen/tizen_window.h | 6 ++--- shell/platform/tizen/tizen_window_ecore_wl2.h | 8 ------- .../platform/tizen/tizen_window_elementary.h | 7 ------ 7 files changed, 19 insertions(+), 38 deletions(-) diff --git a/shell/platform/tizen/BUILD.gn b/shell/platform/tizen/BUILD.gn index 9650ff72c9646..1951c6835a056 100644 --- a/shell/platform/tizen/BUILD.gn +++ b/shell/platform/tizen/BUILD.gn @@ -234,7 +234,7 @@ template("embedder") { embedder("flutter_tizen_mobile") { target_type = "shared_library" - use_evas_gl_renderer = true + use_evas_gl_renderer = false defines = [ "MOBILE_PROFILE" ] } diff --git a/shell/platform/tizen/tizen_view.h b/shell/platform/tizen/tizen_view.h index 5fece402eccd8..ee529400c959d 100644 --- a/shell/platform/tizen/tizen_view.h +++ b/shell/platform/tizen/tizen_view.h @@ -16,8 +16,7 @@ class FlutterTizenView; class TizenView : public TizenViewBase { public: - TizenView(); - + TizenView() = default; virtual ~TizenView() = default; std::string GetType() override { return "view"; }; diff --git a/shell/platform/tizen/tizen_view_base.h b/shell/platform/tizen/tizen_view_base.h index 994b98559a113..7538deac9cd74 100644 --- a/shell/platform/tizen/tizen_view_base.h +++ b/shell/platform/tizen/tizen_view_base.h @@ -3,8 +3,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef EMBEDDER_TIZEN_BASE_HANDLE_H_ -#define EMBEDDER_TIZEN_BASE_HANDLE_H_ +#ifndef EMBEDDER_TIZEN_VIEW_BASE_H_ +#define EMBEDDER_TIZEN_VIEW_BASE_H_ #include #include @@ -22,17 +22,16 @@ class TizenViewBase { int32_t left = 0, top = 0, width = 0, height = 0; }; - TizenViewBase(){}; - + TizenViewBase() = default; virtual ~TizenViewBase() = default; // Returns a valid pointer the platform object that rendering can be bound to // by rendering backend. - virtual void* GetRenderTarget(); + virtual void* GetRenderTarget() = 0; - virtual void* GetRenderTargetDisplay(); + virtual void* GetRenderTargetDisplay() = 0; - virtual uintptr_t GetWindowId(); + virtual uintptr_t GetWindowId() = 0; // Returns the geometry of the current render target. virtual Geometry GetRenderTargetGeometry() = 0; @@ -61,14 +60,19 @@ class TizenViewBase { virtual void Show() = 0; - virtual TizenInputMethodContext* input_method_context() = 0; - virtual std::string GetType() = 0; + TizenInputMethodContext* input_method_context() { + return input_method_context_.get(); + } + protected: FlutterTizenView* view_ = nullptr; + + // The Tizen input method context. nullptr if not set. + std::unique_ptr input_method_context_; }; } // namespace flutter -#endif // EMBEDDER_TIZEN_BASE_HANDLE_H_ +#endif // EMBEDDER_TIZEN_VIEW_BASE_H_ diff --git a/shell/platform/tizen/tizen_view_elementary.h b/shell/platform/tizen/tizen_view_elementary.h index edaeb4d2fd913..4178f479ef9c8 100644 --- a/shell/platform/tizen/tizen_view_elementary.h +++ b/shell/platform/tizen/tizen_view_elementary.h @@ -45,10 +45,6 @@ class TizenViewElementary : public TizenView { void OnGeometryChanged(Geometry geometry) override; - TizenInputMethodContext* input_method_context() override { - return input_method_context_.get(); - } - private: bool CreateView(); @@ -66,9 +62,6 @@ class TizenViewElementary : public TizenView { std::unordered_map evas_object_callbacks_; std::vector ecore_event_key_handlers_; - - // The Tizen input method context. nullptr if not set. - std::unique_ptr input_method_context_; }; } // namespace flutter diff --git a/shell/platform/tizen/tizen_window.h b/shell/platform/tizen/tizen_window.h index 0ef64e2d2f234..a01cd30c04c9f 100644 --- a/shell/platform/tizen/tizen_window.h +++ b/shell/platform/tizen/tizen_window.h @@ -6,19 +6,19 @@ #ifndef EMBEDDER_TIZEN_WINDOW_H_ #define EMBEDDER_TIZEN_WINDOW_H_ +#include "flutter/shell/platform/tizen/tizen_view_base.h" + #include #include #include -#include "flutter/shell/platform/tizen/tizen_view_base.h" - namespace flutter { class FlutterTizenView; class TizenWindow : public TizenViewBase { public: - TizenWindow(); + TizenWindow() = default; virtual ~TizenWindow() = default; virtual void* GetWindowHandle(); diff --git a/shell/platform/tizen/tizen_window_ecore_wl2.h b/shell/platform/tizen/tizen_window_ecore_wl2.h index 0cab79e3152be..788f1d21fa31b 100644 --- a/shell/platform/tizen/tizen_window_ecore_wl2.h +++ b/shell/platform/tizen/tizen_window_ecore_wl2.h @@ -6,7 +6,6 @@ #ifndef EMBEDDER_TIZEN_WINDOW_ECORE_WL2_H_ #define EMBEDDER_TIZEN_WINDOW_ECORE_WL2_H_ -#include "flutter/shell/platform/tizen/tizen_view_base.h" #include "flutter/shell/platform/tizen/tizen_window.h" #define EFL_BETA_API_SUPPORT @@ -53,10 +52,6 @@ class TizenWindowEcoreWl2 : public TizenWindow { void OnGeometryChanged(Geometry geometry) override; - TizenInputMethodContext* input_method_context() override { - return input_method_context_.get(); - } - private: bool CreateWindow(); @@ -82,9 +77,6 @@ class TizenWindowEcoreWl2 : public TizenWindow { std::vector ecore_event_handlers_; tizen_policy* tizen_policy_ = nullptr; - - // The Tizen input method context. nullptr if not set. - std::unique_ptr input_method_context_; }; } // namespace flutter diff --git a/shell/platform/tizen/tizen_window_elementary.h b/shell/platform/tizen/tizen_window_elementary.h index a70057b3264eb..cca4424d7b0c1 100644 --- a/shell/platform/tizen/tizen_window_elementary.h +++ b/shell/platform/tizen/tizen_window_elementary.h @@ -52,10 +52,6 @@ class TizenWindowElementary : public TizenWindow { void OnGeometryChanged(Geometry geometry) override; - TizenInputMethodContext* input_method_context() override { - return input_method_context_.get(); - } - private: bool CreateWindow(); @@ -75,9 +71,6 @@ class TizenWindowElementary : public TizenWindow { Evas_Smart_Cb rotation_changed_callback_; std::unordered_map evas_object_callbacks_; - - // The Tizen input method context. nullptr if not set. - std::unique_ptr input_method_context_; }; } // namespace flutter From a1f8ba45ca4214bc6fa4a1294216a0852ea8517c Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Tue, 7 Jun 2022 17:30:26 +0900 Subject: [PATCH 06/14] Fix api name and description --- .../platform/tizen/channels/window_channel.h | 2 +- shell/platform/tizen/flutter_tizen.cc | 7 +-- shell/platform/tizen/flutter_tizen_ecore.cc | 13 +++--- .../tizen/flutter_tizen_elementary.cc | 8 ++-- shell/platform/tizen/flutter_tizen_engine.cc | 2 +- shell/platform/tizen/flutter_tizen_view.cc | 45 +++++++++++-------- shell/platform/tizen/flutter_tizen_view.h | 6 +-- shell/platform/tizen/public/flutter_tizen.h | 3 ++ shell/platform/tizen/tizen_view_elementary.cc | 4 +- 9 files changed, 52 insertions(+), 38 deletions(-) diff --git a/shell/platform/tizen/channels/window_channel.h b/shell/platform/tizen/channels/window_channel.h index a0cf1f39dbcef..78c01ee2b94a1 100644 --- a/shell/platform/tizen/channels/window_channel.h +++ b/shell/platform/tizen/channels/window_channel.h @@ -26,7 +26,7 @@ class WindowChannel { std::unique_ptr> channel_; - // A reference to the renderer object managed by FlutterTizenView.s + // A reference to the renderer object managed by FlutterTizenView. TizenWindow* window_; }; diff --git a/shell/platform/tizen/flutter_tizen.cc b/shell/platform/tizen/flutter_tizen.cc index 2cc0fe6a99b82..5a6e3d50450e8 100644 --- a/shell/platform/tizen/flutter_tizen.cc +++ b/shell/platform/tizen/flutter_tizen.cc @@ -71,9 +71,10 @@ void FlutterDesktopEngineShutdown(FlutterDesktopEngineRef engine_ref) { void* FlutterDesktopPluginRegistrarGetNativeWindow( FlutterDesktopPluginRegistrarRef registrar) { - auto view_base = registrar->engine->view()->tizen_view(); - if (view_base->GetType() == "window") { - auto window = reinterpret_cast(view_base); + flutter::TizenViewBase* tizen_view_base = + registrar->engine->view()->tizen_view_base(); + if (tizen_view_base->GetType() == "window") { + auto window = reinterpret_cast(tizen_view_base); return window->GetWindowHandle(); } return nullptr; diff --git a/shell/platform/tizen/flutter_tizen_ecore.cc b/shell/platform/tizen/flutter_tizen_ecore.cc index d3734242591bd..396461303a487 100644 --- a/shell/platform/tizen/flutter_tizen_ecore.cc +++ b/shell/platform/tizen/flutter_tizen_ecore.cc @@ -6,6 +6,7 @@ #include "flutter/shell/platform/tizen/flutter_tizen_engine.h" #include "flutter/shell/platform/tizen/flutter_tizen_view.h" +#include "flutter/shell/platform/tizen/logger.h" #include "flutter/shell/platform/tizen/tizen_window_ecore_wl2.h" namespace { @@ -57,18 +58,20 @@ FlutterDesktopViewRef FlutterDesktopViewCreateFromElmParent( const FlutterDesktopViewProperties& view_properties, FlutterDesktopEngineRef engine, void* parent) { - // Not supported. - + // FIXME: Ecore WL2 renderer does not support this yet. + FT_UNIMPLEMENTED(); return nullptr; } void* FlutterDesktopViewGetEvasObject(FlutterDesktopViewRef view) { - // Not supported. + // FIXME: Ecore WL2 renderer does not support this yet. + FT_UNIMPLEMENTED(); return nullptr; } void FlutterDesktopViewResizeView(FlutterDesktopViewRef view, int32_t width, int32_t height) { - // Not supported. -} \ No newline at end of file + // FIXME: Ecore WL2 renderer does not support this yet. + FT_UNIMPLEMENTED(); +} diff --git a/shell/platform/tizen/flutter_tizen_elementary.cc b/shell/platform/tizen/flutter_tizen_elementary.cc index 9b0e16fa5413a..7ebb174b4338d 100644 --- a/shell/platform/tizen/flutter_tizen_elementary.cc +++ b/shell/platform/tizen/flutter_tizen_elementary.cc @@ -66,8 +66,8 @@ FlutterDesktopViewRef FlutterDesktopViewCreateFromElmParent( }; std::unique_ptr view = - std::make_unique(view_geometry, - (Evas_Object*)(parent)); + std::make_unique( + view_geometry, static_cast(parent)); auto flutter_view = std::make_unique(std::move(view)); @@ -89,7 +89,7 @@ FlutterDesktopViewRef FlutterDesktopViewCreateFromElmParent( void* FlutterDesktopViewGetEvasObject(FlutterDesktopViewRef view) { auto flutter_tizen_view = reinterpret_cast(view); - return flutter_tizen_view->tizen_view()->GetRenderTarget(); + return flutter_tizen_view->tizen_view_base()->GetRenderTarget(); } void FlutterDesktopViewResizeView(FlutterDesktopViewRef view, @@ -102,5 +102,5 @@ void FlutterDesktopViewResizeView(FlutterDesktopViewRef view, width, height, }; - flutter_tizen_view->tizen_view()->OnGeometryChanged(view_geometry); + flutter_tizen_view->tizen_view_base()->OnGeometryChanged(view_geometry); } diff --git a/shell/platform/tizen/flutter_tizen_engine.cc b/shell/platform/tizen/flutter_tizen_engine.cc index 430eb81c21252..7def4b992aab3 100644 --- a/shell/platform/tizen/flutter_tizen_engine.cc +++ b/shell/platform/tizen/flutter_tizen_engine.cc @@ -537,7 +537,7 @@ void FlutterTizenEngine::OnUpdateSemanticsCustomActions( std::shared_ptr window = FlutterPlatformAppDelegateTizen::GetInstance().GetWindow().lock(); TizenViewBase::Geometry geometry = - engine->view_->tizen_view()->GetRenderTargetGeometry(); + engine->view_->tizen_view_base()->GetRenderTargetGeometry(); window->SetGeometry(geometry.left, geometry.top, geometry.width, geometry.height); window->SetRootNode(root); diff --git a/shell/platform/tizen/flutter_tizen_view.cc b/shell/platform/tizen/flutter_tizen_view.cc index d198f6c9bab2c..2f625a8ec508a 100644 --- a/shell/platform/tizen/flutter_tizen_view.cc +++ b/shell/platform/tizen/flutter_tizen_view.cc @@ -41,9 +41,9 @@ const std::vector kBindableSystemKeys = { namespace flutter { FlutterTizenView::FlutterTizenView(std::unique_ptr tizen_view) - : tizen_view_(std::move(tizen_view)) { - tizen_view_->SetView(this); - tizen_view_->BindKeys(kBindableSystemKeys); + : tizen_view_base_(std::move(tizen_view)) { + tizen_view_base_->SetView(this); + tizen_view_base_->BindKeys(kBindableSystemKeys); } FlutterTizenView::~FlutterTizenView() {} @@ -58,8 +58,8 @@ void FlutterTizenView::SetEngine(std::unique_ptr engine) { // Set up window dependent channels. BinaryMessenger* messenger = internal_plugin_registrar_->messenger(); - if (tizen_view_->GetType() == "window") { - auto window = reinterpret_cast(tizen_view_.get()); + if (tizen_view_base_->GetType() == "window") { + auto window = reinterpret_cast(tizen_view_base_.get()); platform_channel_ = std::make_unique(messenger, window); window_channel_ = std::make_unique(messenger, window); } else { @@ -69,15 +69,17 @@ void FlutterTizenView::SetEngine(std::unique_ptr engine) { text_input_channel_ = std::make_unique( internal_plugin_registrar_->messenger(), - tizen_view_->input_method_context()); + tizen_view_base_->input_method_context()); } void FlutterTizenView::CreateRenderSurface() { if (engine_ && engine_->renderer()) { - TizenViewBase::Geometry geometry = tizen_view_->GetRenderTargetGeometry(); - engine_->renderer()->CreateSurface(tizen_view_->GetRenderTarget(), - tizen_view_->GetRenderTargetDisplay(), - geometry.width, geometry.height); + TizenViewBase::Geometry geometry = + tizen_view_base_->GetRenderTargetGeometry(); + engine_->renderer()->CreateSurface( + tizen_view_base_->GetRenderTarget(), + tizen_view_base_->GetRenderTargetDisplay(), geometry.width, + geometry.height); } } @@ -119,8 +121,8 @@ void FlutterTizenView::OnResize(int32_t left, std::swap(width, height); } - tizen_view_->ResizeRenderTargetWithRotation({left, top, width, height}, - rotation_degree_); + tizen_view_base_->ResizeRenderTargetWithRotation({left, top, width, height}, + rotation_degree_); SendWindowMetrics(left, top, width, height, 0.0); } @@ -128,7 +130,8 @@ void FlutterTizenView::OnRotate(int32_t degree) { rotation_degree_ = degree; // Compute renderer transformation based on the angle of rotation. double rad = (360 - rotation_degree_) * M_PI / 180; - TizenViewBase::Geometry geometry = tizen_view_->GetRenderTargetGeometry(); + TizenViewBase::Geometry geometry = + tizen_view_base_->GetRenderTargetGeometry(); int32_t width = geometry.width; int32_t height = geometry.height; @@ -152,7 +155,7 @@ void FlutterTizenView::OnRotate(int32_t degree) { std::swap(width, height); } - tizen_view_->ResizeRenderTargetWithRotation( + tizen_view_base_->ResizeRenderTargetWithRotation( {geometry.left, geometry.top, width, height}, rotation_degree_); // Window position does not change on rotation regardless of its orientation. @@ -260,11 +263,14 @@ void FlutterTizenView::OnCommit(const std::string& str) { } void FlutterTizenView::SendInitialGeometry() { - if (tizen_view_->GetType() == "window") { - auto window = reinterpret_cast(tizen_view_.get()); + if (tizen_view_base_->GetType() == "window") { + auto window = reinterpret_cast(tizen_view_base_.get()); OnRotate(window->GetRotation()); } else { - OnRotate(0); + TizenViewBase::Geometry geometry = + tizen_view_base_->GetRenderTargetGeometry(); + SendWindowMetrics(geometry.left, geometry.top, geometry.width, + geometry.height, 0.0); } } @@ -281,7 +287,7 @@ void FlutterTizenView::SendWindowMetrics(int32_t left, #ifdef TV_PROFILE double dpi = 72.0; #else - double dpi = static_cast(tizen_view_->GetDpi()); + double dpi = static_cast(tizen_view_base_->GetDpi()); #endif double scale_factor = dpi / 90.0 * kProfileFactor; computed_pixel_ratio = std::max(scale_factor, 1.0); @@ -301,7 +307,8 @@ void FlutterTizenView::SendFlutterPointerEvent( size_t timestamp, FlutterPointerDeviceKind device_kind, int device_id) { - TizenViewBase::Geometry geometry = tizen_view_->GetRenderTargetGeometry(); + TizenViewBase::Geometry geometry = + tizen_view_base_->GetRenderTargetGeometry(); double new_x = x, new_y = y; if (rotation_degree_ == 90) { diff --git a/shell/platform/tizen/flutter_tizen_view.h b/shell/platform/tizen/flutter_tizen_view.h index f89bf133b50bd..afe3ae1809f5f 100644 --- a/shell/platform/tizen/flutter_tizen_view.h +++ b/shell/platform/tizen/flutter_tizen_view.h @@ -20,7 +20,7 @@ namespace flutter { class FlutterTizenView { public: - FlutterTizenView(std::unique_ptr tizen_view_); + FlutterTizenView(std::unique_ptr tizen_view_base_); ~FlutterTizenView(); @@ -30,7 +30,7 @@ class FlutterTizenView { FlutterTizenEngine* engine() { return engine_.get(); } - TizenViewBase* tizen_view() { return tizen_view_.get(); } + TizenViewBase* tizen_view_base() { return tizen_view_base_.get(); } // Creates rendering surface for Flutter engine to draw into. // Should be called before calling FlutterEngineRun using this view. @@ -127,7 +127,7 @@ class FlutterTizenView { std::unique_ptr engine_; // The window associated with this view. - std::unique_ptr tizen_view_; + std::unique_ptr tizen_view_base_; // The plugin registrar managing internal plugins. std::unique_ptr internal_plugin_registrar_; diff --git a/shell/platform/tizen/public/flutter_tizen.h b/shell/platform/tizen/public/flutter_tizen.h index f977c4a713b29..ff511bff94b00 100644 --- a/shell/platform/tizen/public/flutter_tizen.h +++ b/shell/platform/tizen/public/flutter_tizen.h @@ -144,16 +144,19 @@ FLUTTER_EXPORT FlutterDesktopViewRef FlutterDesktopViewCreateFromNewWindow( FlutterDesktopEngineRef engine); // Creates a view that hosts and displays the given engine instance. +// (@warning: This API is improving. There is no guarantee that exact result.) FLUTTER_EXPORT FlutterDesktopViewRef FlutterDesktopViewCreateFromElmParent( const FlutterDesktopViewProperties& view_properties, FlutterDesktopEngineRef engine, void* parent); // Returns a handle to evas object that the FlutterView is drawn to. +// (@warning: This API is improving. There is no guarantee that exact result.) FLUTTER_EXPORT void* FlutterDesktopViewGetEvasObject( FlutterDesktopViewRef view); // Resize the FlutterView. +// (@warning: This API is improving. There is no guarantee that exact result.) FLUTTER_EXPORT void FlutterDesktopViewResizeView(FlutterDesktopViewRef view, int32_t width, int32_t height); diff --git a/shell/platform/tizen/tizen_view_elementary.cc b/shell/platform/tizen/tizen_view_elementary.cc index 1b041860ecba6..aa9d7d647c34f 100644 --- a/shell/platform/tizen/tizen_view_elementary.cc +++ b/shell/platform/tizen/tizen_view_elementary.cc @@ -316,8 +316,8 @@ void TizenViewElementary::BindKeys(const std::vector& keys) { // However, it is necessary to bind a special key for each profile(in this // case). This part is modified after refactoring related to the key event // code. - Evas_Object* elm_win = (Evas_Object*)ecore_evas_data_get( - ecore_evas_ecore_evas_get(evas_object_evas_get(image_)), "elm_win"); + Evas_Object* elm_win = static_cast(ecore_evas_data_get( + ecore_evas_ecore_evas_get(evas_object_evas_get(image_)), "elm_win")); if (elm_win) { for (const std::string& key : keys) { eext_win_keygrab_set(elm_win, key.c_str()); From 2c14b3a0e86cc4c9c7b4ef302356e09df3089e0e Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Wed, 8 Jun 2022 10:59:35 +0900 Subject: [PATCH 07/14] Fix scroll event --- shell/platform/tizen/tizen_view_elementary.cc | 57 ++++++++++++------- shell/platform/tizen/tizen_view_elementary.h | 2 + 2 files changed, 40 insertions(+), 19 deletions(-) diff --git a/shell/platform/tizen/tizen_view_elementary.cc b/shell/platform/tizen/tizen_view_elementary.cc index aa9d7d647c34f..407cc8dd1b091 100644 --- a/shell/platform/tizen/tizen_view_elementary.cc +++ b/shell/platform/tizen/tizen_view_elementary.cc @@ -140,6 +140,10 @@ void TizenViewElementary::RegisterEventHandlers() { if (self->view_) { if (self->event_layer_ == object) { auto* mouse_event = reinterpret_cast(event_info); + if (self->scroll_hold_) { + elm_object_scroll_hold_pop(self->event_layer_); + self->scroll_hold_ = false; + } self->view_->OnPointerUp(mouse_event->canvas.x, mouse_event->canvas.y, mouse_event->timestamp, kFlutterPointerDeviceKindTouch, @@ -150,23 +154,26 @@ void TizenViewElementary::RegisterEventHandlers() { evas_object_event_callback_add(event_layer_, EVAS_CALLBACK_MOUSE_UP, evas_object_callbacks_[EVAS_CALLBACK_MOUSE_UP], this); - evas_object_callbacks_[EVAS_CALLBACK_MOUSE_MOVE] = [](void* data, Evas* evas, - Evas_Object* object, - void* event_info) { - auto* self = reinterpret_cast(data); - if (self->view_) { - if (self->event_layer_ == object) { - auto* mouse_event = - reinterpret_cast(event_info); - mouse_event->event_flags = (Evas_Event_Flags)(mouse_event->event_flags & - EVAS_EVENT_FLAG_ON_HOLD); - self->view_->OnPointerMove( - mouse_event->cur.canvas.x, mouse_event->cur.canvas.y, - mouse_event->timestamp, kFlutterPointerDeviceKindTouch, - mouse_event->buttons); - } - } - }; + evas_object_callbacks_[EVAS_CALLBACK_MOUSE_MOVE] = + [](void* data, Evas* evas, Evas_Object* object, void* event_info) { + auto* self = reinterpret_cast(data); + if (self->view_) { + if (self->event_layer_ == object) { + auto* mouse_event = + reinterpret_cast(event_info); + mouse_event->event_flags = static_cast( + mouse_event->event_flags | EVAS_EVENT_FLAG_ON_HOLD); + if (!self->scroll_hold_) { + elm_object_scroll_hold_push(self->event_layer_); + self->scroll_hold_ = true; + } + self->view_->OnPointerMove( + mouse_event->cur.canvas.x, mouse_event->cur.canvas.y, + mouse_event->timestamp, kFlutterPointerDeviceKindTouch, + mouse_event->buttons); + } + } + }; evas_object_event_callback_add( event_layer_, EVAS_CALLBACK_MOUSE_MOVE, evas_object_callbacks_[EVAS_CALLBACK_MOUSE_MOVE], this); @@ -206,7 +213,8 @@ void TizenViewElementary::RegisterEventHandlers() { if (self->event_layer_ == object) { auto* key_event = reinterpret_cast(event_info); int handled = false; - key_event->event_flags = EVAS_EVENT_FLAG_ON_HOLD; + key_event->event_flags = static_cast( + key_event->event_flags | EVAS_EVENT_FLAG_ON_HOLD); if (self->input_method_context_->IsInputPanelShown()) { handled = self->input_method_context_->HandleEvasEventKeyDown(key_event); @@ -231,7 +239,8 @@ void TizenViewElementary::RegisterEventHandlers() { if (self->event_layer_ == object) { auto* key_event = reinterpret_cast(event_info); int handled = false; - key_event->event_flags = EVAS_EVENT_FLAG_ON_HOLD; + key_event->event_flags = static_cast( + key_event->event_flags | EVAS_EVENT_FLAG_ON_HOLD); if (self->input_method_context_->IsInputPanelShown()) { handled = self->input_method_context_->HandleEvasEventKeyUp(key_event); @@ -278,6 +287,16 @@ TizenViewBase::Geometry TizenViewElementary::GetRenderTargetGeometry() { } void TizenViewElementary::SetRenderTargetGeometry(Geometry geometry) { + evas_object_resize(container_, geometry.width, geometry.height); + evas_object_size_hint_min_set(container_, geometry.width, geometry.height); + evas_object_size_hint_max_set(container_, geometry.width, geometry.height); + evas_object_move(container_, geometry.left, geometry.top); + + evas_object_resize(event_layer_, geometry.width, geometry.height); + evas_object_size_hint_min_set(event_layer_, geometry.width, geometry.height); + evas_object_size_hint_max_set(event_layer_, geometry.width, geometry.height); + evas_object_move(event_layer_, geometry.left, geometry.top); + evas_object_resize(image_, geometry.width, geometry.height); evas_object_size_hint_min_set(image_, geometry.width, geometry.height); evas_object_size_hint_max_set(image_, geometry.width, geometry.height); diff --git a/shell/platform/tizen/tizen_view_elementary.h b/shell/platform/tizen/tizen_view_elementary.h index 4178f479ef9c8..74bbdf5ca92b5 100644 --- a/shell/platform/tizen/tizen_view_elementary.h +++ b/shell/platform/tizen/tizen_view_elementary.h @@ -62,6 +62,8 @@ class TizenViewElementary : public TizenView { std::unordered_map evas_object_callbacks_; std::vector ecore_event_key_handlers_; + + bool scroll_hold_ = false; }; } // namespace flutter From c2828150e53791a7e17195245c90b9fb660146d8 Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Thu, 9 Jun 2022 14:04:10 +0900 Subject: [PATCH 08/14] Update based on review --- .../platform/tizen/channels/window_channel.cc | 10 +-- shell/platform/tizen/flutter_tizen.cc | 7 +- shell/platform/tizen/flutter_tizen_ecore.cc | 24 +++--- .../tizen/flutter_tizen_elementary.cc | 61 ++++++-------- shell/platform/tizen/flutter_tizen_engine.cc | 4 +- shell/platform/tizen/flutter_tizen_view.cc | 52 ++++++------ shell/platform/tizen/flutter_tizen_view.h | 9 +-- shell/platform/tizen/public/flutter_tizen.h | 16 ++-- .../platform/tizen/tizen_renderer_evas_gl.cc | 4 +- shell/platform/tizen/tizen_view.h | 13 +-- shell/platform/tizen/tizen_view_base.h | 30 ++++--- shell/platform/tizen/tizen_view_elementary.cc | 80 ++++++++----------- shell/platform/tizen/tizen_view_elementary.h | 18 ++--- shell/platform/tizen/tizen_window.h | 15 ++-- .../platform/tizen/tizen_window_ecore_wl2.cc | 18 ++--- shell/platform/tizen/tizen_window_ecore_wl2.h | 12 +-- .../platform/tizen/tizen_window_elementary.cc | 19 ++--- .../platform/tizen/tizen_window_elementary.h | 12 +-- 18 files changed, 193 insertions(+), 211 deletions(-) diff --git a/shell/platform/tizen/channels/window_channel.cc b/shell/platform/tizen/channels/window_channel.cc index ca32b68c8d3f5..bd6e851f9d570 100644 --- a/shell/platform/tizen/channels/window_channel.cc +++ b/shell/platform/tizen/channels/window_channel.cc @@ -35,7 +35,7 @@ void WindowChannel::HandleMethodCall( const std::string& method_name = method_call.method_name(); if (method_name == "getWindowGeometry") { - TizenViewBase::Geometry geometry = window_->GetRenderTargetGeometry(); + TizenGeometry geometry = window_->GetRenderTargetGeometry(); EncodableMap map; map[EncodableValue("x")] = EncodableValue(geometry.left); map[EncodableValue("y")] = EncodableValue(geometry.top); @@ -57,9 +57,9 @@ void WindowChannel::HandleMethodCall( EncodableValueHolder width(arguments, "width"); EncodableValueHolder height(arguments, "height"); - TizenViewBase::Geometry geometry = window_->GetRenderTargetGeometry(); - // FIXME: Use SetWindowGeometry() instead of OnGeometryChanged() - // After the SetWindowGeometry was successfully executed, I expected a + TizenGeometry geometry = window_->GetRenderTargetGeometry(); + // FIXME: Use SetRenderTargetGeometry() instead of OnGeometryChanged() + // After the SetRenderTargetGeometry was successfully executed, I expected a // handler of ECORE_WL2_EVENT_WINDOW_CONFIGURE to be called, but it didn't. window_->OnGeometryChanged({ x ? *x : geometry.left, @@ -70,7 +70,7 @@ void WindowChannel::HandleMethodCall( result->Success(); #endif } else if (method_name == "getScreenGeometry") { - TizenViewBase::Geometry geometry = window_->GetScreenGeometry(); + TizenGeometry geometry = window_->GetScreenGeometry(); EncodableMap map; map[EncodableValue("width")] = EncodableValue(geometry.width); map[EncodableValue("height")] = EncodableValue(geometry.height); diff --git a/shell/platform/tizen/flutter_tizen.cc b/shell/platform/tizen/flutter_tizen.cc index 5a6e3d50450e8..6d3beb3a4f1c5 100644 --- a/shell/platform/tizen/flutter_tizen.cc +++ b/shell/platform/tizen/flutter_tizen.cc @@ -71,10 +71,9 @@ void FlutterDesktopEngineShutdown(FlutterDesktopEngineRef engine_ref) { void* FlutterDesktopPluginRegistrarGetNativeWindow( FlutterDesktopPluginRegistrarRef registrar) { - flutter::TizenViewBase* tizen_view_base = - registrar->engine->view()->tizen_view_base(); - if (tizen_view_base->GetType() == "window") { - auto window = reinterpret_cast(tizen_view_base); + flutter::TizenViewBase* tizen_view = registrar->engine->view()->tizen_view(); + if (tizen_view->GetType() == flutter::TizenViewType::kWindow) { + auto* window = reinterpret_cast(tizen_view); return window->GetWindowHandle(); } return nullptr; diff --git a/shell/platform/tizen/flutter_tizen_ecore.cc b/shell/platform/tizen/flutter_tizen_ecore.cc index 396461303a487..d30b996551a93 100644 --- a/shell/platform/tizen/flutter_tizen_ecore.cc +++ b/shell/platform/tizen/flutter_tizen_ecore.cc @@ -25,12 +25,9 @@ FlutterDesktopViewRef HandleForView(flutter::FlutterTizenView* view) { FlutterDesktopViewRef FlutterDesktopViewCreateFromNewWindow( const FlutterDesktopWindowProperties& window_properties, FlutterDesktopEngineRef engine) { - flutter::TizenViewBase::Geometry window_geometry = { - window_properties.x, - window_properties.y, - window_properties.width, - window_properties.height, - }; + flutter::TizenGeometry window_geometry = { + window_properties.x, window_properties.y, window_properties.width, + window_properties.height}; std::unique_ptr window = std::make_unique( @@ -58,20 +55,17 @@ FlutterDesktopViewRef FlutterDesktopViewCreateFromElmParent( const FlutterDesktopViewProperties& view_properties, FlutterDesktopEngineRef engine, void* parent) { - // FIXME: Ecore WL2 renderer does not support this yet. - FT_UNIMPLEMENTED(); + FT_LOG(Warn) << "Not applicable!"; return nullptr; } void* FlutterDesktopViewGetEvasObject(FlutterDesktopViewRef view) { - // FIXME: Ecore WL2 renderer does not support this yet. - FT_UNIMPLEMENTED(); + FT_LOG(Warn) << "Not applicable!"; return nullptr; } -void FlutterDesktopViewResizeView(FlutterDesktopViewRef view, - int32_t width, - int32_t height) { - // FIXME: Ecore WL2 renderer does not support this yet. - FT_UNIMPLEMENTED(); +void FlutterDesktopViewResize(FlutterDesktopViewRef view, + int32_t width, + int32_t height) { + FT_LOG(Warn) << "Not applicable!"; } diff --git a/shell/platform/tizen/flutter_tizen_elementary.cc b/shell/platform/tizen/flutter_tizen_elementary.cc index 7ebb174b4338d..4bca825edba47 100644 --- a/shell/platform/tizen/flutter_tizen_elementary.cc +++ b/shell/platform/tizen/flutter_tizen_elementary.cc @@ -25,12 +25,9 @@ FlutterDesktopViewRef HandleForView(flutter::FlutterTizenView* view) { FlutterDesktopViewRef FlutterDesktopViewCreateFromNewWindow( const FlutterDesktopWindowProperties& window_properties, FlutterDesktopEngineRef engine) { - flutter::TizenViewBase::Geometry window_geometry = { - window_properties.x, - window_properties.y, - window_properties.width, - window_properties.height, - }; + flutter::TizenGeometry window_geometry = { + window_properties.x, window_properties.y, window_properties.width, + window_properties.height}; std::unique_ptr window = std::make_unique( @@ -58,49 +55,39 @@ FlutterDesktopViewRef FlutterDesktopViewCreateFromElmParent( const FlutterDesktopViewProperties& view_properties, FlutterDesktopEngineRef engine, void* parent) { - flutter::TizenViewBase::Geometry view_geometry = { - 0, - 0, - view_properties.width, - view_properties.height, - }; - - std::unique_ptr view = + std::unique_ptr tizen_view = std::make_unique( - view_geometry, static_cast(parent)); + view_properties.width, view_properties.height, + static_cast(parent)); - auto flutter_view = - std::make_unique(std::move(view)); + auto view = + std::make_unique(std::move(tizen_view)); // Take ownership of the engine, starting it if necessary. - flutter_view->SetEngine( + view->SetEngine( std::unique_ptr(EngineFromHandle(engine))); - flutter_view->CreateRenderSurface(); - if (!flutter_view->engine()->IsRunning()) { - if (!flutter_view->engine()->RunEngine()) { + view->CreateRenderSurface(); + if (!view->engine()->IsRunning()) { + if (!view->engine()->RunEngine()) { return nullptr; } } - flutter_view->SendInitialGeometry(); + view->SendInitialGeometry(); - return HandleForView(flutter_view.release()); + return HandleForView(view.release()); } -void* FlutterDesktopViewGetEvasObject(FlutterDesktopViewRef view) { - auto flutter_tizen_view = reinterpret_cast(view); - return flutter_tizen_view->tizen_view_base()->GetRenderTarget(); +void* FlutterDesktopViewGetEvasObject(FlutterDesktopViewRef view_ref) { + auto* view = reinterpret_cast(view_ref); + auto* tizen_view = reinterpret_cast(view->tizen_view()); + return tizen_view->GetRenderTargetContainer(); } -void FlutterDesktopViewResizeView(FlutterDesktopViewRef view, - int32_t width, - int32_t height) { - auto flutter_tizen_view = reinterpret_cast(view); - flutter::TizenViewBase::Geometry view_geometry = { - 0, - 0, - width, - height, - }; - flutter_tizen_view->tizen_view_base()->OnGeometryChanged(view_geometry); +void FlutterDesktopViewResize(FlutterDesktopViewRef view_ref, + int32_t width, + int32_t height) { + auto* view = reinterpret_cast(view_ref); + flutter::TizenGeometry view_geometry = {0, 0, width, height}; + view->tizen_view()->OnGeometryChanged(view_geometry); } diff --git a/shell/platform/tizen/flutter_tizen_engine.cc b/shell/platform/tizen/flutter_tizen_engine.cc index 7def4b992aab3..ce3a8d601019e 100644 --- a/shell/platform/tizen/flutter_tizen_engine.cc +++ b/shell/platform/tizen/flutter_tizen_engine.cc @@ -536,8 +536,8 @@ void FlutterTizenEngine::OnUpdateSemanticsCustomActions( bridge->GetFlutterPlatformNodeDelegateFromID(0); std::shared_ptr window = FlutterPlatformAppDelegateTizen::GetInstance().GetWindow().lock(); - TizenViewBase::Geometry geometry = - engine->view_->tizen_view_base()->GetRenderTargetGeometry(); + TizenGeometry geometry = + engine->view_->tizen_view()->GetRenderTargetGeometry(); window->SetGeometry(geometry.left, geometry.top, geometry.width, geometry.height); window->SetRootNode(root); diff --git a/shell/platform/tizen/flutter_tizen_view.cc b/shell/platform/tizen/flutter_tizen_view.cc index 2f625a8ec508a..3cd600b131664 100644 --- a/shell/platform/tizen/flutter_tizen_view.cc +++ b/shell/platform/tizen/flutter_tizen_view.cc @@ -4,6 +4,8 @@ // found in the LICENSE file. #include "flutter_tizen_view.h" +#include "flutter/shell/platform/tizen/tizen_view.h" +#include "flutter/shell/platform/tizen/tizen_window.h" #include "flutter/shell/platform/tizen/logger.h" @@ -41,9 +43,9 @@ const std::vector kBindableSystemKeys = { namespace flutter { FlutterTizenView::FlutterTizenView(std::unique_ptr tizen_view) - : tizen_view_base_(std::move(tizen_view)) { - tizen_view_base_->SetView(this); - tizen_view_base_->BindKeys(kBindableSystemKeys); + : tizen_view_(std::move(tizen_view)) { + tizen_view_->SetView(this); + tizen_view_->BindKeys(kBindableSystemKeys); } FlutterTizenView::~FlutterTizenView() {} @@ -58,8 +60,8 @@ void FlutterTizenView::SetEngine(std::unique_ptr engine) { // Set up window dependent channels. BinaryMessenger* messenger = internal_plugin_registrar_->messenger(); - if (tizen_view_base_->GetType() == "window") { - auto window = reinterpret_cast(tizen_view_base_.get()); + if (tizen_view_->GetType() == TizenViewType::kWindow) { + auto* window = reinterpret_cast(tizen_view_.get()); platform_channel_ = std::make_unique(messenger, window); window_channel_ = std::make_unique(messenger, window); } else { @@ -69,17 +71,22 @@ void FlutterTizenView::SetEngine(std::unique_ptr engine) { text_input_channel_ = std::make_unique( internal_plugin_registrar_->messenger(), - tizen_view_base_->input_method_context()); + tizen_view_->input_method_context()); } void FlutterTizenView::CreateRenderSurface() { if (engine_ && engine_->renderer()) { - TizenViewBase::Geometry geometry = - tizen_view_base_->GetRenderTargetGeometry(); - engine_->renderer()->CreateSurface( - tizen_view_base_->GetRenderTarget(), - tizen_view_base_->GetRenderTargetDisplay(), geometry.width, - geometry.height); + TizenGeometry geometry = tizen_view_->GetRenderTargetGeometry(); + if (tizen_view_->GetType() == TizenViewType::kWindow) { + auto* window = reinterpret_cast(tizen_view_.get()); + engine_->renderer()->CreateSurface(window->GetRenderTarget(), + window->GetRenderTargetDisplay(), + geometry.width, geometry.height); + } else { + auto* tizen_view = reinterpret_cast(tizen_view_.get()); + engine_->renderer()->CreateSurface(tizen_view->GetRenderTarget(), nullptr, + geometry.width, geometry.height); + } } } @@ -121,8 +128,8 @@ void FlutterTizenView::OnResize(int32_t left, std::swap(width, height); } - tizen_view_base_->ResizeRenderTargetWithRotation({left, top, width, height}, - rotation_degree_); + tizen_view_->ResizeRenderTargetWithRotation({left, top, width, height}, + rotation_degree_); SendWindowMetrics(left, top, width, height, 0.0); } @@ -130,8 +137,7 @@ void FlutterTizenView::OnRotate(int32_t degree) { rotation_degree_ = degree; // Compute renderer transformation based on the angle of rotation. double rad = (360 - rotation_degree_) * M_PI / 180; - TizenViewBase::Geometry geometry = - tizen_view_base_->GetRenderTargetGeometry(); + TizenGeometry geometry = tizen_view_->GetRenderTargetGeometry(); int32_t width = geometry.width; int32_t height = geometry.height; @@ -155,7 +161,7 @@ void FlutterTizenView::OnRotate(int32_t degree) { std::swap(width, height); } - tizen_view_base_->ResizeRenderTargetWithRotation( + tizen_view_->ResizeRenderTargetWithRotation( {geometry.left, geometry.top, width, height}, rotation_degree_); // Window position does not change on rotation regardless of its orientation. @@ -263,12 +269,11 @@ void FlutterTizenView::OnCommit(const std::string& str) { } void FlutterTizenView::SendInitialGeometry() { - if (tizen_view_base_->GetType() == "window") { - auto window = reinterpret_cast(tizen_view_base_.get()); + if (tizen_view_->GetType() == TizenViewType::kWindow) { + auto* window = reinterpret_cast(tizen_view_.get()); OnRotate(window->GetRotation()); } else { - TizenViewBase::Geometry geometry = - tizen_view_base_->GetRenderTargetGeometry(); + TizenGeometry geometry = tizen_view_->GetRenderTargetGeometry(); SendWindowMetrics(geometry.left, geometry.top, geometry.width, geometry.height, 0.0); } @@ -287,7 +292,7 @@ void FlutterTizenView::SendWindowMetrics(int32_t left, #ifdef TV_PROFILE double dpi = 72.0; #else - double dpi = static_cast(tizen_view_base_->GetDpi()); + double dpi = static_cast(tizen_view_->GetDpi()); #endif double scale_factor = dpi / 90.0 * kProfileFactor; computed_pixel_ratio = std::max(scale_factor, 1.0); @@ -307,8 +312,7 @@ void FlutterTizenView::SendFlutterPointerEvent( size_t timestamp, FlutterPointerDeviceKind device_kind, int device_id) { - TizenViewBase::Geometry geometry = - tizen_view_base_->GetRenderTargetGeometry(); + TizenGeometry geometry = tizen_view_->GetRenderTargetGeometry(); double new_x = x, new_y = y; if (rotation_degree_ == 90) { diff --git a/shell/platform/tizen/flutter_tizen_view.h b/shell/platform/tizen/flutter_tizen_view.h index afe3ae1809f5f..790171455d599 100644 --- a/shell/platform/tizen/flutter_tizen_view.h +++ b/shell/platform/tizen/flutter_tizen_view.h @@ -14,13 +14,12 @@ #include "flutter/shell/platform/tizen/channels/text_input_channel.h" #include "flutter/shell/platform/tizen/channels/window_channel.h" #include "flutter/shell/platform/tizen/flutter_tizen_engine.h" -#include "flutter/shell/platform/tizen/tizen_window.h" namespace flutter { class FlutterTizenView { public: - FlutterTizenView(std::unique_ptr tizen_view_base_); + FlutterTizenView(std::unique_ptr tizen_view); ~FlutterTizenView(); @@ -30,7 +29,7 @@ class FlutterTizenView { FlutterTizenEngine* engine() { return engine_.get(); } - TizenViewBase* tizen_view_base() { return tizen_view_base_.get(); } + TizenViewBase* tizen_view() { return tizen_view_.get(); } // Creates rendering surface for Flutter engine to draw into. // Should be called before calling FlutterEngineRun using this view. @@ -126,8 +125,8 @@ class FlutterTizenView { // The engine associated with this view. std::unique_ptr engine_; - // The window associated with this view. - std::unique_ptr tizen_view_base_; + // The platform view associated with this Flutter view. + std::unique_ptr tizen_view_; // The plugin registrar managing internal plugins. std::unique_ptr internal_plugin_registrar_; diff --git a/shell/platform/tizen/public/flutter_tizen.h b/shell/platform/tizen/public/flutter_tizen.h index ff511bff94b00..051ae3bd6d765 100644 --- a/shell/platform/tizen/public/flutter_tizen.h +++ b/shell/platform/tizen/public/flutter_tizen.h @@ -144,22 +144,26 @@ FLUTTER_EXPORT FlutterDesktopViewRef FlutterDesktopViewCreateFromNewWindow( FlutterDesktopEngineRef engine); // Creates a view that hosts and displays the given engine instance. -// (@warning: This API is improving. There is no guarantee that exact result.) +// +// The type of parent should be Evas_Object*, Cast Evas_Object* to void*. +// @warning This API is a work-in-progress and may change. FLUTTER_EXPORT FlutterDesktopViewRef FlutterDesktopViewCreateFromElmParent( const FlutterDesktopViewProperties& view_properties, FlutterDesktopEngineRef engine, void* parent); // Returns a handle to evas object that the FlutterView is drawn to. -// (@warning: This API is improving. There is no guarantee that exact result.) +// +// Cast the returned void* to Evas_Object*. +// @warning This API is a work-in-progress and may change. FLUTTER_EXPORT void* FlutterDesktopViewGetEvasObject( FlutterDesktopViewRef view); // Resize the FlutterView. -// (@warning: This API is improving. There is no guarantee that exact result.) -FLUTTER_EXPORT void FlutterDesktopViewResizeView(FlutterDesktopViewRef view, - int32_t width, - int32_t height); +// @warning This API is a work-in-progress and may change. +FLUTTER_EXPORT void FlutterDesktopViewResize(FlutterDesktopViewRef view, + int32_t width, + int32_t height); // ========== Plugin Registrar (extensions) ========== diff --git a/shell/platform/tizen/tizen_renderer_evas_gl.cc b/shell/platform/tizen/tizen_renderer_evas_gl.cc index fa779313d9b1f..ae94366454e83 100644 --- a/shell/platform/tizen/tizen_renderer_evas_gl.cc +++ b/shell/platform/tizen/tizen_renderer_evas_gl.cc @@ -26,7 +26,7 @@ bool TizenRendererEvasGL::CreateSurface(void* render_target, int32_t width, int32_t height) { evas_gl_ = evas_gl_new( - evas_object_evas_get(static_cast(render_target_display))); + evas_object_evas_get(static_cast(render_target))); if (!evas_gl_) { FT_LOG(Error) << "Could not create an Evas GL object."; return false; @@ -58,7 +58,7 @@ bool TizenRendererEvasGL::CreateSurface(void* render_target, Evas_Native_Surface native_surface; evas_gl_native_surface_get(evas_gl_, gl_surface_, &native_surface); - image_ = static_cast(render_target_display); + image_ = static_cast(render_target); evas_object_image_native_surface_set(image_, &native_surface); evas_object_image_pixels_get_callback_set( diff --git a/shell/platform/tizen/tizen_view.h b/shell/platform/tizen/tizen_view.h index ee529400c959d..01f5f23af36fd 100644 --- a/shell/platform/tizen/tizen_view.h +++ b/shell/platform/tizen/tizen_view.h @@ -6,7 +6,7 @@ #ifndef EMBEDDER_TIZEN_VIEW_H_ #define EMBEDDER_TIZEN_VIEW_H_ -#include +#include #include "flutter/shell/platform/tizen/tizen_view_base.h" @@ -19,13 +19,16 @@ class TizenView : public TizenViewBase { TizenView() = default; virtual ~TizenView() = default; - std::string GetType() override { return "view"; }; + TizenViewType GetType() override { return TizenViewType::kView; }; + + virtual void* GetRenderTargetContainer() = 0; protected: - explicit TizenView(TizenViewBase::Geometry geometry) - : initial_geometry_(geometry) {} + explicit TizenView(int width, int height) + : initial_width_(width), initial_height_(height) {} - TizenViewBase::Geometry initial_geometry_ = {0, 0, 0, 0}; + int initial_width_ = 0; + int initial_height_ = 0; }; } // namespace flutter diff --git a/shell/platform/tizen/tizen_view_base.h b/shell/platform/tizen/tizen_view_base.h index 7538deac9cd74..4835a8c5b7f21 100644 --- a/shell/platform/tizen/tizen_view_base.h +++ b/shell/platform/tizen/tizen_view_base.h @@ -7,6 +7,7 @@ #define EMBEDDER_TIZEN_VIEW_BASE_H_ #include +#include #include #include @@ -16,31 +17,28 @@ namespace flutter { class FlutterTizenView; +struct TizenGeometry { + int32_t left = 0, top = 0, width = 0, height = 0; +}; + +enum class TizenViewType { kView, kWindow }; + class TizenViewBase { public: - struct Geometry { - int32_t left = 0, top = 0, width = 0, height = 0; - }; - TizenViewBase() = default; virtual ~TizenViewBase() = default; - // Returns a valid pointer the platform object that rendering can be bound to - // by rendering backend. + // Returns a pointer to the platform object that rendering can be bound to + // by the rendering backend. virtual void* GetRenderTarget() = 0; - virtual void* GetRenderTargetDisplay() = 0; - virtual uintptr_t GetWindowId() = 0; // Returns the geometry of the current render target. - virtual Geometry GetRenderTargetGeometry() = 0; + virtual TizenGeometry GetRenderTargetGeometry() = 0; // Set the geometry of the current render target. - virtual void SetRenderTargetGeometry(Geometry geometry) = 0; - - // Returns the geometry of the display screen. - virtual Geometry GetScreenGeometry() = 0; + virtual void SetRenderTargetGeometry(TizenGeometry geometry) = 0; // Returns the dpi of the screen. virtual int32_t GetDpi() = 0; @@ -51,16 +49,16 @@ class TizenViewBase { virtual void BindKeys(const std::vector& keys) = 0; - virtual void ResizeRenderTargetWithRotation(Geometry geometry, + virtual void ResizeRenderTargetWithRotation(TizenGeometry geometry, int32_t degree) = 0; // FIXME // This is a temporary implementation that is only used by the window channel. - virtual void OnGeometryChanged(Geometry geometry) = 0; + virtual void OnGeometryChanged(TizenGeometry geometry) = 0; virtual void Show() = 0; - virtual std::string GetType() = 0; + virtual TizenViewType GetType() = 0; TizenInputMethodContext* input_method_context() { return input_method_context_.get(); diff --git a/shell/platform/tizen/tizen_view_elementary.cc b/shell/platform/tizen/tizen_view_elementary.cc index 407cc8dd1b091..131db7e4cbacf 100644 --- a/shell/platform/tizen/tizen_view_elementary.cc +++ b/shell/platform/tizen/tizen_view_elementary.cc @@ -41,9 +41,10 @@ void EvasObjectResize(Evas_Object* object, uint32_t width, uint32_t height) { namespace flutter { -TizenViewElementary::TizenViewElementary(TizenViewBase::Geometry geometry, +TizenViewElementary::TizenViewElementary(int width, + int height, Evas_Object* parent) - : TizenView(geometry), parent_(parent) { + : TizenView(width, height), parent_(parent) { if (!CreateView()) { FT_LOG(Error) << "Failed to create a platform view."; return; @@ -56,6 +57,7 @@ TizenViewElementary::TizenViewElementary(TizenViewBase::Geometry geometry, TizenViewElementary::~TizenViewElementary() { UnregisterEventHandlers(); + DestroyView(); } bool TizenViewElementary::CreateView() { @@ -65,34 +67,32 @@ bool TizenViewElementary::CreateView() { evas_object_geometry_get(parent_, nullptr, nullptr, &parent_width, &parent_height); - if (initial_geometry_.width == 0) { - initial_geometry_.width = parent_width; + if (initial_width_ == 0) { + initial_width_ = parent_width; } - if (initial_geometry_.height == 0) { - initial_geometry_.height = parent_height; + if (initial_height_ == 0) { + initial_height_ = parent_height; } container_ = elm_table_add(parent_); if (!container_) { - FT_LOG(Error) << "Failed to create a evas object container."; + FT_LOG(Error) << "Failed to create an Evas object container."; return false; } - EvasObjectResize(container_, initial_geometry_.width, - initial_geometry_.height); + EvasObjectResize(container_, initial_width_, initial_height_); evas_object_size_hint_weight_set(container_, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(container_, EVAS_HINT_FILL, EVAS_HINT_FILL); image_ = evas_object_image_filled_add(evas_object_evas_get(container_)); if (!image_) { - FT_LOG(Error) << "Failed to create a evas object image."; + FT_LOG(Error) << "Failed to create an Evas object image."; return false; } - EvasObjectResize(image_, initial_geometry_.width, initial_geometry_.height); - evas_object_image_size_set(image_, initial_geometry_.width, - initial_geometry_.height); + EvasObjectResize(image_, initial_width_, initial_height_); + evas_object_image_size_set(image_, initial_width_, initial_height_); evas_object_image_alpha_set(image_, EINA_TRUE); elm_table_pack(container_, image_, 0, 0, 1, 1); @@ -101,19 +101,24 @@ bool TizenViewElementary::CreateView() { // that can be used as event layer. event_layer_ = elm_button_add(container_); if (!event_layer_) { - FT_LOG(Error) << "Failed to create a event layer"; + FT_LOG(Error) << "Failed to create an event layer."; return false; } elm_object_style_set(event_layer_, "transparent"); evas_object_color_set(event_layer_, 0, 0, 0, 0); - EvasObjectResize(event_layer_, initial_geometry_.width, - initial_geometry_.height); + EvasObjectResize(event_layer_, initial_width_, initial_height_); elm_table_pack(container_, event_layer_, 0, 0, 1, 1); return true; } +void TizenViewElementary::DestroyView() { + evas_object_del(event_layer_); + evas_object_del(image_); + evas_object_del(container_); +} + void TizenViewElementary::RegisterEventHandlers() { evas_object_callbacks_[EVAS_CALLBACK_MOUSE_DOWN] = [](void* data, Evas* evas, Evas_Object* object, void* event_info) { @@ -213,8 +218,8 @@ void TizenViewElementary::RegisterEventHandlers() { if (self->event_layer_ == object) { auto* key_event = reinterpret_cast(event_info); int handled = false; - key_event->event_flags = static_cast( - key_event->event_flags | EVAS_EVENT_FLAG_ON_HOLD); + key_event->event_flags = + Evas_Event_Flags(key_event->event_flags | EVAS_EVENT_FLAG_ON_HOLD); if (self->input_method_context_->IsInputPanelShown()) { handled = self->input_method_context_->HandleEvasEventKeyDown(key_event); @@ -239,8 +244,8 @@ void TizenViewElementary::RegisterEventHandlers() { if (self->event_layer_ == object) { auto* key_event = reinterpret_cast(event_info); int handled = false; - key_event->event_flags = static_cast( - key_event->event_flags | EVAS_EVENT_FLAG_ON_HOLD); + key_event->event_flags = Evas_Event_Flags(key_event->event_flags | + EVAS_EVENT_FLAG_ON_HOLD); if (self->input_method_context_->IsInputPanelShown()) { handled = self->input_method_context_->HandleEvasEventKeyUp(key_event); @@ -279,37 +284,24 @@ void TizenViewElementary::UnregisterEventHandlers() { evas_object_callbacks_[EVAS_CALLBACK_KEY_UP]); } -TizenViewBase::Geometry TizenViewElementary::GetRenderTargetGeometry() { - Geometry result; +TizenGeometry TizenViewElementary::GetRenderTargetGeometry() { + TizenGeometry result; evas_object_geometry_get(image_, &result.left, &result.top, &result.width, &result.height); return result; } -void TizenViewElementary::SetRenderTargetGeometry(Geometry geometry) { - evas_object_resize(container_, geometry.width, geometry.height); - evas_object_size_hint_min_set(container_, geometry.width, geometry.height); - evas_object_size_hint_max_set(container_, geometry.width, geometry.height); +void TizenViewElementary::SetRenderTargetGeometry(TizenGeometry geometry) { + EvasObjectResize(container_, geometry.width, geometry.height); evas_object_move(container_, geometry.left, geometry.top); - evas_object_resize(event_layer_, geometry.width, geometry.height); - evas_object_size_hint_min_set(event_layer_, geometry.width, geometry.height); - evas_object_size_hint_max_set(event_layer_, geometry.width, geometry.height); + EvasObjectResize(event_layer_, geometry.width, geometry.height); evas_object_move(event_layer_, geometry.left, geometry.top); - evas_object_resize(image_, geometry.width, geometry.height); - evas_object_size_hint_min_set(image_, geometry.width, geometry.height); - evas_object_size_hint_max_set(image_, geometry.width, geometry.height); + EvasObjectResize(image_, geometry.width, geometry.height); evas_object_move(image_, geometry.left, geometry.top); } -TizenViewBase::Geometry TizenViewElementary::GetScreenGeometry() { - Geometry result; - evas_object_geometry_get(image_, &result.left, &result.top, &result.width, - &result.height); - return result; -} - int32_t TizenViewElementary::GetDpi() { Ecore_Evas* ecore_evas = ecore_evas_ecore_evas_get(evas_object_evas_get(image_)); @@ -323,7 +315,7 @@ uintptr_t TizenViewElementary::GetWindowId() { ecore_evas_ecore_evas_get(evas_object_evas_get(image_))); } -void TizenViewElementary::ResizeRenderTargetWithRotation(Geometry geometry, +void TizenViewElementary::ResizeRenderTargetWithRotation(TizenGeometry geometry, int32_t angle) { TizenRendererEvasGL* renderer_evas_gl = reinterpret_cast(view_->engine()->renderer()); @@ -331,12 +323,8 @@ void TizenViewElementary::ResizeRenderTargetWithRotation(Geometry geometry, } void TizenViewElementary::BindKeys(const std::vector& keys) { - // Views do not need to have window info. - // However, it is necessary to bind a special key for each profile(in this - // case). This part is modified after refactoring related to the key event - // code. Evas_Object* elm_win = static_cast(ecore_evas_data_get( - ecore_evas_ecore_evas_get(evas_object_evas_get(image_)), "elm_win")); + ecore_evas_ecore_evas_get(evas_object_evas_get(parent_)), "elm_win")); if (elm_win) { for (const std::string& key : keys) { eext_win_keygrab_set(elm_win, key.c_str()); @@ -350,7 +338,7 @@ void TizenViewElementary::Show() { evas_object_show(event_layer_); } -void TizenViewElementary::OnGeometryChanged(Geometry geometry) { +void TizenViewElementary::OnGeometryChanged(TizenGeometry geometry) { SetRenderTargetGeometry(geometry); view_->OnResize(geometry.left, geometry.top, geometry.width, geometry.height); } diff --git a/shell/platform/tizen/tizen_view_elementary.h b/shell/platform/tizen/tizen_view_elementary.h index 74bbdf5ca92b5..6136c59000c8e 100644 --- a/shell/platform/tizen/tizen_view_elementary.h +++ b/shell/platform/tizen/tizen_view_elementary.h @@ -18,36 +18,36 @@ namespace flutter { class TizenViewElementary : public TizenView { public: - TizenViewElementary(TizenViewBase::Geometry geometry, Evas_Object* parent); + TizenViewElementary(int width, int height, Evas_Object* parent); ~TizenViewElementary(); - Geometry GetRenderTargetGeometry() override; + TizenGeometry GetRenderTargetGeometry() override; - void SetRenderTargetGeometry(Geometry geometry) override; + void SetRenderTargetGeometry(TizenGeometry geometry) override; - Geometry GetScreenGeometry() override; + void* GetRenderTarget() override { return image_; } - void* GetRenderTarget() override { return container_; } - - void* GetRenderTargetDisplay() override { return image_; } + void* GetRenderTargetContainer() override { return container_; } int32_t GetDpi() override; uintptr_t GetWindowId() override; - void ResizeRenderTargetWithRotation(Geometry geometry, + void ResizeRenderTargetWithRotation(TizenGeometry geometry, int32_t angle) override; void BindKeys(const std::vector& keys) override; void Show() override; - void OnGeometryChanged(Geometry geometry) override; + void OnGeometryChanged(TizenGeometry geometry) override; private: bool CreateView(); + void DestroyView(); + void RegisterEventHandlers(); void UnregisterEventHandlers(); diff --git a/shell/platform/tizen/tizen_window.h b/shell/platform/tizen/tizen_window.h index a01cd30c04c9f..1fc9a45f52c2a 100644 --- a/shell/platform/tizen/tizen_window.h +++ b/shell/platform/tizen/tizen_window.h @@ -6,12 +6,12 @@ #ifndef EMBEDDER_TIZEN_WINDOW_H_ #define EMBEDDER_TIZEN_WINDOW_H_ -#include "flutter/shell/platform/tizen/tizen_view_base.h" - #include #include #include +#include "flutter/shell/platform/tizen/tizen_view_base.h" + namespace flutter { class FlutterTizenView; @@ -27,10 +27,15 @@ class TizenWindow : public TizenViewBase { virtual void SetPreferredOrientations(const std::vector& rotations); - std::string GetType() override { return "window"; }; + virtual void* GetRenderTargetDisplay() = 0; + + // Returns the geometry of the display screen. + virtual TizenGeometry GetScreenGeometry() = 0; + + TizenViewType GetType() override { return TizenViewType::kWindow; }; protected: - explicit TizenWindow(TizenViewBase::Geometry geometry, + explicit TizenWindow(TizenGeometry geometry, bool transparent, bool focusable, bool top_level) @@ -39,7 +44,7 @@ class TizenWindow : public TizenViewBase { focusable_(focusable), top_level_(top_level) {} - TizenViewBase::Geometry initial_geometry_ = {0, 0, 0, 0}; + TizenGeometry initial_geometry_ = {0, 0, 0, 0}; bool transparent_ = false; bool focusable_ = false; bool top_level_ = false; diff --git a/shell/platform/tizen/tizen_window_ecore_wl2.cc b/shell/platform/tizen/tizen_window_ecore_wl2.cc index 0ed4bb18ed2c3..24837f8b3146d 100644 --- a/shell/platform/tizen/tizen_window_ecore_wl2.cc +++ b/shell/platform/tizen/tizen_window_ecore_wl2.cc @@ -22,7 +22,7 @@ static const int kScrollOffsetMultiplier = 20; namespace flutter { -TizenWindowEcoreWl2::TizenWindowEcoreWl2(Geometry geometry, +TizenWindowEcoreWl2::TizenWindowEcoreWl2(TizenGeometry geometry, bool transparent, bool focusable, bool top_level) @@ -198,7 +198,7 @@ void TizenWindowEcoreWl2::RegisterEventHandlers() { if (rotation_event->win == self->GetWindowId()) { int32_t degree = rotation_event->angle; self->view_->OnRotate(degree); - Geometry geometry = self->GetRenderTargetGeometry(); + TizenGeometry geometry = self->GetRenderTargetGeometry(); ecore_wl2_window_rotation_change_done_send( self->ecore_wl2_window_, rotation_event->rotation, geometry.width, geometry.height); @@ -381,14 +381,14 @@ void TizenWindowEcoreWl2::DestroyWindow() { ecore_wl2_shutdown(); } -TizenViewBase::Geometry TizenWindowEcoreWl2::GetRenderTargetGeometry() { - Geometry result; +TizenGeometry TizenWindowEcoreWl2::GetRenderTargetGeometry() { + TizenGeometry result; ecore_wl2_window_geometry_get(ecore_wl2_window_, &result.left, &result.top, &result.width, &result.height); return result; } -void TizenWindowEcoreWl2::SetRenderTargetGeometry(Geometry geometry) { +void TizenWindowEcoreWl2::SetRenderTargetGeometry(TizenGeometry geometry) { ecore_wl2_window_geometry_set(ecore_wl2_window_, geometry.left, geometry.top, geometry.width, geometry.height); // FIXME: The changes set in `ecore_wl2_window_geometry_set` seems to apply @@ -397,8 +397,8 @@ void TizenWindowEcoreWl2::SetRenderTargetGeometry(Geometry geometry) { ecore_wl2_window_position_set(ecore_wl2_window_, geometry.left, geometry.top); } -TizenViewBase::Geometry TizenWindowEcoreWl2::GetScreenGeometry() { - Geometry result = {}; +TizenGeometry TizenWindowEcoreWl2::GetScreenGeometry() { + TizenGeometry result = {}; ecore_wl2_display_screen_size_get(ecore_wl2_display_, &result.width, &result.height); return result; @@ -421,7 +421,7 @@ uintptr_t TizenWindowEcoreWl2::GetWindowId() { return ecore_wl2_window_id_get(ecore_wl2_window_); } -void TizenWindowEcoreWl2::ResizeRenderTargetWithRotation(Geometry geometry, +void TizenWindowEcoreWl2::ResizeRenderTargetWithRotation(TizenGeometry geometry, int32_t angle) { ecore_wl2_egl_window_resize_with_rotation( ecore_wl2_egl_window_, geometry.left, geometry.top, geometry.width, @@ -445,7 +445,7 @@ void TizenWindowEcoreWl2::Show() { ecore_wl2_window_show(ecore_wl2_window_); } -void TizenWindowEcoreWl2::OnGeometryChanged(Geometry geometry) { +void TizenWindowEcoreWl2::OnGeometryChanged(TizenGeometry geometry) { // This implementation mimics the situation in which the handler of // ECORE_WL2_EVENT_WINDOW_CONFIGURE is called. SetRenderTargetGeometry(geometry); diff --git a/shell/platform/tizen/tizen_window_ecore_wl2.h b/shell/platform/tizen/tizen_window_ecore_wl2.h index 788f1d21fa31b..77300e186f668 100644 --- a/shell/platform/tizen/tizen_window_ecore_wl2.h +++ b/shell/platform/tizen/tizen_window_ecore_wl2.h @@ -16,18 +16,18 @@ namespace flutter { class TizenWindowEcoreWl2 : public TizenWindow { public: - TizenWindowEcoreWl2(TizenViewBase::Geometry geometry, + TizenWindowEcoreWl2(TizenGeometry geometry, bool transparent, bool focusable, bool top_level); ~TizenWindowEcoreWl2(); - Geometry GetRenderTargetGeometry() override; + TizenGeometry GetRenderTargetGeometry() override; - void SetRenderTargetGeometry(Geometry geometry) override; + void SetRenderTargetGeometry(TizenGeometry geometry) override; - Geometry GetScreenGeometry() override; + TizenGeometry GetScreenGeometry() override; void* GetRenderTarget() override { return ecore_wl2_egl_window_; } @@ -41,7 +41,7 @@ class TizenWindowEcoreWl2 : public TizenWindow { void* GetWindowHandle() override { return ecore_wl2_window_; } - void ResizeRenderTargetWithRotation(Geometry geometry, + void ResizeRenderTargetWithRotation(TizenGeometry geometry, int32_t angle) override; void SetPreferredOrientations(const std::vector& rotations) override; @@ -50,7 +50,7 @@ class TizenWindowEcoreWl2 : public TizenWindow { void Show() override; - void OnGeometryChanged(Geometry geometry) override; + void OnGeometryChanged(TizenGeometry geometry) override; private: bool CreateWindow(); diff --git a/shell/platform/tizen/tizen_window_elementary.cc b/shell/platform/tizen/tizen_window_elementary.cc index 29b562f8eb8c5..3c1292d1704d4 100644 --- a/shell/platform/tizen/tizen_window_elementary.cc +++ b/shell/platform/tizen/tizen_window_elementary.cc @@ -35,7 +35,7 @@ uint32_t EvasModifierToEcoreEventModifiers(const Evas_Modifier* evas_modifier) { namespace flutter { -TizenWindowElementary::TizenWindowElementary(TizenViewBase::Geometry geometry, +TizenWindowElementary::TizenWindowElementary(TizenGeometry geometry, bool transparent, bool focusable, bool top_level) @@ -305,16 +305,16 @@ void TizenWindowElementary::UnregisterEventHandlers() { evas_object_callbacks_[EVAS_CALLBACK_KEY_UP]); } -TizenViewBase::Geometry TizenWindowElementary::GetRenderTargetGeometry() { +TizenGeometry TizenWindowElementary::GetRenderTargetGeometry() { // FIXME : evas_object_geometry_get() and ecore_wl2_window_geometry_get() are // not equivalent. - Geometry result; + TizenGeometry result; evas_object_geometry_get(elm_win_, &result.left, &result.top, &result.width, &result.height); return result; } -void TizenWindowElementary::SetRenderTargetGeometry(Geometry geometry) { +void TizenWindowElementary::SetRenderTargetGeometry(TizenGeometry geometry) { evas_object_resize(elm_win_, geometry.width, geometry.height); evas_object_move(elm_win_, geometry.left, geometry.top); @@ -322,8 +322,8 @@ void TizenWindowElementary::SetRenderTargetGeometry(Geometry geometry) { evas_object_move(image_, geometry.left, geometry.top); } -TizenViewBase::Geometry TizenWindowElementary::GetScreenGeometry() { - Geometry result; +TizenGeometry TizenWindowElementary::GetScreenGeometry() { + TizenGeometry result; Ecore_Evas* ecore_evas = ecore_evas_ecore_evas_get(evas_object_evas_get(elm_win_)); ecore_evas_screen_geometry_get(ecore_evas, nullptr, nullptr, &result.width, @@ -348,8 +348,9 @@ uintptr_t TizenWindowElementary::GetWindowId() { ecore_evas_ecore_evas_get(evas_object_evas_get(elm_win_))); } -void TizenWindowElementary::ResizeRenderTargetWithRotation(Geometry geometry, - int32_t angle) { +void TizenWindowElementary::ResizeRenderTargetWithRotation( + TizenGeometry geometry, + int32_t angle) { TizenRendererEvasGL* renderer_evas_gl = reinterpret_cast(view_->engine()->renderer()); renderer_evas_gl->ResizeSurface(geometry.width, geometry.height); @@ -373,7 +374,7 @@ void TizenWindowElementary::Show() { evas_object_show(elm_win_); } -void TizenWindowElementary::OnGeometryChanged(Geometry geometry) { +void TizenWindowElementary::OnGeometryChanged(TizenGeometry geometry) { SetRenderTargetGeometry(geometry); view_->OnResize(geometry.left, geometry.top, geometry.width, geometry.height); } diff --git a/shell/platform/tizen/tizen_window_elementary.h b/shell/platform/tizen/tizen_window_elementary.h index cca4424d7b0c1..05e14e3330f9c 100644 --- a/shell/platform/tizen/tizen_window_elementary.h +++ b/shell/platform/tizen/tizen_window_elementary.h @@ -16,18 +16,18 @@ namespace flutter { class TizenWindowElementary : public TizenWindow { public: - TizenWindowElementary(TizenViewBase::Geometry geometry, + TizenWindowElementary(TizenGeometry geometry, bool transparent, bool focusable, bool top_level); ~TizenWindowElementary(); - Geometry GetRenderTargetGeometry() override; + TizenGeometry GetRenderTargetGeometry() override; - void SetRenderTargetGeometry(Geometry geometry) override; + void SetRenderTargetGeometry(TizenGeometry geometry) override; - Geometry GetScreenGeometry() override; + TizenGeometry GetScreenGeometry() override; void* GetRenderTarget() override { return elm_win_; } @@ -41,7 +41,7 @@ class TizenWindowElementary : public TizenWindow { void* GetWindowHandle() override { return elm_win_; } - void ResizeRenderTargetWithRotation(Geometry geometry, + void ResizeRenderTargetWithRotation(TizenGeometry geometry, int32_t angle) override; void SetPreferredOrientations(const std::vector& rotations) override; @@ -50,7 +50,7 @@ class TizenWindowElementary : public TizenWindow { void Show() override; - void OnGeometryChanged(Geometry geometry) override; + void OnGeometryChanged(TizenGeometry geometry) override; private: bool CreateWindow(); From 7041b0e5e261899cba3ce63a7d7e896380a9de17 Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Thu, 9 Jun 2022 15:19:05 +0900 Subject: [PATCH 09/14] Modify view size calc --- shell/platform/tizen/tizen_view_elementary.cc | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/shell/platform/tizen/tizen_view_elementary.cc b/shell/platform/tizen/tizen_view_elementary.cc index 131db7e4cbacf..26b15441a2616 100644 --- a/shell/platform/tizen/tizen_view_elementary.cc +++ b/shell/platform/tizen/tizen_view_elementary.cc @@ -79,18 +79,15 @@ bool TizenViewElementary::CreateView() { FT_LOG(Error) << "Failed to create an Evas object container."; return false; } - - EvasObjectResize(container_, initial_width_, initial_height_); evas_object_size_hint_weight_set(container_, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(container_, EVAS_HINT_FILL, EVAS_HINT_FILL); image_ = evas_object_image_filled_add(evas_object_evas_get(container_)); if (!image_) { FT_LOG(Error) << "Failed to create an Evas object image."; return false; } - + evas_object_size_hint_align_set(image_, EVAS_HINT_FILL, EVAS_HINT_FILL); EvasObjectResize(image_, initial_width_, initial_height_); evas_object_image_size_set(image_, initial_width_, initial_height_); evas_object_image_alpha_set(image_, EINA_TRUE); @@ -104,10 +101,11 @@ bool TizenViewElementary::CreateView() { FT_LOG(Error) << "Failed to create an event layer."; return false; } - + evas_object_size_hint_weight_set(event_layer_, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(event_layer_, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_object_style_set(event_layer_, "transparent"); evas_object_color_set(event_layer_, 0, 0, 0, 0); - EvasObjectResize(event_layer_, initial_width_, initial_height_); elm_table_pack(container_, event_layer_, 0, 0, 1, 1); return true; @@ -292,12 +290,6 @@ TizenGeometry TizenViewElementary::GetRenderTargetGeometry() { } void TizenViewElementary::SetRenderTargetGeometry(TizenGeometry geometry) { - EvasObjectResize(container_, geometry.width, geometry.height); - evas_object_move(container_, geometry.left, geometry.top); - - EvasObjectResize(event_layer_, geometry.width, geometry.height); - evas_object_move(event_layer_, geometry.left, geometry.top); - EvasObjectResize(image_, geometry.width, geometry.height); evas_object_move(image_, geometry.left, geometry.top); } From 0625e16c4fab55a0b4e128d2dcbba98f9cad2285 Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Thu, 9 Jun 2022 15:46:12 +0900 Subject: [PATCH 10/14] Modify GetWindowId --- shell/platform/tizen/tizen_window_elementary.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/shell/platform/tizen/tizen_window_elementary.cc b/shell/platform/tizen/tizen_window_elementary.cc index 3c1292d1704d4..955373ba3b7ca 100644 --- a/shell/platform/tizen/tizen_window_elementary.cc +++ b/shell/platform/tizen/tizen_window_elementary.cc @@ -344,8 +344,7 @@ int32_t TizenWindowElementary::GetDpi() { } uintptr_t TizenWindowElementary::GetWindowId() { - return ecore_evas_window_get( - ecore_evas_ecore_evas_get(evas_object_evas_get(elm_win_))); + return elm_win_window_id_get(elm_win_); } void TizenWindowElementary::ResizeRenderTargetWithRotation( From eaf8efd3aa5de05443bb7d156d720bd416efd6b3 Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Fri, 10 Jun 2022 11:19:25 +0900 Subject: [PATCH 11/14] Update based on review --- shell/platform/tizen/channels/window_channel.cc | 8 ++++---- shell/platform/tizen/flutter_tizen_ecore.cc | 4 ++-- shell/platform/tizen/flutter_tizen_elementary.cc | 8 ++++++-- shell/platform/tizen/flutter_tizen_engine.cc | 3 +-- shell/platform/tizen/flutter_tizen_view.cc | 15 +++++++-------- shell/platform/tizen/tizen_view.h | 5 ++--- shell/platform/tizen/tizen_view_base.h | 12 +++++------- shell/platform/tizen/tizen_view_elementary.cc | 11 +++++------ shell/platform/tizen/tizen_view_elementary.h | 8 +++----- shell/platform/tizen/tizen_window.h | 1 - shell/platform/tizen/tizen_window_ecore_wl2.cc | 13 ++++++------- shell/platform/tizen/tizen_window_ecore_wl2.h | 8 +++----- shell/platform/tizen/tizen_window_elementary.cc | 12 +++++------- shell/platform/tizen/tizen_window_elementary.h | 12 +++++------- 14 files changed, 54 insertions(+), 66 deletions(-) diff --git a/shell/platform/tizen/channels/window_channel.cc b/shell/platform/tizen/channels/window_channel.cc index bd6e851f9d570..1fec67ff07d26 100644 --- a/shell/platform/tizen/channels/window_channel.cc +++ b/shell/platform/tizen/channels/window_channel.cc @@ -35,7 +35,7 @@ void WindowChannel::HandleMethodCall( const std::string& method_name = method_call.method_name(); if (method_name == "getWindowGeometry") { - TizenGeometry geometry = window_->GetRenderTargetGeometry(); + TizenGeometry geometry = window_->GetGeometry(); EncodableMap map; map[EncodableValue("x")] = EncodableValue(geometry.left); map[EncodableValue("y")] = EncodableValue(geometry.top); @@ -57,9 +57,9 @@ void WindowChannel::HandleMethodCall( EncodableValueHolder width(arguments, "width"); EncodableValueHolder height(arguments, "height"); - TizenGeometry geometry = window_->GetRenderTargetGeometry(); - // FIXME: Use SetRenderTargetGeometry() instead of OnGeometryChanged() - // After the SetRenderTargetGeometry was successfully executed, I expected a + TizenGeometry geometry = window_->GetGeometry(); + // FIXME: Use SetGeometry() instead of OnGeometryChanged() + // After the SetGeometry was successfully executed, I expected a // handler of ECORE_WL2_EVENT_WINDOW_CONFIGURE to be called, but it didn't. window_->OnGeometryChanged({ x ? *x : geometry.left, diff --git a/shell/platform/tizen/flutter_tizen_ecore.cc b/shell/platform/tizen/flutter_tizen_ecore.cc index d30b996551a93..87ade651f9396 100644 --- a/shell/platform/tizen/flutter_tizen_ecore.cc +++ b/shell/platform/tizen/flutter_tizen_ecore.cc @@ -59,12 +59,12 @@ FlutterDesktopViewRef FlutterDesktopViewCreateFromElmParent( return nullptr; } -void* FlutterDesktopViewGetEvasObject(FlutterDesktopViewRef view) { +void* FlutterDesktopViewGetEvasObject(FlutterDesktopViewRef view_ref) { FT_LOG(Warn) << "Not applicable!"; return nullptr; } -void FlutterDesktopViewResize(FlutterDesktopViewRef view, +void FlutterDesktopViewResize(FlutterDesktopViewRef view_ref, int32_t width, int32_t height) { FT_LOG(Warn) << "Not applicable!"; diff --git a/shell/platform/tizen/flutter_tizen_elementary.cc b/shell/platform/tizen/flutter_tizen_elementary.cc index 4bca825edba47..dcf9174a790d4 100644 --- a/shell/platform/tizen/flutter_tizen_elementary.cc +++ b/shell/platform/tizen/flutter_tizen_elementary.cc @@ -80,8 +80,12 @@ FlutterDesktopViewRef FlutterDesktopViewCreateFromElmParent( void* FlutterDesktopViewGetEvasObject(FlutterDesktopViewRef view_ref) { auto* view = reinterpret_cast(view_ref); - auto* tizen_view = reinterpret_cast(view->tizen_view()); - return tizen_view->GetRenderTargetContainer(); + if (view->tizen_view()->GetType() == flutter::TizenViewType::kView) { + auto* tizen_view = + reinterpret_cast(view->tizen_view()); + return tizen_view->GetRenderTargetContainer(); + } + return nullptr; } void FlutterDesktopViewResize(FlutterDesktopViewRef view_ref, diff --git a/shell/platform/tizen/flutter_tizen_engine.cc b/shell/platform/tizen/flutter_tizen_engine.cc index ce3a8d601019e..7856f9303ec30 100644 --- a/shell/platform/tizen/flutter_tizen_engine.cc +++ b/shell/platform/tizen/flutter_tizen_engine.cc @@ -536,8 +536,7 @@ void FlutterTizenEngine::OnUpdateSemanticsCustomActions( bridge->GetFlutterPlatformNodeDelegateFromID(0); std::shared_ptr window = FlutterPlatformAppDelegateTizen::GetInstance().GetWindow().lock(); - TizenGeometry geometry = - engine->view_->tizen_view()->GetRenderTargetGeometry(); + TizenGeometry geometry = engine->view_->tizen_view()->GetGeometry(); window->SetGeometry(geometry.left, geometry.top, geometry.width, geometry.height); window->SetRootNode(root); diff --git a/shell/platform/tizen/flutter_tizen_view.cc b/shell/platform/tizen/flutter_tizen_view.cc index 3cd600b131664..dff99a8e42038 100644 --- a/shell/platform/tizen/flutter_tizen_view.cc +++ b/shell/platform/tizen/flutter_tizen_view.cc @@ -76,7 +76,7 @@ void FlutterTizenView::SetEngine(std::unique_ptr engine) { void FlutterTizenView::CreateRenderSurface() { if (engine_ && engine_->renderer()) { - TizenGeometry geometry = tizen_view_->GetRenderTargetGeometry(); + TizenGeometry geometry = tizen_view_->GetGeometry(); if (tizen_view_->GetType() == TizenViewType::kWindow) { auto* window = reinterpret_cast(tizen_view_.get()); engine_->renderer()->CreateSurface(window->GetRenderTarget(), @@ -128,8 +128,7 @@ void FlutterTizenView::OnResize(int32_t left, std::swap(width, height); } - tizen_view_->ResizeRenderTargetWithRotation({left, top, width, height}, - rotation_degree_); + tizen_view_->ResizeWithRotation({left, top, width, height}, rotation_degree_); SendWindowMetrics(left, top, width, height, 0.0); } @@ -137,7 +136,7 @@ void FlutterTizenView::OnRotate(int32_t degree) { rotation_degree_ = degree; // Compute renderer transformation based on the angle of rotation. double rad = (360 - rotation_degree_) * M_PI / 180; - TizenGeometry geometry = tizen_view_->GetRenderTargetGeometry(); + TizenGeometry geometry = tizen_view_->GetGeometry(); int32_t width = geometry.width; int32_t height = geometry.height; @@ -161,8 +160,8 @@ void FlutterTizenView::OnRotate(int32_t degree) { std::swap(width, height); } - tizen_view_->ResizeRenderTargetWithRotation( - {geometry.left, geometry.top, width, height}, rotation_degree_); + tizen_view_->ResizeWithRotation({geometry.left, geometry.top, width, height}, + rotation_degree_); // Window position does not change on rotation regardless of its orientation. SendWindowMetrics(geometry.left, geometry.top, width, height, 0.0); @@ -273,7 +272,7 @@ void FlutterTizenView::SendInitialGeometry() { auto* window = reinterpret_cast(tizen_view_.get()); OnRotate(window->GetRotation()); } else { - TizenGeometry geometry = tizen_view_->GetRenderTargetGeometry(); + TizenGeometry geometry = tizen_view_->GetGeometry(); SendWindowMetrics(geometry.left, geometry.top, geometry.width, geometry.height, 0.0); } @@ -312,7 +311,7 @@ void FlutterTizenView::SendFlutterPointerEvent( size_t timestamp, FlutterPointerDeviceKind device_kind, int device_id) { - TizenGeometry geometry = tizen_view_->GetRenderTargetGeometry(); + TizenGeometry geometry = tizen_view_->GetGeometry(); double new_x = x, new_y = y; if (rotation_degree_ == 90) { diff --git a/shell/platform/tizen/tizen_view.h b/shell/platform/tizen/tizen_view.h index 01f5f23af36fd..86265f5d1d341 100644 --- a/shell/platform/tizen/tizen_view.h +++ b/shell/platform/tizen/tizen_view.h @@ -1,5 +1,4 @@ // Copyright 2022 Samsung Electronics Co., Ltd. All rights reserved. -// Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -19,10 +18,10 @@ class TizenView : public TizenViewBase { TizenView() = default; virtual ~TizenView() = default; - TizenViewType GetType() override { return TizenViewType::kView; }; - virtual void* GetRenderTargetContainer() = 0; + TizenViewType GetType() override { return TizenViewType::kView; }; + protected: explicit TizenView(int width, int height) : initial_width_(width), initial_height_(height) {} diff --git a/shell/platform/tizen/tizen_view_base.h b/shell/platform/tizen/tizen_view_base.h index 4835a8c5b7f21..e480db982897e 100644 --- a/shell/platform/tizen/tizen_view_base.h +++ b/shell/platform/tizen/tizen_view_base.h @@ -1,5 +1,4 @@ // Copyright 2022 Samsung Electronics Co., Ltd. All rights reserved. -// Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -34,11 +33,11 @@ class TizenViewBase { virtual uintptr_t GetWindowId() = 0; - // Returns the geometry of the current render target. - virtual TizenGeometry GetRenderTargetGeometry() = 0; + // Returns the geometry of the view. + virtual TizenGeometry GetGeometry() = 0; - // Set the geometry of the current render target. - virtual void SetRenderTargetGeometry(TizenGeometry geometry) = 0; + // Set the geometry of the view. + virtual void SetGeometry(TizenGeometry geometry) = 0; // Returns the dpi of the screen. virtual int32_t GetDpi() = 0; @@ -49,8 +48,7 @@ class TizenViewBase { virtual void BindKeys(const std::vector& keys) = 0; - virtual void ResizeRenderTargetWithRotation(TizenGeometry geometry, - int32_t degree) = 0; + virtual void ResizeWithRotation(TizenGeometry geometry, int32_t degree) = 0; // FIXME // This is a temporary implementation that is only used by the window channel. diff --git a/shell/platform/tizen/tizen_view_elementary.cc b/shell/platform/tizen/tizen_view_elementary.cc index 26b15441a2616..cea86f4259f72 100644 --- a/shell/platform/tizen/tizen_view_elementary.cc +++ b/shell/platform/tizen/tizen_view_elementary.cc @@ -1,5 +1,4 @@ // Copyright 2022 Samsung Electronics Co., Ltd. All rights reserved. -// Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -282,14 +281,14 @@ void TizenViewElementary::UnregisterEventHandlers() { evas_object_callbacks_[EVAS_CALLBACK_KEY_UP]); } -TizenGeometry TizenViewElementary::GetRenderTargetGeometry() { +TizenGeometry TizenViewElementary::GetGeometry() { TizenGeometry result; evas_object_geometry_get(image_, &result.left, &result.top, &result.width, &result.height); return result; } -void TizenViewElementary::SetRenderTargetGeometry(TizenGeometry geometry) { +void TizenViewElementary::SetGeometry(TizenGeometry geometry) { EvasObjectResize(image_, geometry.width, geometry.height); evas_object_move(image_, geometry.left, geometry.top); } @@ -307,8 +306,8 @@ uintptr_t TizenViewElementary::GetWindowId() { ecore_evas_ecore_evas_get(evas_object_evas_get(image_))); } -void TizenViewElementary::ResizeRenderTargetWithRotation(TizenGeometry geometry, - int32_t angle) { +void TizenViewElementary::ResizeWithRotation(TizenGeometry geometry, + int32_t angle) { TizenRendererEvasGL* renderer_evas_gl = reinterpret_cast(view_->engine()->renderer()); renderer_evas_gl->ResizeSurface(geometry.width, geometry.height); @@ -331,7 +330,7 @@ void TizenViewElementary::Show() { } void TizenViewElementary::OnGeometryChanged(TizenGeometry geometry) { - SetRenderTargetGeometry(geometry); + SetGeometry(geometry); view_->OnResize(geometry.left, geometry.top, geometry.width, geometry.height); } diff --git a/shell/platform/tizen/tizen_view_elementary.h b/shell/platform/tizen/tizen_view_elementary.h index 6136c59000c8e..a6de24185257c 100644 --- a/shell/platform/tizen/tizen_view_elementary.h +++ b/shell/platform/tizen/tizen_view_elementary.h @@ -1,5 +1,4 @@ // Copyright 2022 Samsung Electronics Co., Ltd. All rights reserved. -// Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -22,9 +21,9 @@ class TizenViewElementary : public TizenView { ~TizenViewElementary(); - TizenGeometry GetRenderTargetGeometry() override; + TizenGeometry GetGeometry() override; - void SetRenderTargetGeometry(TizenGeometry geometry) override; + void SetGeometry(TizenGeometry geometry) override; void* GetRenderTarget() override { return image_; } @@ -34,8 +33,7 @@ class TizenViewElementary : public TizenView { uintptr_t GetWindowId() override; - void ResizeRenderTargetWithRotation(TizenGeometry geometry, - int32_t angle) override; + void ResizeWithRotation(TizenGeometry geometry, int32_t angle) override; void BindKeys(const std::vector& keys) override; diff --git a/shell/platform/tizen/tizen_window.h b/shell/platform/tizen/tizen_window.h index 1fc9a45f52c2a..415e082eb096e 100644 --- a/shell/platform/tizen/tizen_window.h +++ b/shell/platform/tizen/tizen_window.h @@ -1,5 +1,4 @@ // Copyright 2022 Samsung Electronics Co., Ltd. All rights reserved. -// Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/shell/platform/tizen/tizen_window_ecore_wl2.cc b/shell/platform/tizen/tizen_window_ecore_wl2.cc index 24837f8b3146d..5b71816898716 100644 --- a/shell/platform/tizen/tizen_window_ecore_wl2.cc +++ b/shell/platform/tizen/tizen_window_ecore_wl2.cc @@ -1,5 +1,4 @@ // Copyright 2022 Samsung Electronics Co., Ltd. All rights reserved. -// Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -198,7 +197,7 @@ void TizenWindowEcoreWl2::RegisterEventHandlers() { if (rotation_event->win == self->GetWindowId()) { int32_t degree = rotation_event->angle; self->view_->OnRotate(degree); - TizenGeometry geometry = self->GetRenderTargetGeometry(); + TizenGeometry geometry = self->GetGeometry(); ecore_wl2_window_rotation_change_done_send( self->ecore_wl2_window_, rotation_event->rotation, geometry.width, geometry.height); @@ -381,14 +380,14 @@ void TizenWindowEcoreWl2::DestroyWindow() { ecore_wl2_shutdown(); } -TizenGeometry TizenWindowEcoreWl2::GetRenderTargetGeometry() { +TizenGeometry TizenWindowEcoreWl2::GetGeometry() { TizenGeometry result; ecore_wl2_window_geometry_get(ecore_wl2_window_, &result.left, &result.top, &result.width, &result.height); return result; } -void TizenWindowEcoreWl2::SetRenderTargetGeometry(TizenGeometry geometry) { +void TizenWindowEcoreWl2::SetGeometry(TizenGeometry geometry) { ecore_wl2_window_geometry_set(ecore_wl2_window_, geometry.left, geometry.top, geometry.width, geometry.height); // FIXME: The changes set in `ecore_wl2_window_geometry_set` seems to apply @@ -421,8 +420,8 @@ uintptr_t TizenWindowEcoreWl2::GetWindowId() { return ecore_wl2_window_id_get(ecore_wl2_window_); } -void TizenWindowEcoreWl2::ResizeRenderTargetWithRotation(TizenGeometry geometry, - int32_t angle) { +void TizenWindowEcoreWl2::ResizeWithRotation(TizenGeometry geometry, + int32_t angle) { ecore_wl2_egl_window_resize_with_rotation( ecore_wl2_egl_window_, geometry.left, geometry.top, geometry.width, geometry.height, angle); @@ -448,7 +447,7 @@ void TizenWindowEcoreWl2::Show() { void TizenWindowEcoreWl2::OnGeometryChanged(TizenGeometry geometry) { // This implementation mimics the situation in which the handler of // ECORE_WL2_EVENT_WINDOW_CONFIGURE is called. - SetRenderTargetGeometry(geometry); + SetGeometry(geometry); view_->OnResize(geometry.left, geometry.top, geometry.width, geometry.height); } diff --git a/shell/platform/tizen/tizen_window_ecore_wl2.h b/shell/platform/tizen/tizen_window_ecore_wl2.h index 77300e186f668..bb7e82cb06f15 100644 --- a/shell/platform/tizen/tizen_window_ecore_wl2.h +++ b/shell/platform/tizen/tizen_window_ecore_wl2.h @@ -1,5 +1,4 @@ // Copyright 2022 Samsung Electronics Co., Ltd. All rights reserved. -// Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -23,9 +22,9 @@ class TizenWindowEcoreWl2 : public TizenWindow { ~TizenWindowEcoreWl2(); - TizenGeometry GetRenderTargetGeometry() override; + TizenGeometry GetGeometry() override; - void SetRenderTargetGeometry(TizenGeometry geometry) override; + void SetGeometry(TizenGeometry geometry) override; TizenGeometry GetScreenGeometry() override; @@ -41,8 +40,7 @@ class TizenWindowEcoreWl2 : public TizenWindow { void* GetWindowHandle() override { return ecore_wl2_window_; } - void ResizeRenderTargetWithRotation(TizenGeometry geometry, - int32_t angle) override; + void ResizeWithRotation(TizenGeometry geometry, int32_t angle) override; void SetPreferredOrientations(const std::vector& rotations) override; diff --git a/shell/platform/tizen/tizen_window_elementary.cc b/shell/platform/tizen/tizen_window_elementary.cc index 955373ba3b7ca..84e2100a8cd2f 100644 --- a/shell/platform/tizen/tizen_window_elementary.cc +++ b/shell/platform/tizen/tizen_window_elementary.cc @@ -1,5 +1,4 @@ // Copyright 2022 Samsung Electronics Co., Ltd. All rights reserved. -// Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -305,7 +304,7 @@ void TizenWindowElementary::UnregisterEventHandlers() { evas_object_callbacks_[EVAS_CALLBACK_KEY_UP]); } -TizenGeometry TizenWindowElementary::GetRenderTargetGeometry() { +TizenGeometry TizenWindowElementary::GetGeometry() { // FIXME : evas_object_geometry_get() and ecore_wl2_window_geometry_get() are // not equivalent. TizenGeometry result; @@ -314,7 +313,7 @@ TizenGeometry TizenWindowElementary::GetRenderTargetGeometry() { return result; } -void TizenWindowElementary::SetRenderTargetGeometry(TizenGeometry geometry) { +void TizenWindowElementary::SetGeometry(TizenGeometry geometry) { evas_object_resize(elm_win_, geometry.width, geometry.height); evas_object_move(elm_win_, geometry.left, geometry.top); @@ -347,9 +346,8 @@ uintptr_t TizenWindowElementary::GetWindowId() { return elm_win_window_id_get(elm_win_); } -void TizenWindowElementary::ResizeRenderTargetWithRotation( - TizenGeometry geometry, - int32_t angle) { +void TizenWindowElementary::ResizeWithRotation(TizenGeometry geometry, + int32_t angle) { TizenRendererEvasGL* renderer_evas_gl = reinterpret_cast(view_->engine()->renderer()); renderer_evas_gl->ResizeSurface(geometry.width, geometry.height); @@ -374,7 +372,7 @@ void TizenWindowElementary::Show() { } void TizenWindowElementary::OnGeometryChanged(TizenGeometry geometry) { - SetRenderTargetGeometry(geometry); + SetGeometry(geometry); view_->OnResize(geometry.left, geometry.top, geometry.width, geometry.height); } diff --git a/shell/platform/tizen/tizen_window_elementary.h b/shell/platform/tizen/tizen_window_elementary.h index 05e14e3330f9c..9e0bf43789702 100644 --- a/shell/platform/tizen/tizen_window_elementary.h +++ b/shell/platform/tizen/tizen_window_elementary.h @@ -1,5 +1,4 @@ // Copyright 2022 Samsung Electronics Co., Ltd. All rights reserved. -// Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -23,15 +22,15 @@ class TizenWindowElementary : public TizenWindow { ~TizenWindowElementary(); - TizenGeometry GetRenderTargetGeometry() override; + TizenGeometry GetGeometry() override; - void SetRenderTargetGeometry(TizenGeometry geometry) override; + void SetGeometry(TizenGeometry geometry) override; TizenGeometry GetScreenGeometry() override; - void* GetRenderTarget() override { return elm_win_; } + void* GetRenderTarget() override { return image_; } - void* GetRenderTargetDisplay() override { return image_; } + void* GetRenderTargetDisplay() override { return nullptr; } int32_t GetRotation() override; @@ -41,8 +40,7 @@ class TizenWindowElementary : public TizenWindow { void* GetWindowHandle() override { return elm_win_; } - void ResizeRenderTargetWithRotation(TizenGeometry geometry, - int32_t angle) override; + void ResizeWithRotation(TizenGeometry geometry, int32_t angle) override; void SetPreferredOrientations(const std::vector& rotations) override; From 0fa299f42addf0a397ccc25fe27bad6310095c2d Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Mon, 13 Jun 2022 15:17:31 +0900 Subject: [PATCH 12/14] Clean up include header --- shell/platform/tizen/flutter_tizen_view.cc | 3 +-- shell/platform/tizen/tizen_view.h | 8 ++++---- shell/platform/tizen/tizen_view_elementary.cc | 11 ++++++----- shell/platform/tizen/tizen_view_elementary.h | 9 ++++++--- shell/platform/tizen/tizen_window.h | 1 - shell/platform/tizen/tizen_window_ecore_wl2.h | 8 ++++++-- shell/platform/tizen/tizen_window_elementary.cc | 6 +++--- shell/platform/tizen/tizen_window_elementary.h | 7 +++++-- 8 files changed, 31 insertions(+), 22 deletions(-) diff --git a/shell/platform/tizen/flutter_tizen_view.cc b/shell/platform/tizen/flutter_tizen_view.cc index dff99a8e42038..5805123eccf76 100644 --- a/shell/platform/tizen/flutter_tizen_view.cc +++ b/shell/platform/tizen/flutter_tizen_view.cc @@ -4,11 +4,10 @@ // found in the LICENSE file. #include "flutter_tizen_view.h" +#include "flutter/shell/platform/tizen/logger.h" #include "flutter/shell/platform/tizen/tizen_view.h" #include "flutter/shell/platform/tizen/tizen_window.h" -#include "flutter/shell/platform/tizen/logger.h" - namespace { #if defined(MOBILE_PROFILE) diff --git a/shell/platform/tizen/tizen_view.h b/shell/platform/tizen/tizen_view.h index 86265f5d1d341..61da57f88865e 100644 --- a/shell/platform/tizen/tizen_view.h +++ b/shell/platform/tizen/tizen_view.h @@ -5,7 +5,7 @@ #ifndef EMBEDDER_TIZEN_VIEW_H_ #define EMBEDDER_TIZEN_VIEW_H_ -#include +#include #include "flutter/shell/platform/tizen/tizen_view_base.h" @@ -23,11 +23,11 @@ class TizenView : public TizenViewBase { TizenViewType GetType() override { return TizenViewType::kView; }; protected: - explicit TizenView(int width, int height) + explicit TizenView(uint32_t width, uint32_t height) : initial_width_(width), initial_height_(height) {} - int initial_width_ = 0; - int initial_height_ = 0; + uint32_t initial_width_ = 0; + uint32_t initial_height_ = 0; }; } // namespace flutter diff --git a/shell/platform/tizen/tizen_view_elementary.cc b/shell/platform/tizen/tizen_view_elementary.cc index cea86f4259f72..87d4371272ae2 100644 --- a/shell/platform/tizen/tizen_view_elementary.cc +++ b/shell/platform/tizen/tizen_view_elementary.cc @@ -4,12 +4,12 @@ #include "tizen_view_elementary.h" -#include "flutter/shell/platform/tizen/flutter_tizen_view.h" -#include "flutter/shell/platform/tizen/logger.h" - #include #include +#include "flutter/shell/platform/tizen/flutter_tizen_view.h" +#include "flutter/shell/platform/tizen/logger.h" + namespace { static const int kScrollDirectionVertical = 0; @@ -40,8 +40,8 @@ void EvasObjectResize(Evas_Object* object, uint32_t width, uint32_t height) { namespace flutter { -TizenViewElementary::TizenViewElementary(int width, - int height, +TizenViewElementary::TizenViewElementary(uint32_t width, + uint32_t height, Evas_Object* parent) : TizenView(width, height), parent_(parent) { if (!CreateView()) { @@ -156,6 +156,7 @@ void TizenViewElementary::RegisterEventHandlers() { evas_object_event_callback_add(event_layer_, EVAS_CALLBACK_MOUSE_UP, evas_object_callbacks_[EVAS_CALLBACK_MOUSE_UP], this); + evas_object_callbacks_[EVAS_CALLBACK_MOUSE_MOVE] = [](void* data, Evas* evas, Evas_Object* object, void* event_info) { auto* self = reinterpret_cast(data); diff --git a/shell/platform/tizen/tizen_view_elementary.h b/shell/platform/tizen/tizen_view_elementary.h index a6de24185257c..3381aad631042 100644 --- a/shell/platform/tizen/tizen_view_elementary.h +++ b/shell/platform/tizen/tizen_view_elementary.h @@ -5,19 +5,22 @@ #ifndef EMBEDDER_TIZEN_VIEW_ELEMENTARY_H_ #define EMBEDDER_TIZEN_VIEW_ELEMENTARY_H_ -#include "flutter/shell/platform/tizen/tizen_view.h" - #define EFL_BETA_API_SUPPORT #include #include +#include +#include #include +#include + +#include "flutter/shell/platform/tizen/tizen_view.h" namespace flutter { class TizenViewElementary : public TizenView { public: - TizenViewElementary(int width, int height, Evas_Object* parent); + TizenViewElementary(uint32_t width, uint32_t height, Evas_Object* parent); ~TizenViewElementary(); diff --git a/shell/platform/tizen/tizen_window.h b/shell/platform/tizen/tizen_window.h index 415e082eb096e..cd87a729e0be5 100644 --- a/shell/platform/tizen/tizen_window.h +++ b/shell/platform/tizen/tizen_window.h @@ -6,7 +6,6 @@ #define EMBEDDER_TIZEN_WINDOW_H_ #include -#include #include #include "flutter/shell/platform/tizen/tizen_view_base.h" diff --git a/shell/platform/tizen/tizen_window_ecore_wl2.h b/shell/platform/tizen/tizen_window_ecore_wl2.h index bb7e82cb06f15..8d8d00745014d 100644 --- a/shell/platform/tizen/tizen_window_ecore_wl2.h +++ b/shell/platform/tizen/tizen_window_ecore_wl2.h @@ -5,12 +5,16 @@ #ifndef EMBEDDER_TIZEN_WINDOW_ECORE_WL2_H_ #define EMBEDDER_TIZEN_WINDOW_ECORE_WL2_H_ -#include "flutter/shell/platform/tizen/tizen_window.h" - #define EFL_BETA_API_SUPPORT #include #include +#include +#include +#include + +#include "flutter/shell/platform/tizen/tizen_window.h" + namespace flutter { class TizenWindowEcoreWl2 : public TizenWindow { diff --git a/shell/platform/tizen/tizen_window_elementary.cc b/shell/platform/tizen/tizen_window_elementary.cc index 84e2100a8cd2f..21397b4ef1a60 100644 --- a/shell/platform/tizen/tizen_window_elementary.cc +++ b/shell/platform/tizen/tizen_window_elementary.cc @@ -4,12 +4,12 @@ #include "tizen_window_elementary.h" -#include "flutter/shell/platform/tizen/flutter_tizen_view.h" -#include "flutter/shell/platform/tizen/logger.h" - #include #include +#include "flutter/shell/platform/tizen/flutter_tizen_view.h" +#include "flutter/shell/platform/tizen/logger.h" + namespace { static const int kScrollDirectionVertical = 0; diff --git a/shell/platform/tizen/tizen_window_elementary.h b/shell/platform/tizen/tizen_window_elementary.h index 9e0bf43789702..16478e82a966b 100644 --- a/shell/platform/tizen/tizen_window_elementary.h +++ b/shell/platform/tizen/tizen_window_elementary.h @@ -5,11 +5,14 @@ #ifndef EMBEDDER_TIZEN_WINDOW_ELEMENTARY_H_ #define EMBEDDER_TIZEN_WINDOW_ELEMENTARY_H_ -#include "flutter/shell/platform/tizen/tizen_window.h" - #include +#include +#include #include +#include + +#include "flutter/shell/platform/tizen/tizen_window.h" namespace flutter { From 08c9172d336bb297a343abff41ac3086ba3ea575 Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Mon, 13 Jun 2022 16:11:17 +0900 Subject: [PATCH 13/14] Fix integer type --- shell/platform/tizen/flutter_tizen_view.cc | 1 + shell/platform/tizen/tizen_view.h | 6 +++--- shell/platform/tizen/tizen_view_elementary.cc | 6 +++--- shell/platform/tizen/tizen_view_elementary.h | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/shell/platform/tizen/flutter_tizen_view.cc b/shell/platform/tizen/flutter_tizen_view.cc index 5805123eccf76..e76beeaa23521 100644 --- a/shell/platform/tizen/flutter_tizen_view.cc +++ b/shell/platform/tizen/flutter_tizen_view.cc @@ -4,6 +4,7 @@ // found in the LICENSE file. #include "flutter_tizen_view.h" + #include "flutter/shell/platform/tizen/logger.h" #include "flutter/shell/platform/tizen/tizen_view.h" #include "flutter/shell/platform/tizen/tizen_window.h" diff --git a/shell/platform/tizen/tizen_view.h b/shell/platform/tizen/tizen_view.h index 61da57f88865e..6fb8696ea2dda 100644 --- a/shell/platform/tizen/tizen_view.h +++ b/shell/platform/tizen/tizen_view.h @@ -23,11 +23,11 @@ class TizenView : public TizenViewBase { TizenViewType GetType() override { return TizenViewType::kView; }; protected: - explicit TizenView(uint32_t width, uint32_t height) + explicit TizenView(int32_t width, int32_t height) : initial_width_(width), initial_height_(height) {} - uint32_t initial_width_ = 0; - uint32_t initial_height_ = 0; + int32_t initial_width_ = 0; + int32_t initial_height_ = 0; }; } // namespace flutter diff --git a/shell/platform/tizen/tizen_view_elementary.cc b/shell/platform/tizen/tizen_view_elementary.cc index 87d4371272ae2..241be22b75c32 100644 --- a/shell/platform/tizen/tizen_view_elementary.cc +++ b/shell/platform/tizen/tizen_view_elementary.cc @@ -30,7 +30,7 @@ uint32_t EvasModifierToEcoreEventModifiers(const Evas_Modifier* evas_modifier) { return modifiers; } -void EvasObjectResize(Evas_Object* object, uint32_t width, uint32_t height) { +void EvasObjectResize(Evas_Object* object, int32_t width, int32_t height) { evas_object_resize(object, width, height); evas_object_size_hint_min_set(object, width, height); evas_object_size_hint_max_set(object, width, height); @@ -40,8 +40,8 @@ void EvasObjectResize(Evas_Object* object, uint32_t width, uint32_t height) { namespace flutter { -TizenViewElementary::TizenViewElementary(uint32_t width, - uint32_t height, +TizenViewElementary::TizenViewElementary(int32_t width, + int32_t height, Evas_Object* parent) : TizenView(width, height), parent_(parent) { if (!CreateView()) { diff --git a/shell/platform/tizen/tizen_view_elementary.h b/shell/platform/tizen/tizen_view_elementary.h index 3381aad631042..5262f7511510d 100644 --- a/shell/platform/tizen/tizen_view_elementary.h +++ b/shell/platform/tizen/tizen_view_elementary.h @@ -20,7 +20,7 @@ namespace flutter { class TizenViewElementary : public TizenView { public: - TizenViewElementary(uint32_t width, uint32_t height, Evas_Object* parent); + TizenViewElementary(int32_t width, int32_t height, Evas_Object* parent); ~TizenViewElementary(); From 0e394479f441594c6123685417102efb31198e2d Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Tue, 14 Jun 2022 11:27:40 +0900 Subject: [PATCH 14/14] Update shell/platform/tizen/tizen_view_elementary.cc Co-authored-by: Swift Kim --- shell/platform/tizen/tizen_view_elementary.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell/platform/tizen/tizen_view_elementary.cc b/shell/platform/tizen/tizen_view_elementary.cc index 241be22b75c32..bf2707b174ed4 100644 --- a/shell/platform/tizen/tizen_view_elementary.cc +++ b/shell/platform/tizen/tizen_view_elementary.cc @@ -164,7 +164,7 @@ void TizenViewElementary::RegisterEventHandlers() { if (self->event_layer_ == object) { auto* mouse_event = reinterpret_cast(event_info); - mouse_event->event_flags = static_cast( + mouse_event->event_flags = Evas_Event_Flags( mouse_event->event_flags | EVAS_EVENT_FLAG_ON_HOLD); if (!self->scroll_hold_) { elm_object_scroll_hold_push(self->event_layer_);