Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions shell/platform/tizen/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ config("rootstrap_include_dirs") {
"$local_prefix/include/ecore-wayland-1",
"$local_prefix/include/ecore-wl2-1",
"$local_prefix/include/efl-1",
"$local_prefix/include/efl-extension",
"$local_prefix/include/eina-1",
"$local_prefix/include/eina-1/eina",
"$local_prefix/include/emile-1",
Expand Down Expand Up @@ -173,6 +174,7 @@ template("embedder") {
"capi-system-system-settings",
"capi-ui-efl-util",
"dlog",
"efl-extension",
"feedback",
"tbm",
"tdm-client",
Expand Down
414 changes: 227 additions & 187 deletions shell/platform/tizen/channels/key_event_channel.cc

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion shell/platform/tizen/channels/key_event_channel.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class KeyEventChannel {
explicit KeyEventChannel(BinaryMessenger* messenger);
virtual ~KeyEventChannel();

void SendKeyEvent(Ecore_Event_Key* key,
void SendKeyEvent(Ecore_Event_Key* event,
bool is_down,
std::function<void(bool)> callback);

Expand Down
56 changes: 41 additions & 15 deletions shell/platform/tizen/key_event_handler.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,12 @@

#include "key_event_handler.h"

#ifndef __X64_SHELL__
#ifdef __X64_SHELL__
#include <cstdlib>
#else
#include <app.h>
#endif
#include <iostream>

#include "flutter/shell/platform/tizen/flutter_tizen_engine.h"
#include "flutter/shell/platform/tizen/logger.h"
Expand All @@ -18,9 +21,28 @@ namespace {
constexpr char kBackKey[] = "XF86Back";
constexpr char kExitKey[] = "XF86Exit";

// Keys that should always be handled by the app first but not by the system.
const std::vector<std::string> kBindableSystemKeys = {
"XF86Menu", "XF86Back", "XF86AudioPlay",
"XF86AudioPause", "XF86AudioStop", "XF86AudioNext",
"XF86AudioPrev", "XF86AudioRewind", "XF86AudioForward",
"XF86AudioPlayPause", "XF86AudioRecord", "XF86LowerChannel",
"XF86RaiseChannel", "XF86ChannelList", "XF86PreviousChannel",
"XF86SysMenu", "XF86SimpleMenu", "XF86History",
"XF86Favorites", "XF86Info", "XF86Red",
"XF86Green", "XF86Yellow", "XF86Blue",
"XF86Subtitle", "XF86PlayBack", "XF86ChannelGuide",
"XF86Caption", "XF86Exit",
};

} // namespace

KeyEventHandler::KeyEventHandler(FlutterTizenEngine* engine) : engine_(engine) {
if (!engine->renderer() || !engine->renderer()->IsValid()) {
return;
}
engine->renderer()->BindKeys(kBindableSystemKeys);

key_event_handlers_.push_back(
ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, OnKey, this));
key_event_handlers_.push_back(
Expand All @@ -34,49 +56,53 @@ KeyEventHandler::~KeyEventHandler() {
key_event_handlers_.clear();
}

Eina_Bool KeyEventHandler::OnKey(void* data, int type, void* event) {
Eina_Bool KeyEventHandler::OnKey(void* data, int type, void* raw_event) {
auto* self = reinterpret_cast<KeyEventHandler*>(data);
auto* key = reinterpret_cast<Ecore_Event_Key*>(event);
auto* event = reinterpret_cast<Ecore_Event_Key*>(raw_event);
auto* engine = self->engine_;
auto is_down = type == ECORE_EVENT_KEY_DOWN;
bool is_down = type == ECORE_EVENT_KEY_DOWN;

if (self->engine_->renderer()->GetWindowId() != key->window) {
if (engine->renderer()->GetWindowId() != event->window) {
return ECORE_CALLBACK_PASS_ON;
}

if (is_down) {
FT_LOG(Info) << "Key pressed: " << key->key << "(" << key->keycode << ")";
FT_LOG(Info) << "Key symbol: " << event->key << ", code: 0x" << std::setw(8)
<< std::setfill('0') << std::right << std::hex
<< event->keycode;
}

if (engine->text_input_channel()) {
if (engine->text_input_channel()->SendKeyEvent(key, is_down)) {
return ECORE_CALLBACK_PASS_ON;
if (engine->text_input_channel()->SendKeyEvent(event, is_down)) {
return ECORE_CALLBACK_DONE;
}
}

if (engine->platform_view_channel()) {
engine->platform_view_channel()->SendKeyEvent(key, is_down);
engine->platform_view_channel()->SendKeyEvent(event, is_down);
}

if (engine->key_event_channel()) {
engine->key_event_channel()->SendKeyEvent(
key, is_down,
[engine, keyname = std::string(key->keyname), is_down](bool handled) {
event, is_down,
[engine, symbol = std::string(event->key), is_down](bool handled) {
if (handled) {
return;
}
if (keyname == kBackKey && !is_down) {
if (symbol == kBackKey && !is_down) {
if (engine->navigation_channel()) {
engine->navigation_channel()->PopRoute();
}
} else if (keyname == kExitKey && !is_down) {
#ifndef __X64_SHELL__
} else if (symbol == kExitKey && !is_down) {
#ifdef __X64_SHELL__
exit(EXIT_SUCCESS);
#else
ui_app_exit();
#endif
}
});
}
return ECORE_CALLBACK_PASS_ON;
return ECORE_CALLBACK_DONE;
}

} // namespace flutter
2 changes: 2 additions & 0 deletions shell/platform/tizen/tizen_renderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ class TizenRenderer {

virtual bool IsSupportedExtension(const char* name) = 0;

virtual void BindKeys(const std::vector<std::string>& keys) = 0;

protected:
explicit TizenRenderer(Geometry geometry,
bool transparent,
Expand Down
7 changes: 7 additions & 0 deletions shell/platform/tizen/tizen_renderer_ecore_wl2.cc
Original file line number Diff line number Diff line change
Expand Up @@ -611,4 +611,11 @@ void TizenRendererEcoreWl2::SetTizenPolicyNotificationLevel(int level) {
tizen_policy_, ecore_wl2_window_surface_get(ecore_wl2_window_), level);
}

void TizenRendererEcoreWl2::BindKeys(const std::vector<std::string>& keys) {
for (const auto& key : keys) {
ecore_wl2_window_keygrab_set(ecore_wl2_window_, key.c_str(), 0, 0, 0,
ECORE_WL2_WINDOW_KEYGRAB_TOPMOST);
}
}

} // namespace flutter
2 changes: 2 additions & 0 deletions shell/platform/tizen/tizen_renderer_ecore_wl2.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ class TizenRendererEcoreWl2 : public TizenRenderer {

bool IsSupportedExtension(const char* name) override;

void BindKeys(const std::vector<std::string>& keys) override;

private:
void Show();

Expand Down
17 changes: 13 additions & 4 deletions shell/platform/tizen/tizen_renderer_evas_gl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,17 @@

#include "tizen_renderer_evas_gl.h"

#ifndef __X64_SHELL__
#include <efl_extension.h>
#include <ui/efl_util.h>
#endif

#include "tizen_evas_gl_helper.h"
Evas_GL* g_evas_gl = nullptr;
EVAS_GL_GLOBAL_GLES3_DEFINE();

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

#ifndef __X64_SHELL__
#include <ui/efl_util.h>
#endif

namespace flutter {

TizenRendererEvasGL::TizenRendererEvasGL(Geometry geometry,
Expand Down Expand Up @@ -785,4 +786,12 @@ bool TizenRendererEvasGL::IsSupportedExtension(const char* name) {
return strcmp(name, "EGL_TIZEN_image_native_surface") == 0;
}

void TizenRendererEvasGL::BindKeys(const std::vector<std::string>& keys) {
#ifndef __X64_SHELL__
for (const auto& key : keys) {
eext_win_keygrab_set(evas_window_, key.c_str());
}
#endif
}

} // namespace flutter
4 changes: 3 additions & 1 deletion shell/platform/tizen/tizen_renderer_evas_gl.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ class TizenRendererEvasGL : public TizenRenderer {

void* GetWindowHandle() override { return evas_window_; }

Evas_Object* GetImageHandle() { return graphics_adapter_; }

void SetRotate(int angle) override;
void SetGeometry(int32_t x,
int32_t y,
Expand All @@ -51,7 +53,7 @@ class TizenRendererEvasGL : public TizenRenderer {

bool IsSupportedExtension(const char* name) override;

Evas_Object* GetImageHandle() { return graphics_adapter_; }
void BindKeys(const std::vector<std::string>& keys) override;

private:
void Show();
Expand Down
23 changes: 12 additions & 11 deletions shell/platform/tizen/touch_event_handler.cc
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ namespace flutter {

TouchEventHandler::TouchEventHandler(FlutterTizenEngine* engine)
: engine_(engine) {
if (!engine->renderer() || !engine->renderer()->IsValid()) {
return;
}
touch_event_handlers_.push_back(
ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, OnTouch, this));
touch_event_handlers_.push_back(
Expand All @@ -21,7 +24,6 @@ TouchEventHandler::TouchEventHandler(FlutterTizenEngine* engine)
ecore_event_handler_add(ECORE_EVENT_MOUSE_WHEEL, OnTouch, this));
touch_event_handlers_.push_back(
ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE, OnTouch, this));
window_id_ = engine_->renderer()->GetWindowId();
}

TouchEventHandler::~TouchEventHandler() {
Expand All @@ -40,19 +42,17 @@ void TouchEventHandler::SendFlutterPointerEvent(FlutterPointerPhase phase,
int device_id = 0) {
// Correct errors caused by window rotation.
auto geometry = engine_->renderer()->GetWindowGeometry();
double width = geometry.w;
double height = geometry.h;
double new_x = x, new_y = y;

if (rotation == 90) {
new_x = height - y;
new_x = geometry.h - y;
new_y = x;
} else if (rotation == 180) {
new_x = width - x;
new_y = height - y;
new_x = geometry.w - x;
new_y = geometry.h - y;
} else if (rotation == 270) {
new_x = y;
new_y = width - x;
new_y = geometry.w - x;
}

FlutterPointerEvent event = {};
Expand All @@ -74,10 +74,11 @@ void TouchEventHandler::SendFlutterPointerEvent(FlutterPointerPhase phase,

Eina_Bool TouchEventHandler::OnTouch(void* data, int type, void* event) {
auto* self = reinterpret_cast<TouchEventHandler*>(data);
auto window_id = self->engine_->renderer()->GetWindowId();

if (type == ECORE_EVENT_MOUSE_BUTTON_DOWN) {
auto* button_event = reinterpret_cast<Ecore_Event_Mouse_Button*>(event);
if (self->window_id_ == button_event->window) {
if (window_id == button_event->window) {
self->pointer_state_ = true;
self->SendFlutterPointerEvent(kDown, button_event->x, button_event->y, 0,
0, button_event->timestamp,
Expand All @@ -87,7 +88,7 @@ Eina_Bool TouchEventHandler::OnTouch(void* data, int type, void* event) {

} else if (type == ECORE_EVENT_MOUSE_BUTTON_UP) {
auto* button_event = reinterpret_cast<Ecore_Event_Mouse_Button*>(event);
if (self->window_id_ == button_event->window) {
if (window_id == button_event->window) {
self->pointer_state_ = false;
self->SendFlutterPointerEvent(kUp, button_event->x, button_event->y, 0, 0,
button_event->timestamp,
Expand All @@ -96,7 +97,7 @@ Eina_Bool TouchEventHandler::OnTouch(void* data, int type, void* event) {
}
} else if (type == ECORE_EVENT_MOUSE_MOVE) {
auto* move_event = reinterpret_cast<Ecore_Event_Mouse_Move*>(event);
if (self->window_id_ == move_event->window) {
if (window_id == move_event->window) {
if (self->pointer_state_) {
self->SendFlutterPointerEvent(kMove, move_event->x, move_event->y, 0, 0,
move_event->timestamp,
Expand All @@ -106,7 +107,7 @@ Eina_Bool TouchEventHandler::OnTouch(void* data, int type, void* event) {
}
} else if (type == ECORE_EVENT_MOUSE_WHEEL) {
auto* wheel_event = reinterpret_cast<Ecore_Event_Mouse_Wheel*>(event);
if (self->window_id_ == wheel_event->window) {
if (window_id == wheel_event->window) {
double scroll_delta_x = 0.0, scroll_delta_y = 0.0;
if (wheel_event->direction == kScrollDirectionVertical) {
scroll_delta_y += wheel_event->z;
Expand Down
1 change: 0 additions & 1 deletion shell/platform/tizen/touch_event_handler.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ class TouchEventHandler {
FlutterTizenEngine* engine_;
std::vector<Ecore_Event_Handler*> touch_event_handlers_;
bool pointer_state_ = false;
uintptr_t window_id_ = 0;

void SendFlutterPointerEvent(FlutterPointerPhase phase,
double x,
Expand Down