diff --git a/packages/tizen_window_manager/CHANGELOG.md b/packages/tizen_window_manager/CHANGELOG.md index 607323422..d379b6bc1 100644 --- a/packages/tizen_window_manager/CHANGELOG.md +++ b/packages/tizen_window_manager/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.1.1 + +* Add tizen-core-wl window backend for Tizen 11.0 and later. + ## 0.1.0 * Initial release. diff --git a/packages/tizen_window_manager/pubspec.yaml b/packages/tizen_window_manager/pubspec.yaml index e75043d9d..b5c80e01a 100644 --- a/packages/tizen_window_manager/pubspec.yaml +++ b/packages/tizen_window_manager/pubspec.yaml @@ -2,7 +2,7 @@ name: tizen_window_manager description: Tizen window APIs. homepage: https://github.com/flutter-tizen/plugins repository: https://github.com/flutter-tizen/plugins/tree/master/packages/tizen_window_manager -version: 0.1.0 +version: 0.1.1 environment: sdk: ">=3.1.0 <4.0.0" diff --git a/packages/tizen_window_manager/tizen/src/ecore_wl2_window_proxy.cc b/packages/tizen_window_manager/tizen/src/ecore_wl2_window_proxy.cc index f35fe75c1..1979cea3f 100644 --- a/packages/tizen_window_manager/tizen/src/ecore_wl2_window_proxy.cc +++ b/packages/tizen_window_manager/tizen/src/ecore_wl2_window_proxy.cc @@ -28,9 +28,8 @@ EcoreWl2WindowProxy::~EcoreWl2WindowProxy() { } } -void EcoreWl2WindowProxy::ecore_wl2_window_geometry_get(void *window, int *x, - int *y, int *width, - int *height) { +void EcoreWl2WindowProxy::GetGeometry(void *window, int *x, int *y, int *width, + int *height) { if (!ecore_wl2_window_handle_) { LOG_ERROR("ecore_wl2_window_handle_ not valid"); return; @@ -46,7 +45,7 @@ void EcoreWl2WindowProxy::ecore_wl2_window_geometry_get(void *window, int *x, ecore_wl2_window_geometry_get(window, x, y, width, height); } -void EcoreWl2WindowProxy::ecore_wl2_window_activate(void *window) { +void EcoreWl2WindowProxy::Activate(void *window) { if (!ecore_wl2_window_handle_) { LOG_ERROR("ecore_wl2_window_handle_ not valid"); return; @@ -62,7 +61,7 @@ void EcoreWl2WindowProxy::ecore_wl2_window_activate(void *window) { ecore_wl2_window_activate(window); } -void EcoreWl2WindowProxy::ecore_wl2_window_lower(void *window) { +void EcoreWl2WindowProxy::Lower(void *window) { if (!ecore_wl2_window_handle_) { LOG_ERROR("ecore_wl2_window_handle_ not valid"); return; diff --git a/packages/tizen_window_manager/tizen/src/ecore_wl2_window_proxy.h b/packages/tizen_window_manager/tizen/src/ecore_wl2_window_proxy.h index 0eed95ebf..856549de6 100644 --- a/packages/tizen_window_manager/tizen/src/ecore_wl2_window_proxy.h +++ b/packages/tizen_window_manager/tizen/src/ecore_wl2_window_proxy.h @@ -5,15 +5,17 @@ #ifndef FLUTTER_PLUGIN_ECORE_WL2_WINDOW_PROXY_H_ #define FLUTTER_PLUGIN_ECORE_WL2_WINDOW_PROXY_H_ -class EcoreWl2WindowProxy { +#include "window_proxy_interface.h" + +class EcoreWl2WindowProxy : public WindowProxyInterface { public: EcoreWl2WindowProxy(); - ~EcoreWl2WindowProxy(); - void ecore_wl2_window_geometry_get(void *window, int *x, int *y, int *width, - int *height); + ~EcoreWl2WindowProxy() override; - void ecore_wl2_window_activate(void *window); - void ecore_wl2_window_lower(void *window); + void GetGeometry(void *window, int *x, int *y, int *width, + int *height) override; + void Activate(void *window) override; + void Lower(void *window) override; private: void *ecore_wl2_window_handle_ = nullptr; diff --git a/packages/tizen_window_manager/tizen/src/tizen_core_wl_window_proxy.cc b/packages/tizen_window_manager/tizen/src/tizen_core_wl_window_proxy.cc new file mode 100644 index 000000000..ed6814160 --- /dev/null +++ b/packages/tizen_window_manager/tizen/src/tizen_core_wl_window_proxy.cc @@ -0,0 +1,74 @@ +// Copyright 2025 Samsung Electronics Co., Ltd. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "tizen_core_wl_window_proxy.h" + +#include +#include + +#include "log.h" + +TizenCoreWlWindowProxy::TizenCoreWlWindowProxy() { + handle_ = dlopen("libtizen-core-wl.so.0", RTLD_LAZY); + if (handle_ == nullptr) { + LOG_ERROR("Failed to open tizen-core-wl."); + return; + } + + get_geometry_ = reinterpret_cast( + dlsym(handle_, "tizen_core_wl_window_get_geometry")); + activate_ = reinterpret_cast( + dlsym(handle_, "tizen_core_wl_window_activate")); + lower_ = + reinterpret_cast(dlsym(handle_, "tizen_core_wl_window_lower")); + + if (!get_geometry_ || !activate_ || !lower_) { + LOG_ERROR("Failed to resolve tizen-core-wl symbols."); + dlclose(handle_); + handle_ = nullptr; + } +} + +TizenCoreWlWindowProxy::~TizenCoreWlWindowProxy() { + if (handle_) { + dlclose(handle_); + handle_ = nullptr; + } +} + +void TizenCoreWlWindowProxy::GetGeometry(void *window, int *x, int *y, + int *width, int *height) { + if (!handle_) { + LOG_ERROR("tizen-core-wl handle not valid"); + return; + } + int ret = get_geometry_(window, x, y, width, height); + if (ret != TIZEN_ERROR_NONE) { + LOG_ERROR("tizen_core_wl_window_get_geometry failed: %s", + get_error_message(ret)); + } +} + +void TizenCoreWlWindowProxy::Activate(void *window) { + if (!handle_) { + LOG_ERROR("tizen-core-wl handle not valid"); + return; + } + int ret = activate_(window); + if (ret != TIZEN_ERROR_NONE) { + LOG_ERROR("tizen_core_wl_window_activate failed: %s", + get_error_message(ret)); + } +} + +void TizenCoreWlWindowProxy::Lower(void *window) { + if (!handle_) { + LOG_ERROR("tizen-core-wl handle not valid"); + return; + } + int ret = lower_(window); + if (ret != TIZEN_ERROR_NONE) { + LOG_ERROR("tizen_core_wl_window_lower failed: %s", get_error_message(ret)); + } +} diff --git a/packages/tizen_window_manager/tizen/src/tizen_core_wl_window_proxy.h b/packages/tizen_window_manager/tizen/src/tizen_core_wl_window_proxy.h new file mode 100644 index 000000000..ff5cf07d3 --- /dev/null +++ b/packages/tizen_window_manager/tizen/src/tizen_core_wl_window_proxy.h @@ -0,0 +1,34 @@ +// Copyright 2025 Samsung Electronics Co., Ltd. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef FLUTTER_PLUGIN_TIZEN_CORE_WL_WINDOW_PROXY_H_ +#define FLUTTER_PLUGIN_TIZEN_CORE_WL_WINDOW_PROXY_H_ + +#include "window_proxy_interface.h" + +class TizenCoreWlWindowProxy : public WindowProxyInterface { + public: + TizenCoreWlWindowProxy(); + ~TizenCoreWlWindowProxy() override; + + bool IsValid() const { return handle_ != nullptr; } + + void GetGeometry(void *window, int *x, int *y, int *width, + int *height) override; + void Activate(void *window) override; + void Lower(void *window) override; + + private: + typedef int (*FuncGetGeometry)(void *window, int *x, int *y, int *width, + int *height); + typedef int (*FuncActivate)(void *window); + typedef int (*FuncLower)(void *window); + + void *handle_ = nullptr; + FuncGetGeometry get_geometry_ = nullptr; + FuncActivate activate_ = nullptr; + FuncLower lower_ = nullptr; +}; + +#endif // FLUTTER_PLUGIN_TIZEN_CORE_WL_WINDOW_PROXY_H_ diff --git a/packages/tizen_window_manager/tizen/src/tizen_window_manager.cc b/packages/tizen_window_manager/tizen/src/tizen_window_manager.cc index d4ed5b57a..b41ee155e 100644 --- a/packages/tizen_window_manager/tizen/src/tizen_window_manager.cc +++ b/packages/tizen_window_manager/tizen/src/tizen_window_manager.cc @@ -9,11 +9,11 @@ #include -#include "ecore_wl2_window_proxy.h" #include "log.h" +#include "window_proxy.h" TizenWindowManager::TizenWindowManager(void* handle) - : window_handle_(handle), proxy_(std::make_unique()) {} + : window_handle_(handle), proxy_(std::make_unique()) {} TizenWindowManager::~TizenWindowManager() {} @@ -22,7 +22,7 @@ void TizenWindowManager::Activate() { LOG_ERROR("Window handle is null"); } - proxy_->ecore_wl2_window_activate(window_handle_); + proxy_->Activate(window_handle_); } void TizenWindowManager::Lower() { @@ -30,7 +30,7 @@ void TizenWindowManager::Lower() { LOG_ERROR("Window handle is null"); } - proxy_->ecore_wl2_window_lower(window_handle_); + proxy_->Lower(window_handle_); } flutter::EncodableMap TizenWindowManager::GetGeometry() { @@ -45,9 +45,8 @@ flutter::EncodableMap TizenWindowManager::GetGeometry() { return geometry; } - int x, y, width, height; - proxy_->ecore_wl2_window_geometry_get(window_handle_, &x, &y, &width, - &height); + int x = 0, y = 0, width = 0, height = 0; + proxy_->GetGeometry(window_handle_, &x, &y, &width, &height); geometry[flutter::EncodableValue("x")] = flutter::EncodableValue(x); geometry[flutter::EncodableValue("y")] = flutter::EncodableValue(y); diff --git a/packages/tizen_window_manager/tizen/src/tizen_window_manager.h b/packages/tizen_window_manager/tizen/src/tizen_window_manager.h index 0f3475eea..14d4f17f7 100644 --- a/packages/tizen_window_manager/tizen/src/tizen_window_manager.h +++ b/packages/tizen_window_manager/tizen/src/tizen_window_manager.h @@ -10,7 +10,7 @@ #include -class EcoreWl2WindowProxy; +class WindowProxy; class TizenWindowManager { public: @@ -23,7 +23,7 @@ class TizenWindowManager { private: void* window_handle_; - std::unique_ptr proxy_; + std::unique_ptr proxy_; }; #endif // FLUTTER_PLUGIN_TIZEN_WINDOW_MANAGER_H_ diff --git a/packages/tizen_window_manager/tizen/src/window_proxy.cc b/packages/tizen_window_manager/tizen/src/window_proxy.cc new file mode 100644 index 000000000..c176129f5 --- /dev/null +++ b/packages/tizen_window_manager/tizen/src/window_proxy.cc @@ -0,0 +1,57 @@ +// Copyright 2025 Samsung Electronics Co., Ltd. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "window_proxy.h" + +#include + +#include +#include +#include + +#include "ecore_wl2_window_proxy.h" +#include "log.h" +#include "tizen_core_wl_window_proxy.h" + +namespace { + +constexpr int kTizenCoreWlMinMajorVersion = 11; + +int GetPlatformMajorVersion() { + char *version = nullptr; + int ret = system_info_get_platform_string( + "http://tizen.org/feature/platform.version", &version); + if (ret != SYSTEM_INFO_ERROR_NONE || version == nullptr) { + LOG_ERROR("Failed to get platform version. error: %d", ret); + return 0; + } + + int major = std::atoi(version); + free(version); + return major; +} + +} // namespace + +WindowProxy::WindowProxy() { + if (GetPlatformMajorVersion() >= kTizenCoreWlMinMajorVersion) { + auto proxy = std::make_unique(); + if (proxy->IsValid()) { + LOG_INFO("Using tizen-core-wl backend."); + impl_ = std::move(proxy); + return; + } + LOG_INFO("tizen-core-wl unavailable, falling back to ecore_wl2 backend."); + } + impl_ = std::make_unique(); +} + +void WindowProxy::GetGeometry(void *window, int *x, int *y, int *width, + int *height) { + impl_->GetGeometry(window, x, y, width, height); +} + +void WindowProxy::Activate(void *window) { impl_->Activate(window); } + +void WindowProxy::Lower(void *window) { impl_->Lower(window); } diff --git a/packages/tizen_window_manager/tizen/src/window_proxy.h b/packages/tizen_window_manager/tizen/src/window_proxy.h new file mode 100644 index 000000000..1e8d7c2bf --- /dev/null +++ b/packages/tizen_window_manager/tizen/src/window_proxy.h @@ -0,0 +1,26 @@ +// Copyright 2025 Samsung Electronics Co., Ltd. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef FLUTTER_PLUGIN_WINDOW_PROXY_H_ +#define FLUTTER_PLUGIN_WINDOW_PROXY_H_ + +#include + +#include "window_proxy_interface.h" + +class WindowProxy : public WindowProxyInterface { + public: + WindowProxy(); + ~WindowProxy() override = default; + + void GetGeometry(void *window, int *x, int *y, int *width, + int *height) override; + void Activate(void *window) override; + void Lower(void *window) override; + + private: + std::unique_ptr impl_; +}; + +#endif // FLUTTER_PLUGIN_WINDOW_PROXY_H_ diff --git a/packages/tizen_window_manager/tizen/src/window_proxy_interface.h b/packages/tizen_window_manager/tizen/src/window_proxy_interface.h new file mode 100644 index 000000000..ae48128b4 --- /dev/null +++ b/packages/tizen_window_manager/tizen/src/window_proxy_interface.h @@ -0,0 +1,18 @@ +// Copyright 2025 Samsung Electronics Co., Ltd. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef FLUTTER_PLUGIN_WINDOW_PROXY_INTERFACE_H_ +#define FLUTTER_PLUGIN_WINDOW_PROXY_INTERFACE_H_ + +class WindowProxyInterface { + public: + virtual ~WindowProxyInterface() = default; + + virtual void GetGeometry(void *window, int *x, int *y, int *width, + int *height) = 0; + virtual void Activate(void *window) = 0; + virtual void Lower(void *window) = 0; +}; + +#endif // FLUTTER_PLUGIN_WINDOW_PROXY_INTERFACE_H_