1e41f4b71Sopenharmony_ci# Using OH_DisplayManager to Obtain Basic Display Information and Listen for Status Changes (C/C++)
2e41f4b71Sopenharmony_ci
3e41f4b71Sopenharmony_ci## When to Use
4e41f4b71Sopenharmony_ci
5e41f4b71Sopenharmony_ciThe [OH_DisplayManager](../reference/apis-arkui/_o_h___display_manager.md) module provides functions for you to obtain the display information and listen for display status changes and folded/unfolded state changes. Applications can adapt to different UIs based on the information and changes.
6e41f4b71Sopenharmony_ci
7e41f4b71Sopenharmony_ci- The display information that can be obtained includes the resolution, physical pixel density, logical pixel density, refresh rate, size, orientation, and rotation angle of the display.
8e41f4b71Sopenharmony_ci
9e41f4b71Sopenharmony_ci- The display status changes include changes of the rotation, resolution, and refresh rate of the display.
10e41f4b71Sopenharmony_ci
11e41f4b71Sopenharmony_ci- The folded/unfolded state changes indicate whether the device is in the folded or unfolded state. A function is also provided for you to check whether a device is foldable.
12e41f4b71Sopenharmony_ci
13e41f4b71Sopenharmony_ci## Basic Concepts
14e41f4b71Sopenharmony_ci
15e41f4b71Sopenharmony_ci- Density DPI: physical pixel density, that is, the number of physical pixels per inch of the display.
16e41f4b71Sopenharmony_ci
17e41f4b71Sopenharmony_ci- Density pixels: logical pixel density, which indicates the scaling coefficient of the physical pixels and logical pixels. It is calculated by dividing the physical pixel density by 160.
18e41f4b71Sopenharmony_ci
19e41f4b71Sopenharmony_ci## Available APIs
20e41f4b71Sopenharmony_ci
21e41f4b71Sopenharmony_ciThe following table lists the common APIs. For more API description, see [OH_DisplayManager](../reference/apis-arkui/_o_h___display_manager.md).
22e41f4b71Sopenharmony_ci
23e41f4b71Sopenharmony_ci| Name| Description|
24e41f4b71Sopenharmony_ci| -------- | -------- |
25e41f4b71Sopenharmony_ci| OH_NativeDisplayManager_GetDefaultDisplayRotation(NativeDisplayManager_Rotation *displayRotation) | Obtains the rotation angle of the default display.|
26e41f4b71Sopenharmony_ci| OH_NativeDisplayManager_CreateDefaultDisplayCutoutInfo(NativeDisplayManager_CutoutInfo **cutoutInfo) | Obtains the cutout information of the default display.|
27e41f4b71Sopenharmony_ci| OH_NativeDisplayManager_DestroyDefaultDisplayCutoutInfo(NativeDisplayManager_CutoutInfo *cutoutInfo) |  Destroys the cutout information of the default display.|
28e41f4b71Sopenharmony_ci| OH_NativeDisplayManager_IsFoldable()|Checks whether the device is foldable.|
29e41f4b71Sopenharmony_ci| OH_NativeDisplayManager_RegisterDisplayChangeListener( OH_NativeDisplayManager_DisplayChangeCallback displayChangeCallback, uint32_t *listenerIndex)|Registers a listener for status changes (such as rotation, refresh rate, DPI, and resolution changes) of the display.|
30e41f4b71Sopenharmony_ci|OH_NativeDisplayManager_UnregisterDisplayChangeListener(uint32_t listenerIndex)|Cancels the listening for status changes of the display.|
31e41f4b71Sopenharmony_ci|OH_NativeDisplayManager_RegisterFoldDisplayModeChangeListener( OH_NativeDisplayManager_FoldDisplayModeChangeCallback displayModeChangeCallback, uint32_t *listenerIndex)|Registers a listener for folded/unfolded state changes of the display.|
32e41f4b71Sopenharmony_ci|OH_NativeDisplayManager_UnregisterFoldDisplayModeChangeListener(uint32_t listenerIndex)|Cancels the listening for folded/unfolded state changes of the display.|
33e41f4b71Sopenharmony_ci
34e41f4b71Sopenharmony_ci## Linking the Dynamic Link Library in the CMake Script
35e41f4b71Sopenharmony_ci
36e41f4b71Sopenharmony_ci```
37e41f4b71Sopenharmony_citarget_link_libraries(entry PUBLIC libhilog_ndk.z.so)
38e41f4b71Sopenharmony_citarget_link_libraries(entry PUBLIC libnative_display_manager.so )
39e41f4b71Sopenharmony_ci```
40e41f4b71Sopenharmony_ci
41e41f4b71Sopenharmony_ci## Including Header Files
42e41f4b71Sopenharmony_ci
43e41f4b71Sopenharmony_ci```c++
44e41f4b71Sopenharmony_ci#include <window_manager/oh_display_info.h>
45e41f4b71Sopenharmony_ci#include <window_manager/oh_display_manager.h>
46e41f4b71Sopenharmony_ci#include <hilog/log.h>
47e41f4b71Sopenharmony_ci```
48e41f4b71Sopenharmony_ci
49e41f4b71Sopenharmony_ci## Obtaining Display Information
50e41f4b71Sopenharmony_ci
51e41f4b71Sopenharmony_ci1. Call **OH_NativeDisplayManager_GetDefaultDisplayRotation** to obtain the rotation angle of the default display.
52e41f4b71Sopenharmony_ci
53e41f4b71Sopenharmony_ci   ```c++
54e41f4b71Sopenharmony_ci   #include "napi/native_api.h"
55e41f4b71Sopenharmony_ci   #include <window_manager/oh_display_info.h>
56e41f4b71Sopenharmony_ci   #include <window_manager/oh_display_manager.h>
57e41f4b71Sopenharmony_ci   #include <hilog/log.h>
58e41f4b71Sopenharmony_ci   
59e41f4b71Sopenharmony_ci   static napi_value GetDefaultDisplayRotation(napi_env env, napi_callback_info info)
60e41f4b71Sopenharmony_ci   {
61e41f4b71Sopenharmony_ci       NativeDisplayManager_Rotation displayRotation;
62e41f4b71Sopenharmony_ci       NativeDisplayManager_ErrorCode errCode = OH_NativeDisplayManager_GetDefaultDisplayRotation(&displayRotation);
63e41f4b71Sopenharmony_ci       if (errCode == NativeDisplayManager_ErrorCode::DISPLAY_MANAGER_OK) {
64e41f4b71Sopenharmony_ci           napi_value rotation;
65e41f4b71Sopenharmony_ci           napi_create_int32(env, displayRotation, &rotation);
66e41f4b71Sopenharmony_ci           return rotation;
67e41f4b71Sopenharmony_ci       } else {
68e41f4b71Sopenharmony_ci           napi_value errorCode;
69e41f4b71Sopenharmony_ci           napi_create_int32(env, errCode, &errorCode);
70e41f4b71Sopenharmony_ci           return errorCode;  
71e41f4b71Sopenharmony_ci       }
72e41f4b71Sopenharmony_ci   }
73e41f4b71Sopenharmony_ci   
74e41f4b71Sopenharmony_ci   EXTERN_C_START
75e41f4b71Sopenharmony_ci   static napi_value Init(napi_env env, napi_value exports) {
76e41f4b71Sopenharmony_ci       napi_property_descriptor desc[] = {
77e41f4b71Sopenharmony_ci          {"getDisplayRotation", nullptr, GetDefaultDisplayRotation, nullptr, nullptr, nullptr, napi_default, nullptr},
78e41f4b71Sopenharmony_ci       };
79e41f4b71Sopenharmony_ci       napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
80e41f4b71Sopenharmony_ci       return exports;
81e41f4b71Sopenharmony_ci   }
82e41f4b71Sopenharmony_ci   EXTERN_C_END
83e41f4b71Sopenharmony_ci   ```
84e41f4b71Sopenharmony_ci
85e41f4b71Sopenharmony_ci2. Call **OH_NativeDisplayManager_CreateDefaultDisplayCutoutInfo** to obtain the cutout information of the default display. Call **OH_NativeDisplayManager_DestroyDefaultDisplayCutoutInfo** to destroy the cutout information.
86e41f4b71Sopenharmony_ci
87e41f4b71Sopenharmony_ci   ```c++
88e41f4b71Sopenharmony_ci   #include "napi/native_api.h"
89e41f4b71Sopenharmony_ci   #include <window_manager/oh_display_info.h>
90e41f4b71Sopenharmony_ci   #include <window_manager/oh_display_manager.h>
91e41f4b71Sopenharmony_ci   #include <hilog/log.h>
92e41f4b71Sopenharmony_ci   
93e41f4b71Sopenharmony_ci   static napi_value CreateDefaultDisplayCutoutInfo(napi_env env, napi_callback_info info)
94e41f4b71Sopenharmony_ci   {
95e41f4b71Sopenharmony_ci       NativeDisplayManager_CutoutInfo *cutOutInfo = NULL;
96e41f4b71Sopenharmony_ci       NativeDisplayManager_ErrorCode errCode = OH_NativeDisplayManager_CreateDefaultDisplayCutoutInfo(&cutOutInfo);
97e41f4b71Sopenharmony_ci       OH_LOG_INFO(LOG_APP, "GetDefaultCutoutInfo errCode=%{public}d", errCode);
98e41f4b71Sopenharmony_ci       if (errCode == NativeDisplayManager_ErrorCode::DISPLAY_MANAGER_OK) {
99e41f4b71Sopenharmony_ci           if (cutOutInfo != NULL && cutOutInfo->boundingRectsLength != 0) {
100e41f4b71Sopenharmony_ci               OH_LOG_INFO(LOG_APP, "GetDefaultCutoutInfo cutOutInfo length=%{public}d", cutOutInfo->boundingRectsLength);
101e41f4b71Sopenharmony_ci               for (int i = 0; i < cutOutInfo->boundingRectsLength; i++) {
102e41f4b71Sopenharmony_ci                   OH_LOG_INFO(LOG_APP, "cutOutInfo[%{public}d]=[%{public}d %{public}d %{public}d %{public}d]",
103e41f4b71Sopenharmony_ci                       i, cutOutInfo->boundingRects[i].left, cutOutInfo->boundingRects[i].top,
104e41f4b71Sopenharmony_ci                       cutOutInfo->boundingRects[i].width, cutOutInfo->boundingRects[i].height);
105e41f4b71Sopenharmony_ci               }
106e41f4b71Sopenharmony_ci               OH_LOG_INFO(LOG_APP, "cutOutInfo waterfall left rect=[%{public}d %{public}d %{public}d %{public}d]",
107e41f4b71Sopenharmony_ci               cutOutInfo->waterfallDisplayAreaRects.left.left, cutOutInfo->waterfallDisplayAreaRects.left.top,
108e41f4b71Sopenharmony_ci               cutOutInfo->waterfallDisplayAreaRects.left.left, cutOutInfo->waterfallDisplayAreaRects.left.left);
109e41f4b71Sopenharmony_ci               OH_LOG_INFO(LOG_APP, "cutOutInfo waterfall top rect=[%{public}d %{public}d %{public}d %{public}d]",
110e41f4b71Sopenharmony_ci               cutOutInfo->waterfallDisplayAreaRects.top.left, cutOutInfo->waterfallDisplayAreaRects.top.top,
111e41f4b71Sopenharmony_ci               cutOutInfo->waterfallDisplayAreaRects.top.left, cutOutInfo->waterfallDisplayAreaRects.top.left);
112e41f4b71Sopenharmony_ci               OH_LOG_INFO(LOG_APP, "cutOutInfo waterfall right rect=[%{public}d %{public}d %{public}d %{public}d]",
113e41f4b71Sopenharmony_ci               cutOutInfo->waterfallDisplayAreaRects.right.left, cutOutInfo->waterfallDisplayAreaRects.right.top,
114e41f4b71Sopenharmony_ci               cutOutInfo->waterfallDisplayAreaRects.right.left, cutOutInfo->waterfallDisplayAreaRects.right.left);
115e41f4b71Sopenharmony_ci               OH_LOG_INFO(LOG_APP, "cutOutInfo waterfall bottom rect=[%{public}d %{public}d %{public}d %{public}d]",
116e41f4b71Sopenharmony_ci               cutOutInfo->waterfallDisplayAreaRects.bottom.left, cutOutInfo->waterfallDisplayAreaRects.bottom.top,
117e41f4b71Sopenharmony_ci               cutOutInfo->waterfallDisplayAreaRects.bottom.left, cutOutInfo->waterfallDisplayAreaRects.bottom.left);            
118e41f4b71Sopenharmony_ci           }
119e41f4b71Sopenharmony_ci           napi_value boundingRectsLength;
120e41f4b71Sopenharmony_ci           napi_create_int32(env, cutOutInfo->boundingRectsLength, &boundingRectsLength);
121e41f4b71Sopenharmony_ci           OH_NativeDisplayManager_DestroyDefaultDisplayCutoutInfo(cutOutInfo);   
122e41f4b71Sopenharmony_ci           return boundingRectsLength;
123e41f4b71Sopenharmony_ci       } else {
124e41f4b71Sopenharmony_ci           napi_value errorCode;
125e41f4b71Sopenharmony_ci           napi_create_int32(env, errCode, &errorCode);
126e41f4b71Sopenharmony_ci           return errorCode;  
127e41f4b71Sopenharmony_ci       }
128e41f4b71Sopenharmony_ci   }
129e41f4b71Sopenharmony_ci   
130e41f4b71Sopenharmony_ci   EXTERN_C_START
131e41f4b71Sopenharmony_ci   static napi_value Init(napi_env env, napi_value exports) {
132e41f4b71Sopenharmony_ci       napi_property_descriptor desc[] = {
133e41f4b71Sopenharmony_ci           {"getCutoutInfo", nullptr, CreateDefaultDisplayCutoutInfo, nullptr, nullptr, nullptr, napi_default, nullptr},
134e41f4b71Sopenharmony_ci       };
135e41f4b71Sopenharmony_ci       napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
136e41f4b71Sopenharmony_ci       return exports;
137e41f4b71Sopenharmony_ci   }
138e41f4b71Sopenharmony_ci   EXTERN_C_END
139e41f4b71Sopenharmony_ci   ```
140e41f4b71Sopenharmony_ci
141e41f4b71Sopenharmony_ci
142e41f4b71Sopenharmony_ci
143e41f4b71Sopenharmony_ci## Listening for Display Status Changes
144e41f4b71Sopenharmony_ci
145e41f4b71Sopenharmony_ciCall **OH_NativeDisplayManager_RegisterDisplayChangeListener** to register a listener for display status changes, including the rotation, resolution, refresh rate, and DPI changes. Call **OH_NativeDisplayManager_UnregisterDisplayChangeListener** to cancel the listening for the display status changes.
146e41f4b71Sopenharmony_ci
147e41f4b71Sopenharmony_ci```c++
148e41f4b71Sopenharmony_ci#include "napi/native_api.h"
149e41f4b71Sopenharmony_ci#include <window_manager/oh_display_info.h>
150e41f4b71Sopenharmony_ci#include <window_manager/oh_display_manager.h>
151e41f4b71Sopenharmony_ci#include <hilog/log.h>
152e41f4b71Sopenharmony_ci
153e41f4b71Sopenharmony_civoid DisplayChangeCallback(uint64_t displayId)
154e41f4b71Sopenharmony_ci{
155e41f4b71Sopenharmony_ci    OH_LOG_INFO(LOG_APP, "DisplayChangeCallback displayId=%{public}lu.", displayId);
156e41f4b71Sopenharmony_ci}
157e41f4b71Sopenharmony_ci
158e41f4b71Sopenharmony_cistatic napi_value RegisterDisplayChangeListener(napi_env env, napi_callback_info info)
159e41f4b71Sopenharmony_ci{
160e41f4b71Sopenharmony_ci    uint32_t listenerIndex;
161e41f4b71Sopenharmony_ci    NativeDisplayManager_ErrorCode errCode = OH_NativeDisplayManager_RegisterDisplayChangeListener(
162e41f4b71Sopenharmony_ci        DisplayChangeCallback, &listenerIndex);
163e41f4b71Sopenharmony_ci    OH_LOG_INFO(LOG_APP, "RegisterDisplayChangeListener listenerIndex =%{public}d errCode=%{public}d.",
164e41f4b71Sopenharmony_ci        listenerIndex, errCode);
165e41f4b71Sopenharmony_ci    if (errCode == NativeDisplayManager_ErrorCode::DISPLAY_MANAGER_OK) {
166e41f4b71Sopenharmony_ci        napi_value registerIndex;
167e41f4b71Sopenharmony_ci        napi_create_int32(env, listenerIndex, &registerIndex);
168e41f4b71Sopenharmony_ci        return registerIndex;
169e41f4b71Sopenharmony_ci    } else {
170e41f4b71Sopenharmony_ci        napi_value errorCode;
171e41f4b71Sopenharmony_ci        napi_create_int32(env, errCode, &errorCode);
172e41f4b71Sopenharmony_ci        return errorCode;  
173e41f4b71Sopenharmony_ci    }
174e41f4b71Sopenharmony_ci}
175e41f4b71Sopenharmony_ci
176e41f4b71Sopenharmony_cistatic napi_value UnregisterDisplayChangeListener(napi_env env, napi_callback_info info)
177e41f4b71Sopenharmony_ci{
178e41f4b71Sopenharmony_ci    size_t argc = 1;
179e41f4b71Sopenharmony_ci    napi_value args[1] = { nullptr };
180e41f4b71Sopenharmony_ci
181e41f4b71Sopenharmony_ci    uint32_t listenerIndex;
182e41f4b71Sopenharmony_ci    napi_get_cb_info(env, info, &argc, args , nullptr, nullptr);
183e41f4b71Sopenharmony_ci    napi_get_value_uint32(env, args[0], &listenerIndex);
184e41f4b71Sopenharmony_ci    OH_LOG_INFO(LOG_APP, "UnregisterDisplayChangeListener listenerIndex =%{public}d.", listenerIndex);
185e41f4b71Sopenharmony_ci    NativeDisplayManager_ErrorCode errCode = OH_NativeDisplayManager_UnregisterDisplayChangeListener(listenerIndex);
186e41f4b71Sopenharmony_ci    OH_LOG_INFO(LOG_APP, "UnregisterDisplayChangeListener errCode=%{public}d.", errCode);
187e41f4b71Sopenharmony_ci    napi_value errorCode;
188e41f4b71Sopenharmony_ci    napi_create_int32(env, errCode, &errorCode);
189e41f4b71Sopenharmony_ci    return errorCode;
190e41f4b71Sopenharmony_ci}
191e41f4b71Sopenharmony_ci
192e41f4b71Sopenharmony_ciEXTERN_C_START
193e41f4b71Sopenharmony_cistatic napi_value Init(napi_env env, napi_value exports) {
194e41f4b71Sopenharmony_ci    napi_property_descriptor desc[] = {
195e41f4b71Sopenharmony_ci        {"registerDisplayChange", nullptr, RegisterDisplayChangeListener, nullptr, nullptr, nullptr, napi_default, nullptr},
196e41f4b71Sopenharmony_ci        {"unregisterDisplayChange", nullptr, UnregisterDisplayChangeListener, nullptr, nullptr, nullptr,
197e41f4b71Sopenharmony_ci            napi_default, nullptr},
198e41f4b71Sopenharmony_ci    };
199e41f4b71Sopenharmony_ci    napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
200e41f4b71Sopenharmony_ci    return exports;
201e41f4b71Sopenharmony_ci}
202e41f4b71Sopenharmony_ciEXTERN_C_END
203e41f4b71Sopenharmony_ci
204e41f4b71Sopenharmony_ci```
205e41f4b71Sopenharmony_ci
206e41f4b71Sopenharmony_ci## Listening for Folded/Unfolded State Changes
207e41f4b71Sopenharmony_ci
208e41f4b71Sopenharmony_ci1. Call **OH_NativeDisplayManager_IsFoldable** to check whether a device is foldable.
209e41f4b71Sopenharmony_ci
210e41f4b71Sopenharmony_ci   ```c++
211e41f4b71Sopenharmony_ci   #include "napi/native_api.h"
212e41f4b71Sopenharmony_ci   #include <window_manager/oh_display_info.h>
213e41f4b71Sopenharmony_ci   #include <window_manager/oh_display_manager.h>
214e41f4b71Sopenharmony_ci   #include <hilog/log.h>
215e41f4b71Sopenharmony_ci   
216e41f4b71Sopenharmony_ci   static napi_value IsFoldable(napi_env env, napi_callback_info info)
217e41f4b71Sopenharmony_ci   {
218e41f4b71Sopenharmony_ci       bool isFoldDevice = OH_NativeDisplayManager_IsFoldable();
219e41f4b71Sopenharmony_ci       OH_LOG_INFO(LOG_APP, "IsFoldable isFoldDevice =%{public}d.", isFoldDevice);
220e41f4b71Sopenharmony_ci       napi_value isFold;
221e41f4b71Sopenharmony_ci       napi_get_boolean(env, isFoldDevice, &isFold);
222e41f4b71Sopenharmony_ci       return isFold;
223e41f4b71Sopenharmony_ci   }
224e41f4b71Sopenharmony_ci   
225e41f4b71Sopenharmony_ci   EXTERN_C_START
226e41f4b71Sopenharmony_ci   static napi_value Init(napi_env env, napi_value exports) {
227e41f4b71Sopenharmony_ci       napi_property_descriptor desc[] = {
228e41f4b71Sopenharmony_ci           {"checkIsFoldDevice", nullptr, IsFoldable, nullptr, nullptr, nullptr, napi_default, nullptr},
229e41f4b71Sopenharmony_ci       };
230e41f4b71Sopenharmony_ci       napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
231e41f4b71Sopenharmony_ci       return exports;
232e41f4b71Sopenharmony_ci   }
233e41f4b71Sopenharmony_ci   EXTERN_C_END
234e41f4b71Sopenharmony_ci   ```
235e41f4b71Sopenharmony_ci2. Call **OH_NativeDisplayManager_RegisterFoldDisplayModeChangeListener** to register a listener for folded/unfolded state changes of the display. Call **OH_NativeDisplayManager_UnregisterFoldDisplayModeChangeListener** to cancel the listening for the folded/unfolded state changes.
236e41f4b71Sopenharmony_ci
237e41f4b71Sopenharmony_ci   ```c++
238e41f4b71Sopenharmony_ci   #include "napi/native_api.h"
239e41f4b71Sopenharmony_ci   #include <window_manager/oh_display_info.h>
240e41f4b71Sopenharmony_ci   #include <window_manager/oh_display_manager.h>
241e41f4b71Sopenharmony_ci   #include <hilog/log.h>
242e41f4b71Sopenharmony_ci   
243e41f4b71Sopenharmony_ci   void FoldDisplayModeChangeCallback(NativeDisplayManager_FoldDisplayMode displayMode)
244e41f4b71Sopenharmony_ci   {
245e41f4b71Sopenharmony_ci       OH_LOG_INFO(LOG_APP, "displayMode=%{public}d.", displayMode);
246e41f4b71Sopenharmony_ci   }
247e41f4b71Sopenharmony_ci   
248e41f4b71Sopenharmony_ci   static napi_value RegisterFoldDisplayModeChangeListener(napi_env env, napi_callback_info info)
249e41f4b71Sopenharmony_ci   {
250e41f4b71Sopenharmony_ci       uint32_t listenerIndex = 0;
251e41f4b71Sopenharmony_ci       NativeDisplayManager_ErrorCode errCode = OH_NativeDisplayManager_RegisterFoldDisplayModeChangeListener(
252e41f4b71Sopenharmony_ci           FoldDisplayModeChangeCallback, &listenerIndex);
253e41f4b71Sopenharmony_ci       OH_LOG_INFO(LOG_APP, "listenerIndex =%{public}d errCode=%{public}d.",
254e41f4b71Sopenharmony_ci           listenerIndex, errCode);
255e41f4b71Sopenharmony_ci       if (errCode == NativeDisplayManager_ErrorCode::DISPLAY_MANAGER_OK) {
256e41f4b71Sopenharmony_ci           napi_value registerIndex;
257e41f4b71Sopenharmony_ci           napi_create_int32(env, listenerIndex, &registerIndex);
258e41f4b71Sopenharmony_ci           return registerIndex;
259e41f4b71Sopenharmony_ci       } else {
260e41f4b71Sopenharmony_ci           napi_value errorCode;
261e41f4b71Sopenharmony_ci           napi_create_int32(env, errCode, &errorCode);
262e41f4b71Sopenharmony_ci           return errorCode;  
263e41f4b71Sopenharmony_ci       }
264e41f4b71Sopenharmony_ci   }
265e41f4b71Sopenharmony_ci   
266e41f4b71Sopenharmony_ci   static napi_value UnregisterFoldDisplayModeChangeListener(napi_env env, napi_callback_info info)
267e41f4b71Sopenharmony_ci   {
268e41f4b71Sopenharmony_ci       size_t argc = 1;
269e41f4b71Sopenharmony_ci       napi_value args[1] = { nullptr };
270e41f4b71Sopenharmony_ci       uint32_t listenerIndex;
271e41f4b71Sopenharmony_ci       napi_get_cb_info(env, info, &argc, args , nullptr, nullptr);
272e41f4b71Sopenharmony_ci       napi_get_value_uint32(env, args[0], &listenerIndex);
273e41f4b71Sopenharmony_ci       OH_LOG_INFO(LOG_APP, "listenerIndex =%{public}d.", listenerIndex);
274e41f4b71Sopenharmony_ci       NativeDisplayManager_ErrorCode errCode = OH_NativeDisplayManager_UnregisterFoldDisplayModeChangeListener(listenerIndex);
275e41f4b71Sopenharmony_ci       OH_LOG_INFO(LOG_APP, "errorCode=%{public}d", errCode);
276e41f4b71Sopenharmony_ci       napi_value errorCode;
277e41f4b71Sopenharmony_ci       napi_create_int32(env, errCode, &errorCode);
278e41f4b71Sopenharmony_ci       return errorCode;
279e41f4b71Sopenharmony_ci   }
280e41f4b71Sopenharmony_ci   
281e41f4b71Sopenharmony_ci   EXTERN_C_START
282e41f4b71Sopenharmony_ci   static napi_value Init(napi_env env, napi_value exports) {
283e41f4b71Sopenharmony_ci       napi_property_descriptor desc[] = {
284e41f4b71Sopenharmony_ci       { "registerFoldDisplayModeChange", nullptr, RegisterFoldDisplayModeChangeListener, nullptr, nullptr, nullptr,
285e41f4b71Sopenharmony_ci           napi_default, nullptr },
286e41f4b71Sopenharmony_ci       { "unregisterFoldDisplayModeChange", nullptr, UnregisterFoldDisplayModeChangeListener, nullptr, nullptr,
287e41f4b71Sopenharmony_ci           nullptr, napi_default, nullptr },
288e41f4b71Sopenharmony_ci       };
289e41f4b71Sopenharmony_ci       napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
290e41f4b71Sopenharmony_ci       return exports;
291e41f4b71Sopenharmony_ci   }
292e41f4b71Sopenharmony_ci   EXTERN_C_END
293e41f4b71Sopenharmony_ci   ```
294