Skip to content

Commit b98c6b6

Browse files
authored
Introduce TizenViewElementary (#292)
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 TizenViewBase. we can add FlutterTizenView to other UIFW of Tizen while adding TizenView{?}(maybe Tizen NUI). ``` TizenViewBase -> TizenView -> TizenViewElementary -> TizenView{?} -> TizenWindow -> TizenWindowElementary -> TizenWindowEcore ``` related PR : flutter-tizen/flutter-tizen#373
1 parent 7b0c7a1 commit b98c6b6

19 files changed

+761
-151
lines changed

shell/platform/tizen/BUILD.gn

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ template("embedder") {
190190
sources += [
191191
"flutter_tizen_elementary.cc",
192192
"tizen_renderer_evas_gl.cc",
193+
"tizen_view_elementary.cc",
193194
"tizen_window_elementary.cc",
194195
]
195196

shell/platform/tizen/channels/window_channel.cc

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ void WindowChannel::HandleMethodCall(
3535
const std::string& method_name = method_call.method_name();
3636

3737
if (method_name == "getWindowGeometry") {
38-
TizenWindow::Geometry geometry = window_->GetWindowGeometry();
38+
TizenGeometry geometry = window_->GetGeometry();
3939
EncodableMap map;
4040
map[EncodableValue("x")] = EncodableValue(geometry.left);
4141
map[EncodableValue("y")] = EncodableValue(geometry.top);
@@ -57,9 +57,9 @@ void WindowChannel::HandleMethodCall(
5757
EncodableValueHolder<int32_t> width(arguments, "width");
5858
EncodableValueHolder<int32_t> height(arguments, "height");
5959

60-
TizenWindow::Geometry geometry = window_->GetWindowGeometry();
61-
// FIXME: Use SetWindowGeometry() instead of OnGeometryChanged()
62-
// After the SetWindowGeometry was successfully executed, I expected a
60+
TizenGeometry geometry = window_->GetGeometry();
61+
// FIXME: Use SetGeometry() instead of OnGeometryChanged()
62+
// After the SetGeometry was successfully executed, I expected a
6363
// handler of ECORE_WL2_EVENT_WINDOW_CONFIGURE to be called, but it didn't.
6464
window_->OnGeometryChanged({
6565
x ? *x : geometry.left,
@@ -70,7 +70,7 @@ void WindowChannel::HandleMethodCall(
7070
result->Success();
7171
#endif
7272
} else if (method_name == "getScreenGeometry") {
73-
TizenWindow::Geometry geometry = window_->GetScreenGeometry();
73+
TizenGeometry geometry = window_->GetScreenGeometry();
7474
EncodableMap map;
7575
map[EncodableValue("width")] = EncodableValue(geometry.width);
7676
map[EncodableValue("height")] = EncodableValue(geometry.height);

shell/platform/tizen/flutter_tizen.cc

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,12 @@ void FlutterDesktopEngineShutdown(FlutterDesktopEngineRef engine_ref) {
7171

7272
void* FlutterDesktopPluginRegistrarGetNativeWindow(
7373
FlutterDesktopPluginRegistrarRef registrar) {
74-
return registrar->engine->view()->window()->GetWindowHandle();
74+
flutter::TizenViewBase* tizen_view = registrar->engine->view()->tizen_view();
75+
if (tizen_view->GetType() == flutter::TizenViewType::kWindow) {
76+
auto* window = reinterpret_cast<flutter::TizenWindow*>(tizen_view);
77+
return window->GetWindowHandle();
78+
}
79+
return nullptr;
7580
}
7681

7782
void FlutterDesktopPluginRegistrarEnableInputBlocking(

shell/platform/tizen/flutter_tizen_ecore.cc

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
#include "flutter/shell/platform/tizen/flutter_tizen_engine.h"
88
#include "flutter/shell/platform/tizen/flutter_tizen_view.h"
9+
#include "flutter/shell/platform/tizen/logger.h"
910
#include "flutter/shell/platform/tizen/tizen_window_ecore_wl2.h"
1011

1112
namespace {
@@ -24,12 +25,9 @@ FlutterDesktopViewRef HandleForView(flutter::FlutterTizenView* view) {
2425
FlutterDesktopViewRef FlutterDesktopViewCreateFromNewWindow(
2526
const FlutterDesktopWindowProperties& window_properties,
2627
FlutterDesktopEngineRef engine) {
27-
flutter::TizenWindow::Geometry window_geometry = {
28-
window_properties.x,
29-
window_properties.y,
30-
window_properties.width,
31-
window_properties.height,
32-
};
28+
flutter::TizenGeometry window_geometry = {
29+
window_properties.x, window_properties.y, window_properties.width,
30+
window_properties.height};
3331

3432
std::unique_ptr<flutter::TizenWindow> window =
3533
std::make_unique<flutter::TizenWindowEcoreWl2>(
@@ -52,3 +50,22 @@ FlutterDesktopViewRef FlutterDesktopViewCreateFromNewWindow(
5250

5351
return HandleForView(view.release());
5452
}
53+
54+
FlutterDesktopViewRef FlutterDesktopViewCreateFromElmParent(
55+
const FlutterDesktopViewProperties& view_properties,
56+
FlutterDesktopEngineRef engine,
57+
void* parent) {
58+
FT_LOG(Warn) << "Not applicable!";
59+
return nullptr;
60+
}
61+
62+
void* FlutterDesktopViewGetEvasObject(FlutterDesktopViewRef view_ref) {
63+
FT_LOG(Warn) << "Not applicable!";
64+
return nullptr;
65+
}
66+
67+
void FlutterDesktopViewResize(FlutterDesktopViewRef view_ref,
68+
int32_t width,
69+
int32_t height) {
70+
FT_LOG(Warn) << "Not applicable!";
71+
}

shell/platform/tizen/flutter_tizen_elementary.cc

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
#include "flutter/shell/platform/tizen/flutter_tizen_engine.h"
88
#include "flutter/shell/platform/tizen/flutter_tizen_view.h"
9+
#include "flutter/shell/platform/tizen/tizen_view_elementary.h"
910
#include "flutter/shell/platform/tizen/tizen_window_elementary.h"
1011

1112
namespace {
@@ -24,12 +25,9 @@ FlutterDesktopViewRef HandleForView(flutter::FlutterTizenView* view) {
2425
FlutterDesktopViewRef FlutterDesktopViewCreateFromNewWindow(
2526
const FlutterDesktopWindowProperties& window_properties,
2627
FlutterDesktopEngineRef engine) {
27-
flutter::TizenWindow::Geometry window_geometry = {
28-
window_properties.x,
29-
window_properties.y,
30-
window_properties.width,
31-
window_properties.height,
32-
};
28+
flutter::TizenGeometry window_geometry = {
29+
window_properties.x, window_properties.y, window_properties.width,
30+
window_properties.height};
3331

3432
std::unique_ptr<flutter::TizenWindow> window =
3533
std::make_unique<flutter::TizenWindowElementary>(
@@ -52,3 +50,48 @@ FlutterDesktopViewRef FlutterDesktopViewCreateFromNewWindow(
5250

5351
return HandleForView(view.release());
5452
}
53+
54+
FlutterDesktopViewRef FlutterDesktopViewCreateFromElmParent(
55+
const FlutterDesktopViewProperties& view_properties,
56+
FlutterDesktopEngineRef engine,
57+
void* parent) {
58+
std::unique_ptr<flutter::TizenViewBase> tizen_view =
59+
std::make_unique<flutter::TizenViewElementary>(
60+
view_properties.width, view_properties.height,
61+
static_cast<Evas_Object*>(parent));
62+
63+
auto view =
64+
std::make_unique<flutter::FlutterTizenView>(std::move(tizen_view));
65+
66+
// Take ownership of the engine, starting it if necessary.
67+
view->SetEngine(
68+
std::unique_ptr<flutter::FlutterTizenEngine>(EngineFromHandle(engine)));
69+
view->CreateRenderSurface();
70+
if (!view->engine()->IsRunning()) {
71+
if (!view->engine()->RunEngine()) {
72+
return nullptr;
73+
}
74+
}
75+
76+
view->SendInitialGeometry();
77+
78+
return HandleForView(view.release());
79+
}
80+
81+
void* FlutterDesktopViewGetEvasObject(FlutterDesktopViewRef view_ref) {
82+
auto* view = reinterpret_cast<flutter::FlutterTizenView*>(view_ref);
83+
if (view->tizen_view()->GetType() == flutter::TizenViewType::kView) {
84+
auto* tizen_view =
85+
reinterpret_cast<flutter::TizenView*>(view->tizen_view());
86+
return tizen_view->GetRenderTargetContainer();
87+
}
88+
return nullptr;
89+
}
90+
91+
void FlutterDesktopViewResize(FlutterDesktopViewRef view_ref,
92+
int32_t width,
93+
int32_t height) {
94+
auto* view = reinterpret_cast<flutter::FlutterTizenView*>(view_ref);
95+
flutter::TizenGeometry view_geometry = {0, 0, width, height};
96+
view->tizen_view()->OnGeometryChanged(view_geometry);
97+
}

shell/platform/tizen/flutter_tizen_engine.cc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -536,8 +536,7 @@ void FlutterTizenEngine::OnUpdateSemanticsCustomActions(
536536
bridge->GetFlutterPlatformNodeDelegateFromID(0);
537537
std::shared_ptr<FlutterPlatformWindowDelegateTizen> window =
538538
FlutterPlatformAppDelegateTizen::GetInstance().GetWindow().lock();
539-
TizenWindow::Geometry geometry =
540-
engine->view_->window()->GetWindowGeometry();
539+
TizenGeometry geometry = engine->view_->tizen_view()->GetGeometry();
541540
window->SetGeometry(geometry.left, geometry.top, geometry.width,
542541
geometry.height);
543542
window->SetRootNode(root);

shell/platform/tizen/flutter_tizen_view.cc

Lines changed: 45 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
#include "flutter_tizen_view.h"
77

88
#include "flutter/shell/platform/tizen/logger.h"
9+
#include "flutter/shell/platform/tizen/tizen_view.h"
10+
#include "flutter/shell/platform/tizen/tizen_window.h"
911

1012
namespace {
1113

@@ -40,10 +42,10 @@ const std::vector<std::string> kBindableSystemKeys = {
4042

4143
namespace flutter {
4244

43-
FlutterTizenView::FlutterTizenView(std::unique_ptr<TizenWindow> window)
44-
: window_(std::move(window)) {
45-
window_->SetView(this);
46-
window_->BindKeys(kBindableSystemKeys);
45+
FlutterTizenView::FlutterTizenView(std::unique_ptr<TizenViewBase> tizen_view)
46+
: tizen_view_(std::move(tizen_view)) {
47+
tizen_view_->SetView(this);
48+
tizen_view_->BindKeys(kBindableSystemKeys);
4749
}
4850

4951
FlutterTizenView::~FlutterTizenView() {}
@@ -57,19 +59,34 @@ void FlutterTizenView::SetEngine(std::unique_ptr<FlutterTizenEngine> engine) {
5759

5860
// Set up window dependent channels.
5961
BinaryMessenger* messenger = internal_plugin_registrar_->messenger();
60-
platform_channel_ =
61-
std::make_unique<PlatformChannel>(messenger, window_.get());
62-
window_channel_ = std::make_unique<WindowChannel>(messenger, window_.get());
62+
63+
if (tizen_view_->GetType() == TizenViewType::kWindow) {
64+
auto* window = reinterpret_cast<TizenWindow*>(tizen_view_.get());
65+
platform_channel_ = std::make_unique<PlatformChannel>(messenger, window);
66+
window_channel_ = std::make_unique<WindowChannel>(messenger, window);
67+
} else {
68+
platform_channel_ = std::make_unique<PlatformChannel>(messenger, nullptr);
69+
window_channel_ = std::make_unique<WindowChannel>(messenger, nullptr);
70+
}
71+
6372
text_input_channel_ = std::make_unique<TextInputChannel>(
64-
internal_plugin_registrar_->messenger(), window_->input_method_context());
73+
internal_plugin_registrar_->messenger(),
74+
tizen_view_->input_method_context());
6575
}
6676

6777
void FlutterTizenView::CreateRenderSurface() {
6878
if (engine_ && engine_->renderer()) {
69-
TizenWindow::Geometry geometry = window_->GetWindowGeometry();
70-
engine_->renderer()->CreateSurface(window_->GetRenderTarget(),
71-
window_->GetRenderTargetDisplay(),
72-
geometry.width, geometry.height);
79+
TizenGeometry geometry = tizen_view_->GetGeometry();
80+
if (tizen_view_->GetType() == TizenViewType::kWindow) {
81+
auto* window = reinterpret_cast<TizenWindow*>(tizen_view_.get());
82+
engine_->renderer()->CreateSurface(window->GetRenderTarget(),
83+
window->GetRenderTargetDisplay(),
84+
geometry.width, geometry.height);
85+
} else {
86+
auto* tizen_view = reinterpret_cast<TizenView*>(tizen_view_.get());
87+
engine_->renderer()->CreateSurface(tizen_view->GetRenderTarget(), nullptr,
88+
geometry.width, geometry.height);
89+
}
7390
}
7491
}
7592

@@ -111,16 +128,15 @@ void FlutterTizenView::OnResize(int32_t left,
111128
std::swap(width, height);
112129
}
113130

114-
window_->ResizeRenderTargetWithRotation({left, top, width, height},
115-
rotation_degree_);
131+
tizen_view_->ResizeWithRotation({left, top, width, height}, rotation_degree_);
116132
SendWindowMetrics(left, top, width, height, 0.0);
117133
}
118134

119135
void FlutterTizenView::OnRotate(int32_t degree) {
120136
rotation_degree_ = degree;
121137
// Compute renderer transformation based on the angle of rotation.
122138
double rad = (360 - rotation_degree_) * M_PI / 180;
123-
TizenWindow::Geometry geometry = window_->GetWindowGeometry();
139+
TizenGeometry geometry = tizen_view_->GetGeometry();
124140
int32_t width = geometry.width;
125141
int32_t height = geometry.height;
126142

@@ -144,8 +160,8 @@ void FlutterTizenView::OnRotate(int32_t degree) {
144160
std::swap(width, height);
145161
}
146162

147-
window_->ResizeRenderTargetWithRotation(
148-
{geometry.left, geometry.top, width, height}, rotation_degree_);
163+
tizen_view_->ResizeWithRotation({geometry.left, geometry.top, width, height},
164+
rotation_degree_);
149165

150166
// Window position does not change on rotation regardless of its orientation.
151167
SendWindowMetrics(geometry.left, geometry.top, width, height, 0.0);
@@ -254,7 +270,14 @@ void FlutterTizenView::OnCommit(const std::string& str) {
254270
}
255271

256272
void FlutterTizenView::SendInitialGeometry() {
257-
OnRotate(window_->GetRotation());
273+
if (tizen_view_->GetType() == TizenViewType::kWindow) {
274+
auto* window = reinterpret_cast<TizenWindow*>(tizen_view_.get());
275+
OnRotate(window->GetRotation());
276+
} else {
277+
TizenGeometry geometry = tizen_view_->GetGeometry();
278+
SendWindowMetrics(geometry.left, geometry.top, geometry.width,
279+
geometry.height, 0.0);
280+
}
258281
}
259282

260283
void FlutterTizenView::SendWindowMetrics(int32_t left,
@@ -270,7 +293,7 @@ void FlutterTizenView::SendWindowMetrics(int32_t left,
270293
#ifdef TV_PROFILE
271294
double dpi = 72.0;
272295
#else
273-
double dpi = static_cast<double>(window_->GetDpi());
296+
double dpi = static_cast<double>(tizen_view_->GetDpi());
274297
#endif
275298
double scale_factor = dpi / 90.0 * kProfileFactor;
276299
computed_pixel_ratio = std::max(scale_factor, 1.0);
@@ -290,7 +313,7 @@ void FlutterTizenView::SendFlutterPointerEvent(
290313
size_t timestamp,
291314
FlutterPointerDeviceKind device_kind,
292315
int device_id) {
293-
TizenWindow::Geometry geometry = window_->GetWindowGeometry();
316+
TizenGeometry geometry = tizen_view_->GetGeometry();
294317
double new_x = x, new_y = y;
295318

296319
if (rotation_degree_ == 90) {
@@ -307,8 +330,8 @@ void FlutterTizenView::SendFlutterPointerEvent(
307330
FlutterPointerEvent event = {};
308331
event.struct_size = sizeof(event);
309332
event.phase = phase;
310-
event.x = new_x;
311-
event.y = new_y;
333+
event.x = new_x - geometry.left;
334+
event.y = new_y - geometry.top;
312335
if (delta_x != 0 || delta_y != 0) {
313336
event.signal_kind = kFlutterPointerSignalKindScroll;
314337
}

shell/platform/tizen/flutter_tizen_view.h

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,12 @@
1414
#include "flutter/shell/platform/tizen/channels/text_input_channel.h"
1515
#include "flutter/shell/platform/tizen/channels/window_channel.h"
1616
#include "flutter/shell/platform/tizen/flutter_tizen_engine.h"
17-
#include "flutter/shell/platform/tizen/tizen_window.h"
1817

1918
namespace flutter {
2019

2120
class FlutterTizenView {
2221
public:
23-
FlutterTizenView(std::unique_ptr<TizenWindow> window);
22+
FlutterTizenView(std::unique_ptr<TizenViewBase> tizen_view);
2423

2524
~FlutterTizenView();
2625

@@ -30,7 +29,7 @@ class FlutterTizenView {
3029

3130
FlutterTizenEngine* engine() { return engine_.get(); }
3231

33-
TizenWindow* window() { return window_.get(); }
32+
TizenViewBase* tizen_view() { return tizen_view_.get(); }
3433

3534
// Creates rendering surface for Flutter engine to draw into.
3635
// Should be called before calling FlutterEngineRun using this view.
@@ -126,8 +125,8 @@ class FlutterTizenView {
126125
// The engine associated with this view.
127126
std::unique_ptr<FlutterTizenEngine> engine_;
128127

129-
// The window associated with this view.
130-
std::unique_ptr<TizenWindow> window_;
128+
// The platform view associated with this Flutter view.
129+
std::unique_ptr<TizenViewBase> tizen_view_;
131130

132131
// The plugin registrar managing internal plugins.
133132
std::unique_ptr<PluginRegistrar> internal_plugin_registrar_;

0 commit comments

Comments
 (0)