Skip to content

Commit 94bd946

Browse files
authored
Remove FlutterWindowProperties and get the screen size automatically (#72)
The screen width/height/dpi values returned by the system_info API are just pre-defined values and do not represent the actual properties of the display. The correct values can be only obtained after ecore_wl2_display is created.
1 parent e2dcdc6 commit 94bd946

9 files changed

+81
-90
lines changed

shell/platform/tizen/flutter_tizen.cc

+1-2
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,11 @@ struct FlutterWindowControllerState {
2121
};
2222

2323
FlutterWindowControllerRef FlutterCreateWindow(
24-
const FlutterWindowProperties& window_properties,
2524
const FlutterEngineProperties& engine_properties) {
2625
StartLogging();
2726

2827
auto state = std::make_unique<FlutterWindowControllerState>();
29-
state->engine = std::make_unique<TizenEmbedderEngine>(window_properties);
28+
state->engine = std::make_unique<TizenEmbedderEngine>();
3029

3130
if (!state->engine->RunEngine(engine_properties)) {
3231
FT_LOGE("Failed to run the Flutter engine.");

shell/platform/tizen/public/flutter_tizen.h

+1-14
Original file line numberDiff line numberDiff line change
@@ -20,18 +20,6 @@ extern "C" {
2020
// Opaque reference to a Flutter window controller.
2121
typedef struct FlutterWindowControllerState* FlutterWindowControllerRef;
2222

23-
// Properties for configuring the initial settings of a Flutter window.
24-
typedef struct {
25-
// The display title.
26-
const char* title;
27-
int32_t x;
28-
int32_t y;
29-
// Width in screen coordinates.
30-
int32_t width;
31-
// Height in screen coordinates.
32-
int32_t height;
33-
} FlutterWindowProperties;
34-
3523
// Properties for configuring a Flutter engine instance.
3624
typedef struct {
3725
// The path to the flutter_assets folder for the application to be run.
@@ -50,8 +38,7 @@ typedef struct {
5038
} FlutterEngineProperties;
5139

5240
FLUTTER_EXPORT FlutterWindowControllerRef
53-
FlutterCreateWindow(const FlutterWindowProperties& window_properties,
54-
const FlutterEngineProperties& engine_properties);
41+
FlutterCreateWindow(const FlutterEngineProperties& engine_properties);
5542

5643
// Returns the plugin registrar handle for the plugin with the given name.
5744
//

shell/platform/tizen/tizen_embedder_engine.cc

+8-19
Original file line numberDiff line numberDiff line change
@@ -39,24 +39,12 @@ static DeviceProfile GetDeviceProfile() {
3939
return DeviceProfile::kUnknown;
4040
}
4141

42-
static double GetDeviceDpi() {
43-
int feature_dpi;
44-
system_info_get_platform_int("http://tizen.org/feature/screen.dpi",
45-
&feature_dpi);
46-
return (double)feature_dpi;
47-
}
48-
49-
TizenEmbedderEngine::TizenEmbedderEngine(
50-
const FlutterWindowProperties& window_properties)
51-
: device_profile(GetDeviceProfile()), device_dpi(GetDeviceDpi()) {
42+
TizenEmbedderEngine::TizenEmbedderEngine()
43+
: device_profile(GetDeviceProfile()) {
5244
#ifdef TIZEN_RENDERER_EVAS_GL
53-
tizen_renderer = std::make_unique<TizenRendererEvasGL>(
54-
*this, window_properties.x, window_properties.y, window_properties.width,
55-
window_properties.height);
45+
tizen_renderer = std::make_unique<TizenRendererEvasGL>(*this);
5646
#else
57-
tizen_renderer = std::make_unique<TizenRendererEcoreWl2>(
58-
*this, window_properties.x, window_properties.y, window_properties.width,
59-
window_properties.height);
47+
tizen_renderer = std::make_unique<TizenRendererEcoreWl2>(*this);
6048
#endif
6149

6250
// Run flutter task on Tizen main loop.
@@ -296,17 +284,18 @@ void TizenEmbedderEngine::SendWindowMetrics(int32_t width, int32_t height,
296284
// The scale factor is computed based on the display DPI and the current
297285
// profile. A fixed DPI value (72) is used on TVs. See:
298286
// https://docs.tizen.org/application/native/guides/ui/efl/multiple-screens
287+
double dpi = 72.0;
288+
if (tizen_renderer && device_profile != DeviceProfile::kTV) {
289+
dpi = (double)tizen_renderer->GetDpi();
290+
}
299291
double profile_factor = 1.0;
300292
if (device_profile == DeviceProfile::kWearable) {
301293
profile_factor = 0.4;
302294
} else if (device_profile == DeviceProfile::kMobile) {
303295
profile_factor = 0.7;
304296
} else if (device_profile == DeviceProfile::kTV) {
305297
profile_factor = 2.0;
306-
} else if (device_profile == DeviceProfile::kCommon) {
307-
profile_factor = 0.5;
308298
}
309-
double dpi = device_profile == DeviceProfile::kTV ? 72.0 : device_dpi;
310299
double scale_factor = dpi / 90.0 * profile_factor;
311300
event.pixel_ratio = std::max(scale_factor, 1.0);
312301
} else {

shell/platform/tizen/tizen_embedder_engine.h

+1-3
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,7 @@ enum DeviceProfile { kUnknown, kMobile, kWearable, kTV, kCommon };
6969
// Manages state associated with the underlying FlutterEngine.
7070
class TizenEmbedderEngine : public TizenRenderer::Delegate {
7171
public:
72-
explicit TizenEmbedderEngine(
73-
const FlutterWindowProperties& window_properties);
72+
explicit TizenEmbedderEngine();
7473
virtual ~TizenEmbedderEngine();
7574
bool RunEngine(const FlutterEngineProperties& engine_properties);
7675
bool StopEngine();
@@ -114,7 +113,6 @@ class TizenEmbedderEngine : public TizenRenderer::Delegate {
114113
std::unique_ptr<PlatformViewChannel> platform_view_channel;
115114

116115
const DeviceProfile device_profile;
117-
const double device_dpi;
118116

119117
private:
120118
static bool MakeContextCurrent(void* user_data);

shell/platform/tizen/tizen_renderer.h

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class TizenRenderer {
3030
virtual void* OnProcResolver(const char* name) = 0;
3131

3232
virtual TizenWindowGeometry GetGeometry() = 0;
33+
virtual int32_t GetDpi() = 0;
3334
virtual uintptr_t GetWindowId() = 0;
3435

3536
virtual void SetRotate(int angle) = 0;

shell/platform/tizen/tizen_renderer_ecore_wl2.cc

+26-18
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,9 @@
99

1010
#include "flutter/shell/platform/tizen/tizen_log.h"
1111

12-
TizenRendererEcoreWl2::TizenRendererEcoreWl2(TizenRenderer::Delegate &delegate,
13-
int32_t x, int32_t y, int32_t w,
14-
int32_t h)
12+
TizenRendererEcoreWl2::TizenRendererEcoreWl2(TizenRenderer::Delegate &delegate)
1513
: TizenRenderer(delegate) {
16-
InitializeRenderer(x, y, w, h);
14+
InitializeRenderer();
1715
}
1816

1917
TizenRendererEcoreWl2::~TizenRendererEcoreWl2() { DestroyRenderer(); }
@@ -217,21 +215,30 @@ TizenRenderer::TizenWindowGeometry TizenRendererEcoreWl2::GetGeometry() {
217215
return result;
218216
}
219217

218+
int32_t TizenRendererEcoreWl2::GetDpi() {
219+
auto *output = ecore_wl2_window_output_find(ecore_wl2_window_);
220+
if (!output) {
221+
FT_LOGE("Could not find an output associated with the window.");
222+
return 0;
223+
}
224+
return ecore_wl2_output_dpi_get(output);
225+
}
226+
220227
uintptr_t TizenRendererEcoreWl2::GetWindowId() {
221228
return (uintptr_t)ecore_wl2_window_id_get(ecore_wl2_window_);
222229
}
223230

224-
bool TizenRendererEcoreWl2::InitializeRenderer(int32_t x, int32_t y, int32_t w,
225-
int32_t h) {
226-
if (!SetupDisplay()) {
231+
bool TizenRendererEcoreWl2::InitializeRenderer() {
232+
int32_t width, height;
233+
if (!SetupDisplay(width, height)) {
227234
FT_LOGE("SetupDisplay fail");
228235
return false;
229236
}
230-
if (!SetupEcoreWlWindow(x, y, w, h)) {
237+
if (!SetupEcoreWlWindow(width, height)) {
231238
FT_LOGE("SetupEcoreWlWindow fail");
232239
return false;
233240
}
234-
if (!SetupEglWindow(w, h)) {
241+
if (!SetupEglWindow(width, height)) {
235242
FT_LOGE("SetupEglWindow fail");
236243
return false;
237244
}
@@ -253,7 +260,7 @@ void TizenRendererEcoreWl2::DestroyRenderer() {
253260
ShutdownDisplay();
254261
}
255262

256-
bool TizenRendererEcoreWl2::SetupDisplay() {
263+
bool TizenRendererEcoreWl2::SetupDisplay(int32_t &width, int32_t &height) {
257264
if (!ecore_wl2_init()) {
258265
FT_LOGE("Could not initialize ecore_wl2");
259266
return false;
@@ -265,20 +272,20 @@ bool TizenRendererEcoreWl2::SetupDisplay() {
265272
}
266273
FT_LOGD("ecore_wl2_display_: %p", ecore_wl2_display_);
267274
ecore_wl2_sync();
275+
ecore_wl2_display_screen_size_get(ecore_wl2_display_, &width, &height);
268276
return true;
269277
}
270278

271-
bool TizenRendererEcoreWl2::SetupEcoreWlWindow(int32_t x, int32_t y, int32_t w,
272-
int32_t h) {
273-
if (w == 0 || h == 0) {
274-
FT_LOGE("Failed to create because of the wrong size");
279+
bool TizenRendererEcoreWl2::SetupEcoreWlWindow(int32_t width, int32_t height) {
280+
if (width == 0 || height == 0) {
281+
FT_LOGE("Invalid screen size: %d x %d", width, height);
275282
return false;
276283
}
277284
ecore_wl2_window_ =
278-
ecore_wl2_window_new(ecore_wl2_display_, nullptr, x, y, w, h);
285+
ecore_wl2_window_new(ecore_wl2_display_, nullptr, 0, 0, width, height);
279286
ecore_wl2_window_type_set(ecore_wl2_window_, ECORE_WL2_WINDOW_TYPE_TOPLEVEL);
280287
ecore_wl2_window_alpha_set(ecore_wl2_window_, EINA_FALSE);
281-
ecore_wl2_window_position_set(ecore_wl2_window_, x, y);
288+
ecore_wl2_window_position_set(ecore_wl2_window_, 0, 0);
282289
ecore_wl2_window_aux_hint_add(ecore_wl2_window_, 0,
283290
"wm.policy.win.user.geometry", "1");
284291
int rotations[4] = {0, 90, 180, 270};
@@ -288,8 +295,9 @@ bool TizenRendererEcoreWl2::SetupEcoreWlWindow(int32_t x, int32_t y, int32_t w,
288295
return true;
289296
}
290297

291-
bool TizenRendererEcoreWl2::SetupEglWindow(int32_t w, int32_t h) {
292-
ecore_wl2_egl_window_ = ecore_wl2_egl_window_create(ecore_wl2_window_, w, h);
298+
bool TizenRendererEcoreWl2::SetupEglWindow(int32_t width, int32_t height) {
299+
ecore_wl2_egl_window_ =
300+
ecore_wl2_egl_window_create(ecore_wl2_window_, width, height);
293301
return ecore_wl2_egl_window_ != nullptr;
294302
}
295303

shell/platform/tizen/tizen_renderer_ecore_wl2.h

+6-6
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@
1313

1414
class TizenRendererEcoreWl2 : public TizenRenderer {
1515
public:
16-
explicit TizenRendererEcoreWl2(TizenRenderer::Delegate &delegate, int32_t x,
17-
int32_t y, int32_t w, int32_t h);
16+
explicit TizenRendererEcoreWl2(TizenRenderer::Delegate &delegate);
1817
virtual ~TizenRendererEcoreWl2();
1918

2019
bool OnMakeCurrent() override;
@@ -25,20 +24,21 @@ class TizenRendererEcoreWl2 : public TizenRenderer {
2524
void *OnProcResolver(const char *name) override;
2625

2726
TizenWindowGeometry GetGeometry() override;
27+
int32_t GetDpi() override;
2828
uintptr_t GetWindowId() override;
2929

3030
void ResizeWithRotation(int32_t x, int32_t y, int32_t width, int32_t height,
3131
int32_t angle) override;
3232
void SetRotate(int angle) override;
3333

3434
private:
35-
bool InitializeRenderer(int32_t x, int32_t y, int32_t w, int32_t h);
35+
bool InitializeRenderer();
3636
void Show();
3737
void DestroyRenderer();
3838

39-
bool SetupDisplay();
40-
bool SetupEcoreWlWindow(int32_t x, int32_t y, int32_t w, int32_t h);
41-
bool SetupEglWindow(int32_t w, int32_t h);
39+
bool SetupDisplay(int32_t &width, int32_t &height);
40+
bool SetupEcoreWlWindow(int32_t width, int32_t height);
41+
bool SetupEglWindow(int32_t width, int32_t height);
4242
EGLDisplay GetEGLDisplay();
4343
EGLNativeWindowType GetEGLNativeWindowType();
4444
void DestroyEglWindow();

shell/platform/tizen/tizen_renderer_evas_gl.cc

+32-23
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,9 @@ EVAS_GL_GLOBAL_GLES3_DEFINE();
1010

1111
#include "flutter/shell/platform/tizen/tizen_log.h"
1212

13-
TizenRendererEvasGL::TizenRendererEvasGL(TizenRenderer::Delegate& delegate,
14-
int32_t x, int32_t y, int32_t w,
15-
int32_t h)
13+
TizenRendererEvasGL::TizenRendererEvasGL(TizenRenderer::Delegate& delegate)
1614
: TizenRenderer(delegate) {
17-
InitializeRenderer(x, y, w, h);
15+
InitializeRenderer();
1816

1917
// Clear once to remove noise.
2018
OnMakeCurrent();
@@ -549,16 +547,23 @@ TizenRenderer::TizenWindowGeometry TizenRendererEvasGL::GetGeometry() {
549547
return result;
550548
}
551549

550+
int32_t TizenRendererEvasGL::GetDpi() {
551+
auto* ecore_evas =
552+
ecore_evas_ecore_evas_get(evas_object_evas_get(evas_window_));
553+
int32_t xdpi, ydpi;
554+
ecore_evas_screen_dpi_get(ecore_evas, &xdpi, &ydpi);
555+
return xdpi;
556+
}
557+
552558
uintptr_t TizenRendererEvasGL::GetWindowId() {
553559
return ecore_evas_window_get(
554560
ecore_evas_ecore_evas_get(evas_object_evas_get(evas_window_)));
555561
}
556562

557563
void* TizenRendererEvasGL::GetImageHandle() { return (void*)graphics_adapter_; }
558564

559-
bool TizenRendererEvasGL::InitializeRenderer(int32_t x, int32_t y, int32_t w,
560-
int32_t h) {
561-
if (!SetupEvasGL(x, y, w, h)) {
565+
bool TizenRendererEvasGL::InitializeRenderer() {
566+
if (!SetupEvasGL()) {
562567
FT_LOGE("SetupEvasGL fail");
563568
return false;
564569
}
@@ -577,10 +582,10 @@ void TizenRendererEvasGL::DestroyRenderer() {
577582
DestroyEvasWindow();
578583
}
579584

580-
bool TizenRendererEvasGL::SetupEvasGL(int32_t x, int32_t y, int32_t w,
581-
int32_t h) {
585+
bool TizenRendererEvasGL::SetupEvasGL() {
586+
int32_t width, height;
582587
evas_gl_ = evas_gl_new(
583-
evas_object_evas_get((Evas_Object*)SetupEvasWindow(x, y, w, h)));
588+
evas_object_evas_get((Evas_Object*)SetupEvasWindow(width, height)));
584589
if (!evas_gl_) {
585590
FT_LOGE("SetupEvasWindow fail");
586591
return false;
@@ -612,10 +617,10 @@ bool TizenRendererEvasGL::SetupEvasGL(int32_t x, int32_t y, int32_t w,
612617
}
613618

614619
EVAS_GL_GLOBAL_GLES3_USE(g_evas_gl, gl_context_);
615-
gl_surface_ = evas_gl_surface_create(evas_gl_, gl_config_, w, h);
620+
gl_surface_ = evas_gl_surface_create(evas_gl_, gl_config_, width, height);
616621

617622
gl_resource_surface_ =
618-
evas_gl_pbuffer_surface_create(evas_gl_, gl_config_, w, h, NULL);
623+
evas_gl_pbuffer_surface_create(evas_gl_, gl_config_, width, height, NULL);
619624

620625
Evas_Native_Surface ns;
621626
evas_gl_native_surface_get(evas_gl_, gl_surface_, &ns);
@@ -624,18 +629,22 @@ bool TizenRendererEvasGL::SetupEvasGL(int32_t x, int32_t y, int32_t w,
624629
return true;
625630
}
626631

627-
void* TizenRendererEvasGL::SetupEvasWindow(int32_t x, int32_t y, int32_t w,
628-
int32_t h) {
629-
if (w == 0 || h == 0) {
630-
FT_LOGE("Failed to create because of the wrong size");
631-
return nullptr;
632-
}
632+
void* TizenRendererEvasGL::SetupEvasWindow(int32_t& width, int32_t& height) {
633633
elm_config_accel_preference_set("hw:opengl");
634634

635635
evas_window_ = elm_win_add(NULL, NULL, ELM_WIN_BASIC);
636+
auto* ecore_evas =
637+
ecore_evas_ecore_evas_get(evas_object_evas_get(evas_window_));
638+
int32_t x, y;
639+
ecore_evas_screen_geometry_get(ecore_evas, &x, &y, &width, &height);
640+
if (width == 0 || height == 0) {
641+
FT_LOGE("Invalid screen size: %d x %d", width, height);
642+
return nullptr;
643+
}
644+
636645
elm_win_alpha_set(evas_window_, EINA_FALSE);
637-
evas_object_move(evas_window_, x, y);
638-
evas_object_resize(evas_window_, w, h);
646+
evas_object_move(evas_window_, 0, 0);
647+
evas_object_resize(evas_window_, width, height);
639648
evas_object_raise(evas_window_);
640649

641650
Evas_Object* bg = elm_bg_add(evas_window_);
@@ -646,9 +655,9 @@ void* TizenRendererEvasGL::SetupEvasWindow(int32_t x, int32_t y, int32_t w,
646655

647656
graphics_adapter_ =
648657
evas_object_image_filled_add(evas_object_evas_get(evas_window_));
649-
evas_object_resize(graphics_adapter_, w, h);
650-
evas_object_move(graphics_adapter_, x, y);
651-
evas_object_image_size_set(graphics_adapter_, w, h);
658+
evas_object_resize(graphics_adapter_, width, height);
659+
evas_object_move(graphics_adapter_, 0, 0);
660+
evas_object_image_size_set(graphics_adapter_, width, height);
652661
evas_object_image_alpha_set(graphics_adapter_, EINA_TRUE);
653662
elm_win_resize_object_add(evas_window_, graphics_adapter_);
654663

shell/platform/tizen/tizen_renderer_evas_gl.h

+5-5
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@
1414

1515
class TizenRendererEvasGL : public TizenRenderer {
1616
public:
17-
explicit TizenRendererEvasGL(TizenRenderer::Delegate& delegate, int32_t x,
18-
int32_t y, int32_t w, int32_t h);
17+
explicit TizenRendererEvasGL(TizenRenderer::Delegate& delegate);
1918
virtual ~TizenRendererEvasGL();
2019

2120
bool OnMakeCurrent() override;
@@ -26,6 +25,7 @@ class TizenRendererEvasGL : public TizenRenderer {
2625
void* OnProcResolver(const char* name) override;
2726

2827
TizenWindowGeometry GetGeometry() override;
28+
int32_t GetDpi() override;
2929
uintptr_t GetWindowId() override;
3030

3131
void ResizeWithRotation(int32_t x, int32_t y, int32_t width, int32_t height,
@@ -37,12 +37,12 @@ class TizenRendererEvasGL : public TizenRenderer {
3737
private:
3838
void ClearColor(float r, float g, float b, float a);
3939

40-
bool InitializeRenderer(int32_t x, int32_t y, int32_t w, int32_t h);
40+
bool InitializeRenderer();
4141
void Show();
4242
void DestroyRenderer();
4343

44-
bool SetupEvasGL(int32_t x, int32_t y, int32_t w, int32_t h);
45-
void* SetupEvasWindow(int32_t x, int32_t y, int32_t w, int32_t h);
44+
bool SetupEvasGL();
45+
void* SetupEvasWindow(int32_t& width, int32_t& height);
4646
void DestroyEvasGL();
4747
void DestroyEvasWindow();
4848

0 commit comments

Comments
 (0)