From 45cc5b58058ec9be73c3a8831cd96cdc5ee42efc Mon Sep 17 00:00:00 2001 From: Boram Bae Date: Mon, 11 Jul 2022 14:08:27 +0900 Subject: [PATCH] Introduce TizenViewEventHandlerDelegate and rework FlutterDesktopViewResize (#309) * `TizenViewEventHandlerDelegate` only provides a limited interface for delegating event handling. * `FlutterDesktopViewResize` should work on all types of views. * Implementations of `TizenViewBase::SetGeometry` only manipulate top-level raw object such as window, container. other components in the view are manipulated on a resize callback. * window channel use `SetGeometry` normally. Signed-off-by: Boram Bae --- .../platform/tizen/channels/window_channel.cc | 5 +- shell/platform/tizen/flutter_tizen.cc | 11 ++ shell/platform/tizen/flutter_tizen_ecore.cc | 6 - .../tizen/flutter_tizen_elementary.cc | 7 -- shell/platform/tizen/flutter_tizen_view.cc | 13 +- shell/platform/tizen/flutter_tizen_view.h | 32 +++-- shell/platform/tizen/tizen_renderer.h | 2 + shell/platform/tizen/tizen_renderer_egl.cc | 4 + shell/platform/tizen/tizen_renderer_egl.h | 2 + shell/platform/tizen/tizen_renderer_evas_gl.h | 2 +- shell/platform/tizen/tizen_view_base.h | 11 +- shell/platform/tizen/tizen_view_elementary.cc | 77 ++++++------ shell/platform/tizen/tizen_view_elementary.h | 2 - .../tizen/tizen_view_event_handler_delegate.h | 69 ++++++++++ shell/platform/tizen/tizen_window.h | 2 - .../platform/tizen/tizen_window_ecore_wl2.cc | 85 ++++++------- shell/platform/tizen/tizen_window_ecore_wl2.h | 4 - .../platform/tizen/tizen_window_elementary.cc | 119 +++++++++--------- .../platform/tizen/tizen_window_elementary.h | 4 - 19 files changed, 262 insertions(+), 195 deletions(-) create mode 100644 shell/platform/tizen/tizen_view_event_handler_delegate.h diff --git a/shell/platform/tizen/channels/window_channel.cc b/shell/platform/tizen/channels/window_channel.cc index 1fec67ff07d26..3eeab011bbffd 100644 --- a/shell/platform/tizen/channels/window_channel.cc +++ b/shell/platform/tizen/channels/window_channel.cc @@ -58,10 +58,7 @@ void WindowChannel::HandleMethodCall( EncodableValueHolder height(arguments, "height"); 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({ + window_->SetGeometry({ x ? *x : geometry.left, y ? *y : geometry.top, width ? *width : geometry.width, diff --git a/shell/platform/tizen/flutter_tizen.cc b/shell/platform/tizen/flutter_tizen.cc index 6d3beb3a4f1c5..cf29309bede6b 100644 --- a/shell/platform/tizen/flutter_tizen.cc +++ b/shell/platform/tizen/flutter_tizen.cc @@ -27,6 +27,11 @@ FlutterDesktopEngineRef HandleForEngine(flutter::FlutterTizenEngine* engine) { return reinterpret_cast(engine); } +// Returns the view corresponding to the given opaque API handle. +flutter::FlutterTizenView* ViewFromHandle(FlutterDesktopViewRef view) { + return reinterpret_cast(view); +} + // Returns the texture registrar corresponding to the given opaque API handle. flutter::FlutterTizenTextureRegistrar* TextureRegistrarFromHandle( FlutterDesktopTextureRegistrarRef ref) { @@ -176,6 +181,12 @@ void FlutterDesktopEngineNotifyAppIsDetached(FlutterDesktopEngineRef engine) { EngineFromHandle(engine)->lifecycle_channel()->AppIsDetached(); } +void FlutterDesktopViewResize(FlutterDesktopViewRef view, + int32_t width, + int32_t height) { + ViewFromHandle(view)->Resize(width, height); +} + void FlutterDesktopRegisterViewFactory( FlutterDesktopPluginRegistrarRef registrar, const char* view_type, diff --git a/shell/platform/tizen/flutter_tizen_ecore.cc b/shell/platform/tizen/flutter_tizen_ecore.cc index 87ade651f9396..c6fecd069b1a8 100644 --- a/shell/platform/tizen/flutter_tizen_ecore.cc +++ b/shell/platform/tizen/flutter_tizen_ecore.cc @@ -63,9 +63,3 @@ void* FlutterDesktopViewGetEvasObject(FlutterDesktopViewRef view_ref) { FT_LOG(Warn) << "Not applicable!"; return nullptr; } - -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 f72cbbca1df99..ec408aec5ff93 100644 --- a/shell/platform/tizen/flutter_tizen_elementary.cc +++ b/shell/platform/tizen/flutter_tizen_elementary.cc @@ -87,10 +87,3 @@ void* FlutterDesktopViewGetEvasObject(FlutterDesktopViewRef view_ref) { } return nullptr; } - -void FlutterDesktopViewResize(FlutterDesktopViewRef view_ref, - int32_t width, - int32_t height) { - auto* view = reinterpret_cast(view_ref); - view->OnResize(0, 0, width, height); -} diff --git a/shell/platform/tizen/flutter_tizen_view.cc b/shell/platform/tizen/flutter_tizen_view.cc index 64e0003c117cc..3359f7ffb4f66 100644 --- a/shell/platform/tizen/flutter_tizen_view.cc +++ b/shell/platform/tizen/flutter_tizen_view.cc @@ -103,6 +103,13 @@ void FlutterTizenView::DestroyRenderSurface() { } } +void FlutterTizenView::Resize(int32_t width, int32_t height) { + TizenGeometry geometry = tizen_view_->GetGeometry(); + geometry.width = width; + geometry.height = height; + tizen_view_->SetGeometry(geometry); +} + bool FlutterTizenView::OnMakeCurrent() { return engine_->renderer()->OnMakeCurrent(); } @@ -135,7 +142,8 @@ void FlutterTizenView::OnResize(int32_t left, std::swap(width, height); } - tizen_view_->ResizeWithRotation({left, top, width, height}, rotation_degree_); + engine_->renderer()->ResizeSurface(width, height); + SendWindowMetrics(left, top, width, height, 0.0); } @@ -167,8 +175,7 @@ void FlutterTizenView::OnRotate(int32_t degree) { std::swap(width, height); } - tizen_view_->ResizeWithRotation({geometry.left, geometry.top, width, height}, - rotation_degree_); + engine_->renderer()->ResizeSurface(width, height); // Window position does not change on rotation regardless of its orientation. SendWindowMetrics(geometry.left, geometry.top, width, height, 0.0); diff --git a/shell/platform/tizen/flutter_tizen_view.h b/shell/platform/tizen/flutter_tizen_view.h index 78526f664c52b..1860541c23fa7 100644 --- a/shell/platform/tizen/flutter_tizen_view.h +++ b/shell/platform/tizen/flutter_tizen_view.h @@ -16,14 +16,15 @@ #include "flutter/shell/platform/tizen/channels/window_channel.h" #include "flutter/shell/platform/tizen/flutter_tizen_engine.h" #include "flutter/shell/platform/tizen/tizen_view_base.h" +#include "flutter/shell/platform/tizen/tizen_view_event_handler_delegate.h" namespace flutter { -class FlutterTizenView { +class FlutterTizenView : public TizenViewEventHandlerDelegate { public: FlutterTizenView(std::unique_ptr tizen_view); - ~FlutterTizenView(); + virtual ~FlutterTizenView(); // Configures the window instance with an instance of a running Flutter // engine. @@ -40,6 +41,8 @@ class FlutterTizenView { // Destroys current rendering surface if one has been allocated. void DestroyRenderSurface(); + void Resize(int32_t width, int32_t height); + // Callbacks for clearing context, settings context and swapping buffers, // these are typically called on an engine-controlled (non-platform) thread. bool OnMakeCurrent(); @@ -51,27 +54,30 @@ class FlutterTizenView { void* OnProcResolver(const char* name); - void OnResize(int32_t left, int32_t top, int32_t width, int32_t height); + void OnResize(int32_t left, + int32_t top, + int32_t width, + int32_t height) override; - void OnRotate(int32_t degree); + void OnRotate(int32_t degree) override; void OnPointerMove(double x, double y, size_t timestamp, FlutterPointerDeviceKind device_kind, - int32_t device_id); + int32_t device_id) override; void OnPointerDown(double x, double y, size_t timestamp, FlutterPointerDeviceKind device_kind, - int32_t device_id); + int32_t device_id) override; void OnPointerUp(double x, double y, size_t timestamp, FlutterPointerDeviceKind device_kind, - int32_t device_id); + int32_t device_id) override; void OnScroll(double x, double y, @@ -80,22 +86,22 @@ class FlutterTizenView { int scroll_offset_multiplier, size_t timestamp, FlutterPointerDeviceKind device_kind, - int32_t device_id); + int32_t device_id) override; void OnKey(const char* key, const char* string, const char* compose, uint32_t modifiers, uint32_t scan_code, - bool is_down); + bool is_down) override; - void OnComposeBegin(); + void OnComposeBegin() override; - void OnComposeChange(const std::string& str, int cursor_pos); + void OnComposeChange(const std::string& str, int cursor_pos) override; - void OnComposeEnd(); + void OnComposeEnd() override; - void OnCommit(const std::string& str); + void OnCommit(const std::string& str) override; FlutterTransformation GetFlutterTransformation() { return flutter_transformation_; diff --git a/shell/platform/tizen/tizen_renderer.h b/shell/platform/tizen/tizen_renderer.h index c5f600a251641..1077b173d1927 100644 --- a/shell/platform/tizen/tizen_renderer.h +++ b/shell/platform/tizen/tizen_renderer.h @@ -38,6 +38,8 @@ class TizenRenderer { virtual bool IsSupportedExtension(const char* name) = 0; + virtual void ResizeSurface(int32_t width, int32_t height) = 0; + protected: bool is_valid_ = false; }; diff --git a/shell/platform/tizen/tizen_renderer_egl.cc b/shell/platform/tizen/tizen_renderer_egl.cc index dd3ffa87e54ce..0cf59eca14791 100644 --- a/shell/platform/tizen/tizen_renderer_egl.cc +++ b/shell/platform/tizen/tizen_renderer_egl.cc @@ -271,6 +271,10 @@ bool TizenRendererEgl::IsSupportedExtension(const char* name) { return strstr(egl_extension_str_.c_str(), name); } +void TizenRendererEgl::ResizeSurface(int32_t width, int32_t height) { + // Do nothing. +} + void* TizenRendererEgl::OnProcResolver(const char* name) { auto address = eglGetProcAddress(name); if (address != nullptr) { diff --git a/shell/platform/tizen/tizen_renderer_egl.h b/shell/platform/tizen/tizen_renderer_egl.h index a981ae1a76cd4..1026f675b9d2b 100644 --- a/shell/platform/tizen/tizen_renderer_egl.h +++ b/shell/platform/tizen/tizen_renderer_egl.h @@ -40,6 +40,8 @@ class TizenRendererEgl : public TizenRenderer { bool IsSupportedExtension(const char* name) override; + void ResizeSurface(int32_t width, int32_t height) override; + private: bool ChooseEGLConfiguration(); diff --git a/shell/platform/tizen/tizen_renderer_evas_gl.h b/shell/platform/tizen/tizen_renderer_evas_gl.h index fd41d8a5c8097..48101f027b934 100644 --- a/shell/platform/tizen/tizen_renderer_evas_gl.h +++ b/shell/platform/tizen/tizen_renderer_evas_gl.h @@ -47,7 +47,7 @@ class TizenRendererEvasGL : public TizenRenderer { void MarkPixelsDirty(); - void ResizeSurface(int32_t width, int32_t height); + void ResizeSurface(int32_t width, int32_t height) override; private: Evas_GL* evas_gl_ = nullptr; diff --git a/shell/platform/tizen/tizen_view_base.h b/shell/platform/tizen/tizen_view_base.h index 718133a9d4031..a66e3ae8d6d60 100644 --- a/shell/platform/tizen/tizen_view_base.h +++ b/shell/platform/tizen/tizen_view_base.h @@ -11,11 +11,10 @@ #include #include "flutter/shell/platform/tizen/tizen_input_method_context.h" +#include "flutter/shell/platform/tizen/tizen_view_event_handler_delegate.h" namespace flutter { -class FlutterTizenView; - struct TizenGeometry { int32_t left = 0, top = 0, width = 0, height = 0; }; @@ -44,9 +43,9 @@ class TizenViewBase { // 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 ResizeWithRotation(TizenGeometry geometry, int32_t degree) = 0; + void SetView(TizenViewEventHandlerDelegate* view_delegate) { + view_delegate_ = view_delegate; + } virtual void Show() = 0; @@ -57,7 +56,7 @@ class TizenViewBase { } protected: - FlutterTizenView* view_ = nullptr; + TizenViewEventHandlerDelegate* view_delegate_ = nullptr; // The Tizen input method context. nullptr if not set. std::unique_ptr input_method_context_; diff --git a/shell/platform/tizen/tizen_view_elementary.cc b/shell/platform/tizen/tizen_view_elementary.cc index b68fd4a9b317c..2c2ab5c973bdb 100644 --- a/shell/platform/tizen/tizen_view_elementary.cc +++ b/shell/platform/tizen/tizen_view_elementary.cc @@ -7,8 +7,8 @@ #include #include -#include "flutter/shell/platform/tizen/flutter_tizen_view.h" #include "flutter/shell/platform/tizen/logger.h" +#include "flutter/shell/platform/tizen/tizen_view_event_handler_delegate.h" namespace { @@ -30,7 +30,9 @@ uint32_t EvasModifierToEcoreEventModifiers(const Evas_Modifier* evas_modifier) { return modifiers; } -void EvasObjectResize(Evas_Object* object, int32_t width, int32_t height) { +void EvasObjectResizeWithMinMaxHint(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); @@ -80,6 +82,7 @@ bool TizenViewElementary::CreateView() { } evas_object_size_hint_weight_set(container_, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + EvasObjectResizeWithMinMaxHint(container_, initial_width_, initial_height_); image_ = evas_object_image_filled_add(evas_object_evas_get(container_)); if (!image_) { @@ -87,8 +90,10 @@ bool TizenViewElementary::CreateView() { return false; } evas_object_size_hint_align_set(image_, EVAS_HINT_FILL, EVAS_HINT_FILL); + EvasObjectResizeWithMinMaxHint(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); // FIXME: Button widgets can receive both mouse events and key events. But the @@ -106,8 +111,6 @@ bool TizenViewElementary::CreateView() { evas_object_color_set(event_layer_, 0, 0, 0, 0); elm_table_pack(container_, event_layer_, 0, 0, 1, 1); - SetGeometry(TizenGeometry{0, 0, initial_width_, initial_height_}); - return true; } @@ -121,12 +124,18 @@ void TizenViewElementary::RegisterEventHandlers() { evas_object_callbacks_[EVAS_CALLBACK_RESIZE] = [](void* data, Evas* evas, Evas_Object* object, void* event_info) { auto* self = reinterpret_cast(data); - if (self->view_) { + if (self->view_delegate_) { if (self->container_ == object) { int32_t width = 0, height = 0; - evas_object_geometry_get(object, nullptr, nullptr, &width, &height); + evas_object_geometry_get(self->container_, nullptr, nullptr, &width, + &height); + + evas_object_size_hint_min_set(self->container_, width, height); + evas_object_size_hint_max_set(self->container_, width, height); + + EvasObjectResizeWithMinMaxHint(self->image_, width, height); - self->view_->OnResize(0, 0, width, height); + self->view_delegate_->OnResize(0, 0, width, height); } } }; @@ -137,12 +146,12 @@ 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->view_delegate_) { if (self->event_layer_ == object) { auto* mouse_event = reinterpret_cast(event_info); TizenGeometry geometry = self->GetGeometry(); - self->view_->OnPointerDown( + self->view_delegate_->OnPointerDown( mouse_event->canvas.x - geometry.left, mouse_event->canvas.y - geometry.top, mouse_event->timestamp, kFlutterPointerDeviceKindTouch, mouse_event->button); @@ -157,7 +166,7 @@ void TizenViewElementary::RegisterEventHandlers() { Evas_Object* object, void* event_info) { auto* self = reinterpret_cast(data); - if (self->view_) { + if (self->view_delegate_) { if (self->event_layer_ == object) { auto* mouse_event = reinterpret_cast(event_info); if (self->scroll_hold_) { @@ -165,7 +174,7 @@ void TizenViewElementary::RegisterEventHandlers() { self->scroll_hold_ = false; } TizenGeometry geometry = self->GetGeometry(); - self->view_->OnPointerUp( + self->view_delegate_->OnPointerUp( mouse_event->canvas.x - geometry.left, mouse_event->canvas.y - geometry.top, mouse_event->timestamp, kFlutterPointerDeviceKindTouch, mouse_event->button); @@ -180,7 +189,7 @@ void TizenViewElementary::RegisterEventHandlers() { Evas_Object* object, void* event_info) { auto* self = reinterpret_cast(data); - if (self->view_) { + if (self->view_delegate_) { if (self->event_layer_ == object) { auto* mouse_event = reinterpret_cast(event_info); @@ -191,7 +200,7 @@ void TizenViewElementary::RegisterEventHandlers() { self->scroll_hold_ = true; } TizenGeometry geometry = self->GetGeometry(); - self->view_->OnPointerMove( + self->view_delegate_->OnPointerMove( mouse_event->cur.canvas.x - geometry.left, mouse_event->cur.canvas.y - geometry.top, mouse_event->timestamp, kFlutterPointerDeviceKindTouch, mouse_event->buttons); @@ -205,7 +214,7 @@ void TizenViewElementary::RegisterEventHandlers() { 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->view_delegate_) { if (self->event_layer_ == object) { auto* wheel_event = reinterpret_cast(event_info); @@ -218,7 +227,7 @@ void TizenViewElementary::RegisterEventHandlers() { delta_x += wheel_event->z; } TizenGeometry geometry = self->GetGeometry(); - self->view_->OnScroll( + self->view_delegate_->OnScroll( wheel_event->x - geometry.left, wheel_event->y - geometry.top, delta_x, delta_y, kScrollOffsetMultiplier, wheel_event->timestamp, kFlutterPointerDeviceKindTouch, 0); @@ -233,7 +242,7 @@ void TizenViewElementary::RegisterEventHandlers() { Evas_Object* object, void* event_info) { auto* self = reinterpret_cast(data); - if (self->view_) { + if (self->view_delegate_) { if (self->event_layer_ == object) { auto* key_event = reinterpret_cast(event_info); bool handled = false; @@ -244,7 +253,7 @@ void TizenViewElementary::RegisterEventHandlers() { self->input_method_context_->HandleEvasEventKeyDown(key_event); } if (!handled) { - self->view_->OnKey( + self->view_delegate_->OnKey( key_event->key, key_event->string, key_event->compose, EvasModifierToEcoreEventModifiers(key_event->modifiers), key_event->keycode, true); @@ -259,7 +268,7 @@ void TizenViewElementary::RegisterEventHandlers() { 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->view_delegate_) { if (self->event_layer_ == object) { auto* key_event = reinterpret_cast(event_info); bool handled = false; @@ -270,7 +279,7 @@ void TizenViewElementary::RegisterEventHandlers() { self->input_method_context_->HandleEvasEventKeyUp(key_event); } if (!handled) { - self->view_->OnKey( + self->view_delegate_->OnKey( key_event->key, key_event->string, key_event->compose, EvasModifierToEcoreEventModifiers(key_event->modifiers), key_event->keycode, false); @@ -307,23 +316,19 @@ void TizenViewElementary::UnregisterEventHandlers() { TizenGeometry TizenViewElementary::GetGeometry() { TizenGeometry result; - evas_object_geometry_get(image_, &result.left, &result.top, &result.width, + evas_object_geometry_get(container_, &result.left, &result.top, &result.width, &result.height); return result; } void TizenViewElementary::SetGeometry(TizenGeometry geometry) { - EvasObjectResize(image_, geometry.width, geometry.height); - evas_object_move(image_, geometry.left, geometry.top); - evas_object_image_size_set(image_, geometry.width, geometry.height); - - EvasObjectResize(container_, geometry.width, geometry.height); + EvasObjectResizeWithMinMaxHint(container_, geometry.width, geometry.height); evas_object_move(container_, geometry.left, geometry.top); } int32_t TizenViewElementary::GetDpi() { Ecore_Evas* ecore_evas = - ecore_evas_ecore_evas_get(evas_object_evas_get(image_)); + ecore_evas_ecore_evas_get(evas_object_evas_get(container_)); int32_t xdpi, ydpi; ecore_evas_screen_dpi_get(ecore_evas, &xdpi, &ydpi); return xdpi; @@ -331,16 +336,7 @@ int32_t TizenViewElementary::GetDpi() { uintptr_t TizenViewElementary::GetWindowId() { return ecore_evas_window_get( - ecore_evas_ecore_evas_get(evas_object_evas_get(image_))); -} - -void TizenViewElementary::ResizeWithRotation(TizenGeometry geometry, - int32_t angle) { - SetGeometry(geometry); - - TizenRendererEvasGL* renderer_evas_gl = - reinterpret_cast(view_->engine()->renderer()); - renderer_evas_gl->ResizeSurface(geometry.width, geometry.height); + ecore_evas_ecore_evas_get(evas_object_evas_get(container_))); } void TizenViewElementary::Show() { @@ -355,14 +351,15 @@ void TizenViewElementary::PrepareInputMethod() { // Set input method callbacks. input_method_context_->SetOnPreeditStart( - [this]() { view_->OnComposeBegin(); }); + [this]() { view_delegate_->OnComposeBegin(); }); input_method_context_->SetOnPreeditChanged( [this](std::string str, int cursor_pos) { - view_->OnComposeChange(str, cursor_pos); + view_delegate_->OnComposeChange(str, cursor_pos); }); - input_method_context_->SetOnPreeditEnd([this]() { view_->OnComposeEnd(); }); + input_method_context_->SetOnPreeditEnd( + [this]() { view_delegate_->OnComposeEnd(); }); input_method_context_->SetOnCommit( - [this](std::string str) { view_->OnCommit(str); }); + [this](std::string str) { view_delegate_->OnCommit(str); }); } } // namespace flutter diff --git a/shell/platform/tizen/tizen_view_elementary.h b/shell/platform/tizen/tizen_view_elementary.h index 960a62b47a825..479dbbbcc15de 100644 --- a/shell/platform/tizen/tizen_view_elementary.h +++ b/shell/platform/tizen/tizen_view_elementary.h @@ -36,8 +36,6 @@ class TizenViewElementary : public TizenView { uintptr_t GetWindowId() override; - void ResizeWithRotation(TizenGeometry geometry, int32_t angle) override; - void Show() override; private: diff --git a/shell/platform/tizen/tizen_view_event_handler_delegate.h b/shell/platform/tizen/tizen_view_event_handler_delegate.h new file mode 100644 index 0000000000000..1bf668b65dbac --- /dev/null +++ b/shell/platform/tizen/tizen_view_event_handler_delegate.h @@ -0,0 +1,69 @@ +// 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_EVENT_HANDLER_DELEGATE_H_ +#define EMBEDDER_TIZEN_VIEW_EVENT_HANDLER_DELEGATE_H_ + +#include + +#include "flutter/shell/platform/embedder/embedder.h" + +namespace flutter { + +class TizenViewEventHandlerDelegate { + public: + virtual void OnResize(int32_t left, + int32_t top, + int32_t width, + int32_t height) = 0; + + virtual void OnRotate(int32_t degree) = 0; + + virtual void OnPointerMove(double x, + double y, + size_t timestamp, + FlutterPointerDeviceKind device_kind, + int32_t device_id) = 0; + + virtual void OnPointerDown(double x, + double y, + size_t timestamp, + FlutterPointerDeviceKind device_kind, + int32_t device_id) = 0; + + virtual void OnPointerUp(double x, + double y, + size_t timestamp, + FlutterPointerDeviceKind device_kind, + int32_t device_id) = 0; + + virtual void OnScroll(double x, + double y, + double delta_x, + double delta_y, + int scroll_offset_multiplier, + size_t timestamp, + FlutterPointerDeviceKind device_kind, + int32_t device_id) = 0; + + virtual void OnKey(const char* key, + const char* string, + const char* compose, + uint32_t modifiers, + uint32_t scan_code, + bool is_down) = 0; + + virtual void OnComposeBegin() = 0; + + virtual void OnComposeChange(const std::string& str, int cursor_pos) = 0; + + virtual void OnComposeEnd() = 0; + + virtual void OnCommit(const std::string& str) = 0; +}; + +} // namespace flutter + +#endif // EMBEDDER_TIZEN_VIEW_EVENT_HANDLER_DELEGATE_H_ diff --git a/shell/platform/tizen/tizen_window.h b/shell/platform/tizen/tizen_window.h index d8846afeb7c78..a8250da058097 100644 --- a/shell/platform/tizen/tizen_window.h +++ b/shell/platform/tizen/tizen_window.h @@ -30,8 +30,6 @@ class TizenWindow : public TizenViewBase { // Returns the geometry of the display screen. virtual TizenGeometry GetScreenGeometry() = 0; - virtual void OnGeometryChanged(TizenGeometry geometry) = 0; - virtual void BindKeys(const std::vector& keys) = 0; TizenViewType GetType() override { return TizenViewType::kWindow; }; diff --git a/shell/platform/tizen/tizen_window_ecore_wl2.cc b/shell/platform/tizen/tizen_window_ecore_wl2.cc index edcef9fc4a5bd..06964a9546ec4 100644 --- a/shell/platform/tizen/tizen_window_ecore_wl2.cc +++ b/shell/platform/tizen/tizen_window_ecore_wl2.cc @@ -8,8 +8,8 @@ #include #endif -#include "flutter/shell/platform/tizen/flutter_tizen_view.h" #include "flutter/shell/platform/tizen/logger.h" +#include "flutter/shell/platform/tizen/tizen_view_event_handler_delegate.h" namespace { @@ -191,12 +191,12 @@ void TizenWindowEcoreWl2::RegisterEventHandlers() { ECORE_WL2_EVENT_WINDOW_ROTATE, [](void* data, int type, void* event) -> Eina_Bool { auto* self = reinterpret_cast(data); - if (self->view_) { + if (self->view_delegate_) { auto* rotation_event = reinterpret_cast(event); if (rotation_event->win == self->GetWindowId()) { int32_t degree = rotation_event->angle; - self->view_->OnRotate(degree); + self->view_delegate_->OnRotate(degree); TizenGeometry geometry = self->GetGeometry(); ecore_wl2_window_rotation_change_done_send( self->ecore_wl2_window_, rotation_event->rotation, @@ -212,13 +212,18 @@ void TizenWindowEcoreWl2::RegisterEventHandlers() { ECORE_WL2_EVENT_WINDOW_CONFIGURE, [](void* data, int type, void* event) -> Eina_Bool { auto* self = reinterpret_cast(data); - if (self->view_) { + if (self->view_delegate_) { auto* configure_event = reinterpret_cast(event); if (configure_event->win == self->GetWindowId()) { - self->view_->OnResize(configure_event->x, configure_event->y, - configure_event->w, configure_event->h); - ecore_wl2_window_commit(self->ecore_wl2_window_, EINA_FALSE); + ecore_wl2_egl_window_resize_with_rotation( + self->ecore_wl2_egl_window_, configure_event->x, + configure_event->y, configure_event->w, configure_event->h, + self->GetRotation()); + + self->view_delegate_->OnResize( + configure_event->x, configure_event->y, configure_event->w, + configure_event->h); return ECORE_CALLBACK_DONE; } } @@ -230,11 +235,11 @@ void TizenWindowEcoreWl2::RegisterEventHandlers() { ECORE_EVENT_MOUSE_BUTTON_DOWN, [](void* data, int type, void* event) -> Eina_Bool { auto* self = reinterpret_cast(data); - if (self->view_) { + if (self->view_delegate_) { auto* button_event = reinterpret_cast(event); if (button_event->window == self->GetWindowId()) { - self->view_->OnPointerDown( + self->view_delegate_->OnPointerDown( button_event->x, button_event->y, button_event->timestamp, kFlutterPointerDeviceKindTouch, button_event->multi.device); return ECORE_CALLBACK_DONE; @@ -248,11 +253,11 @@ void TizenWindowEcoreWl2::RegisterEventHandlers() { ECORE_EVENT_MOUSE_BUTTON_UP, [](void* data, int type, void* event) -> Eina_Bool { auto* self = reinterpret_cast(data); - if (self->view_) { + if (self->view_delegate_) { auto* button_event = reinterpret_cast(event); if (button_event->window == self->GetWindowId()) { - self->view_->OnPointerUp( + self->view_delegate_->OnPointerUp( button_event->x, button_event->y, button_event->timestamp, kFlutterPointerDeviceKindTouch, button_event->multi.device); return ECORE_CALLBACK_DONE; @@ -266,10 +271,10 @@ void TizenWindowEcoreWl2::RegisterEventHandlers() { ECORE_EVENT_MOUSE_MOVE, [](void* data, int type, void* event) -> Eina_Bool { auto* self = reinterpret_cast(data); - if (self->view_) { + if (self->view_delegate_) { auto* move_event = reinterpret_cast(event); if (move_event->window == self->GetWindowId()) { - self->view_->OnPointerMove( + self->view_delegate_->OnPointerMove( move_event->x, move_event->y, move_event->timestamp, kFlutterPointerDeviceKindTouch, move_event->multi.device); return ECORE_CALLBACK_DONE; @@ -283,7 +288,7 @@ void TizenWindowEcoreWl2::RegisterEventHandlers() { ECORE_EVENT_MOUSE_WHEEL, [](void* data, int type, void* event) -> Eina_Bool { auto* self = reinterpret_cast(data); - if (self->view_) { + if (self->view_delegate_) { auto* wheel_event = reinterpret_cast(event); if (wheel_event->window == self->GetWindowId()) { double delta_x = 0.0; @@ -295,10 +300,10 @@ void TizenWindowEcoreWl2::RegisterEventHandlers() { delta_x += wheel_event->z; } - self->view_->OnScroll(wheel_event->x, wheel_event->y, delta_x, - delta_y, kScrollOffsetMultiplier, - wheel_event->timestamp, - kFlutterPointerDeviceKindTouch, 0); + self->view_delegate_->OnScroll( + wheel_event->x, wheel_event->y, delta_x, delta_y, + kScrollOffsetMultiplier, wheel_event->timestamp, + kFlutterPointerDeviceKindTouch, 0); return ECORE_CALLBACK_DONE; } } @@ -310,7 +315,7 @@ void TizenWindowEcoreWl2::RegisterEventHandlers() { ECORE_EVENT_KEY_DOWN, [](void* data, int type, void* event) -> Eina_Bool { auto* self = reinterpret_cast(data); - if (self->view_) { + if (self->view_delegate_) { auto* key_event = reinterpret_cast(event); if (key_event->window == self->GetWindowId()) { bool handled = false; @@ -319,9 +324,9 @@ void TizenWindowEcoreWl2::RegisterEventHandlers() { key_event, true); } if (!handled) { - self->view_->OnKey(key_event->key, key_event->string, - key_event->compose, key_event->modifiers, - key_event->keycode, true); + self->view_delegate_->OnKey( + key_event->key, key_event->string, key_event->compose, + key_event->modifiers, key_event->keycode, true); } return ECORE_CALLBACK_DONE; } @@ -334,7 +339,7 @@ void TizenWindowEcoreWl2::RegisterEventHandlers() { ECORE_EVENT_KEY_UP, [](void* data, int type, void* event) -> Eina_Bool { auto* self = reinterpret_cast(data); - if (self->view_) { + if (self->view_delegate_) { auto* key_event = reinterpret_cast(event); if (key_event->window == self->GetWindowId()) { bool handled = false; @@ -343,9 +348,9 @@ void TizenWindowEcoreWl2::RegisterEventHandlers() { key_event, false); } if (!handled) { - self->view_->OnKey(key_event->key, key_event->string, - key_event->compose, key_event->modifiers, - key_event->keycode, false); + self->view_delegate_->OnKey( + key_event->key, key_event->string, key_event->compose, + key_event->modifiers, key_event->keycode, false); } return ECORE_CALLBACK_DONE; } @@ -388,8 +393,9 @@ TizenGeometry TizenWindowEcoreWl2::GetGeometry() { } void TizenWindowEcoreWl2::SetGeometry(TizenGeometry geometry) { - ecore_wl2_window_geometry_set(ecore_wl2_window_, geometry.left, geometry.top, - geometry.width, geometry.height); + ecore_wl2_window_rotation_geometry_set(ecore_wl2_window_, GetRotation(), + geometry.left, geometry.top, + geometry.width, geometry.height); // FIXME: The changes set in `ecore_wl2_window_geometry_set` seems to apply // only after calling `ecore_wl2_window_position_set`. Call a more appropriate // API that flushes geometry settings to the compositor. @@ -420,13 +426,6 @@ uintptr_t TizenWindowEcoreWl2::GetWindowId() { return ecore_wl2_window_id_get(ecore_wl2_window_); } -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); -} - void TizenWindowEcoreWl2::SetPreferredOrientations( const std::vector& rotations) { ecore_wl2_window_available_rotations_set(ecore_wl2_window_, rotations.data(), @@ -444,13 +443,6 @@ void TizenWindowEcoreWl2::Show() { ecore_wl2_window_show(ecore_wl2_window_); } -void TizenWindowEcoreWl2::OnGeometryChanged(TizenGeometry geometry) { - // This implementation mimics the situation in which the handler of - // ECORE_WL2_EVENT_WINDOW_CONFIGURE is called. - SetGeometry(geometry); - view_->OnResize(geometry.left, geometry.top, geometry.width, geometry.height); -} - void TizenWindowEcoreWl2::SetTizenPolicyNotificationLevel(int level) { wl_registry* registry = ecore_wl2_display_registry_get(ecore_wl2_display_); if (!registry) { @@ -488,14 +480,15 @@ void TizenWindowEcoreWl2::PrepareInputMethod() { // Set input method callbacks. input_method_context_->SetOnPreeditStart( - [this]() { view_->OnComposeBegin(); }); + [this]() { view_delegate_->OnComposeBegin(); }); input_method_context_->SetOnPreeditChanged( [this](std::string str, int cursor_pos) { - view_->OnComposeChange(str, cursor_pos); + view_delegate_->OnComposeChange(str, cursor_pos); }); - input_method_context_->SetOnPreeditEnd([this]() { view_->OnComposeEnd(); }); + input_method_context_->SetOnPreeditEnd( + [this]() { view_delegate_->OnComposeEnd(); }); input_method_context_->SetOnCommit( - [this](std::string str) { view_->OnCommit(str); }); + [this](std::string str) { view_delegate_->OnCommit(str); }); } } // namespace flutter diff --git a/shell/platform/tizen/tizen_window_ecore_wl2.h b/shell/platform/tizen/tizen_window_ecore_wl2.h index 8d8d00745014d..c44b114454805 100644 --- a/shell/platform/tizen/tizen_window_ecore_wl2.h +++ b/shell/platform/tizen/tizen_window_ecore_wl2.h @@ -44,16 +44,12 @@ class TizenWindowEcoreWl2 : public TizenWindow { void* GetWindowHandle() override { return ecore_wl2_window_; } - void ResizeWithRotation(TizenGeometry geometry, int32_t angle) override; - void SetPreferredOrientations(const std::vector& rotations) override; void BindKeys(const std::vector& keys) override; void Show() 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 43d8dc0d5e84d..a5c9e4055a815 100644 --- a/shell/platform/tizen/tizen_window_elementary.cc +++ b/shell/platform/tizen/tizen_window_elementary.cc @@ -7,8 +7,8 @@ #include #include -#include "flutter/shell/platform/tizen/flutter_tizen_view.h" #include "flutter/shell/platform/tizen/logger.h" +#include "flutter/shell/platform/tizen/tizen_view_event_handler_delegate.h" namespace { @@ -138,11 +138,11 @@ void TizenWindowElementary::RegisterEventHandlers() { rotation_changed_callback_ = [](void* data, Evas_Object* object, void* event_info) { auto* self = reinterpret_cast(data); - if (self->view_) { + if (self->view_delegate_) { if (self->elm_win_ == object) { // FIXME FT_UNIMPLEMENTED(); - self->view_->OnRotate(self->GetRotation()); + self->view_delegate_->OnRotate(self->GetRotation()); elm_win_wm_rotation_manual_rotation_done(self->elm_win_); } } @@ -150,14 +150,33 @@ void TizenWindowElementary::RegisterEventHandlers() { evas_object_smart_callback_add(elm_win_, "rotation,changed", rotation_changed_callback_, this); + evas_object_callbacks_[EVAS_CALLBACK_RESIZE] = + [](void* data, Evas* evas, Evas_Object* object, void* event_info) { + auto* self = reinterpret_cast(data); + if (self->view_delegate_) { + if (self->elm_win_ == object) { + int32_t x = 0, y = 0, width = 0, height = 0; + evas_object_geometry_get(object, &x, &y, &width, &height); + + evas_object_resize(self->image_, width, height); + evas_object_move(self->image_, x, y); + + self->view_delegate_->OnResize(0, 0, width, height); + } + } + }; + evas_object_event_callback_add(elm_win_, EVAS_CALLBACK_RESIZE, + evas_object_callbacks_[EVAS_CALLBACK_RESIZE], + this); + 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->view_delegate_) { if (self->elm_win_ == object) { auto* mouse_event = reinterpret_cast(event_info); - self->view_->OnPointerDown( + self->view_delegate_->OnPointerDown( mouse_event->canvas.x, mouse_event->canvas.y, mouse_event->timestamp, kFlutterPointerDeviceKindTouch, mouse_event->button); @@ -172,13 +191,13 @@ void TizenWindowElementary::RegisterEventHandlers() { Evas_Object* object, void* event_info) { auto* self = reinterpret_cast(data); - if (self->view_) { + if (self->view_delegate_) { if (self->elm_win_ == 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); + self->view_delegate_->OnPointerUp( + mouse_event->canvas.x, mouse_event->canvas.y, + mouse_event->timestamp, kFlutterPointerDeviceKindTouch, + mouse_event->button); } } }; @@ -189,11 +208,11 @@ void TizenWindowElementary::RegisterEventHandlers() { 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->view_delegate_) { if (self->elm_win_ == object) { auto* mouse_event = reinterpret_cast(event_info); - self->view_->OnPointerMove( + self->view_delegate_->OnPointerMove( mouse_event->cur.canvas.x, mouse_event->cur.canvas.y, mouse_event->timestamp, kFlutterPointerDeviceKindTouch, mouse_event->buttons); @@ -204,29 +223,29 @@ void TizenWindowElementary::RegisterEventHandlers() { elm_win_, 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->elm_win_ == 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; - } + 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_delegate_) { + if (self->elm_win_ == 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); - } - } - }; + self->view_delegate_->OnScroll( + wheel_event->x, wheel_event->y, delta_x, delta_y, + kScrollOffsetMultiplier, wheel_event->timestamp, + kFlutterPointerDeviceKindTouch, 0); + } + } + }; evas_object_event_callback_add( elm_win_, EVAS_CALLBACK_MOUSE_WHEEL, evas_object_callbacks_[EVAS_CALLBACK_MOUSE_WHEEL], this); @@ -235,7 +254,7 @@ void TizenWindowElementary::RegisterEventHandlers() { Evas_Object* object, void* event_info) { auto* self = reinterpret_cast(data); - if (self->view_) { + if (self->view_delegate_) { if (self->elm_win_ == object) { auto* key_event = reinterpret_cast(event_info); bool handled = false; @@ -244,7 +263,7 @@ void TizenWindowElementary::RegisterEventHandlers() { self->input_method_context_->HandleEvasEventKeyDown(key_event); } if (!handled) { - self->view_->OnKey( + self->view_delegate_->OnKey( key_event->key, key_event->string, key_event->compose, EvasModifierToEcoreEventModifiers(key_event->modifiers), key_event->keycode, true); @@ -259,7 +278,7 @@ void TizenWindowElementary::RegisterEventHandlers() { 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->view_delegate_) { if (self->elm_win_ == object) { auto* key_event = reinterpret_cast(event_info); bool handled = false; @@ -268,7 +287,7 @@ void TizenWindowElementary::RegisterEventHandlers() { self->input_method_context_->HandleEvasEventKeyUp(key_event); } if (!handled) { - self->view_->OnKey( + self->view_delegate_->OnKey( key_event->key, key_event->string, key_event->compose, EvasModifierToEcoreEventModifiers(key_event->modifiers), key_event->keycode, false); @@ -316,9 +335,6 @@ TizenGeometry TizenWindowElementary::GetGeometry() { void TizenWindowElementary::SetGeometry(TizenGeometry geometry) { evas_object_resize(elm_win_, geometry.width, geometry.height); evas_object_move(elm_win_, geometry.left, geometry.top); - - evas_object_resize(image_, geometry.width, geometry.height); - evas_object_move(image_, geometry.left, geometry.top); } TizenGeometry TizenWindowElementary::GetScreenGeometry() { @@ -346,13 +362,6 @@ uintptr_t TizenWindowElementary::GetWindowId() { return elm_win_window_id_get(elm_win_); } -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); -} - void TizenWindowElementary::SetPreferredOrientations( const std::vector& rotations) { elm_win_wm_rotation_available_rotations_set( @@ -371,25 +380,21 @@ void TizenWindowElementary::Show() { evas_object_show(elm_win_); } -void TizenWindowElementary::OnGeometryChanged(TizenGeometry geometry) { - SetGeometry(geometry); - view_->OnResize(geometry.left, geometry.top, geometry.width, geometry.height); -} - void TizenWindowElementary::PrepareInputMethod() { input_method_context_ = std::make_unique(GetWindowId()); // Set input method callbacks. input_method_context_->SetOnPreeditStart( - [this]() { view_->OnComposeBegin(); }); + [this]() { view_delegate_->OnComposeBegin(); }); input_method_context_->SetOnPreeditChanged( [this](std::string str, int cursor_pos) { - view_->OnComposeChange(str, cursor_pos); + view_delegate_->OnComposeChange(str, cursor_pos); }); - input_method_context_->SetOnPreeditEnd([this]() { view_->OnComposeEnd(); }); + input_method_context_->SetOnPreeditEnd( + [this]() { view_delegate_->OnComposeEnd(); }); input_method_context_->SetOnCommit( - [this](std::string str) { view_->OnCommit(str); }); + [this](std::string str) { view_delegate_->OnCommit(str); }); } } // namespace flutter diff --git a/shell/platform/tizen/tizen_window_elementary.h b/shell/platform/tizen/tizen_window_elementary.h index 16478e82a966b..cf2d0aa7c8a01 100644 --- a/shell/platform/tizen/tizen_window_elementary.h +++ b/shell/platform/tizen/tizen_window_elementary.h @@ -43,16 +43,12 @@ class TizenWindowElementary : public TizenWindow { void* GetWindowHandle() override { return elm_win_; } - void ResizeWithRotation(TizenGeometry geometry, int32_t angle) override; - void SetPreferredOrientations(const std::vector& rotations) override; void BindKeys(const std::vector& keys) override; void Show() override; - void OnGeometryChanged(TizenGeometry geometry) override; - private: bool CreateWindow();