Skip to content

Commit 70804d2

Browse files
bbrto21swift-kim
authored andcommitted
Support top-layer mode (flutter-tizen#191)
* Support top-layer mode * Add top to FlutterDesktopWindowProperties as a member * If top is true, the window type will be NOTIFICATION with the top level priority Signed-off-by: Boram Bae <[email protected]> * Update based on review Signed-off-by: Boram Bae <[email protected]> * Destroy wl_event_queue Signed-off-by: Boram Bae <[email protected]> * Fix build break on host * Fix naming convention Signed-off-by: Boram Bae <[email protected]> * Remove unnecessary code Signed-off-by: Boram Bae <[email protected]> * Add repeat count to prevent infinite wait Signed-off-by: Boram Bae <[email protected]> * Retrieve global objects to bind tizen policy Signed-off-by: Boram Bae <[email protected]> * Update based on review Signed-off-by: Boram Bae <[email protected]> * Free Eina_Iterator after using it Signed-off-by: Boram Bae <[email protected]>
1 parent 5ccf0c1 commit 70804d2

12 files changed

+86
-13
lines changed

shell/platform/tizen/BUILD.gn

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ template("embedder") {
169169
"capi-base-common",
170170
"capi-system-info",
171171
"capi-system-system-settings",
172+
"capi-ui-efl-util",
172173
"dlog",
173174
"feedback",
174175
"tbm",
@@ -201,7 +202,10 @@ template("embedder") {
201202
"tizen_vsync_waiter.cc",
202203
]
203204

204-
libs += [ "ecore_wl2" ]
205+
libs += [
206+
"ecore_wl2",
207+
"tizen-extension-client",
208+
]
205209
}
206210

207211
public_deps = [ ":flutter_engine" ]

shell/platform/tizen/flutter_tizen.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ FlutterDesktopEngineRef FlutterDesktopRunEngine(
3838
engine->InitializeRenderer(
3939
window_properties.x, window_properties.y, window_properties.width,
4040
window_properties.height, window_properties.transparent,
41-
window_properties.focusable);
41+
window_properties.focusable, window_properties.top_level);
4242
}
4343
if (!engine->RunEngine(engine_properties.entrypoint)) {
4444
FT_LOG(Error) << "Failed to start the Flutter engine.";

shell/platform/tizen/flutter_tizen_engine.cc

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,12 +90,13 @@ void FlutterTizenEngine::InitializeRenderer(int32_t x,
9090
int32_t width,
9191
int32_t height,
9292
bool transparent,
93-
bool focusable) {
93+
bool focusable,
94+
bool top_level) {
9495
TizenRenderer::WindowGeometry geometry = {x, y, width, height};
9596

9697
#ifdef TIZEN_RENDERER_EVAS_GL
97-
renderer_ = std::make_unique<TizenRendererEvasGL>(geometry, transparent,
98-
focusable, *this);
98+
renderer_ = std::make_unique<TizenRendererEvasGL>(
99+
geometry, transparent, focusable, top_level, *this);
99100

100101
render_loop_ = std::make_unique<TizenRenderEventLoop>(
101102
std::this_thread::get_id(), // main thread
@@ -107,8 +108,8 @@ void FlutterTizenEngine::InitializeRenderer(int32_t x,
107108
},
108109
renderer_.get());
109110
#else
110-
renderer_ = std::make_unique<TizenRendererEcoreWl2>(geometry, transparent,
111-
focusable, *this);
111+
renderer_ = std::make_unique<TizenRendererEcoreWl2>(
112+
geometry, transparent, focusable, top_level, *this);
112113

113114
tizen_vsync_waiter_ = std::make_unique<TizenVsyncWaiter>(this);
114115
#endif

shell/platform/tizen/flutter_tizen_engine.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,8 @@ class FlutterTizenEngine : public TizenRenderer::Delegate {
6767
int32_t width,
6868
int32_t height,
6969
bool transparent,
70-
bool focusable);
70+
bool focusable,
71+
bool top_level);
7172

7273
// Starts running the engine with the given entrypoint. If null, defaults to
7374
// main().

shell/platform/tizen/flutter_tizen_engine_unittest.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ class FlutterTizenEngineTestHeaded : public FlutterTizenEngineTest {
4444
protected:
4545
void SetUp() {
4646
FlutterTizenEngineTest::SetUp();
47-
engine_->InitializeRenderer(0, 0, 800, 600, false, true);
47+
engine_->InitializeRenderer(0, 0, 800, 600, false, true, false);
4848
}
4949
};
5050

shell/platform/tizen/public/flutter_tizen.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ typedef struct {
3838
bool transparent;
3939
// Whether the window should be focusable or not.
4040
bool focusable;
41+
// Whether the window should be on top layer or not.
42+
bool top_level;
4143
} FlutterDesktopWindowProperties;
4244

4345
// Properties for configuring a Flutter engine instance.

shell/platform/tizen/tizen_renderer.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@ namespace flutter {
99
TizenRenderer::TizenRenderer(WindowGeometry geometry,
1010
bool transparent,
1111
bool focusable,
12+
bool top_level,
1213
Delegate& delegate)
1314
: initial_geometry_(geometry),
1415
transparent_(transparent),
1516
focusable_(focusable),
17+
top_level_(top_level),
1618
delegate_(delegate) {}
1719

1820
TizenRenderer::~TizenRenderer() = default;

shell/platform/tizen/tizen_renderer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,13 @@ class TizenRenderer {
5050
explicit TizenRenderer(WindowGeometry geometry,
5151
bool transparent,
5252
bool focusable,
53+
bool top_level,
5354
Delegate& delegate);
5455

5556
WindowGeometry initial_geometry_;
5657
bool transparent_;
5758
bool focusable_;
59+
bool top_level_;
5860
Delegate& delegate_;
5961

6062
bool is_valid_ = false;

shell/platform/tizen/tizen_renderer_ecore_wl2.cc

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@ namespace flutter {
1414
TizenRendererEcoreWl2::TizenRendererEcoreWl2(WindowGeometry geometry,
1515
bool transparent,
1616
bool focusable,
17+
bool top_level,
1718
Delegate& delegate)
18-
: TizenRenderer(geometry, transparent, focusable, delegate) {
19+
: TizenRenderer(geometry, transparent, focusable, top_level, delegate) {
1920
InitializeRenderer();
2021
}
2122

@@ -296,7 +297,18 @@ bool TizenRendererEcoreWl2::SetupEcoreWlWindow(int32_t width, int32_t height) {
296297

297298
ecore_wl2_window_ =
298299
ecore_wl2_window_new(ecore_wl2_display_, nullptr, x, y, width, height);
299-
ecore_wl2_window_type_set(ecore_wl2_window_, ECORE_WL2_WINDOW_TYPE_TOPLEVEL);
300+
301+
// Change the window type to use the tizen policy for notification window
302+
// according to top_level_.
303+
// Note: ECORE_WL2_WINDOW_TYPE_TOPLEVEL is similar to "ELM_WIN_BASIC" and it
304+
// does not mean that the window always will be overlaid on other apps :(
305+
ecore_wl2_window_type_set(ecore_wl2_window_,
306+
top_level_ ? ECORE_WL2_WINDOW_TYPE_NOTIFICATION
307+
: ECORE_WL2_WINDOW_TYPE_TOPLEVEL);
308+
if (top_level_) {
309+
SetTizenPolicyNotificationLevel(TIZEN_POLICY_LEVEL_TOP);
310+
}
311+
300312
ecore_wl2_window_position_set(ecore_wl2_window_, x, y);
301313
ecore_wl2_window_aux_hint_add(ecore_wl2_window_, 0,
302314
"wm.policy.win.user.geometry", "1");
@@ -571,4 +583,34 @@ bool TizenRendererEcoreWl2::IsSupportedExtention(const char* name) {
571583
return false;
572584
}
573585

586+
void TizenRendererEcoreWl2::SetTizenPolicyNotificationLevel(int level) {
587+
Eina_Iterator* iter = ecore_wl2_display_globals_get(ecore_wl2_display_);
588+
struct wl_registry* registry =
589+
ecore_wl2_display_registry_get(ecore_wl2_display_);
590+
591+
if (iter && registry) {
592+
Ecore_Wl2_Global* global = nullptr;
593+
594+
// Retrieve global objects to bind tizen policy
595+
EINA_ITERATOR_FOREACH(iter, global) {
596+
if (strcmp(global->interface, tizen_policy_interface.name) == 0) {
597+
tizen_policy_ = static_cast<tizen_policy*>(
598+
wl_registry_bind(registry, global->id, &tizen_policy_interface, 1));
599+
break;
600+
}
601+
}
602+
}
603+
eina_iterator_free(iter);
604+
605+
if (tizen_policy_ == nullptr) {
606+
FT_LOG(Error)
607+
<< "Failed to initialize the tizen policy handle, the top_level "
608+
"attribute is ignored.";
609+
return;
610+
}
611+
612+
tizen_policy_set_notification_level(
613+
tizen_policy_, ecore_wl2_window_surface_get(ecore_wl2_window_), level);
614+
}
615+
574616
} // namespace flutter

shell/platform/tizen/tizen_renderer_ecore_wl2.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
#define EFL_BETA_API_SUPPORT
99
#include <EGL/egl.h>
1010
#include <Ecore_Wl2.h>
11+
#include <tizen-extension-client-protocol.h>
12+
1113
#include <string>
1214

1315
#include "flutter/shell/platform/tizen/tizen_renderer.h"
@@ -19,6 +21,7 @@ class TizenRendererEcoreWl2 : public TizenRenderer {
1921
explicit TizenRendererEcoreWl2(WindowGeometry geometry,
2022
bool transparent,
2123
bool focusable,
24+
bool top_level,
2225
Delegate& delegate);
2326
virtual ~TizenRendererEcoreWl2();
2427

@@ -61,6 +64,7 @@ class TizenRendererEcoreWl2 : public TizenRenderer {
6164
bool ChooseEGLConfiguration();
6265
void PrintEGLError();
6366
void DestroyEglSurface();
67+
void SetTizenPolicyNotificationLevel(int level);
6468

6569
static Eina_Bool RotationEventCb(void* data, int type, void* event);
6670
void SendRotationChangeDone();
@@ -77,6 +81,8 @@ class TizenRendererEcoreWl2 : public TizenRenderer {
7781
EGLSurface egl_resource_surface_ = EGL_NO_SURFACE;
7882

7983
std::string egl_extention_str_;
84+
85+
tizen_policy* tizen_policy_ = nullptr;
8086
};
8187

8288
} // namespace flutter

shell/platform/tizen/tizen_renderer_evas_gl.cc

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,18 @@ EVAS_GL_GLOBAL_GLES3_DEFINE();
1010

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

13+
#ifndef __X64_SHELL__
14+
#include <ui/efl_util.h>
15+
#endif
16+
1317
namespace flutter {
1418

1519
TizenRendererEvasGL::TizenRendererEvasGL(WindowGeometry geometry,
1620
bool transparent,
1721
bool focusable,
22+
bool top_level,
1823
Delegate& delegate)
19-
: TizenRenderer(geometry, transparent, focusable, delegate) {
24+
: TizenRenderer(geometry, transparent, focusable, top_level, delegate) {
2025
InitializeRenderer();
2126

2227
// Clear once to remove noise.
@@ -639,10 +644,17 @@ Evas_Object* TizenRendererEvasGL::SetupEvasWindow(int32_t* width,
639644
int32_t* height) {
640645
elm_config_accel_preference_set("hw:opengl");
641646

642-
evas_window_ = elm_win_add(NULL, NULL, ELM_WIN_BASIC);
647+
evas_window_ = elm_win_add(NULL, NULL,
648+
top_level_ ? ELM_WIN_NOTIFICATION : ELM_WIN_BASIC);
643649
if (!evas_window_) {
644650
return nullptr;
645651
}
652+
#ifndef __X64_SHELL__
653+
if (top_level_) {
654+
efl_util_set_notification_window_level(evas_window_,
655+
EFL_UTIL_NOTIFICATION_LEVEL_TOP);
656+
}
657+
#endif
646658
auto* ecore_evas =
647659
ecore_evas_ecore_evas_get(evas_object_evas_get(evas_window_));
648660

shell/platform/tizen/tizen_renderer_evas_gl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ class TizenRendererEvasGL : public TizenRenderer {
1919
explicit TizenRendererEvasGL(WindowGeometry geometry,
2020
bool transparent,
2121
bool focusable,
22+
bool top_level,
2223
Delegate& delegate);
2324
virtual ~TizenRendererEvasGL();
2425

0 commit comments

Comments
 (0)