Skip to content

Commit 02a7411

Browse files
authored
Support screen rotations for Tizen 4.0 and Tizen 6.0 (#28)
* Support screen rotations for tizen4.0 and tizen6.0 Screen rotations sequence: 1.Register ecore rotate event callback. 2.Set rotate for ecore window when receive rotate event. 3.Resize ecore window. 4.Resize egl window. 5.Reize flutter UI. 6.Send rotate done before swap buffer. * Refactor screen rotations according to code reviews suggestions 1.Remove GetWindowData func. 2.Remove struct WindowData. * Add newline at end of file
1 parent ac00eef commit 02a7411

11 files changed

+148
-51
lines changed

shell/platform/tizen/channels/text_input_channel.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ void TextInputChannel::InputPanelStateChangedCallback(
102102
case ECORE_IMF_INPUT_PANEL_STATE_SHOW: {
103103
FT_LOGD("[PANEL_STATE_SHOW]\n");
104104
if (self->engine_->device_profile ==
105-
"mobile") { // FIXME : Needs improvement on other devices.
105+
"mobileD") { // FIXME : Needs improvement on other devices.
106106
ecore_timer_add(
107107
0.25,
108108
[](void* data) -> Eina_Bool {
@@ -611,7 +611,7 @@ void TextInputChannel::HideSoftwareKeyboard() {
611611
is_software_keyboard_showing_ = false;
612612

613613
if (engine_->device_profile ==
614-
"mobile") { // FIXME : Needs improvement on other devices.
614+
"mobileD") { // FIXME : Needs improvement on other devices.
615615
auto window_geometry = engine_->tizen_renderer->GetGeometry();
616616

617617
if (rotation == 90 || rotation == 270) {

shell/platform/tizen/flutter_tizen.cc

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -221,9 +221,6 @@ void FlutterNotifyLowMemoryWarning(FlutterWindowControllerRef controller) {
221221

222222
void FlutterRotateWindow(FlutterWindowControllerRef controller,
223223
int32_t degree) {
224-
if (controller->engine) {
225-
controller->engine->SetWindowOrientation(degree);
226-
}
227224
}
228225

229226
int64_t FlutterRegisterExternalTexture(

shell/platform/tizen/tizen_embedder_engine.cc

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,11 @@ TizenEmbedderEngine::TizenEmbedderEngine(
3737
: device_profile(GetDeviceProfile()), device_dpi(GetDeviceDpi()) {
3838
#ifdef FLUTTER_TIZEN_4
3939
tizen_renderer = std::make_unique<TizenRendererEcoreWl>(
40-
window_properties.x, window_properties.y, window_properties.width,
40+
*this, window_properties.x, window_properties.y, window_properties.width,
4141
window_properties.height);
4242
#else
4343
tizen_renderer = std::make_unique<TizenRendererEcoreWl2>(
44-
window_properties.x, window_properties.y, window_properties.width,
44+
*this, window_properties.x, window_properties.y, window_properties.width,
4545
window_properties.height);
4646
#endif
4747

@@ -198,10 +198,13 @@ bool TizenEmbedderEngine::RunEngine(
198198
touch_event_handler_ = std::make_unique<TouchEventHandler>(this);
199199

200200
SetWindowOrientation(0);
201-
202201
return true;
203202
}
204203

204+
void TizenEmbedderEngine::OnRotationChange(int angle) {
205+
SetWindowOrientation(angle);
206+
}
207+
205208
bool TizenEmbedderEngine::StopEngine() {
206209
if (flutter_engine) {
207210
if (platform_view_channel) {
@@ -270,16 +273,13 @@ void TizenEmbedderEngine::SetWindowOrientation(int32_t degree) {
270273
return;
271274
}
272275

276+
tizen_renderer->SetRotate(degree);
273277
// Compute renderer transformation based on the angle of rotation.
274278
double rad = (360 - degree) * M_PI / 180;
275279
auto geometry = tizen_renderer->GetGeometry();
276280
double width = geometry.w;
277281
double height = geometry.h;
278282

279-
if (text_input_channel->IsSoftwareKeyboardShowing()) {
280-
height -= text_input_channel->GetCurrentKeyboardGeometry().h;
281-
}
282-
283283
double trans_x = 0.0, trans_y = 0.0;
284284
if (degree == 90) {
285285
trans_y = height;
@@ -297,8 +297,12 @@ void TizenEmbedderEngine::SetWindowOrientation(int32_t degree) {
297297
touch_event_handler_->rotation = degree;
298298
text_input_channel->rotation = degree;
299299
if (degree == 90 || degree == 270) {
300+
tizen_renderer->ResizeWithRotation(geometry.x, geometry.y, height, width,
301+
degree);
300302
SendWindowMetrics(height, width, 0.0);
301303
} else {
304+
tizen_renderer->ResizeWithRotation(geometry.x, geometry.y, width, height,
305+
degree);
302306
SendWindowMetrics(width, height, 0.0);
303307
}
304308
}

shell/platform/tizen/tizen_embedder_engine.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ struct FlutterTextureRegistrar {
6565
using UniqueAotDataPtr = std::unique_ptr<_FlutterEngineAOTData, AOTDataDeleter>;
6666

6767
// Manages state associated with the underlying FlutterEngine.
68-
class TizenEmbedderEngine {
68+
class TizenEmbedderEngine : public TizenRenderer::Delegate {
6969
public:
7070
explicit TizenEmbedderEngine(
7171
const FlutterWindowProperties& window_properties);
@@ -87,6 +87,7 @@ class TizenEmbedderEngine {
8787
void AppIsResumed();
8888
void AppIsPaused();
8989
void AppIsDetached();
90+
void OnRotationChange(int degree) override;
9091

9192
// The Flutter engine instance.
9293
FLUTTER_API_SYMBOL(FlutterEngine) flutter_engine;

shell/platform/tizen/tizen_renderer.cc

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99

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

12+
TizenRenderer::TizenRenderer(TizenRenderer::Delegate& delegate)
13+
: delegate_(delegate) {}
14+
1215
TizenRenderer::~TizenRenderer() = default;
1316

1417
bool TizenRenderer::OnMakeCurrent() {
@@ -58,6 +61,12 @@ bool TizenRenderer::OnPresent() {
5861
FT_LOGE("Invalid TizenRenderer");
5962
return false;
6063
}
64+
65+
if(received_rotation) {
66+
SendRotationChangeDone();
67+
received_rotation = false;
68+
}
69+
6170
if (eglSwapBuffers(egl_display_, egl_surface_) != EGL_TRUE) {
6271
FT_LOGE("Could not swap EGl buffer");
6372
PrintEGLError();
@@ -217,6 +226,7 @@ bool TizenRenderer::InitializeRenderer(int32_t x, int32_t y, int32_t w,
217226
FT_LOGE("setupEglSurface fail");
218227
return false;
219228
}
229+
Show();
220230
is_valid_ = true;
221231
return true;
222232
}

shell/platform/tizen/tizen_renderer.h

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,13 @@ class TizenRenderer {
1212
struct TizenWindowGeometry {
1313
int32_t x{0}, y{0}, w{0}, h{0};
1414
};
15-
TizenRenderer() = default;
15+
16+
class Delegate {
17+
public:
18+
virtual void OnRotationChange(int angle) = 0;
19+
};
20+
21+
TizenRenderer(TizenRenderer::Delegate& deleget);
1622
virtual ~TizenRenderer();
1723
bool OnMakeCurrent();
1824
bool OnClearCurrent();
@@ -22,11 +28,15 @@ class TizenRenderer {
2228
void* OnProcResolver(const char* name);
2329
virtual TizenWindowGeometry GetGeometry() = 0;
2430
bool IsValid();
31+
virtual void Show() = 0;
32+
virtual void SetRotate(int angle) = 0;
2533
virtual int GetEcoreWindowId() = 0;
26-
virtual void ResizeWithRotation(int32_t dx, int32_t dy, int32_t width,
34+
virtual void ResizeWithRotation(int32_t x, int32_t y, int32_t width,
2735
int32_t height, int32_t degree) = 0;
2836

2937
protected:
38+
bool received_rotation{false};
39+
TizenRenderer::Delegate& delegate_;
3040
bool InitializeRenderer(int32_t x, int32_t y, int32_t w, int32_t h);
3141
virtual bool SetupDisplay() = 0;
3242
virtual bool SetupEcoreWlWindow(int32_t x, int32_t y, int32_t w,
@@ -35,12 +45,12 @@ class TizenRenderer {
3545
bool SetupEglSurface();
3646
virtual EGLDisplay GetEGLDisplay() = 0;
3747
virtual EGLNativeWindowType GetEGLNativeWindowType() = 0;
38-
3948
void DestoryRenderer();
4049
void DestoryEglSurface();
4150
virtual void DestoryEglWindow() = 0;
4251
virtual void DestoryEcoreWlWindow() = 0;
4352
virtual void ShutdownDisplay() = 0;
53+
virtual void SendRotationChangeDone() = 0;
4454

4555
private:
4656
bool is_valid_ = false;
@@ -53,4 +63,4 @@ class TizenRenderer {
5363
bool ChooseEGLConfiguration();
5464
void PrintEGLError();
5565
};
56-
#endif
66+
#endif //EMBEDDER_TIZEN_RENDERER_H

shell/platform/tizen/tizen_renderer_ecore_wl.cc

Lines changed: 47 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,13 @@
66

77
#include "flutter/shell/platform/tizen/tizen_log.h"
88

9-
TizenRendererEcoreWl::TizenRendererEcoreWl(int32_t x, int32_t y, int32_t w,
10-
int32_t h) {
9+
TizenRendererEcoreWl::TizenRendererEcoreWl(TizenRenderer::Delegate &delegate,
10+
int32_t x, int32_t y, int32_t w,
11+
int32_t h)
12+
: TizenRenderer(delegate) {
1113
InitializeRenderer(x, y, w, h);
1214
}
15+
1316
TizenRendererEcoreWl::~TizenRendererEcoreWl() { DestoryRenderer(); }
1417

1518
bool TizenRendererEcoreWl::SetupDisplay() {
@@ -25,12 +28,14 @@ bool TizenRendererEcoreWl::SetupDisplay() {
2528
}
2629
return true;
2730
}
31+
2832
bool TizenRendererEcoreWl::SetupEcoreWlWindow(int32_t x, int32_t y, int32_t w,
2933
int32_t h) {
3034
if (w == 0 || h == 0) {
3135
FT_LOGE("Failed to create because of the wrong size");
3236
return false;
3337
}
38+
3439
ecore_wl_window_ = ecore_wl_window_new(
3540
nullptr, x, y, w, h, ECORE_WL_WINDOW_BUFFER_TYPE_EGL_WINDOW);
3641
FT_LOGD("ecore_wl_window_: %p", ecore_wl_window_);
@@ -43,8 +48,44 @@ bool TizenRendererEcoreWl::SetupEcoreWlWindow(int32_t x, int32_t y, int32_t w,
4348
ecore_wl_window_aux_hint_add(ecore_wl_window_, 0,
4449
"wm.policy.win.user.geometry", "1");
4550
ecore_wl_window_show(ecore_wl_window_);
51+
int rotations[4] = {0, 90, 180, 270};
52+
ecore_wl_window_rotation_available_rotations_set(
53+
ecore_wl_window_, rotations, sizeof(rotations) / sizeof(int));
54+
ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_ROTATE, RotationEventCb, this);
4655
return true;
4756
}
57+
58+
Eina_Bool TizenRendererEcoreWl::RotationEventCb(void *data, int type,
59+
void *event) {
60+
auto *self = reinterpret_cast<TizenRendererEcoreWl *>(data);
61+
Ecore_Wl_Event_Window_Rotate *ev =
62+
reinterpret_cast<Ecore_Wl_Event_Window_Rotate *>(event);
63+
self->delegate_.OnRotationChange(ev->angle);
64+
return ECORE_CALLBACK_PASS_ON;
65+
}
66+
67+
void TizenRendererEcoreWl::Show() { ecore_wl_window_show(ecore_wl_window_); }
68+
void TizenRendererEcoreWl::SetRotate(int degree) {
69+
ecore_wl_window_rotation_set(ecore_wl_window_, degree);
70+
received_rotation = true;
71+
}
72+
73+
void TizenRendererEcoreWl::ResizeWithRotation(int32_t x, int32_t y,
74+
int32_t width, int32_t height,
75+
int32_t degree) {
76+
wl_egl_window_set_buffer_transform(wl_egl_window_, degree / 90);
77+
wl_egl_window_set_window_transform(wl_egl_window_, degree / 90);
78+
79+
if ((degree == 90) || (degree == 270))
80+
wl_egl_window_resize(wl_egl_window_, height, width, x, y);
81+
else
82+
wl_egl_window_resize(wl_egl_window_, width, height, x, y);
83+
}
84+
85+
void TizenRendererEcoreWl::SendRotationChangeDone() {
86+
ecore_wl_window_rotation_change_done_send(ecore_wl_window_);
87+
}
88+
4889
bool TizenRendererEcoreWl::SetupEglWindow(int32_t w, int32_t h) {
4990
wl_egl_window_ =
5091
wl_egl_window_create(ecore_wl_window_surface_get(ecore_wl_window_), w, h);
@@ -54,9 +95,11 @@ bool TizenRendererEcoreWl::SetupEglWindow(int32_t w, int32_t h) {
5495
}
5596
return true;
5697
}
98+
5799
EGLDisplay TizenRendererEcoreWl::GetEGLDisplay() {
58100
return eglGetDisplay((EGLNativeDisplayType)wl_display_);
59101
}
102+
60103
EGLNativeWindowType TizenRendererEcoreWl::GetEGLNativeWindowType() {
61104
return (EGLNativeWindowType)wl_egl_window_;
62105
}
@@ -67,12 +110,14 @@ void TizenRendererEcoreWl::DestoryEglWindow() {
67110
wl_egl_window_ = nullptr;
68111
}
69112
}
113+
70114
void TizenRendererEcoreWl::DestoryEcoreWlWindow() {
71115
if (ecore_wl_window_) {
72116
ecore_wl_window_free(ecore_wl_window_);
73117
ecore_wl_window_ = nullptr;
74118
}
75119
}
120+
76121
void TizenRendererEcoreWl::ShutdownDisplay() { ecore_wl_shutdown(); }
77122

78123
TizenRenderer::TizenWindowGeometry TizenRendererEcoreWl::GetGeometry() {
@@ -82,19 +127,6 @@ TizenRenderer::TizenWindowGeometry TizenRendererEcoreWl::GetGeometry() {
82127
return result;
83128
}
84129

85-
void TizenRendererEcoreWl::ResizeWithRotation(int32_t dx, int32_t dy,
86-
int32_t width, int32_t height,
87-
int32_t degree) {
88-
wl_egl_window_resize(wl_egl_window_, width, height, dx, dy);
89-
wl_egl_window_rotation rotations[4] = {ROTATION_0, ROTATION_90, ROTATION_180,
90-
ROTATION_270};
91-
int index = 0;
92-
if (degree > 0) {
93-
index = (degree / 90) % 4;
94-
}
95-
wl_egl_window_set_rotation(wl_egl_window_, rotations[index]);
96-
}
97-
98130
int TizenRendererEcoreWl::GetEcoreWindowId() {
99131
return ecore_wl_window_id_get(ecore_wl_window_);
100132
}

shell/platform/tizen/tizen_renderer_ecore_wl.h

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,15 @@
1313
#include <Ecore_Wayland.h>
1414
class TizenRendererEcoreWl : public TizenRenderer {
1515
public:
16-
TizenRendererEcoreWl(int32_t x, int32_t y, int32_t w, int32_t h);
16+
TizenRendererEcoreWl(TizenRenderer::Delegate& delegate, int32_t x, int32_t y,
17+
int32_t w, int32_t h);
1718
~TizenRendererEcoreWl();
1819
TizenRenderer::TizenWindowGeometry GetGeometry() override;
19-
int GetEcoreWindowId() override;
20-
void ResizeWithRotation(int32_t dx, int32_t dy, int32_t width, int32_t height,
20+
void Show() override;
21+
void SetRotate(int angle) override;
22+
void ResizeWithRotation(int32_t x, int32_t y, int32_t width, int32_t height,
2123
int32_t degree) override;
24+
int GetEcoreWindowId() override;
2225

2326
protected:
2427
void DestoryEglWindow() override;
@@ -29,10 +32,12 @@ class TizenRendererEcoreWl : public TizenRenderer {
2932
bool SetupEcoreWlWindow(int32_t x, int32_t y, int32_t w, int32_t h) override;
3033
bool SetupEglWindow(int32_t w, int32_t h) override;
3134
void ShutdownDisplay() override;
35+
void SendRotationChangeDone() override;
3236

3337
private:
3438
Ecore_Wl_Window* ecore_wl_window_ = nullptr;
3539
wl_egl_window* wl_egl_window_ = nullptr;
3640
wl_display* wl_display_ = nullptr;
41+
static Eina_Bool RotationEventCb(void* data, int type, void* event);
3742
};
38-
#endif
43+
#endif //EMBEDDER_TIZEN_RENDERER_ECORE_WL_H

0 commit comments

Comments
 (0)