Skip to content

Commit 6818614

Browse files
HakkyuKimswift-kim
authored andcommitted
Add window channel (#201)
* Add window channel * Obtain real screen size * Rename some namings Also: - remove unused include - sort channels alphabetically - sort channel initializations alphabetically * Move SetGeometry to TizenRender to remove macros Also: - call `result->NotImplemented()` instead of `result->Error()` on unsupported window resizing. * Finish resolving previous conflict * Suppress unused private field warning Also: - Add `explicit` to `WindowChannel` constructor. - Disable `OnGeometryChange` for evas_gl. - Remove unused include. * Explicitly initialize with zeros
1 parent 9eff930 commit 6818614

12 files changed

+239
-31
lines changed

shell/platform/tizen/BUILD.gn

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ template("embedder") {
157157
"channels/app_control_channel.cc",
158158
"channels/platform_channel_tizen.cc",
159159
"channels/settings_channel_tizen.cc",
160+
"channels/window_channel.cc",
160161
"external_texture_surface_gl_tizen.cc",
161162
"system_utils_tizen.cc",
162163
]
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
// Copyright 2021 Samsung Electronics Co., Ltd. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
#pragma clang diagnostic push
6+
#pragma clang diagnostic ignored "-Wunused-private-field"
7+
#include "window_channel.h"
8+
#pragma clang diagnostic pop
9+
10+
#include "flutter/shell/platform/common/client_wrapper/include/flutter/standard_method_codec.h"
11+
#include "flutter/shell/platform/tizen/channels/encodable_value_holder.h"
12+
#include "flutter/shell/platform/tizen/logger.h"
13+
14+
namespace flutter {
15+
16+
namespace {
17+
18+
constexpr char kChannelName[] = "tizen/internal/window";
19+
20+
} // namespace
21+
22+
WindowChannel::WindowChannel(BinaryMessenger* messenger,
23+
TizenRenderer* renderer,
24+
TizenRenderer::Delegate* delegate)
25+
: renderer_(renderer), delegate_(delegate) {
26+
channel_ = std::make_unique<MethodChannel<EncodableValue>>(
27+
messenger, kChannelName, &StandardMethodCodec::GetInstance());
28+
channel_->SetMethodCallHandler([this](const auto& call, auto result) {
29+
this->HandleMethodCall(call, std::move(result));
30+
});
31+
}
32+
33+
WindowChannel::~WindowChannel() {}
34+
35+
void WindowChannel::HandleMethodCall(
36+
const MethodCall<EncodableValue>& method_call,
37+
std::unique_ptr<MethodResult<EncodableValue>> result) {
38+
const auto& method_name = method_call.method_name();
39+
40+
if (method_name == "getWindowGeometry") {
41+
TizenRenderer::Geometry geometry = renderer_->GetWindowGeometry();
42+
EncodableMap map;
43+
map[EncodableValue("x")] = EncodableValue(geometry.x);
44+
map[EncodableValue("y")] = EncodableValue(geometry.y);
45+
map[EncodableValue("width")] = EncodableValue(geometry.w);
46+
map[EncodableValue("height")] = EncodableValue(geometry.h);
47+
result->Success(EncodableValue(map));
48+
} else if (method_name == "setWindowGeometry") {
49+
#ifdef TIZEN_RENDERER_EVAS_GL
50+
FT_LOG(Error) << "setWindowGeometry is not supported on evas_gl.";
51+
result->NotImplemented();
52+
#else
53+
auto arguments = std::get_if<EncodableMap>(method_call.arguments());
54+
if (!arguments) {
55+
result->Error("Invalid arguments");
56+
return;
57+
}
58+
EncodableValueHolder<int32_t> x(arguments, "x");
59+
EncodableValueHolder<int32_t> y(arguments, "y");
60+
EncodableValueHolder<int32_t> width(arguments, "width");
61+
EncodableValueHolder<int32_t> height(arguments, "height");
62+
63+
TizenRenderer::Geometry geometry = renderer_->GetWindowGeometry();
64+
65+
delegate_->OnGeometryChange(x ? *x : geometry.x, y ? *y : geometry.y,
66+
width ? *width : geometry.w,
67+
height ? *height : geometry.h);
68+
result->Success();
69+
#endif
70+
} else if (method_name == "getScreenGeometry") {
71+
TizenRenderer::Geometry geometry = renderer_->GetScreenGeometry();
72+
EncodableMap map;
73+
map[EncodableValue("width")] = EncodableValue(geometry.w);
74+
map[EncodableValue("height")] = EncodableValue(geometry.h);
75+
result->Success(EncodableValue(map));
76+
} else {
77+
result->NotImplemented();
78+
}
79+
}
80+
81+
} // namespace flutter
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// Copyright 2021 Samsung Electronics Co., Ltd. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
#ifndef EMBEDDER_WINDOW_CHANNEL_H_
6+
#define EMBEDDER_WINDOW_CHANNEL_H_
7+
8+
#include <memory>
9+
10+
#include "flutter/shell/platform/common/client_wrapper/include/flutter/binary_messenger.h"
11+
#include "flutter/shell/platform/common/client_wrapper/include/flutter/encodable_value.h"
12+
#include "flutter/shell/platform/common/client_wrapper/include/flutter/method_channel.h"
13+
#include "flutter/shell/platform/tizen/tizen_renderer.h"
14+
15+
namespace flutter {
16+
17+
class WindowChannel {
18+
public:
19+
explicit WindowChannel(BinaryMessenger* messenger,
20+
TizenRenderer* renderer,
21+
TizenRenderer::Delegate* delegate);
22+
virtual ~WindowChannel();
23+
24+
private:
25+
void HandleMethodCall(const MethodCall<EncodableValue>& method_call,
26+
std::unique_ptr<MethodResult<EncodableValue>> result);
27+
28+
std::unique_ptr<MethodChannel<EncodableValue>> channel_;
29+
30+
// A reference to the renderer object managed by FlutterTizenEngine.
31+
// This can be nullptr if the engine is running in headless mode.
32+
TizenRenderer* renderer_;
33+
TizenRenderer::Delegate* delegate_;
34+
};
35+
36+
} // namespace flutter
37+
38+
#endif // EMBEDDER_WINDOW_CHANNEL_H_

shell/platform/tizen/flutter_tizen_engine.cc

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ void FlutterTizenEngine::InitializeRenderer(int32_t x,
9292
bool transparent,
9393
bool focusable,
9494
bool top_level) {
95-
TizenRenderer::WindowGeometry geometry = {x, y, width, height};
95+
TizenRenderer::Geometry geometry = {x, y, width, height};
9696

9797
#ifdef TIZEN_RENDERER_EVAS_GL
9898
renderer_ = std::make_unique<TizenRendererEvasGL>(
@@ -267,6 +267,10 @@ bool FlutterTizenEngine::RunEngine(const char* entrypoint) {
267267
text_input_channel_ = std::make_unique<TextInputChannel>(
268268
internal_plugin_registrar_->messenger(),
269269
std::make_unique<TizenInputMethodContext>(this));
270+
#ifndef __X64_SHELL__
271+
window_channel_ = std::make_unique<WindowChannel>(
272+
internal_plugin_registrar_->messenger(), renderer_.get(), this);
273+
#endif
270274
key_event_handler_ = std::make_unique<KeyEventHandler>(this);
271275
touch_event_handler_ = std::make_unique<TouchEventHandler>(this);
272276

@@ -343,11 +347,15 @@ void FlutterTizenEngine::SendPointerEvent(const FlutterPointerEvent& event) {
343347
embedder_api_.SendPointerEvent(engine_, &event, 1);
344348
}
345349

346-
void FlutterTizenEngine::SendWindowMetrics(int32_t width,
350+
void FlutterTizenEngine::SendWindowMetrics(int32_t x,
351+
int32_t y,
352+
int32_t width,
347353
int32_t height,
348354
double pixel_ratio) {
349355
FlutterWindowMetricsEvent event = {};
350356
event.struct_size = sizeof(FlutterWindowMetricsEvent);
357+
event.left = static_cast<size_t>(x);
358+
event.top = static_cast<size_t>(y);
351359
event.width = static_cast<size_t>(width);
352360
event.height = static_cast<size_t>(height);
353361
if (pixel_ratio == 0.0) {
@@ -377,7 +385,7 @@ void FlutterTizenEngine::SetWindowOrientation(int32_t degree) {
377385
renderer_->SetRotate(degree);
378386
// Compute renderer transformation based on the angle of rotation.
379387
double rad = (360 - degree) * M_PI / 180;
380-
auto geometry = renderer_->GetCurrentGeometry();
388+
auto geometry = renderer_->GetWindowGeometry();
381389
double width = geometry.w;
382390
double height = geometry.h;
383391

@@ -397,20 +405,33 @@ void FlutterTizenEngine::SetWindowOrientation(int32_t degree) {
397405
};
398406
touch_event_handler_->rotation = degree;
399407
if (degree == 90 || degree == 270) {
400-
renderer_->ResizeWithRotation(geometry.x, geometry.y, height, width,
401-
degree);
402-
SendWindowMetrics(height, width, 0.0);
403-
} else {
404-
renderer_->ResizeWithRotation(geometry.x, geometry.y, width, height,
405-
degree);
406-
SendWindowMetrics(width, height, 0.0);
408+
std::swap(width, height);
407409
}
410+
renderer_->ResizeWithRotation(geometry.x, geometry.y, width, height, degree);
411+
// Window position does not change on rotation regardless of its orientation.
412+
SendWindowMetrics(geometry.x, geometry.y, width, height, 0.0);
408413
}
409414

410415
void FlutterTizenEngine::OnOrientationChange(int32_t degree) {
411416
SetWindowOrientation(degree);
412417
}
413418

419+
void FlutterTizenEngine::OnGeometryChange(int32_t x,
420+
int32_t y,
421+
int32_t width,
422+
int32_t height) {
423+
#ifdef TIZEN_RENDERER_EVAS_GL
424+
FT_UNIMPLEMENTED();
425+
#else
426+
if (!renderer_->IsValid()) {
427+
return;
428+
}
429+
renderer_->SetGeometry(x, y, width, height);
430+
renderer_->ResizeWithRotation(x, y, width, height, 0);
431+
SendWindowMetrics(x, y, width, height, 0.0);
432+
#endif
433+
}
434+
414435
void FlutterTizenEngine::OnVsync(intptr_t baton,
415436
uint64_t frame_start_time_nanos,
416437
uint64_t frame_target_time_nanos) {
@@ -456,8 +477,8 @@ bool FlutterTizenEngine::MarkExternalTextureFrameAvailable(int64_t texture_id) {
456477
engine_, texture_id) == kSuccess);
457478
}
458479

459-
// The Flutter Engine calls out to this function when new platform messages are
460-
// available.
480+
// The Flutter Engine calls out to this function when new platform messages
481+
// are available.
461482

462483
// Converts a FlutterPlatformMessage to an equivalent FlutterDesktopMessage.
463484
FlutterDesktopMessage FlutterTizenEngine::ConvertToDesktopMessage(

shell/platform/tizen/flutter_tizen_engine.h

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "flutter/shell/platform/tizen/channels/platform_view_channel.h"
2222
#include "flutter/shell/platform/tizen/channels/settings_channel.h"
2323
#include "flutter/shell/platform/tizen/channels/text_input_channel.h"
24+
#include "flutter/shell/platform/tizen/channels/window_channel.h"
2425
#include "flutter/shell/platform/tizen/flutter_project_bundle.h"
2526
#include "flutter/shell/platform/tizen/flutter_tizen_texture_registrar.h"
2627
#include "flutter/shell/platform/tizen/key_event_handler.h"
@@ -136,10 +137,18 @@ class FlutterTizenEngine : public TizenRenderer::Delegate {
136137

137138
// Sends a window metrics update to the Flutter engine using current window
138139
// dimensions in physical
139-
void SendWindowMetrics(int32_t width, int32_t height, double pixel_ratio);
140+
void SendWindowMetrics(int32_t x,
141+
int32_t y,
142+
int32_t width,
143+
int32_t height,
144+
double pixel_ratio);
140145

141146
void SetWindowOrientation(int32_t degree);
142147
void OnOrientationChange(int32_t degree) override;
148+
void OnGeometryChange(int32_t x,
149+
int32_t y,
150+
int32_t width,
151+
int32_t height) override;
143152
void OnVsync(intptr_t baton,
144153
uint64_t frame_start_time_nanos,
145154
uint64_t frame_target_time_nanos);
@@ -239,6 +248,11 @@ class FlutterTizenEngine : public TizenRenderer::Delegate {
239248
// A plugin that implements the Flutter textinput channel.
240249
std::unique_ptr<TextInputChannel> text_input_channel_;
241250

251+
#ifndef __X64_SHELL__
252+
// A plugin that implements the Tizen window channel.
253+
std::unique_ptr<WindowChannel> window_channel_;
254+
#endif
255+
242256
// The event loop for the main thread that allows for delayed task execution.
243257
std::unique_ptr<TizenPlatformEventLoop> event_loop_;
244258

shell/platform/tizen/tizen_renderer.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
namespace flutter {
88

9-
TizenRenderer::TizenRenderer(WindowGeometry geometry,
9+
TizenRenderer::TizenRenderer(Geometry geometry,
1010
bool transparent,
1111
bool focusable,
1212
bool top_level,

shell/platform/tizen/tizen_renderer.h

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,17 @@ namespace flutter {
1212

1313
class TizenRenderer {
1414
public:
15-
struct WindowGeometry {
15+
struct Geometry {
1616
int32_t x{0}, y{0}, w{0}, h{0};
1717
};
1818

1919
class Delegate {
2020
public:
2121
virtual void OnOrientationChange(int32_t degree) = 0;
22+
virtual void OnGeometryChange(int32_t x,
23+
int32_t y,
24+
int32_t width,
25+
int32_t height) = 0;
2226
};
2327

2428
virtual ~TizenRenderer();
@@ -32,12 +36,21 @@ class TizenRenderer {
3236
virtual uint32_t OnGetFBO() = 0;
3337
virtual void* OnProcResolver(const char* name) = 0;
3438

35-
virtual WindowGeometry GetCurrentGeometry() = 0;
39+
// Returns the geometry of the current window.
40+
virtual Geometry GetWindowGeometry() = 0;
41+
42+
// Returns the geometry of the display screen.
43+
virtual Geometry GetScreenGeometry() = 0;
44+
3645
virtual int32_t GetDpi() = 0;
3746
virtual uintptr_t GetWindowId() = 0;
3847
virtual void* GetWindowHandle() = 0;
3948

4049
virtual void SetRotate(int angle) = 0;
50+
virtual void SetGeometry(int32_t x,
51+
int32_t y,
52+
int32_t width,
53+
int32_t height) = 0;
4154
virtual void ResizeWithRotation(int32_t x,
4255
int32_t y,
4356
int32_t width,
@@ -47,13 +60,13 @@ class TizenRenderer {
4760
virtual bool IsSupportedExtention(const char* name) = 0;
4861

4962
protected:
50-
explicit TizenRenderer(WindowGeometry geometry,
63+
explicit TizenRenderer(Geometry geometry,
5164
bool transparent,
5265
bool focusable,
5366
bool top_level,
5467
Delegate& delegate);
5568

56-
WindowGeometry initial_geometry_;
69+
Geometry initial_geometry_;
5770
bool transparent_;
5871
bool focusable_;
5972
bool top_level_;

shell/platform/tizen/tizen_renderer_ecore_wl2.cc

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
namespace flutter {
1313

14-
TizenRendererEcoreWl2::TizenRendererEcoreWl2(WindowGeometry geometry,
14+
TizenRendererEcoreWl2::TizenRendererEcoreWl2(Geometry geometry,
1515
bool transparent,
1616
bool focusable,
1717
bool top_level,
@@ -206,13 +206,19 @@ void* TizenRendererEcoreWl2::OnProcResolver(const char* name) {
206206
return nullptr;
207207
}
208208

209-
TizenRenderer::WindowGeometry TizenRendererEcoreWl2::GetCurrentGeometry() {
210-
WindowGeometry result;
209+
TizenRenderer::Geometry TizenRendererEcoreWl2::GetWindowGeometry() {
210+
Geometry result;
211211
ecore_wl2_window_geometry_get(ecore_wl2_window_, &result.x, &result.y,
212212
&result.w, &result.h);
213213
return result;
214214
}
215215

216+
TizenRenderer::Geometry TizenRendererEcoreWl2::GetScreenGeometry() {
217+
Geometry result = {};
218+
ecore_wl2_display_screen_size_get(ecore_wl2_display_, &result.w, &result.h);
219+
return result;
220+
}
221+
216222
int32_t TizenRendererEcoreWl2::GetDpi() {
217223
auto* output = ecore_wl2_window_output_find(ecore_wl2_window_);
218224
if (!output) {
@@ -553,6 +559,14 @@ void TizenRendererEcoreWl2::SetRotate(int angle) {
553559
received_rotation_ = true;
554560
}
555561

562+
void TizenRendererEcoreWl2::SetGeometry(int32_t x,
563+
int32_t y,
564+
int32_t width,
565+
int32_t height) {
566+
ecore_wl2_window_geometry_set(ecore_wl2_window_, x, y, width, height);
567+
ecore_wl2_window_position_set(ecore_wl2_window_, x, y);
568+
}
569+
556570
void TizenRendererEcoreWl2::ResizeWithRotation(int32_t x,
557571
int32_t y,
558572
int32_t width,

0 commit comments

Comments
 (0)