From 0cbc619dab50718bca72bbada879dd70bcc91e05 Mon Sep 17 00:00:00 2001 From: alnin Date: Wed, 18 Dec 2024 21:13:26 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8napi=5Fcall=5Fthreadsafe=5Ffu?= =?UTF-8?q?nction=E6=96=B9=E5=BC=8F=E8=B0=83=E7=94=A8capi=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: alnin --- .../src/main/cpp/application/napi_init.cpp | 4 +- src/core/ohos/SDL_ohos.cpp | 140 ++++++- src/core/ohos/SDL_ohos.h | 7 + src/core/ohos/SDL_ohos_tstype.h | 7 + src/core/ohos/SDL_ohos_xcomponent.cpp | 2 + src/core/ohos/SDL_ohosplugin_c.cpp | 2 - src/core/ohos/SDL_ohosthreadsafe.cpp | 125 ++++++- .../{AdapterC.cpp => SDL_AdapterC.cpp} | 351 +++++++++++------- .../adapter_c/{AdapterC.h => SDL_AdapterC.h} | 9 +- src/video/ohos/SDL_ohosvideo.c | 1 + src/video/ohos/SDL_ohoswindow.c | 18 +- 11 files changed, 491 insertions(+), 175 deletions(-) rename src/core/ohos/adapter_c/{AdapterC.cpp => SDL_AdapterC.cpp} (70%) rename src/core/ohos/adapter_c/{AdapterC.h => SDL_AdapterC.h} (96%) diff --git a/ohos-project/entry/src/main/cpp/application/napi_init.cpp b/ohos-project/entry/src/main/cpp/application/napi_init.cpp index 3b4766ca..d4c58371 100644 --- a/ohos-project/entry/src/main/cpp/application/napi_init.cpp +++ b/ohos-project/entry/src/main/cpp/application/napi_init.cpp @@ -15,8 +15,8 @@ #include #include "gloable.h" -#include "AdapterC.h" -using namespace EMBEDDED_WINDOW_ADAPTER; +#include "SDL_AdapterC.h" +using namespace SDL_EMBEDDED_WINDOW_ADAPTER; #define NAPI_ARGO 0 #define NAPI_ARG1 1 diff --git a/src/core/ohos/SDL_ohos.cpp b/src/core/ohos/SDL_ohos.cpp index 05dbf376..ebc025fd 100644 --- a/src/core/ohos/SDL_ohos.cpp +++ b/src/core/ohos/SDL_ohos.cpp @@ -43,7 +43,7 @@ extern "C" { #include "../../video/ohos/SDL_ohosvideo.h" #include "../../video/ohos/SDL_ohoskeyboard.h" #include "../../audio/ohos/SDL_ohosaudio.h" -#include "adapter_c/AdapterC.h" +#include "adapter_c/SDL_AdapterC.h" #include "SDL_ohosthreadsafe.h" #include "SDL_ohos_xcomponent.h" #include @@ -61,7 +61,14 @@ extern "C" { using namespace std; using namespace OHOS::SDL; -using namespace EMBEDDED_WINDOW_ADAPTER; +using namespace SDL_EMBEDDED_WINDOW_ADAPTER; + +// Defines locks and semaphores. +using ThreadLockInfo = struct ThreadLockInfo { + std::mutex mutex; + std::condition_variable condition; + bool ready = false; +}; SDL_DisplayOrientation displayOrientation; @@ -170,6 +177,133 @@ SDL_bool OHOS_NAPI_RequestPermission(const char *permission) return bPermissionRequestResult; } +SDL_bool OHOS_NAPI_AddChildNode(void *parent, void **child, char *xcompentId, WindowPosition *windowPosition) +{ + cJSON *root = cJSON_CreateObject(); + if (root == NULL) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "Error creating JSON object."); + return SDL_FALSE; + } + cJSON_AddNumberToObject(root, OHOS_TS_CALLBACK_TYPE, NAPI_CALLBACK_ADD_CHILD_NODE); + cJSON_AddNumberToObject(root, "parent", (long long)parent); + cJSON_AddNumberToObject(root, "child", (long long)child); + cJSON_AddStringToObject(root, "xcompentid", xcompentId); + cJSON_AddNumberToObject(root, "position", (long long)windowPosition); + ThreadLockInfo *lockInfo = new ThreadLockInfo(); + std::uintptr_t lockInfoPointer = reinterpret_cast(lockInfo); + cJSON_AddNumberToObject(root, OHOS_JSON_ASYN, (double)lockInfoPointer); + napi_status status = napi_call_threadsafe_function(g_napiCallback->tsfn, root, napi_tsfn_nonblocking); + if (status != napi_ok) { + delete lockInfo; + cJSON_free(root); + return SDL_FALSE; + } + std::unique_lock lock(lockInfo->mutex); + lockInfo->condition.wait_for(lock, std::chrono::seconds(OHOS_INDEX_ARG6), [lockInfo] { return lockInfo->ready; }); + delete lockInfo; + return SDL_TRUE; +} + +SDL_bool OHOS_NAPI_RemoveChildNode(char *xcompentId) +{ + cJSON *root = cJSON_CreateObject(); + if (root == NULL) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "Error creating JSON object."); + return SDL_FALSE; + } + cJSON_AddNumberToObject(root, OHOS_TS_CALLBACK_TYPE, NAPI_CALLBACK_REMOVE_CHILD_NODE); + cJSON_AddStringToObject(root, "xcompentid", xcompentId); + napi_status status = napi_call_threadsafe_function(g_napiCallback->tsfn, root, napi_tsfn_nonblocking); + if (status != napi_ok) { + cJSON_free(root); + } + return SDL_TRUE; +} + +SDL_bool OHOS_NAPI_ResizeNode(char *xcompentId, int width, int height) +{ + cJSON *root = cJSON_CreateObject(); + if (root == NULL) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "Error creating JSON object."); + return SDL_FALSE; + } + cJSON_AddNumberToObject(root, OHOS_TS_CALLBACK_TYPE, NAPI_CALLBACK_RESIZE_NODE); + cJSON_AddStringToObject(root, "xcompentid", xcompentId); + cJSON_AddNumberToObject(root, "width", width); + cJSON_AddNumberToObject(root, "height", height); + napi_status status = napi_call_threadsafe_function(g_napiCallback->tsfn, root, napi_tsfn_nonblocking); + if (status != napi_ok) { + cJSON_free(root); + } + return SDL_TRUE; +} + +SDL_bool OHOS_NAPI_MoveNode(char *xcompentId, int x, int y) +{ + cJSON *root = cJSON_CreateObject(); + if (root == NULL) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "Error creating JSON object."); + return SDL_FALSE; + } + cJSON_AddNumberToObject(root, OHOS_TS_CALLBACK_TYPE, NAPI_CALLBACK_MOVE_NODE); + cJSON_AddStringToObject(root, "xcompentid", xcompentId); + cJSON_AddNumberToObject(root, "x", x); + cJSON_AddNumberToObject(root, "y", y); + napi_status status = napi_call_threadsafe_function(g_napiCallback->tsfn, root, napi_tsfn_nonblocking); + if (status != napi_ok) { + cJSON_free(root); + } + return SDL_TRUE; +} + +SDL_bool OHOS_NAPI_ShowNode(char *xcompentId) +{ + cJSON *root = cJSON_CreateObject(); + if (root == NULL) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "Error creating JSON object."); + return SDL_FALSE; + } + cJSON_AddNumberToObject(root, OHOS_TS_CALLBACK_TYPE, NAPI_CALLBACK_SHOW_NODE); + cJSON_AddStringToObject(root, "xcompentid", xcompentId); + napi_status status = napi_call_threadsafe_function(g_napiCallback->tsfn, root, napi_tsfn_nonblocking); + if (status != napi_ok) { + cJSON_free(root); + } + return SDL_TRUE; +} + +SDL_bool OHOS_NAPI_HideNode(char *xcompentId) +{ + cJSON *root = cJSON_CreateObject(); + if (root == NULL) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "Error creating JSON object."); + return SDL_FALSE; + } + cJSON_AddNumberToObject(root, OHOS_TS_CALLBACK_TYPE, NAPI_CALLBACK_HIDE_NODE); + cJSON_AddStringToObject(root, "xcompentid", xcompentId); + napi_status status = napi_call_threadsafe_function(g_napiCallback->tsfn, root, napi_tsfn_nonblocking); + if (status != napi_ok) { + cJSON_free(root); + } + return SDL_TRUE; +} + +SDL_bool OHOS_NAPI_RaiseNode(char *xcompentId) +{ + cJSON *root = cJSON_CreateObject(); + if (root == NULL) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "Error creating JSON object."); + return SDL_FALSE; + } + cJSON_AddNumberToObject(root, OHOS_TS_CALLBACK_TYPE, NAPI_CALLBACK_RAISE_NODE); + cJSON_AddStringToObject(root, "xcompentid", xcompentId); + napi_status status = napi_call_threadsafe_function(g_napiCallback->tsfn, root, napi_tsfn_nonblocking); + if (status != napi_ok) { + cJSON_free(root); + } + return SDL_TRUE; +} + void OHOS_NAPI_HideTextInput(int flag) { cJSON *root = cJSON_CreateObject(); @@ -1061,8 +1195,6 @@ bool OHOS_AddChildNode(void *parent, void **child, char *xcompentId, WindowPosit } } - delete params; - params = nullptr; return flag; } diff --git a/src/core/ohos/SDL_ohos.h b/src/core/ohos/SDL_ohos.h index 32a15f49..e6a8b248 100644 --- a/src/core/ohos/SDL_ohos.h +++ b/src/core/ohos/SDL_ohos.h @@ -65,6 +65,13 @@ extern void OHOS_SetDisplayOrientation(int orientation); extern SDL_DisplayOrientation OHOS_GetDisplayOrientation(); extern void OHOS_NAPI_ShowTextInput(int x, int y, int w, int h); extern SDL_bool OHOS_NAPI_RequestPermission(const char *Permission); +extern SDL_bool OHOS_NAPI_AddChildNode(void *parent, void **child, char *xcompentId, WindowPosition *windowPosition); +extern SDL_bool OHOS_NAPI_RemoveChildNode(char *xcompentId); +extern SDL_bool OHOS_NAPI_ResizeNode(char *xcompentId, int width, int height); +extern SDL_bool OHOS_NAPI_MoveNode(char *xcompentId, int x, int y); +extern SDL_bool OHOS_NAPI_ShowNode(char *xcompentId); +extern SDL_bool OHOS_NAPI_HideNode(char *xcompentId); +extern SDL_bool OHOS_NAPI_RaiseNode(char *xcompentId); extern void OHOS_NAPI_HideTextInput(int a); extern void OHOS_NAPI_ShouldMinimizeOnFocusLoss(int a); extern void OHOS_NAPI_SetTitle(const char *title); diff --git a/src/core/ohos/SDL_ohos_tstype.h b/src/core/ohos/SDL_ohos_tstype.h index 74891ae3..83d6d2d5 100644 --- a/src/core/ohos/SDL_ohos_tstype.h +++ b/src/core/ohos/SDL_ohos_tstype.h @@ -38,6 +38,13 @@ enum NapiCallBackType { NAPI_CALLBACK_SET_DISPLAYORIENTATION, NAPI_CALLBACK_SHOW_TEXTINPUT, NAPI_CALLBACK_REQUEST_PERMISSION, + NAPI_CALLBACK_ADD_CHILD_NODE, + NAPI_CALLBACK_REMOVE_CHILD_NODE, + NAPI_CALLBACK_RESIZE_NODE, + NAPI_CALLBACK_MOVE_NODE, + NAPI_CALLBACK_SHOW_NODE, + NAPI_CALLBACK_HIDE_NODE, + NAPI_CALLBACK_RAISE_NODE, NAPI_CALLBACK_HIDE_TEXTINPUT, NAPI_CALLBACK_SHOULD_MINIMIZEON_FOCUSLOSS, NAPI_CALLBACK_SET_TITLE, diff --git a/src/core/ohos/SDL_ohos_xcomponent.cpp b/src/core/ohos/SDL_ohos_xcomponent.cpp index c0df07dd..cd166b29 100644 --- a/src/core/ohos/SDL_ohos_xcomponent.cpp +++ b/src/core/ohos/SDL_ohos_xcomponent.cpp @@ -148,6 +148,8 @@ static void OnSurfaceChangedCB(OH_NativeXComponent *component, void *window) double offsetX; double offsetY; OH_NativeXComponent_GetXComponentSize(component, window, &width, &height); + g_ohosSurfaceWidth = width; + g_ohosSurfaceHeight = height; OH_NativeXComponent_GetXComponentOffset(component, window, &offsetX, &offsetY); SDL_Log("Xcompent is changeing, xcomponent is %p", component); diff --git a/src/core/ohos/SDL_ohosplugin_c.cpp b/src/core/ohos/SDL_ohosplugin_c.cpp index 7f68ce2a..0f400fda 100644 --- a/src/core/ohos/SDL_ohosplugin_c.cpp +++ b/src/core/ohos/SDL_ohosplugin_c.cpp @@ -53,9 +53,7 @@ void OHOS_ClearPluginData(char *xcompentId) std::string strId(xcompentId); OH_NativeXComponent *c = nullptr; - SDL_LockMutex(g_ohosPageMutex); pthread_t t = OhosPluginManager::GetInstance()->GetThreadIdFromXComponentId(strId); OhosPluginManager::GetInstance()->FindNativeXcomPoment(strId, &c); OhosPluginManager::GetInstance()->ClearPluginManagerData(strId, c, t); - SDL_UnlockMutex(g_ohosPageMutex); } \ No newline at end of file diff --git a/src/core/ohos/SDL_ohosthreadsafe.cpp b/src/core/ohos/SDL_ohosthreadsafe.cpp index 7d15ad49..f2bc9cb1 100644 --- a/src/core/ohos/SDL_ohosthreadsafe.cpp +++ b/src/core/ohos/SDL_ohosthreadsafe.cpp @@ -14,7 +14,7 @@ */ #include "SDL_ohosthreadsafe.h" - +#include "SDL_ohos.h" #include #include #include @@ -30,6 +30,13 @@ extern "C" { #include "SDL_timer.h" #include "SDL_log.h" +// Defines locks and semaphores. +using ThreadLockInfo = struct ThreadLockInfo { + std::mutex mutex; + std::condition_variable condition; + bool ready = false; +}; + std::unique_ptr g_napiCallback = nullptr; #define OHOS_THREAD_NAME "threadname" @@ -40,6 +47,13 @@ typedef void (*OHOS_TS_Fuction)(const cJSON *root); static void OHOS_TS_ShowTextInput(const cJSON *root); static void OHOS_TS_RequestPermission(const cJSON *root); +static void OHOS_TS_AddChildNode(const cJSON *root); +static void OHOS_TS_RemoveChildNode(const cJSON *root); +static void OHOS_TS_ResizeNode(const cJSON *root); +static void OHOS_TS_MoveNode(const cJSON *root); +static void OHOS_TS_ShowNode(const cJSON *root); +static void OHOS_TS_HideNode(const cJSON *root); +static void OHOS_TS_RaiseNode(const cJSON *root); static void OHOS_TS_HideTextInput(const cJSON *root); static void OHOS_TS_ShouldMinimizeOnFocusLoss(const cJSON *root); static void OHOS_TS_SetTitle(const cJSON *root); @@ -61,7 +75,14 @@ static std::unordered_map tsFuctions = { {NAPI_CALLBACK_SHOW_TEXTINPUTKEYBOARD, OHOS_TS_ShowTextInputKeyboard}, {NAPI_CALLBACK_SET_WINDOWRESIZE, OHOS_TS_SetWindowResize}, {NAPI_CALLBACK_CREATE_CUSTOMCURSOR, OHOS_TS_CreateCustomCursor}, - {NAPI_CALLBACK_REQUEST_PERMISSION, OHOS_TS_RequestPermission} + {NAPI_CALLBACK_REQUEST_PERMISSION, OHOS_TS_RequestPermission}, + {NAPI_CALLBACK_ADD_CHILD_NODE, OHOS_TS_AddChildNode}, + {NAPI_CALLBACK_REMOVE_CHILD_NODE, OHOS_TS_RemoveChildNode}, + {NAPI_CALLBACK_RESIZE_NODE, OHOS_TS_ResizeNode}, + {NAPI_CALLBACK_MOVE_NODE, OHOS_TS_MoveNode}, + {NAPI_CALLBACK_SHOW_NODE, OHOS_TS_ShowNode}, + {NAPI_CALLBACK_HIDE_NODE, OHOS_TS_HideNode}, + {NAPI_CALLBACK_RAISE_NODE, OHOS_TS_RaiseNode} }; static void OHOS_TS_SetWindowResize(const cJSON *root) @@ -147,6 +168,95 @@ static void OHOS_TS_RequestPermission(const cJSON *root) return; } +static void OHOS_TS_AddChildNode(const cJSON *root) +{ + long long temp; + cJSON *data = cJSON_GetObjectItem(root, "parent"); + temp = static_cast(data->valuedouble); + void* parent = reinterpret_cast(temp); + + data = cJSON_GetObjectItem(root, "child"); + temp = static_cast(data->valuedouble); + void *child = reinterpret_cast(temp); + + data = cJSON_GetObjectItem(root, "xcompentid"); + char *xcompentId = data->valuestring; + + data = cJSON_GetObjectItem(root, "position"); + temp = static_cast(data->valuedouble); + WindowPosition *position = reinterpret_cast(temp); + + ThreadLockInfo *lockInfo = nullptr; + data = cJSON_GetObjectItem(root, OHOS_JSON_ASYN); + temp = static_cast(data->valuedouble); + lockInfo = reinterpret_cast(temp); + + OHOS_AddChildNode(parent, (void**)child, xcompentId, position); + + lockInfo->ready = true; + lockInfo->condition.notify_all(); +} + +static void OHOS_TS_RemoveChildNode(const cJSON *root) +{ + cJSON *data = cJSON_GetObjectItem(root, "xcompentid"); + char *xcompentId = data->valuestring; + + OHOS_RemoveChildNode(xcompentId); +} + +static void OHOS_TS_ResizeNode(const cJSON *root) +{ + cJSON *data = cJSON_GetObjectItem(root, "xcompentid"); + char *xcompentId = data->valuestring; + + data = cJSON_GetObjectItem(root, "width"); + int width = data->valueint; + + data = cJSON_GetObjectItem(root, "height"); + int height = data->valueint; + + OHOS_ResizeNode(xcompentId, width, height); +} + +static void OHOS_TS_MoveNode(const cJSON *root) +{ + cJSON *data = cJSON_GetObjectItem(root, "xcompentid"); + char *xcompentId = data->valuestring; + + data = cJSON_GetObjectItem(root, "x"); + int x = data->valueint; + + data = cJSON_GetObjectItem(root, "y"); + int y = data->valueint; + + OHOS_MoveNode(xcompentId, x, y); +} + +static void OHOS_TS_ShowNode(const cJSON *root) +{ + cJSON *data = cJSON_GetObjectItem(root, "xcompentid"); + char *xcompentId = data->valuestring; + + OHOS_ShowNode(xcompentId); +} + +static void OHOS_TS_HideNode(const cJSON *root) +{ + cJSON *data = cJSON_GetObjectItem(root, "xcompentid"); + char *xcompentId = data->valuestring; + + OHOS_HideNode(xcompentId); +} + +static void OHOS_TS_RaiseNode(const cJSON *root) +{ + cJSON *data = cJSON_GetObjectItem(root, "xcompentid"); + char *xcompentId = data->valuestring; + + OHOS_RaiseNode(xcompentId); +} + static void OHOS_TS_HideTextInput(const cJSON *root) { cJSON *data = cJSON_GetObjectItem(root, "flag"); @@ -332,17 +442,6 @@ static void OHOS_SetSystemCursor(const cJSON *root) return; } -/* Relative mouse support */ -static SDL_bool OHOS_SupportsRelativeMouse(void) -{ - return SDL_TRUE; -} - -static SDL_bool OHOS_SetRelativeMouseEnabled(SDL_bool enabled) -{ - return SDL_TRUE; -} - void OHOS_TS_Call(napi_env env, napi_value jsCb, void *context, void *data) { if (data == nullptr) { diff --git a/src/core/ohos/adapter_c/AdapterC.cpp b/src/core/ohos/adapter_c/SDL_AdapterC.cpp similarity index 70% rename from src/core/ohos/adapter_c/AdapterC.cpp rename to src/core/ohos/adapter_c/SDL_AdapterC.cpp index 1dccb101..03d6edf8 100644 --- a/src/core/ohos/adapter_c/AdapterC.cpp +++ b/src/core/ohos/adapter_c/SDL_AdapterC.cpp @@ -13,7 +13,7 @@ * limitations under the License. */ -#include "AdapterC.h" +#include "SDL_AdapterC.h" #include #include #include @@ -25,7 +25,7 @@ #define Z_INDEX_MAX 2147483647 #define Z_INDEX_SUBNODE_INIT 65536 -namespace EMBEDDED_WINDOW_ADAPTER { +namespace SDL_EMBEDDED_WINDOW_ADAPTER { napi_env EWAdapterC::MainEnv = nullptr; ArkUI_NativeNodeAPI_1 *EWAdapterC::nodeAPI = nullptr; EWAdapterC EWAdapterC::adapterC; @@ -67,58 +67,80 @@ struct WorkParam { bool GetThreadWorkResult(WorkParam *workParam, uv_after_work_cb uvAfterWork) { - OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "EWAdapterC", "RunCallbackType begin"); + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "RunCallbackType begin"); uv_loop_s *loop = nullptr; napi_get_uv_event_loop(EWAdapterC::MainEnv, &loop); if (loop == nullptr) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", "Failed to get_uv_event_loop"); + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "Failed to get_uv_event_loop"); return false; } uv_work_t *work = new uv_work_t; if (work == nullptr) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", "Failed to new uv_work_t"); + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "Failed to new uv_work_t"); return false; } work->data = (void *)(workParam); uv_work_cb uvWork = [](uv_work_t *work) {}; uv_queue_work(loop, work, uvWork, uvAfterWork); - OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "EWAdapterC", "childThread lock and wait"); + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "childThread lock and wait"); std::unique_lock lock(workParam->lockInfo->mutex); workParam->lockInfo->condition.wait(lock, [&workParam] { return workParam->lockInfo->ready; }); - OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "EWAdapterC", "wait work end"); + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "wait work end"); delete work; return workParam->replyStatus; } +bool GetThreadWorkResultNonblocking(WorkParam *workParam, uv_async_cb uvAfterWork) +{ + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "RunCallbackType begin"); + uv_loop_s *loop = nullptr; + napi_get_uv_event_loop(EWAdapterC::MainEnv, &loop); + if (loop == nullptr) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "Failed to get_uv_event_loop"); + return false; + } + uv_async_t *work = new uv_async_t; + if (work == nullptr) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "Failed to new uv_work_t"); + return false; + } + work->data = (void *)(workParam); + uv_async_init(loop, work, uvAfterWork); + uv_async_send(work); + + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "childThread nonlocking and not wait"); + return true; +} + bool Compare(EWNode *a, EWNode *b) { return a->GetZIndex() < b->GetZIndex(); } -int32_t getSubNodeMaxZIndex(Node *node) +int32_t GetSubNodeMaxZIndex(Node *node) { if (node == nullptr) { - OH_LOG_Print(LOG_APP, LOG_WARN, LOG_PRINT_DOMAIN, "EWAdapterC", "getSubNodeMaxZIndex nullptr error"); + OH_LOG_Print(LOG_APP, LOG_WARN, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "getSubNodeMaxZIndex nullptr error"); return 0; } return 0; } -int32_t getSubNodeMinZIndex(Node *node) +int32_t GetSubNodeMinZIndex(Node *node) { if (node == nullptr) { - OH_LOG_Print(LOG_APP, LOG_WARN, LOG_PRINT_DOMAIN, "EWAdapterC", "getSubNodeMinZIndex nullptr error"); + OH_LOG_Print(LOG_APP, LOG_WARN, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "getSubNodeMinZIndex nullptr error"); return 0; } return 0; } // just for test -static uint32_t generateRandomHex() +static uint32_t GenerateRandomHex() { std::random_device rd; std::mt19937 gen(rd()); @@ -143,9 +165,15 @@ EWNode::~EWNode() { if (current->container != nullptr) { nodeApi->disposeNode(current->container); + current->container = nullptr; } if (current->node != nullptr) { nodeApi->disposeNode(current->node); + current->node = nullptr; + } + if (nodeAttributes != nullptr) { + delete nodeAttributes; + nodeAttributes = nullptr; } } @@ -188,7 +216,7 @@ bool EWNode::RemoveChild(Node *node) { auto iter = std::find(this->childList.begin(), this->childList.end(), node); if (iter == this->childList.end()) { - OH_LOG_Print(LOG_APP, LOG_WARN, LOG_PRINT_DOMAIN, "EWAdapterC", "removeChild not find node"); + OH_LOG_Print(LOG_APP, LOG_WARN, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "removeChild not find node"); return false; } this->childList.erase(iter); @@ -217,7 +245,7 @@ EWAdapterC::~EWAdapterC() float EWAdapterC::Px2vp(int px) { if (EWAdapterC::scaledDensity == 0) { - OH_LOG_Print(LOG_APP, LOG_WARN, LOG_PRINT_DOMAIN, "EWAdapterC", "scaledDensity error"); + OH_LOG_Print(LOG_APP, LOG_WARN, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "scaledDensity error"); return px; } return px / EWAdapterC::scaledDensity; @@ -233,10 +261,10 @@ Node *EWAdapterC::CreateRootNode(NodeAttribute *nodeParams, bool scale) Node *res = nullptr; std::thread::id curThreadId = std::this_thread::get_id(); if (curThreadId == mainJsThreadId) { - OH_LOG_Print(LOG_APP, LOG_DEBUG, LOG_PRINT_DOMAIN, "EWAdapterC", "createRootNode mainJsThreadId"); + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "createRootNode mainJsThreadId"); res = CreateEWNode(nullptr, nodeParams, scale); } else { - OH_LOG_Print(LOG_APP, LOG_DEBUG, LOG_PRINT_DOMAIN, "EWAdapterC", "createRootNode not in mainJsThreadId"); + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "createRootNode not in mainJsThreadId"); WorkParam *workParam = new WorkParam(nullptr, nullptr, nodeParams, scale, std::make_shared()); uv_after_work_cb afterFunc = [](uv_work_t *work, int _status) { @@ -255,7 +283,8 @@ Node *EWAdapterC::CreateRootNode(NodeAttribute *nodeParams, bool scale) Node *EWAdapterC::CreateEWNode(Node *parentNode, NodeAttribute *nodeParams, bool scale) { - int32_t curZINdex = 0; + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "createEWNode: begin!"); + int32_t curZINdex = GetNodeZIndex(parentNode) + 1; ArkUI_NodeHandle stack = nodeAPI->createNode(ARKUI_NODE_STACK); if (stack == nullptr) { return nullptr; @@ -263,7 +292,9 @@ Node *EWAdapterC::CreateEWNode(Node *parentNode, NodeAttribute *nodeParams, bool SetStackSize(stack, nodeParams, scale); SetStackAlignContent(stack); SetStackZIndex(stack, curZINdex); + SetStackPosition(stack, nodeParams->x, nodeParams->y); + SetStackHitTestMode(stack); ArkUI_NodeHandle xc = nodeAPI->createNode(ARKUI_NODE_XCOMPONENT); if (xc == nullptr) { @@ -308,14 +339,14 @@ Node *EWAdapterC::CreateEWNode(Node *parentNode, NodeAttribute *nodeParams, bool Node *EWAdapterC::AddChildNode(Node *parentNode, NodeAttribute *nodeParams, bool scale) { - OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "EWAdapterC", "addChildNode enter"); + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "addChildNode enter"); Node *res = nullptr; std::thread::id curThreadId = std::this_thread::get_id(); if (curThreadId == mainJsThreadId) { - OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "EWAdapterC", "addChildNode mainJsThreadId"); + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "addChildNode mainJsThreadId"); res = CreateEWNode(parentNode, nodeParams, scale); } else { - OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "EWAdapterC", "addChildNode not in mainJsThreadId"); + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "addChildNode not in mainJsThreadId"); WorkParam *workParam = new WorkParam(nullptr, parentNode, nodeParams, scale, std::make_shared()); uv_after_work_cb afterFunc = [](uv_work_t *work, int _status) { @@ -338,13 +369,13 @@ void EWAdapterC::Init(napi_env env, napi_value exports) { EWAdapterC::MainEnv = env; if ((env == nullptr) || (exports == nullptr)) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", "init: env or exports is null"); + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "init: env or exports is null"); return; } napi_value exportInstance = nullptr; if (napi_get_named_property(env, exports, OH_NATIVE_XCOMPONENT_OBJ, &exportInstance) != napi_ok) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", "init: napi_get_named_property fail"); + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "init: napi_get_named_property fail"); return; } @@ -354,50 +385,50 @@ void EWAdapterC::Init(napi_env env, napi_value exports) OH_NativeXComponent *nativeXComponent = nullptr; if (napi_unwrap(env, exportInstance, reinterpret_cast(&nativeXComponent)) != napi_ok) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", "init: napi_unwrap fail"); + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "init: napi_unwrap fail"); return; } char idStr[OH_XCOMPONENT_ID_LEN_MAX + 1] = {'\0'}; uint64_t idSize = OH_XCOMPONENT_ID_LEN_MAX + 1; if (OH_NativeXComponent_GetXComponentId(nativeXComponent, idStr, &idSize) != OH_NATIVEXCOMPONENT_RESULT_SUCCESS) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "init: OH_NativeXComponent_GetXComponentId fail"); return; } - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "QtMock", "EWAdapterC EWAdapterC::nodeAPI"); + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "EWAdapterC EWAdapterC::nodeAPI"); std::string id(idStr); if (nativeXComponent != nullptr) { SetNativeXComponent(id, nativeXComponent); } else { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", "init: nativeXComponent nullptr error"); + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "init: nativeXComponent nullptr error"); } } // 记录NativeXComponent void EWAdapterC::SetNativeXComponent(const std::string &id, OH_NativeXComponent *nativeXComponent) { - OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "EWAdapterC", "setNativeXComponent: begin!"); + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "setNativeXComponent: begin!"); if (nativeXComponent == nullptr) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "setNativeXComponent: nativeXComponent nullptr error"); return; } auto it = nativeXComponentMap.find(id); if (it == nativeXComponentMap.end()) { - OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "EWAdapterC", "setNativeXComponent: add new"); + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "setNativeXComponent: add new"); nativeXComponentMap[id] = nativeXComponent; return; } if (nativeXComponentMap[id] != nativeXComponent) { - OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "EWAdapterC", "setNativeXComponent: remove old"); + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "setNativeXComponent: remove old"); nativeXComponentMap[id] = nativeXComponent; } - OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "EWAdapterC", "setNativeXComponent: end"); + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "setNativeXComponent: end"); } OH_NativeXComponent *EWAdapterC::GetNativeXComponent(const std::string &id) @@ -408,20 +439,20 @@ OH_NativeXComponent *EWAdapterC::GetNativeXComponent(const std::string &id) // 移除记录NativeXComponent void EWAdapterC::RemoveNativeXComponent(const std::string &id) { - OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "EWAdapterC", "removeNativeXComponent: begin"); + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "removeNativeXComponent: begin"); auto it = nativeXComponentMap.find(id); if (it != nativeXComponentMap.end()) { - OH_LOG_Print(LOG_APP, LOG_DEBUG, LOG_PRINT_DOMAIN, "EWAdapterC", "removeNativeXComponent: remove old"); + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "removeNativeXComponent: remove old"); nativeXComponentMap.erase(it); } - OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "EWAdapterC", "removeNativeXComponent: end"); + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "removeNativeXComponent: end"); } bool EWAdapterC::RemoveEWNode(Node *node) { - OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "EWAdapterC", "removeEWNode: begin!"); + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "removeEWNode: begin!"); if (node == nullptr) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", "removeEWNode: node nullptr error"); + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "removeEWNode: node nullptr error"); return false; } @@ -437,32 +468,33 @@ bool EWAdapterC::RemoveNode(Node *node) bool res = false; std::thread::id curThreadId = std::this_thread::get_id(); if (curThreadId == mainJsThreadId) { - OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "EWAdapterC", "removeNode mainJsThreadId"); + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "removeNode mainJsThreadId"); res = RemoveEWNode(node); } else { - OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "EWAdapterC", "removeNode not in mainJsThreadId"); + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "removeNode not in mainJsThreadId"); WorkParam *workParam = new WorkParam(node, nullptr, nullptr, false, std::make_shared()); - uv_after_work_cb afterFunc = [](uv_work_t *work, int _status) { + uv_async_cb afterFunc = [](uv_async_t *work) { WorkParam *param = (WorkParam *)(work->data); param->replyStatus = RemoveEWNode(param->node); - param->lockInfo->ready = true; - param->lockInfo->condition.notify_all(); + delete param; + param = nullptr; + uv_close((uv_handle_t *)work, [](uv_handle_t *work) { + delete (uv_async_t *)work; + work = nullptr; + }); }; - GetThreadWorkResult(workParam, afterFunc); - res = workParam->replyStatus; - delete workParam; - workParam = nullptr; + res = GetThreadWorkResultNonblocking(workParam, afterFunc); } return res; } bool EWAdapterC::RemoveRootNode(Node *node) { - OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "EWAdapterC", "removeRootNode: begin"); + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "removeRootNode: begin"); if (node == nullptr || GetParent(node) != nullptr || nodeAPI == nullptr || nodeAPI->removeChild == nullptr) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", "removeRootNode param nullptr error"); + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "removeRootNode param nullptr error"); return false; } if (GetStack(node) != nullptr && GetXComponent(node) != nullptr) { @@ -477,7 +509,7 @@ bool EWAdapterC::RemoveChildNode(Node *node) { if (node == nullptr || GetParent(node) == nullptr || nodeAPI == nullptr || nodeAPI->removeChild == nullptr) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", "removeChildNode param nullptr error"); + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "removeChildNode param nullptr error"); return false; } RemoveChild(GetParent(node), node); @@ -496,10 +528,10 @@ bool EWAdapterC::RemoveChildNode(Node *node) EWNode *ewNode = nullptr; for (auto iter = ewNodeMap.begin(); iter != ewNodeMap.end(); ++iter) { ewNode = iter->second; - if (ewNode->GetCurrent() == node) { - ewNodeMap.erase(iter); + if (ewNode && (ewNode->GetCurrent() == node)) { delete ewNode; ewNode = nullptr; + ewNodeMap.erase(iter); break; } } @@ -511,24 +543,26 @@ bool EWAdapterC::RemoveChildNode(Node *node) // NODE_Z_INDEX up bool EWAdapterC::RaiseEwNode(Node *node) { + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "raiseEwNode: begin!"); if (node == nullptr || GetParent(node) == nullptr) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, - "EWAdapterC", "raiseEwNode node nullptr error"); + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "raiseEwNode node nullptr error"); + return false; + } + + if (nodeAPI == nullptr || nodeAPI->setAttribute == nullptr) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "raiseEwNode nodeAPI nullptr error"); return false; } - int32_t newZIndex = getSubNodeMaxZIndex(GetParent(node)); + + int32_t newZIndex = GetNodeZIndex(GetParent(node)) + 1; if (newZIndex == GetZIndex(node)) { OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, - "EWAdapterC", "node already on the top, index: %{public}d", newZIndex); + LOG_PRINT_TAG, "node already on the top, index: %{public}d", newZIndex); return true; } if (newZIndex >= Z_INDEX_MAX) { OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, - "EWAdapterC", "raiseEwNode index invalid, index: %{public}d", newZIndex); - return false; - } - if (nodeAPI == nullptr || nodeAPI->setAttribute == nullptr) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", "raiseEwNode nodeAPI nullptr error"); + LOG_PRINT_TAG, "raiseEwNode index invalid, index: %{public}d", newZIndex); return false; } newZIndex++; @@ -537,7 +571,7 @@ bool EWAdapterC::RaiseEwNode(Node *node) nodeAPI->setAttribute(GetStack(node), NODE_Z_INDEX, &zIndexItem); SetZIndex(node, newZIndex); OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, - "EWAdapterC", "raiseEwNode newZIndex = %{public}d", newZIndex); + LOG_PRINT_TAG, "raiseEwNode newZIndex = %{public}d", newZIndex); return true; } @@ -547,22 +581,23 @@ bool EWAdapterC::RaiseNode(Node *node) bool res = false; std::thread::id curThreadId = std::this_thread::get_id(); if (curThreadId == mainJsThreadId) { - OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "EWAdapterC", "raiseNode mainJsThreadId"); + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "raiseNode mainJsThreadId"); res = RaiseEwNode(node); } else { - OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "EWAdapterC", "raiseNode not in mainJsThreadId"); + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "raiseNode not in mainJsThreadId"); WorkParam *workParam = new WorkParam(node, nullptr, nullptr, false, std::make_shared()); - uv_after_work_cb afterFunc = [](uv_work_t *work, int _status) { + uv_async_cb afterFunc = [](uv_async_t *work) { WorkParam *param = (WorkParam *)(work->data); param->replyStatus = RaiseEwNode(param->node); - param->lockInfo->ready = true; - param->lockInfo->condition.notify_all(); + delete param; + param = nullptr; + uv_close((uv_handle_t *)work, [](uv_handle_t *work) { + delete (uv_async_t *)work; + work = nullptr; + }); }; - GetThreadWorkResult(workParam, afterFunc); - res = workParam->replyStatus; - delete workParam; - workParam = nullptr; + res = GetThreadWorkResultNonblocking(workParam, afterFunc); } return res; } @@ -571,22 +606,22 @@ bool EWAdapterC::RaiseNode(Node *node) bool EWAdapterC::LowerEWNode(Node *node) { if (node == nullptr || GetParent(node) == nullptr) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", "lowerEWNode node nullptr error"); + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "lowerEWNode node nullptr error"); return false; } - int32_t newZIndex = getSubNodeMinZIndex(GetParent(node)); + int32_t newZIndex = GetSubNodeMinZIndex(GetParent(node)); if (newZIndex == GetZIndex(node)) { OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, - "EWAdapterC", "lowerEWNode already at the bottom, index: %{public}d", newZIndex); + LOG_PRINT_TAG, "lowerEWNode already at the bottom, index: %{public}d", newZIndex); return true; } if (newZIndex <= 1) { OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, - "EWAdapterC", "lowerEWNode node index error, index: %{public}d", newZIndex); + LOG_PRINT_TAG, "lowerEWNode node index error, index: %{public}d", newZIndex); return false; } if (nodeAPI == nullptr || nodeAPI->setAttribute == nullptr) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", "lowerEWNode nodeAPI nullptr error"); + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "lowerEWNode nodeAPI nullptr error"); return false; } newZIndex = newZIndex - 1; @@ -595,7 +630,7 @@ bool EWAdapterC::LowerEWNode(Node *node) nodeAPI->setAttribute(GetStack(node), NODE_Z_INDEX, &zIndexItem); SetZIndex(node, newZIndex); OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, - "EWAdapterC", "lowerEWNode lowerNode = %{public}d", newZIndex); + LOG_PRINT_TAG, "lowerEWNode lowerNode = %{public}d", newZIndex); return true; } @@ -605,10 +640,10 @@ bool EWAdapterC::LowerNode(Node *node) bool res = false; std::thread::id curThreadId = std::this_thread::get_id(); if (curThreadId == mainJsThreadId) { - OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "EWAdapterC", "lowerNode mainJsThreadId"); + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "lowerNode mainJsThreadId"); res = LowerEWNode(node); } else { - OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "EWAdapterC", "lowerNode not in mainJsThreadId"); + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "lowerNode not in mainJsThreadId"); WorkParam *workParam = new WorkParam(node, nullptr, nullptr, false, std::make_shared()); uv_after_work_cb afterFunc = [](uv_work_t *work, int _status) { @@ -625,16 +660,17 @@ bool EWAdapterC::LowerNode(Node *node) return res; } - // NODE_WIDTH | NODE_HEIGHT bool EWAdapterC::ResizeEWNode(Node *node, int width, int height) { + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, + "resizeEWNode: (width:%{public}d, height:%{public}d)", width, height); if (node == nullptr) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", "resizeEWNode node nullptr error"); + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "resizeEWNode node nullptr error"); return false; } if (nodeAPI == nullptr || nodeAPI->setAttribute == nullptr) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", "resizeEWNode nodeAPI nullptr error"); + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "resizeEWNode nodeAPI nullptr error"); return false; } ArkUI_NumberValue widthValue[] = {{.f32 = Px2vp(width)}}; @@ -654,22 +690,23 @@ bool EWAdapterC::ResizeNode(Node *node, int width, int height) bool res = false; std::thread::id curThreadId = std::this_thread::get_id(); if (curThreadId == mainJsThreadId) { - OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "EWAdapterC", "resizeNode mainJsThreadId"); + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "resizeNode mainJsThreadId"); res = ResizeEWNode(node, width, height); } else { - OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "EWAdapterC", "resizeNode not in mainJsThreadId"); + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "resizeNode not in mainJsThreadId"); WorkParam *workParam = new WorkParam(node, nullptr, new NodeAttribute(width, height, 0, 0, nullptr), false, std::make_shared()); - uv_after_work_cb afterFunc = [](uv_work_t *work, int _status) { + uv_async_cb afterFunc = [](uv_async_t *work) { WorkParam *param = (WorkParam *)(work->data); param->replyStatus = ResizeEWNode(param->node, param->nodeParams->width, param->nodeParams->height); - param->lockInfo->ready = true; - param->lockInfo->condition.notify_all(); + delete param; + param = nullptr; + uv_close((uv_handle_t *)work, [](uv_handle_t *work) { + delete (uv_async_t *)work; + work = nullptr; + }); }; - GetThreadWorkResult(workParam, afterFunc); - res = workParam->replyStatus; - delete workParam; - workParam = nullptr; + res = GetThreadWorkResultNonblocking(workParam, afterFunc); } return res; } @@ -677,17 +714,17 @@ bool EWAdapterC::ResizeNode(Node *node, int width, int height) bool EWAdapterC::ReparentChildNode(Node *node, Node *newParent) { if (node == nullptr || newParent == nullptr) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", "reparentChildNode param nullptr error"); + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "reparentChildNode param nullptr error"); return false; } if (nodeAPI == nullptr || nodeAPI->removeChild == nullptr || nodeAPI->addChild == nullptr) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", "reparentChildNode nodeAPI nullptr error"); + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "reparentChildNode nodeAPI nullptr error"); return false; } auto stack = GetStack(node); if (stack == nullptr) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", "reparentChildNode stack nullptr error"); + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "reparentChildNode stack nullptr error"); return false; } auto parentNode = GetParent(node); @@ -695,29 +732,44 @@ bool EWAdapterC::ReparentChildNode(Node *node, Node *newParent) nodeAPI->removeChild(GetStack(parentNode), stack); RemoveChild(parentNode, node); } else { - OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "EWAdapterC", "reparentChildNode do not need removeChild"); + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "reparentChildNode do not need removeChild"); } auto newParentStack = GetStack(newParent); if (newParentStack != nullptr) { nodeAPI->addChild(newParentStack, stack); AddChild(newParent, node); } else { - OH_LOG_Print(LOG_APP, LOG_WARN, LOG_PRINT_DOMAIN, "EWAdapterC", "reparentChildNode addChild error"); + OH_LOG_Print(LOG_APP, LOG_WARN, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "reparentChildNode addChild error"); } SetParent(node, newParent); return true; } +int32_t EWAdapterC::GetNodeZIndex(Node *node) +{ + if (node == nullptr || nodeAPI == nullptr) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "getNodeZIndex nullptr error"); + return 0; + } + + const ArkUI_AttributeItem* item = nodeAPI->getAttribute(node->container, NODE_Z_INDEX); + if (item == nullptr) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "getNodeZIndex item nullptr error"); + return 0; + } + return item->value[0].i32; +} + // move Node from ParentA to ParnetB bool EWAdapterC::ReParentNode(Node *node, Node *newParent) { bool res = true; std::thread::id curThreadId = std::this_thread::get_id(); if (curThreadId == mainJsThreadId) { - OH_LOG_Print(LOG_APP, LOG_DEBUG, LOG_PRINT_DOMAIN, "EWAdapterC", "reParentNode mainJsThreadId"); + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "reParentNode mainJsThreadId"); res = ReparentChildNode(node, newParent); } else { - OH_LOG_Print(LOG_APP, LOG_DEBUG, LOG_PRINT_DOMAIN, "EWAdapterC", "reParentNode not in mainJsThreadId"); + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "reParentNode not in mainJsThreadId"); WorkParam *workParam = new WorkParam(node, newParent, nullptr, false, std::make_shared()); uv_after_work_cb afterFunc = [](uv_work_t *work, int _status) { @@ -739,7 +791,7 @@ NodeRect EWAdapterC::GetNodeRect(Node *node) { NodeRect rect = {-1, -1, -1, -1}; if (node == nullptr || GetXComponent(node) == nullptr) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", "getNodeRect node nullptr error"); + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "getNodeRect node nullptr error"); return rect; } @@ -766,7 +818,7 @@ NodeRect EWAdapterC::GetNodeRectEx(Node *node) { NodeRect rect = {-1, -1, -1, -1}; if (node == nullptr || node->node == nullptr) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", "getNodeRect node nullptr error"); + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "getNodeRect node nullptr error"); return rect; } @@ -784,9 +836,11 @@ NodeRect EWAdapterC::GetNodeRectEx(Node *node) bool EWAdapterC::MoveEWNode(Node *node, int x, int y) { + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, + "moveEWNode: (x:%{public}d, y:%{public}d)", x, y); if (node == nullptr || GetStack(node) == nullptr || nodeAPI == nullptr || nodeAPI->setAttribute == nullptr) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", "moveEWNode param nullptr error"); + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "moveEWNode param nullptr error"); return false; } // set stack position @@ -803,36 +857,36 @@ bool EWAdapterC::MoveNode(Node *node, int x, int y) bool res = true; std::thread::id curThreadId = std::this_thread::get_id(); if (curThreadId == mainJsThreadId) { - OH_LOG_Print(LOG_APP, LOG_DEBUG, LOG_PRINT_DOMAIN, "EWAdapterC", "moveNode mainJsThreadId"); + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "moveNode mainJsThreadId"); res = MoveEWNode(node, x, y); } else { - OH_LOG_Print(LOG_APP, LOG_DEBUG, LOG_PRINT_DOMAIN, "EWAdapterC", "moveNode not in mainJsThreadId"); + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "moveNode not in mainJsThreadId"); WorkParam *workParam = new WorkParam(node, nullptr, new NodeAttribute(0, 0, x, y, nullptr), false, std::make_shared()); - uv_after_work_cb afterFunc = [](uv_work_t *work, int _status) { + uv_async_cb afterFunc = [](uv_async_t *work) { WorkParam *param = (WorkParam *)(work->data); param->replyStatus = MoveEWNode(param->node, param->nodeParams->x, param->nodeParams->y); - param->lockInfo->ready = true; - param->lockInfo->condition.notify_all(); + delete param; + param = nullptr; + uv_close((uv_handle_t *)work, [](uv_handle_t *work) { + delete (uv_async_t *)work; + work = nullptr; + }); }; - - GetThreadWorkResult(workParam, afterFunc); - res = workParam->replyStatus; - delete workParam; - workParam = nullptr; + res = GetThreadWorkResultNonblocking(workParam, afterFunc); } return res; } bool EWAdapterC::SetEWNodeVisibility(Node *node, bool showCurNode) { - OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "EWAdapterC", "setEWNodeVisibility: %{public}d", showCurNode); + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "setEWNodeVisibility: %{public}d", showCurNode); if (node == nullptr) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", "setEWNodeVisibility node nullptr error"); + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "setEWNodeVisibility node nullptr error"); return false; } if (nodeAPI == nullptr || nodeAPI->setAttribute == nullptr) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", "setEWNodeVisibility nodeAPI nullptr error"); + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "setEWNodeVisibility nodeAPI nullptr error"); return false; } ArkUI_NumberValue value[] = {ARKUI_VISIBILITY_VISIBLE}; @@ -852,22 +906,22 @@ bool EWAdapterC::SetNodeVisibility(Node *node, bool showCurNode) bool res = true; std::thread::id curThreadId = std::this_thread::get_id(); if (curThreadId == mainJsThreadId) { - OH_LOG_Print(LOG_APP, LOG_DEBUG, LOG_PRINT_DOMAIN, "EWAdapterC", "setNodeVisibility mainJsThreadId"); + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "setNodeVisibility mainJsThreadId"); res = SetEWNodeVisibility(node, showCurNode); } else { - OH_LOG_Print(LOG_APP, LOG_DEBUG, LOG_PRINT_DOMAIN, "EWAdapterC", "setNodeVisibility not in mainJsThreadId"); + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "setNodeVisibility not in mainJsThreadId"); WorkParam *workParam = new WorkParam(node, nullptr, nullptr, showCurNode, std::make_shared()); - uv_after_work_cb afterFunc = [](uv_work_t *work, int _status) { + uv_async_cb afterFunc = [](uv_async_t *work) { WorkParam *param = (WorkParam *)(work->data); param->replyStatus = SetEWNodeVisibility(param->node, param->boolStatus); - param->lockInfo->ready = true; - param->lockInfo->condition.notify_all(); + delete param; + param = nullptr; + uv_close((uv_handle_t *)work, [](uv_handle_t *work) { + delete (uv_async_t *)work; + work = nullptr; + }); }; - - GetThreadWorkResult(workParam, afterFunc); - res = workParam->replyStatus; - delete workParam; - workParam = nullptr; + res = GetThreadWorkResultNonblocking(workParam, afterFunc); } return res; } @@ -875,11 +929,11 @@ bool EWAdapterC::SetNodeVisibility(Node *node, bool showCurNode) bool EWAdapterC::GetEWNodeVisibility(Node *node) { if (node == nullptr) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", "getEWNodeVisibility node nullptr error"); + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "getEWNodeVisibility node nullptr error"); return false; } if (nodeAPI == nullptr || nodeAPI->getAttribute == nullptr) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", "getEWNodeVisibility nodeAPI nullptr error"); + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "getEWNodeVisibility nodeAPI nullptr error"); return false; } @@ -895,10 +949,10 @@ bool EWAdapterC::IsVisible(Node *node) bool res = true; std::thread::id curThreadId = std::this_thread::get_id(); if (curThreadId == mainJsThreadId) { - OH_LOG_Print(LOG_APP, LOG_DEBUG, LOG_PRINT_DOMAIN, "EWAdapterC", "isVisible mainJsThreadId"); + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "isVisible mainJsThreadId"); res = GetEWNodeVisibility(node); } else { - OH_LOG_Print(LOG_APP, LOG_DEBUG, LOG_PRINT_DOMAIN, "EWAdapterC", "isVisible not in mainJsThreadId"); + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "isVisible not in mainJsThreadId"); WorkParam *workParam = new WorkParam(node, nullptr, nullptr, false, std::make_shared()); uv_after_work_cb afterFunc = [](uv_work_t *work, int _status) { WorkParam *param = (WorkParam *)(work->data); @@ -1053,7 +1107,7 @@ int32_t EWAdapterC::SetStackSize(ArkUI_NodeHandle stack, NodeAttribute *nodePara ArkUI_AttributeItem widthPercentItem = {widthPercentValue, 1}; res = nodeAPI->setAttribute(stack, NODE_WIDTH_PERCENT, &widthPercentItem); if (res != ARKUI_ERROR_CODE_NO_ERROR) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "createEWNode: setAttribute NODE_WIDTH_PERCENT failed!"); } @@ -1061,7 +1115,7 @@ int32_t EWAdapterC::SetStackSize(ArkUI_NodeHandle stack, NodeAttribute *nodePara ArkUI_AttributeItem heightPercentItem = {heightPercentValue, 1}; res = nodeAPI->setAttribute(stack, NODE_HEIGHT_PERCENT, &heightPercentItem); if (res != ARKUI_ERROR_CODE_NO_ERROR) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "createEWNode: setAttribute NODE_HEIGHT_PERCENT failed!"); } } else { @@ -1069,7 +1123,7 @@ int32_t EWAdapterC::SetStackSize(ArkUI_NodeHandle stack, NodeAttribute *nodePara ArkUI_AttributeItem widthItem = {widthValue, 1}; res = nodeAPI->setAttribute(stack, NODE_WIDTH, &widthItem); if (res != ARKUI_ERROR_CODE_NO_ERROR) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "createEWNode: setAttribute NODE_WIDTH failed!"); } @@ -1077,7 +1131,7 @@ int32_t EWAdapterC::SetStackSize(ArkUI_NodeHandle stack, NodeAttribute *nodePara ArkUI_AttributeItem heightItem = {heightValue, 1}; res = nodeAPI->setAttribute(stack, NODE_HEIGHT, &heightItem); if (res != ARKUI_ERROR_CODE_NO_ERROR) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "createEWNode: setAttribute NODE_HEIGHT failed!"); } } @@ -1091,7 +1145,7 @@ int32_t EWAdapterC::SetStackAlignContent(ArkUI_NodeHandle stack) ArkUI_AttributeItem alignContentItem = {alignContentValue, 1}; res = nodeAPI->setAttribute(stack, NODE_STACK_ALIGN_CONTENT, &alignContentItem); if (res != ARKUI_ERROR_CODE_NO_ERROR) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "createEWNode: setAttribute NODE_STACK_ALIGN_CONTENT failed!"); } return res; @@ -1104,7 +1158,7 @@ int32_t EWAdapterC::SetStackZIndex(ArkUI_NodeHandle stack, int zIndex) ArkUI_AttributeItem zIndexItem = {zIndexValue, 1}; res = nodeAPI->setAttribute(stack, NODE_Z_INDEX, &zIndexItem); if (res != ARKUI_ERROR_CODE_NO_ERROR) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "createEWNode: setAttribute NODE_Z_INDEX failed!"); } return res; @@ -1117,25 +1171,38 @@ int32_t EWAdapterC::SetStackPosition(ArkUI_NodeHandle stack, int x, int y) ArkUI_AttributeItem positionItem = {positionValue, 2}; res = nodeAPI->setAttribute(stack, NODE_POSITION, &positionItem); if (res != ARKUI_ERROR_CODE_NO_ERROR) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "createEWNode: setAttribute NODE_POSITION failed!"); } return res; } +int32_t EWAdapterC::SetStackHitTestMode(ArkUI_NodeHandle stack) +{ + int32_t res = ARKUI_ERROR_CODE_NO_ERROR; + ArkUI_NumberValue value[] = {{.i32 = static_cast(ARKUI_HIT_TEST_MODE_TRANSPARENT)}}; + ArkUI_AttributeItem item = {value, 1}; + res = nodeAPI->setAttribute(stack, NODE_HIT_TEST_BEHAVIOR, &item); + if (res != ARKUI_ERROR_CODE_NO_ERROR) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, + "createEWNode: setAttribute NODE_HIT_TEST_BEHAVIOR failed!"); + } + return res; +} + int32_t EWAdapterC::SetXCompontId(ArkUI_NodeHandle xc, const char* id) { int32_t res = ARKUI_ERROR_CODE_NO_ERROR; ArkUI_AttributeItem idItem = {.string = id}; res = nodeAPI->setAttribute(xc, NODE_ID, &idItem); if (res != ARKUI_ERROR_CODE_NO_ERROR) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "createEWNode: setAttribute NODE_XCOMPONENT_ID failed!"); } res = nodeAPI->setAttribute(xc, NODE_XCOMPONENT_ID, &idItem); if (res != ARKUI_ERROR_CODE_NO_ERROR) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "createEWNode: setAttribute NODE_XCOMPONENT_ID failed!"); } return res; @@ -1148,7 +1215,7 @@ int32_t EWAdapterC::SetXCompontType(ArkUI_NodeHandle xc, int type) ArkUI_AttributeItem typeItem = {typeValue, 1}; res = nodeAPI->setAttribute(xc, NODE_XCOMPONENT_TYPE, &typeItem); if (res != ARKUI_ERROR_CODE_NO_ERROR) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "createEWNode: setAttribute NODE_XCOMPONENT_TYPE failed!"); } return res; @@ -1161,7 +1228,7 @@ int32_t EWAdapterC::SetXCompontFocusable(ArkUI_NodeHandle xc) ArkUI_AttributeItem focusableItem = {focusableValue, 1}; res = nodeAPI->setAttribute(xc, NODE_FOCUSABLE, &focusableItem); if (res != ARKUI_ERROR_CODE_NO_ERROR) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "createEWNode: setAttribute NODE_FOCUSABLE failed!"); } @@ -1170,22 +1237,20 @@ int32_t EWAdapterC::SetXCompontFocusable(ArkUI_NodeHandle xc) ArkUI_AttributeItem focusOnTouchItem = {focusOnTouchValue, 1}; res = nodeAPI->setAttribute(xc, NODE_FOCUS_ON_TOUCH, &focusOnTouchItem); if (res != ARKUI_ERROR_CODE_NO_ERROR) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "createEWNode: setAttribute NODE_FOCUS_ON_TOUCH failed!"); } -#ifdef TEST_EWNODE // set background color for test - ArkUI_NumberValue xcBackgroundColor[] = {{.u32 = generateRandomHex()}}; + ArkUI_NumberValue xcBackgroundColor[] = {{.u32 = 0}}; ArkUI_AttributeItem xcBackgroundColorItem = {xcBackgroundColor, 1}; res = nodeAPI->setAttribute(xc, NODE_BACKGROUND_COLOR, &xcBackgroundColorItem); if (res != ARKUI_ERROR_CODE_NO_ERROR) { - OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EWAdapterC", + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TAG, "createEWNode: setAttribute NODE_BACKGROUND_COLOR failed!"); } -#endif return res; } -} // namespace EMBEDDED_WINDOW_ADAPTER +} // namespace SDL_EMBEDDED_WINDOW_ADAPTER diff --git a/src/core/ohos/adapter_c/AdapterC.h b/src/core/ohos/adapter_c/SDL_AdapterC.h similarity index 96% rename from src/core/ohos/adapter_c/AdapterC.h rename to src/core/ohos/adapter_c/SDL_AdapterC.h index 79d5bb2f..f5596b3a 100644 --- a/src/core/ohos/adapter_c/AdapterC.h +++ b/src/core/ohos/adapter_c/SDL_AdapterC.h @@ -26,10 +26,10 @@ #include #include -namespace EMBEDDED_WINDOW_ADAPTER { - -const unsigned int LOG_PRINT_DOMAIN = 0xFF00; +namespace SDL_EMBEDDED_WINDOW_ADAPTER { +const unsigned int LOG_PRINT_DOMAIN = 0xFF01; +#define LOG_PRINT_TAG "SDL/EWAdapterC" #define TEST_EWNODE #define EWNODE_HEX 16 #define EWNODE_BYTE 8 @@ -174,6 +174,9 @@ private: static int32_t SetXCompontType(ArkUI_NodeHandle xc, int type); static int32_t SetXCompontFocusable(ArkUI_NodeHandle xc); + static int32_t GetNodeZIndex(Node *node); + static int32_t SetStackHitTestMode(ArkUI_NodeHandle stack); + public: static ArkUI_NativeNodeAPI_1 *nodeAPI; static float scaledDensity; diff --git a/src/video/ohos/SDL_ohosvideo.c b/src/video/ohos/SDL_ohosvideo.c index 6d4e463f..18e9dccf 100644 --- a/src/video/ohos/SDL_ohosvideo.c +++ b/src/video/ohos/SDL_ohosvideo.c @@ -244,6 +244,7 @@ void OHOS_SendResize(SDL_Window *window) display->display_modes[0].h = g_ohosDeviceHeight; display->display_modes[0].refresh_rate = OHOS_ScreenRate; display->current_mode = display->display_modes[0]; + SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESIZED, g_ohosSurfaceWidth, g_ohosSurfaceHeight); } } diff --git a/src/video/ohos/SDL_ohoswindow.c b/src/video/ohos/SDL_ohoswindow.c index 4f832399..6fb19e48 100644 --- a/src/video/ohos/SDL_ohoswindow.c +++ b/src/video/ohos/SDL_ohoswindow.c @@ -79,7 +79,7 @@ int OHOS_CreateWindow(SDL_VideoDevice *thisDevice, SDL_Window * window) windowPosition->x = window->x; windowPosition->y = window->y; window->xcompentId = OHOS_GenerateNewXComponentId(); - OHOS_AddChildNode(parentWindowNode, &window->ohosHandle, window->xcompentId, windowPosition); + OHOS_NAPI_AddChildNode(parentWindowNode, &window->ohosHandle, window->xcompentId, windowPosition); SDL_free(windowPosition); } else { parentWindowNode = window->ohosHandle; @@ -130,7 +130,7 @@ void OHOS_DestroyWindow(SDL_VideoDevice *thisDevice, SDL_Window *window) if (((window->flags & SDL_WINDOW_RECREATE) == 0) && ((window->flags & SDL_WINDOW_FOREIGN_OHOS) == 0)) { if (window->xcompentId != NULL) { - OHOS_RemoveChildNode(window->xcompentId); + OHOS_NAPI_RemoveChildNode(window->xcompentId); OHOS_ClearPluginData(window->xcompentId); SDL_free(window->xcompentId); window->xcompentId = NULL; @@ -177,35 +177,35 @@ void OHOS_SetWindowResizable(SDL_VideoDevice *thisDevice, SDL_Window *window, SD void OHOS_SetWindowSize(SDL_VideoDevice *thisDevice, SDL_Window *window) { SDL_LockMutex(g_ohosPageMutex); - OHOS_ResizeNode(window->xcompentId, window->w, window->h); + OHOS_NAPI_ResizeNode(window->xcompentId, window->w, window->h); SDL_UnlockMutex(g_ohosPageMutex); } void OHOS_SetWindowPosition(SDL_VideoDevice *thisDevice, SDL_Window *window) { SDL_LockMutex(g_ohosPageMutex); - OHOS_MoveNode(window->xcompentId, window->x, window->y); + OHOS_NAPI_MoveNode(window->xcompentId, window->x, window->y); SDL_UnlockMutex(g_ohosPageMutex); } void OHOS_ShowWindow(SDL_VideoDevice *thisDevice, SDL_Window *window) { SDL_LockMutex(g_ohosPageMutex); - OHOS_ShowNode(window->xcompentId); + OHOS_NAPI_ShowNode(window->xcompentId); SDL_UnlockMutex(g_ohosPageMutex); } void OHOS_HideWindow(SDL_VideoDevice *thisDevice, SDL_Window *window) { SDL_LockMutex(g_ohosPageMutex); - OHOS_HideNode(window->xcompentId); + OHOS_NAPI_HideNode(window->xcompentId); SDL_UnlockMutex(g_ohosPageMutex); } void OHOS_RaiseWindow(SDL_VideoDevice *thisDevice, SDL_Window *window) { SDL_LockMutex(g_ohosPageMutex); - OHOS_RaiseNode(window->xcompentId); + OHOS_NAPI_RaiseNode(window->xcompentId); SDL_UnlockMutex(g_ohosPageMutex); } @@ -226,10 +226,12 @@ static void OHOS_WaitGetNativeWindow(const char *strID, pthread_t tid, SDL_Windo int cnt = OHOS_WAIT_COUNT; while (!OHOS_FindNativeWindow(nativeXComponent, windowData)) { if (cnt-- == 0) { + SDL_Log("Failed get native window."); break; } SDL_Delay(OHOS_WAIT_TIME); } + SDL_Log("Successful get native window."); } static void OHOS_SetRealWindowPosition(SDL_Window *window, SDL_WindowData *windowData) @@ -253,7 +255,7 @@ int OHOS_CreateWindowFrom(SDL_VideoDevice *thisDevice, SDL_Window *window, const windowPosition = (WindowPosition *)SDL_malloc(sizeof(WindowPosition)); OHOS_GetXComponentPos(data, windowPosition); window->xcompentId = OHOS_GenerateNewXComponentId(); - OHOS_AddChildNode(data, &window->ohosHandle, window->xcompentId, windowPosition); + OHOS_NAPI_AddChildNode(data, &window->ohosHandle, window->xcompentId, windowPosition); SDL_free(windowPosition); } -- Gitee