Skip to content

Commit 1a71e39

Browse files
committed
Support user made window
* This is a necessary feature for partial window. Signed-off-by: MuHong Byun <[email protected]>
1 parent 9f08d18 commit 1a71e39

7 files changed

+61
-57
lines changed

shell/platform/tizen/flutter_tizen.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ FlutterDesktopEngineRef FlutterDesktopRunEngine(
2929
bool headed) {
3030
StartLogging();
3131

32-
auto engine = std::make_unique<FlutterTizenEngine>(headed);
32+
auto engine = std::make_unique<FlutterTizenEngine>(headed,engine_properties.custom_win);
3333
if (!engine->RunEngine(engine_properties)) {
3434
FT_LOGE("Failed to run the Flutter engine.");
3535
return nullptr;

shell/platform/tizen/flutter_tizen_engine.cc

+8-9
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ static DeviceProfile GetDeviceProfile() {
3838
return DeviceProfile::kUnknown;
3939
}
4040

41-
FlutterTizenEngine::FlutterTizenEngine(bool headed)
42-
: device_profile(GetDeviceProfile()) {
41+
FlutterTizenEngine::FlutterTizenEngine(bool headed, void* win)
42+
: device_profile(GetDeviceProfile()), custom_window_(win) {
4343
// Run flutter task on Tizen main loop.
4444
// Tizen engine has four threads (GPU thread, UI thread, IO thread, platform
4545
// thread). UI threads need to send flutter task to platform thread.
@@ -64,9 +64,7 @@ FlutterTizenEngine::FlutterTizenEngine(bool headed)
6464
}
6565
}
6666

67-
FlutterTizenEngine::~FlutterTizenEngine() {
68-
renderer = nullptr;
69-
}
67+
FlutterTizenEngine::~FlutterTizenEngine() { renderer = nullptr; }
7068

7169
void FlutterTizenEngine::InitializeRenderer() {
7270
#ifdef TIZEN_RENDERER_EVAS_GL
@@ -257,8 +255,7 @@ void FlutterTizenEngine::SetPluginRegistrarDestructionCallback(
257255
plugin_registrar_destruction_callback_ = callback;
258256
}
259257

260-
void FlutterTizenEngine::SendWindowMetrics(int32_t width,
261-
int32_t height,
258+
void FlutterTizenEngine::SendWindowMetrics(int32_t width, int32_t height,
262259
double pixel_ratio) {
263260
FlutterWindowMetricsEvent event;
264261
event.struct_size = sizeof(FlutterWindowMetricsEvent);
@@ -331,11 +328,13 @@ void FlutterTizenEngine::OnOrientationChange(int32_t degree) {
331328
SetWindowOrientation(degree);
332329
}
333330

331+
bool FlutterTizenEngine::hasCustomWindow() { return custom_window_ != nullptr; }
332+
void* FlutterTizenEngine::CustomWindow() { return custom_window_; }
333+
334334
// The Flutter Engine calls out to this function when new platform messages are
335335
// available.
336336
void FlutterTizenEngine::OnFlutterPlatformMessage(
337-
const FlutterPlatformMessage* engine_message,
338-
void* user_data) {
337+
const FlutterPlatformMessage* engine_message, void* user_data) {
339338
if (engine_message->struct_size != sizeof(FlutterPlatformMessage)) {
340339
FT_LOGE("Invalid message size received. Expected: %zu, but received %zu",
341340
sizeof(FlutterPlatformMessage), engine_message->struct_size);

shell/platform/tizen/flutter_tizen_engine.h

+7-3
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ enum DeviceProfile { kUnknown, kMobile, kWearable, kTV, kCommon };
5858
// Manages state associated with the underlying FlutterEngine.
5959
class FlutterTizenEngine : public TizenRenderer::Delegate {
6060
public:
61-
explicit FlutterTizenEngine(bool headed);
61+
explicit FlutterTizenEngine(bool headed, void* win = nullptr);
6262
virtual ~FlutterTizenEngine();
6363

6464
// Prevent copying.
@@ -83,6 +83,9 @@ class FlutterTizenEngine : public TizenRenderer::Delegate {
8383
void SetWindowOrientation(int32_t degree);
8484
void OnOrientationChange(int32_t degree) override;
8585

86+
// This is an experimental feature to support partial window.
87+
bool hasCustomWindow() override;
88+
void* CustomWindow() override;
8689
// The Flutter engine instance.
8790
FLUTTER_API_SYMBOL(FlutterEngine) flutter_engine;
8891

@@ -111,8 +114,7 @@ class FlutterTizenEngine : public TizenRenderer::Delegate {
111114
bool IsHeaded() { return renderer != nullptr; }
112115

113116
static void OnFlutterPlatformMessage(
114-
const FlutterPlatformMessage* engine_message,
115-
void* user_data);
117+
const FlutterPlatformMessage* engine_message, void* user_data);
116118
FlutterDesktopMessage ConvertToDesktopMessage(
117119
const FlutterPlatformMessage& engine_message);
118120
FlutterRendererConfig GetRendererConfig();
@@ -152,6 +154,8 @@ class FlutterTizenEngine : public TizenRenderer::Delegate {
152154

153155
// The current renderer transformation.
154156
FlutterTransformation transformation_;
157+
158+
void* custom_window_;
155159
};
156160

157161
#endif // EMBEDDER_TIZEN_EMBEDDER_ENGINE_H_

shell/platform/tizen/public/flutter_tizen.h

+2
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ typedef struct {
3636
const char** switches;
3737
// The number of elements in |switches|.
3838
size_t switches_count;
39+
// This is an experimental feature to support partial window.
40+
void* custom_win;
3941
} FlutterDesktopEngineProperties;
4042

4143
// Runs an instance of a Flutter engine with the given properties.

shell/platform/tizen/tizen_renderer.h

+3
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ class TizenRenderer {
1717
class Delegate {
1818
public:
1919
virtual void OnOrientationChange(int32_t degree) = 0;
20+
// This is an experimental feature to support partial window.
21+
virtual bool hasCustomWindow() = 0;
22+
virtual void* CustomWindow() = 0;
2023
};
2124

2225
virtual ~TizenRenderer();

shell/platform/tizen/tizen_renderer_ecore_wl2.cc

+18-19
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,7 @@ TizenRendererEcoreWl2::TizenRendererEcoreWl2(TizenRenderer::Delegate& delegate)
1414
InitializeRenderer();
1515
}
1616

17-
TizenRendererEcoreWl2::~TizenRendererEcoreWl2() {
18-
DestroyRenderer();
19-
}
17+
TizenRendererEcoreWl2::~TizenRendererEcoreWl2() { DestroyRenderer(); }
2018

2119
bool TizenRendererEcoreWl2::OnMakeCurrent() {
2220
if (!IsValid()) {
@@ -253,9 +251,7 @@ bool TizenRendererEcoreWl2::InitializeRenderer() {
253251
return true;
254252
}
255253

256-
void TizenRendererEcoreWl2::Show() {
257-
ecore_wl2_window_show(ecore_wl2_window_);
258-
}
254+
void TizenRendererEcoreWl2::Show() { ecore_wl2_window_show(ecore_wl2_window_); }
259255

260256
void TizenRendererEcoreWl2::DestroyRenderer() {
261257
DestroyEglSurface();
@@ -285,13 +281,19 @@ bool TizenRendererEcoreWl2::SetupEcoreWlWindow(int32_t width, int32_t height) {
285281
FT_LOGE("Invalid screen size: %d x %d", width, height);
286282
return false;
287283
}
288-
ecore_wl2_window_ =
289-
ecore_wl2_window_new(ecore_wl2_display_, nullptr, 0, 0, width, height);
290-
ecore_wl2_window_type_set(ecore_wl2_window_, ECORE_WL2_WINDOW_TYPE_TOPLEVEL);
291-
ecore_wl2_window_alpha_set(ecore_wl2_window_, EINA_FALSE);
292-
ecore_wl2_window_position_set(ecore_wl2_window_, 0, 0);
293-
ecore_wl2_window_aux_hint_add(ecore_wl2_window_, 0,
294-
"wm.policy.win.user.geometry", "1");
284+
if (delegate_.hasCustomWindow()) {
285+
ecore_wl2_window_ =
286+
reinterpret_cast<Ecore_Wl2_Window*>(delegate_.CustomWindow());
287+
} else {
288+
ecore_wl2_window_ =
289+
ecore_wl2_window_new(ecore_wl2_display_, nullptr, 0, 0, width, height);
290+
ecore_wl2_window_type_set(ecore_wl2_window_,
291+
ECORE_WL2_WINDOW_TYPE_TOPLEVEL);
292+
ecore_wl2_window_alpha_set(ecore_wl2_window_, EINA_FALSE);
293+
ecore_wl2_window_position_set(ecore_wl2_window_, 0, 0);
294+
ecore_wl2_window_aux_hint_add(ecore_wl2_window_, 0,
295+
"wm.policy.win.user.geometry", "1");
296+
}
295297
int rotations[4] = {0, 90, 180, 270};
296298
ecore_wl2_window_available_rotations_set(ecore_wl2_window_, rotations,
297299
sizeof(rotations) / sizeof(int));
@@ -561,8 +563,7 @@ void TizenRendererEcoreWl2::DestroyEglSurface() {
561563
}
562564
}
563565

564-
Eina_Bool TizenRendererEcoreWl2::RotationEventCb(void* data,
565-
int type,
566+
Eina_Bool TizenRendererEcoreWl2::RotationEventCb(void* data, int type,
566567
void* event) {
567568
auto* self = reinterpret_cast<TizenRendererEcoreWl2*>(data);
568569
auto* ev = reinterpret_cast<Ecore_Wl2_Event_Window_Rotation*>(event);
@@ -575,10 +576,8 @@ void TizenRendererEcoreWl2::SetRotate(int angle) {
575576
received_rotation_ = true;
576577
}
577578

578-
void TizenRendererEcoreWl2::ResizeWithRotation(int32_t x,
579-
int32_t y,
580-
int32_t width,
581-
int32_t height,
579+
void TizenRendererEcoreWl2::ResizeWithRotation(int32_t x, int32_t y,
580+
int32_t width, int32_t height,
582581
int32_t angle) {
583582
ecore_wl2_egl_window_resize_with_rotation(ecore_wl2_egl_window_, x, y, width,
584583
height, angle);

shell/platform/tizen/tizen_renderer_evas_gl.cc

+22-25
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,7 @@ TizenRendererEvasGL::TizenRendererEvasGL(TizenRenderer::Delegate& delegate)
2020
OnPresent();
2121
}
2222

23-
TizenRendererEvasGL::~TizenRendererEvasGL() {
24-
DestroyRenderer();
25-
}
23+
TizenRendererEvasGL::~TizenRendererEvasGL() { DestroyRenderer(); }
2624

2725
void TizenRendererEvasGL::ClearColor(float r, float g, float b, float a) {
2826
glClearColor(r, g, b, a);
@@ -562,9 +560,7 @@ uintptr_t TizenRendererEvasGL::GetWindowId() {
562560
ecore_evas_ecore_evas_get(evas_object_evas_get(evas_window_)));
563561
}
564562

565-
void* TizenRendererEvasGL::GetImageHandle() {
566-
return (void*)graphics_adapter_;
567-
}
563+
void* TizenRendererEvasGL::GetImageHandle() { return (void*)graphics_adapter_; }
568564

569565
bool TizenRendererEvasGL::InitializeRenderer() {
570566
if (!SetupEvasGL()) {
@@ -636,21 +632,25 @@ bool TizenRendererEvasGL::SetupEvasGL() {
636632
void* TizenRendererEvasGL::SetupEvasWindow(int32_t& width, int32_t& height) {
637633
elm_config_accel_preference_set("hw:opengl");
638634

639-
evas_window_ = elm_win_add(NULL, NULL, ELM_WIN_BASIC);
640-
auto* ecore_evas =
641-
ecore_evas_ecore_evas_get(evas_object_evas_get(evas_window_));
642-
int32_t x, y;
643-
ecore_evas_screen_geometry_get(ecore_evas, &x, &y, &width, &height);
644-
if (width == 0 || height == 0) {
645-
FT_LOGE("Invalid screen size: %d x %d", width, height);
646-
return nullptr;
635+
if (delegate_.hasCustomWindow()) {
636+
evas_window_ = reinterpret_cast<Evas_Object*>(delegate_.CustomWindow());
637+
} else {
638+
evas_window_ = elm_win_add(NULL, NULL, ELM_WIN_BASIC);
639+
auto* ecore_evas =
640+
ecore_evas_ecore_evas_get(evas_object_evas_get(evas_window_));
641+
int32_t x, y;
642+
ecore_evas_screen_geometry_get(ecore_evas, &x, &y, &width, &height);
643+
if (width == 0 || height == 0) {
644+
FT_LOGE("Invalid screen size: %d x %d", width, height);
645+
return nullptr;
646+
}
647+
648+
elm_win_alpha_set(evas_window_, EINA_FALSE);
649+
evas_object_move(evas_window_, 0, 0);
650+
evas_object_resize(evas_window_, width, height);
651+
evas_object_raise(evas_window_);
647652
}
648653

649-
elm_win_alpha_set(evas_window_, EINA_FALSE);
650-
evas_object_move(evas_window_, 0, 0);
651-
evas_object_resize(evas_window_, width, height);
652-
evas_object_raise(evas_window_);
653-
654654
Evas_Object* bg = elm_bg_add(evas_window_);
655655
evas_object_color_set(bg, 0x00, 0x00, 0x00, 0x00);
656656

@@ -689,8 +689,7 @@ void TizenRendererEvasGL::DestroyEvasWindow() {
689689
evas_object_del(graphics_adapter_);
690690
}
691691

692-
void TizenRendererEvasGL::RotationEventCb(void* data,
693-
Evas_Object* obj,
692+
void TizenRendererEvasGL::RotationEventCb(void* data, Evas_Object* obj,
694693
void* event_info) {
695694
auto* self = reinterpret_cast<TizenRendererEvasGL*>(data);
696695
// TODO : Use current window rotation degree
@@ -703,10 +702,8 @@ void TizenRendererEvasGL::SetRotate(int angle) {
703702
received_rotation_ = true;
704703
}
705704

706-
void TizenRendererEvasGL::ResizeWithRotation(int32_t x,
707-
int32_t y,
708-
int32_t width,
709-
int32_t height,
705+
void TizenRendererEvasGL::ResizeWithRotation(int32_t x, int32_t y,
706+
int32_t width, int32_t height,
710707
int32_t angle) {
711708
evas_object_move(evas_window_, x, y);
712709
evas_object_resize(evas_window_, width, height);

0 commit comments

Comments
 (0)