mirror of
https://github.com/openharmony/windowmanager.git
synced 2026-07-18 16:24:27 -04:00
窗口显示
Signed-off-by: dubj <dubingjian@huawei.com> Change-Id: I66f45ac5df46655582470ad6cff09db375ea1d15
This commit is contained in:
+1
-1
@@ -52,7 +52,7 @@
|
||||
"//foundation/windowmanager/dm:libdm",
|
||||
"//foundation/windowmanager/dmserver:libdms",
|
||||
"//foundation/windowmanager/extension/extension_connection:libwindow_extension_client",
|
||||
"//foundation/windowmanager/extension/window_extension:libwindow_exteinsion",
|
||||
"//foundation/windowmanager/extension/window_extension:libwindow_extension",
|
||||
"//foundation/windowmanager/extension/window_extension:window_extension_module",
|
||||
"//foundation/windowmanager/wm:libwm",
|
||||
"//foundation/windowmanager/wmserver:libwms",
|
||||
|
||||
@@ -44,7 +44,7 @@ ohos_shared_library("libwindow_extension_client") {
|
||||
"//foundation/aafwk/standard/interfaces/innerkits/ability_manager:ability_manager",
|
||||
"//foundation/graphic/standard/rosen/modules/render_service_client:librender_service_client",
|
||||
"//foundation/windowmanager/wm:libwm",
|
||||
"//foundation/windowmanager/extension/window_extension:libwindow_exteinsion",
|
||||
"//foundation/windowmanager/extension/window_extension:libwindow_extension",
|
||||
"//foundation/appexecfwk/standard/interfaces/innerkits/appexecfwk_base:appexecfwk_base",
|
||||
"//foundation/appexecfwk/standard/interfaces/innerkits/libeventhandler:libeventhandler",
|
||||
]
|
||||
|
||||
@@ -24,7 +24,7 @@ namespace Rosen {
|
||||
class WindowExtensionClientStubImpl : public WindowExtensionClientStub {
|
||||
public:
|
||||
explicit WindowExtensionClientStubImpl(sptr<IWindowExtensionCallback>& componentCallback)
|
||||
: componentCallback_(componentCallback) {};
|
||||
: componentCallback_(componentCallback) {};
|
||||
~WindowExtensionClientStubImpl() = default;
|
||||
|
||||
void OnWindowReady(std::shared_ptr<RSSurfaceNode>& surfaceNode) override;
|
||||
|
||||
@@ -73,7 +73,7 @@ void WindowExtensionClientProxy::OnKeyEvent(std::shared_ptr<MMI::KeyEvent>& keyE
|
||||
return;
|
||||
}
|
||||
|
||||
if (!keyEvent->WriteToParcel(data)) {
|
||||
if (!keyEvent->WriteToParcel(data)) {
|
||||
WLOGFE("write key event failed");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -31,8 +31,7 @@ namespace {
|
||||
constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_WINDOW, "WindowExtensionConnection"};
|
||||
}
|
||||
|
||||
class WindowExtensionConnection::Impl
|
||||
: public AAFwk::AbilityConnectionStub {
|
||||
class WindowExtensionConnection::Impl : public AAFwk::AbilityConnectionStub {
|
||||
public:
|
||||
Impl() = default;
|
||||
~Impl() = default;
|
||||
@@ -68,7 +67,8 @@ WindowExtensionConnection::WindowExtensionConnection()
|
||||
{
|
||||
}
|
||||
|
||||
WindowExtensionConnection::Impl::WindowExtensionClientRecipient::WindowExtensionClientRecipient(sptr<IWindowExtensionCallback> callback)
|
||||
WindowExtensionConnection::Impl::WindowExtensionClientRecipient::WindowExtensionClientRecipient(
|
||||
sptr<IWindowExtensionCallback> callback)
|
||||
{
|
||||
callback_ = callback;
|
||||
}
|
||||
@@ -93,7 +93,7 @@ void WindowExtensionConnection::Impl::WindowExtensionClientRecipient::OnRemoteDi
|
||||
WLOGFI("Remote died");
|
||||
}
|
||||
void WindowExtensionConnection::Impl::ConnectExtension(const AppExecFwk::ElementName &element, Rect rect,
|
||||
uint32_t uid, sptr<IWindowExtensionCallback>& callback)
|
||||
uint32_t uid, sptr<IWindowExtensionCallback>& callback)
|
||||
{
|
||||
AAFwk::Want want;
|
||||
want.SetElement(element);
|
||||
@@ -140,7 +140,7 @@ void WindowExtensionConnection::Impl::RequestFocus()
|
||||
}
|
||||
|
||||
void WindowExtensionConnection::Impl::OnAbilityConnectDone(const AppExecFwk::ElementName &element,
|
||||
const sptr<IRemoteObject> &remoteObject, int resultCode)
|
||||
const sptr<IRemoteObject> &remoteObject, int resultCode)
|
||||
{
|
||||
if (!remoteObject) {
|
||||
WLOGFE("remote object is null");
|
||||
@@ -178,7 +178,7 @@ void WindowExtensionConnection::Impl::OnAbilityDisconnectDone(const AppExecFwk::
|
||||
|
||||
// WindowExtensionConnection
|
||||
void WindowExtensionConnection::ConnectExtension(const AppExecFwk::ElementName &element, Rect rect,
|
||||
uint32_t uid, sptr<IWindowExtensionCallback>& callback)
|
||||
uint32_t uid, sptr<IWindowExtensionCallback>& callback)
|
||||
{
|
||||
pImpl_->ConnectExtension(element, rect, uid, callback);
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
import("//build/ohos.gni")
|
||||
|
||||
config("libwindow_exteinsion_private_config") {
|
||||
config("libwindow_extension_private_config") {
|
||||
visibility = [ ":*" ]
|
||||
|
||||
include_dirs = [
|
||||
@@ -21,19 +21,21 @@ config("libwindow_exteinsion_private_config") {
|
||||
"include/zidl",
|
||||
"../extension_connection/include",
|
||||
"../extension_connection/include/zidl",
|
||||
"../../interfaces/kits/napi/window_runtime/window_napi",
|
||||
"//foundation/aafwk/standard/frameworks/kits/ability/ability_runtime/include",
|
||||
"//foundation/aafwk/standard/interfaces/innerkits/runtime/include",
|
||||
]
|
||||
}
|
||||
|
||||
config("libwindow_exteinsion_public_config") {
|
||||
config("libwindow_extension_public_config") {
|
||||
include_dirs = [
|
||||
"../../interfaces/innerkits/wm",
|
||||
"../../utils/include",
|
||||
]
|
||||
}
|
||||
|
||||
## Build libwindow_exteinsion.so
|
||||
ohos_shared_library("libwindow_exteinsion") {
|
||||
## Build libwindow_extension.so
|
||||
ohos_shared_library("libwindow_extension") {
|
||||
sources = [
|
||||
"../extension_connection/src/window_extension_client_proxy.cpp",
|
||||
"src/js_window_extension_context.cpp",
|
||||
@@ -43,12 +45,13 @@ ohos_shared_library("libwindow_exteinsion") {
|
||||
"src/window_extension.cpp",
|
||||
]
|
||||
|
||||
configs = [ ":libwindow_exteinsion_private_config" ]
|
||||
configs = [ ":libwindow_extension_private_config" ]
|
||||
|
||||
public_configs = [ ":libwindow_exteinsion_public_config" ]
|
||||
public_configs = [ ":libwindow_extension_public_config" ]
|
||||
|
||||
deps = [
|
||||
"//foundation/graphic/standard/rosen/modules/render_service_client:librender_service_client",
|
||||
"//foundation/windowmanager/interfaces/kits/napi/window_runtime:window_native_kit",
|
||||
"//foundation/windowmanager/wm:libwm",
|
||||
"//foundation/windowmanager/utils:libwmutil",
|
||||
]
|
||||
@@ -63,6 +66,7 @@ ohos_shared_library("libwindow_exteinsion") {
|
||||
"graphic_standard:surface",
|
||||
"hilog_native:libhilog",
|
||||
"input:libmmi-client",
|
||||
"utils_base:utils",
|
||||
]
|
||||
|
||||
part_name = "window_manager"
|
||||
@@ -84,7 +88,7 @@ ohos_shared_library("window_extension_module") {
|
||||
configs = [ ":window_extension_module_private_config" ]
|
||||
|
||||
deps = [
|
||||
"//foundation/windowmanager/extension/window_extension:libwindow_exteinsion",
|
||||
"//foundation/windowmanager/extension/window_extension:libwindow_extension",
|
||||
]
|
||||
|
||||
external_deps = [
|
||||
|
||||
@@ -82,8 +82,9 @@ public:
|
||||
virtual void OnStart(const AAFwk::Want &want) override;
|
||||
private:
|
||||
void GetSrcPath(std::string &srcPath);
|
||||
NativeValue* CallJsMethod(const char* name, NativeValue* const* argv = nullptr, size_t argc = 0);
|
||||
void OnWindowCreated();
|
||||
|
||||
//sptr<IWindowExtensionClient> extensionToken_; // TODO IWindowExtensionClient下沉到window_extension
|
||||
AbilityRuntime::JsRuntime& jsRuntime_;
|
||||
std::unique_ptr<NativeReference> jsObj_;
|
||||
std::shared_ptr<NativeReference> shellContextRef_;
|
||||
|
||||
@@ -36,7 +36,9 @@ public:
|
||||
virtual void RequestFocus() override;
|
||||
virtual void ConnectToExtension(sptr<IWindowExtensionClient>& token) override;
|
||||
|
||||
std::shared_ptr<RSSurfaceNode> CreateWindow(Rect& rect);
|
||||
sptr<Window> CreateWindow(Rect& rect, const std::shared_ptr<AbilityRuntime::Context>& context);
|
||||
void DestroyWindow();
|
||||
sptr<Window> GetWindow() const;
|
||||
private:
|
||||
|
||||
sptr<IDispatchInputEventListener> dispatchInputEventListener_;
|
||||
|
||||
@@ -18,7 +18,9 @@
|
||||
#include <native_engine/native_reference.h>
|
||||
#include <native_engine/native_value.h>
|
||||
#include <js_extension_context.h>
|
||||
#include <js_runtime_utils.h>
|
||||
|
||||
#include "js_window.h"
|
||||
#include "js_window_extension_context.h"
|
||||
#include "window_extension_connection.h"
|
||||
#include "window_manager_hilog.h"
|
||||
@@ -115,11 +117,11 @@ void JsWindowExtension::Init(const std::shared_ptr<AbilityLocalRecord> &record,
|
||||
void JsWindowExtension::GetSrcPath(std::string &srcPath)
|
||||
{
|
||||
if (!Extension::abilityInfo_) {
|
||||
HILOG_ERROR("abilityInfo_ is nullptr");
|
||||
WLOGFE("abilityInfo_ is nullptr");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Extension::abilityInfo_->isModuleJson) {
|
||||
if (!Extension::abilityInfo_->isModuleJson) {
|
||||
srcPath.append(Extension::abilityInfo_->package);
|
||||
srcPath.append("/assets/js/");
|
||||
if (!Extension::abilityInfo_->srcPath.empty()) {
|
||||
@@ -142,10 +144,6 @@ sptr<IRemoteObject> JsWindowExtension::OnConnect(const AAFwk::Want &want)
|
||||
WLOGFI("called.");
|
||||
Extension::OnConnect(want);
|
||||
|
||||
ElementName elementName = want.GetElement(); // TODO 为何之前是GetElementName()?
|
||||
std::string windowName = elementName.GetBundleName();
|
||||
|
||||
stub_ = new(std::nothrow) WindowExtensionStubImpl(windowName);
|
||||
if (!stub_) {
|
||||
WLOGFE("stub is nullptr.");
|
||||
return nullptr;
|
||||
@@ -163,14 +161,84 @@ void JsWindowExtension::OnDisconnect(const AAFwk::Want &want)
|
||||
void JsWindowExtension::OnStart(const AAFwk::Want &want)
|
||||
{
|
||||
Extension::OnStart(want);
|
||||
|
||||
ElementName elementName = want.GetElement(); // TODO 为何之前是GetElementName()?
|
||||
std::string windowName = elementName.GetBundleName();
|
||||
|
||||
stub_ = new(std::nothrow)WindowExtensionStubImpl(windowName);
|
||||
WLOGFI("JsWindowExtension OnStart begin..");
|
||||
Rect rect { want.GetIntParam(RECT_FORM_KEY_POS_X, 0),
|
||||
want.GetIntParam(RECT_FORM_KEY_POS_Y, 0),
|
||||
want.GetIntParam(RECT_FORM_KEY_WIDTH, 0),
|
||||
want.GetIntParam(RECT_FORM_KEY_HEIGHT, 0) };
|
||||
// stub_->CreateWindow(rect);
|
||||
WLOGFI(" create window rect x =%{public}d y=%{public}d w=%{public}d h=%{public}d ",
|
||||
rect.posX_, rect.posY_, rect.width_, rect.height_);
|
||||
if (stub_ != nullptr) {
|
||||
auto context = GetContext();
|
||||
if (context == nullptr) {
|
||||
WLOGFE("get context failed");
|
||||
return;
|
||||
}
|
||||
sptr<Window> window = stub_->CreateWindow(rect, context);
|
||||
if (window == nullptr) {
|
||||
WLOGFE("create window failed");
|
||||
return;
|
||||
}
|
||||
OnWindowCreated();
|
||||
WLOGFI("ability context onWindowReady rect x =%{public}d y=%{public}d w=%{public}d h=%{public}d ",
|
||||
rect.posX_, rect.posY_, rect.width_, rect.height_);
|
||||
}
|
||||
}
|
||||
|
||||
void JsWindowExtension::OnWindowCreated()
|
||||
{
|
||||
NativeEngine& engine = jsRuntime_.GetNativeEngine();
|
||||
std::unique_ptr<AsyncTask::CompleteCallback> complete = std::make_unique<AsyncTask::CompleteCallback>(
|
||||
[=] (NativeEngine &engine, AsyncTask &task, int32_t status) {
|
||||
auto window = stub_->GetWindow();
|
||||
if (window == nullptr) {
|
||||
WLOGFE("get window failed");
|
||||
return;
|
||||
}
|
||||
NativeValue* value = CreateJsWindowObject(engine, window, false);
|
||||
if (value == nullptr) {
|
||||
WLOGFE("Create js window failed");
|
||||
return;
|
||||
}
|
||||
NativeValue* argv[] = { value };
|
||||
CallJsMethod("onWindowReady", argv, ArraySize(argv));
|
||||
}
|
||||
);
|
||||
|
||||
NativeReference* callback = nullptr;
|
||||
std::unique_ptr<AsyncTask::ExecuteCallback> execute = nullptr;
|
||||
AsyncTask::Schedule(engine, std::make_unique<AsyncTask>(callback, std::move(execute), std::move(complete)));
|
||||
}
|
||||
|
||||
NativeValue* JsWindowExtension::CallJsMethod(const char* name, NativeValue* const* argv, size_t argc)
|
||||
{
|
||||
WLOGFI("called (%{public}s), begin", name);
|
||||
|
||||
if (!jsObj_) {
|
||||
WLOGFW("Not found ServiceExtension.js");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
HandleScope handleScope(jsRuntime_);
|
||||
auto& nativeEngine = jsRuntime_.GetNativeEngine();
|
||||
|
||||
NativeValue* value = jsObj_->Get();
|
||||
NativeObject* obj = ConvertNativeValueTo<NativeObject>(value);
|
||||
if (obj == nullptr) {
|
||||
WLOGFE("Failed to get ServiceExtension object");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
NativeValue* method = obj->GetProperty(name);
|
||||
if (method == nullptr || method->TypeOf() != NATIVE_FUNCTION) {
|
||||
WLOGFE("Failed to get '%{public}s' from ServiceExtension object", name);
|
||||
return nullptr;
|
||||
}
|
||||
WLOGFI("(%{public}s), success", name);
|
||||
return nativeEngine.CallFunction(value, method, argv, argc);
|
||||
}
|
||||
} // namespace Rosen
|
||||
} // namespace OHOS
|
||||
@@ -59,7 +59,7 @@ void JsWindowConnectCallback::OnAbilityDisconnectDone(const AppExecFwk::ElementN
|
||||
}
|
||||
|
||||
NativeValue* CreateJsWindowExtensionContext(NativeEngine& engine,
|
||||
std::shared_ptr<WindowExtensionContext> context)
|
||||
std::shared_ptr<WindowExtensionContext> context)
|
||||
{
|
||||
WLOGFI("CreateJsWindowExtensionContext begin");
|
||||
NativeValue* objValue = CreateJsExtensionContext(engine, context); // TODO CreateJsBaseContext?
|
||||
|
||||
@@ -38,26 +38,21 @@ WindowExtensionStubImpl::~WindowExtensionStubImpl()
|
||||
}
|
||||
}
|
||||
|
||||
std::shared_ptr<RSSurfaceNode> WindowExtensionStubImpl::CreateWindow(Rect& rect)
|
||||
sptr<Window> WindowExtensionStubImpl::CreateWindow(Rect& rect,
|
||||
const std::shared_ptr<AbilityRuntime::Context>& context)
|
||||
{
|
||||
// WLOGFI("call start windowName_ %{public}s", windowName_.c_str());
|
||||
sptr<WindowOption> option = new (std::nothrow)WindowOption();
|
||||
if (option == nullptr) {
|
||||
WLOGFE("Get option failed");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
option->SetWindowType(WindowType::WINDOW_TYPE_APP_COMPONENT);
|
||||
option->SetWindowMode(OHOS::Rosen::WindowMode::WINDOW_MODE_FLOATING);
|
||||
option->SetWindowRect(rect);
|
||||
WLOGFI("create window");
|
||||
window_ = Window::Create(windowName_, option, nullptr);
|
||||
if (window_ == nullptr) {
|
||||
WLOGFE("create window failed");
|
||||
return nullptr;
|
||||
}
|
||||
WLOGFI("call end");
|
||||
return nullptr; //window_->GetSurfaceNode();
|
||||
option->SetWindowType(WindowType::WINDOW_TYPE_APP_MAIN_WINDOW);
|
||||
option->SetWindowMode(OHOS::Rosen::WindowMode::WINDOW_MODE_FULLSCREEN);
|
||||
// option->SetWindowRect(rect);
|
||||
WLOGFI("Window::Create");
|
||||
window_ = Window::Create(windowName_, option, context);
|
||||
return window_;
|
||||
}
|
||||
|
||||
void WindowExtensionStubImpl::Resize(Rect rect)
|
||||
@@ -91,8 +86,12 @@ void WindowExtensionStubImpl::RequestFocus()
|
||||
void WindowExtensionStubImpl::ConnectToExtension(sptr<IWindowExtensionClient>& token)
|
||||
{
|
||||
token_ = token;
|
||||
token_->OnBackPress();
|
||||
WLOGFI("called");
|
||||
}
|
||||
|
||||
sptr<Window> WindowExtensionStubImpl::GetWindow() const
|
||||
{
|
||||
return window_;
|
||||
}
|
||||
} // namespace Rosen
|
||||
} // namespace OHOS
|
||||
Reference in New Issue
Block a user