@lynx-js/lynx-library-headers 0.0.1-alpha.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +53 -0
- package/include/base/include/value/lynx_api_types.h +57 -0
- package/include/base/include/value/lynx_value_api.h +204 -0
- package/include/base/include/value/lynx_value_types.h +73 -0
- package/include/capi/lynx_env_capi.h +47 -0
- package/include/capi/lynx_event_reporter_service_capi.h +67 -0
- package/include/capi/lynx_export.h +27 -0
- package/include/capi/lynx_extension_module_capi.h +148 -0
- package/include/capi/lynx_extension_module_types_capi.h +17 -0
- package/include/capi/lynx_generic_resource_fetcher_capi.h +124 -0
- package/include/capi/lynx_group_capi.h +42 -0
- package/include/capi/lynx_http_service_capi.h +113 -0
- package/include/capi/lynx_load_meta_capi.h +52 -0
- package/include/capi/lynx_log_capi.h +69 -0
- package/include/capi/lynx_memory_capi.h +28 -0
- package/include/capi/lynx_native_module_capi.h +51 -0
- package/include/capi/lynx_native_view_capi.h +163 -0
- package/include/capi/lynx_resource_request_capi.h +71 -0
- package/include/capi/lynx_resource_response_capi.h +92 -0
- package/include/capi/lynx_runtime_lifecycle_observer_capi.h +62 -0
- package/include/capi/lynx_security_service_capi.h +52 -0
- package/include/capi/lynx_service_center_capi.h +50 -0
- package/include/capi/lynx_template_bundle_capi.h +39 -0
- package/include/capi/lynx_template_data_capi.h +33 -0
- package/include/capi/lynx_trace_capi.h +62 -0
- package/include/capi/lynx_trail_service_capi.h +35 -0
- package/include/capi/lynx_types.h +750 -0
- package/include/capi/lynx_update_meta_capi.h +33 -0
- package/include/capi/lynx_view_builder_capi.h +113 -0
- package/include/capi/lynx_view_capi.h +174 -0
- package/include/capi/lynx_view_client_capi.h +81 -0
- package/include/capi/lynx_vsync_monitor_capi.h +38 -0
- package/include/capi/lynx_windowless_renderer_capi.h +213 -0
- package/include/js_native_api.h +608 -0
- package/include/js_native_api_types.h +202 -0
- package/include/lynx/base/include/value/lynx_api_types.h +57 -0
- package/include/lynx/base/include/value/lynx_value_api.h +204 -0
- package/include/lynx/base/include/value/lynx_value_types.h +73 -0
- package/include/lynx/extension.h +6 -0
- package/include/lynx/platform/embedder/public/capi/lynx_env_capi.h +47 -0
- package/include/lynx/platform/embedder/public/capi/lynx_event_reporter_service_capi.h +67 -0
- package/include/lynx/platform/embedder/public/capi/lynx_export.h +27 -0
- package/include/lynx/platform/embedder/public/capi/lynx_extension_module_capi.h +148 -0
- package/include/lynx/platform/embedder/public/capi/lynx_extension_module_types_capi.h +17 -0
- package/include/lynx/platform/embedder/public/capi/lynx_generic_resource_fetcher_capi.h +124 -0
- package/include/lynx/platform/embedder/public/capi/lynx_group_capi.h +42 -0
- package/include/lynx/platform/embedder/public/capi/lynx_http_service_capi.h +113 -0
- package/include/lynx/platform/embedder/public/capi/lynx_load_meta_capi.h +52 -0
- package/include/lynx/platform/embedder/public/capi/lynx_log_capi.h +69 -0
- package/include/lynx/platform/embedder/public/capi/lynx_memory_capi.h +28 -0
- package/include/lynx/platform/embedder/public/capi/lynx_native_module_capi.h +51 -0
- package/include/lynx/platform/embedder/public/capi/lynx_native_view_capi.h +163 -0
- package/include/lynx/platform/embedder/public/capi/lynx_resource_request_capi.h +71 -0
- package/include/lynx/platform/embedder/public/capi/lynx_resource_response_capi.h +92 -0
- package/include/lynx/platform/embedder/public/capi/lynx_runtime_lifecycle_observer_capi.h +62 -0
- package/include/lynx/platform/embedder/public/capi/lynx_security_service_capi.h +52 -0
- package/include/lynx/platform/embedder/public/capi/lynx_service_center_capi.h +50 -0
- package/include/lynx/platform/embedder/public/capi/lynx_template_bundle_capi.h +39 -0
- package/include/lynx/platform/embedder/public/capi/lynx_template_data_capi.h +33 -0
- package/include/lynx/platform/embedder/public/capi/lynx_trace_capi.h +62 -0
- package/include/lynx/platform/embedder/public/capi/lynx_trail_service_capi.h +35 -0
- package/include/lynx/platform/embedder/public/capi/lynx_types.h +750 -0
- package/include/lynx/platform/embedder/public/capi/lynx_update_meta_capi.h +33 -0
- package/include/lynx/platform/embedder/public/capi/lynx_view_builder_capi.h +113 -0
- package/include/lynx/platform/embedder/public/capi/lynx_view_capi.h +174 -0
- package/include/lynx/platform/embedder/public/capi/lynx_view_client_capi.h +81 -0
- package/include/lynx/platform/embedder/public/capi/lynx_vsync_monitor_capi.h +38 -0
- package/include/lynx/platform/embedder/public/capi/lynx_windowless_renderer_capi.h +213 -0
- package/include/lynx/platform/embedder/public/lynx_env.h +104 -0
- package/include/lynx/platform/embedder/public/lynx_event_reporter_service.h +96 -0
- package/include/lynx/platform/embedder/public/lynx_event_simulation_proxy.h +31 -0
- package/include/lynx/platform/embedder/public/lynx_extension_module.h +521 -0
- package/include/lynx/platform/embedder/public/lynx_generic_resource_fetcher.h +178 -0
- package/include/lynx/platform/embedder/public/lynx_group.h +70 -0
- package/include/lynx/platform/embedder/public/lynx_http_service.h +211 -0
- package/include/lynx/platform/embedder/public/lynx_load_meta.h +120 -0
- package/include/lynx/platform/embedder/public/lynx_native_module.h +9 -0
- package/include/lynx/platform/embedder/public/lynx_native_view.h +201 -0
- package/include/lynx/platform/embedder/public/lynx_resource_request.h +56 -0
- package/include/lynx/platform/embedder/public/lynx_resource_response.h +63 -0
- package/include/lynx/platform/embedder/public/lynx_runtime_lifecycle_observer.h +102 -0
- package/include/lynx/platform/embedder/public/lynx_security_service.h +78 -0
- package/include/lynx/platform/embedder/public/lynx_service_center.h +64 -0
- package/include/lynx/platform/embedder/public/lynx_template_bundle.h +65 -0
- package/include/lynx/platform/embedder/public/lynx_template_data.h +104 -0
- package/include/lynx/platform/embedder/public/lynx_trail_service.h +81 -0
- package/include/lynx/platform/embedder/public/lynx_update_meta.h +56 -0
- package/include/lynx/platform/embedder/public/lynx_value.h +270 -0
- package/include/lynx/platform/embedder/public/lynx_view.h +364 -0
- package/include/lynx/platform/embedder/public/lynx_view_client.h +226 -0
- package/include/lynx/platform/embedder/public/lynx_vsync_monitor.h +70 -0
- package/include/lynx/platform/embedder/public/lynx_windowless_renderer.h +302 -0
- package/include/lynx/registration.h +178 -0
- package/include/lynx_env.h +104 -0
- package/include/lynx_event_reporter_service.h +96 -0
- package/include/lynx_event_simulation_proxy.h +31 -0
- package/include/lynx_extension.h +10 -0
- package/include/lynx_extension_module.h +521 -0
- package/include/lynx_generic_resource_fetcher.h +178 -0
- package/include/lynx_group.h +70 -0
- package/include/lynx_http_service.h +211 -0
- package/include/lynx_load_meta.h +120 -0
- package/include/lynx_native_module.h +9 -0
- package/include/lynx_native_view.h +201 -0
- package/include/lynx_resource_request.h +56 -0
- package/include/lynx_resource_response.h +63 -0
- package/include/lynx_runtime_lifecycle_observer.h +102 -0
- package/include/lynx_security_service.h +78 -0
- package/include/lynx_service_center.h +64 -0
- package/include/lynx_template_bundle.h +65 -0
- package/include/lynx_template_data.h +104 -0
- package/include/lynx_trail_service.h +81 -0
- package/include/lynx_update_meta.h +56 -0
- package/include/lynx_value.h +270 -0
- package/include/lynx_view.h +364 -0
- package/include/lynx_view_client.h +226 -0
- package/include/lynx_vsync_monitor.h +70 -0
- package/include/lynx_windowless_renderer.h +302 -0
- package/include/napi-inl.deprecated.h +186 -0
- package/include/napi-inl.h +6607 -0
- package/include/napi.h +3208 -0
- package/include/node_api.h +276 -0
- package/include/node_api_types.h +59 -0
- package/include/third_party/weak-node-api/headers/js_native_api.h +608 -0
- package/include/third_party/weak-node-api/headers/js_native_api_types.h +202 -0
- package/include/third_party/weak-node-api/headers/napi-inl.deprecated.h +186 -0
- package/include/third_party/weak-node-api/headers/napi-inl.h +6607 -0
- package/include/third_party/weak-node-api/headers/napi.h +3208 -0
- package/include/third_party/weak-node-api/headers/node_api.h +276 -0
- package/include/third_party/weak-node-api/headers/node_api_types.h +59 -0
- package/include/third_party/weak-node-api/headers/weak_napi_defines.h +331 -0
- package/include/third_party/weak-node-api/headers/weak_napi_undefs.h +282 -0
- package/include/weak_napi_defines.h +331 -0
- package/include/weak_napi_undefs.h +282 -0
- package/package.json +29 -0
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
// Copyright 2025 The Lynx Authors. All rights reserved.
|
|
2
|
+
// Licensed under the Apache License Version 2.0 that can be found in the
|
|
3
|
+
// LICENSE file in the root directory of this source tree.
|
|
4
|
+
#ifndef PLATFORM_EMBEDDER_PUBLIC_LYNX_VIEW_CLIENT_H_
|
|
5
|
+
#define PLATFORM_EMBEDDER_PUBLIC_LYNX_VIEW_CLIENT_H_
|
|
6
|
+
|
|
7
|
+
#include "capi/lynx_view_client_capi.h"
|
|
8
|
+
|
|
9
|
+
namespace lynx {
|
|
10
|
+
namespace pub {
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @apidoc
|
|
14
|
+
* @brief A client that provides callbacks for `LynxView`'s lifecycle and other
|
|
15
|
+
* events.
|
|
16
|
+
*/
|
|
17
|
+
class LynxViewClient {
|
|
18
|
+
public:
|
|
19
|
+
static LynxViewClient* Unwrap(lynx_view_client_t* client) {
|
|
20
|
+
return static_cast<LynxViewClient*>(lynx_view_client_get_user_data(client));
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
LynxViewClient() : client_(lynx_view_client_create(this)) {
|
|
24
|
+
// Bind callbacks to lynx_view_client_t.
|
|
25
|
+
lynx_view_client_bind_on_page_start(
|
|
26
|
+
client_, [](lynx_view_client_t* client, const char* url) {
|
|
27
|
+
auto* wrapper = LynxViewClient::Unwrap(client);
|
|
28
|
+
if (wrapper) {
|
|
29
|
+
wrapper->OnPageStart(url);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
lynx_view_client_bind_on_load_success(
|
|
33
|
+
client_, [](lynx_view_client_t* client) {
|
|
34
|
+
auto* wrapper = LynxViewClient::Unwrap(client);
|
|
35
|
+
if (wrapper) {
|
|
36
|
+
wrapper->OnLoadSuccess();
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
lynx_view_client_bind_on_first_screen(
|
|
40
|
+
client_, [](lynx_view_client_t* client) {
|
|
41
|
+
auto* wrapper = LynxViewClient::Unwrap(client);
|
|
42
|
+
if (wrapper) {
|
|
43
|
+
wrapper->OnFirstScreen();
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
lynx_view_client_bind_on_page_updated(
|
|
47
|
+
client_, [](lynx_view_client_t* client) {
|
|
48
|
+
auto* wrapper = LynxViewClient::Unwrap(client);
|
|
49
|
+
if (wrapper) {
|
|
50
|
+
wrapper->OnPageUpdated();
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
lynx_view_client_bind_on_data_updated(
|
|
54
|
+
client_, [](lynx_view_client_t* client) {
|
|
55
|
+
auto* wrapper = LynxViewClient::Unwrap(client);
|
|
56
|
+
if (wrapper) {
|
|
57
|
+
wrapper->OnDataUpdated();
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
lynx_view_client_bind_on_destroy(client_, [](lynx_view_client_t* client) {
|
|
61
|
+
auto* wrapper = LynxViewClient::Unwrap(client);
|
|
62
|
+
if (wrapper) {
|
|
63
|
+
wrapper->OnDestroy();
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
lynx_view_client_bind_on_runtime_ready(
|
|
67
|
+
client_, [](lynx_view_client_t* client) {
|
|
68
|
+
auto* wrapper = LynxViewClient::Unwrap(client);
|
|
69
|
+
if (wrapper) {
|
|
70
|
+
wrapper->OnRuntimeReady();
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
lynx_view_client_bind_on_received_error(
|
|
74
|
+
client_,
|
|
75
|
+
[](lynx_view_client_t* client, int error_code, const char* message) {
|
|
76
|
+
auto* wrapper = LynxViewClient::Unwrap(client);
|
|
77
|
+
if (wrapper) {
|
|
78
|
+
wrapper->OnReceivedError(error_code, message);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
lynx_view_client_bind_on_timing_setup(
|
|
82
|
+
client_, [](lynx_view_client_t* client, const char* timing_info) {
|
|
83
|
+
auto* wrapper = LynxViewClient::Unwrap(client);
|
|
84
|
+
if (wrapper) {
|
|
85
|
+
wrapper->OnTimingSetup(timing_info);
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
lynx_view_client_bind_on_timing_update(
|
|
89
|
+
client_, [](lynx_view_client_t* client, const char* timing_info,
|
|
90
|
+
const char* update_timing, const char* update_flag) {
|
|
91
|
+
auto* wrapper = LynxViewClient::Unwrap(client);
|
|
92
|
+
if (wrapper) {
|
|
93
|
+
wrapper->OnTimingUpdate(timing_info, update_timing, update_flag);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
lynx_view_client_bind_on_enter_foreground(
|
|
97
|
+
client_, [](lynx_view_client_t* client) {
|
|
98
|
+
auto* wrapper = LynxViewClient::Unwrap(client);
|
|
99
|
+
if (wrapper) {
|
|
100
|
+
wrapper->OnEnterForeground();
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
lynx_view_client_bind_on_enter_background(
|
|
104
|
+
client_, [](lynx_view_client_t* client) {
|
|
105
|
+
auto* wrapper = LynxViewClient::Unwrap(client);
|
|
106
|
+
if (wrapper) {
|
|
107
|
+
wrapper->OnEnterBackground();
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
lynx_view_client_bind_on_frame_timing(
|
|
111
|
+
client_, [](lynx_view_client_t* client, int64_t frame_start_time_in_ns,
|
|
112
|
+
int64_t frame_finish_time_in_ns) {
|
|
113
|
+
auto* wrapper = LynxViewClient::Unwrap(client);
|
|
114
|
+
if (wrapper) {
|
|
115
|
+
wrapper->OnFrameTiming(frame_start_time_in_ns,
|
|
116
|
+
frame_finish_time_in_ns);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
virtual ~LynxViewClient() { lynx_view_client_release(client_); }
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* @apidoc
|
|
124
|
+
* @brief Called when page start loading.
|
|
125
|
+
* @param url The page URL
|
|
126
|
+
*/
|
|
127
|
+
virtual void OnPageStart(const char* url) {}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* @apidoc
|
|
131
|
+
* @brief Called when page load finish.
|
|
132
|
+
*/
|
|
133
|
+
virtual void OnLoadSuccess() {}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* @apidoc
|
|
137
|
+
* @brief Called when first screen layout completed.
|
|
138
|
+
*/
|
|
139
|
+
virtual void OnFirstScreen() {}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* @apidoc
|
|
143
|
+
* @brief Called when page update.
|
|
144
|
+
*/
|
|
145
|
+
virtual void OnPageUpdated() {}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* @apidoc
|
|
149
|
+
* @brief Called when data update, but the view may not be updated.
|
|
150
|
+
*/
|
|
151
|
+
virtual void OnDataUpdated() {}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* @apidoc
|
|
155
|
+
* @brief Called after the page is destroyed.
|
|
156
|
+
* @note The callback executed in the main thread.
|
|
157
|
+
*/
|
|
158
|
+
virtual void OnDestroy() {}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* @apidoc
|
|
162
|
+
* @brief Called when JS environment preparation completed.
|
|
163
|
+
* @note The callback is in an asynchronous thread.
|
|
164
|
+
*/
|
|
165
|
+
virtual void OnRuntimeReady() {}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* @apidoc
|
|
169
|
+
* @brief Called when error received.
|
|
170
|
+
* @param error_code The type of the error.
|
|
171
|
+
* @param message The error message.
|
|
172
|
+
*/
|
|
173
|
+
virtual void OnReceivedError(int error_code, const char* message) {}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* @apidoc
|
|
177
|
+
* @brief Called when timing setup.
|
|
178
|
+
* @param timing_info The timing info.
|
|
179
|
+
*/
|
|
180
|
+
virtual void OnTimingSetup(const char* timing_info) {}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* @apidoc
|
|
184
|
+
* @brief Called when timing update.
|
|
185
|
+
* @param timing_info The timing info.
|
|
186
|
+
* @param update_timing The update timing.
|
|
187
|
+
* @param update_flag The update flag.
|
|
188
|
+
*/
|
|
189
|
+
virtual void OnTimingUpdate(const char* timing_info,
|
|
190
|
+
const char* update_timing,
|
|
191
|
+
const char* update_flag) {}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* @apidoc
|
|
195
|
+
* @brief Called when the view enters the foreground.
|
|
196
|
+
*/
|
|
197
|
+
virtual void OnEnterForeground() {}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* @apidoc
|
|
201
|
+
* @brief Called when the view enters the background.
|
|
202
|
+
*/
|
|
203
|
+
virtual void OnEnterBackground() {}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* @apidoc
|
|
207
|
+
* @brief Called when frame timing is received.
|
|
208
|
+
* @param frame_start_time_in_ns The frame start time in ns.
|
|
209
|
+
* @param frame_finish_time_in_ns The frame finish time in ns.
|
|
210
|
+
*/
|
|
211
|
+
virtual void OnFrameTiming(int64_t frame_start_time_in_ns,
|
|
212
|
+
int64_t frame_finish_time_in_ns) {}
|
|
213
|
+
|
|
214
|
+
lynx_view_client_t* Impl() { return client_; }
|
|
215
|
+
|
|
216
|
+
LynxViewClient(const LynxViewClient&) = delete;
|
|
217
|
+
LynxViewClient& operator=(const LynxViewClient&) = delete;
|
|
218
|
+
|
|
219
|
+
private:
|
|
220
|
+
lynx_view_client_t* client_;
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
} // namespace pub
|
|
224
|
+
} // namespace lynx
|
|
225
|
+
|
|
226
|
+
#endif // PLATFORM_EMBEDDER_PUBLIC_LYNX_VIEW_CLIENT_H_
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// Copyright 2025 The Lynx Authors. All rights reserved.
|
|
2
|
+
// Licensed under the Apache License Version 2.0 that can be found in the
|
|
3
|
+
// LICENSE file in the root directory of this source tree.
|
|
4
|
+
#ifndef PLATFORM_EMBEDDER_PUBLIC_LYNX_VSYNC_MONITOR_H_
|
|
5
|
+
#define PLATFORM_EMBEDDER_PUBLIC_LYNX_VSYNC_MONITOR_H_
|
|
6
|
+
|
|
7
|
+
#include <functional>
|
|
8
|
+
#include <memory>
|
|
9
|
+
|
|
10
|
+
#include "capi/lynx_vsync_monitor_capi.h"
|
|
11
|
+
|
|
12
|
+
namespace lynx {
|
|
13
|
+
namespace pub {
|
|
14
|
+
class LynxVSyncMonitor : public std::enable_shared_from_this<LynxVSyncMonitor> {
|
|
15
|
+
public:
|
|
16
|
+
explicit LynxVSyncMonitor(lynx_vsync_monitor_t* c_monitor)
|
|
17
|
+
: c_monitor_(c_monitor) {}
|
|
18
|
+
virtual ~LynxVSyncMonitor() = default;
|
|
19
|
+
/**
|
|
20
|
+
* @apidoc
|
|
21
|
+
* @brief Synchronize a Vsync signal
|
|
22
|
+
* @param callback OnVsync signal callback.
|
|
23
|
+
*/
|
|
24
|
+
virtual void RequestVSync(std::function<void(int64_t, int64_t)> callback) = 0;
|
|
25
|
+
|
|
26
|
+
lynx_vsync_monitor_t* GetCMonitor() { return c_monitor_; }
|
|
27
|
+
|
|
28
|
+
void InitIfNeed() {
|
|
29
|
+
if (c_monitor_) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
c_monitor_ = lynx_vsync_monitor_create_with_finalizer(
|
|
33
|
+
new std::weak_ptr<LynxVSyncMonitor>(weak_from_this()),
|
|
34
|
+
[](lynx_vsync_monitor_t* monitor, void* user_data) {
|
|
35
|
+
std::weak_ptr<LynxVSyncMonitor>* weak_ptr =
|
|
36
|
+
reinterpret_cast<std::weak_ptr<LynxVSyncMonitor>*>(user_data);
|
|
37
|
+
delete weak_ptr;
|
|
38
|
+
});
|
|
39
|
+
BindFunction();
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
private:
|
|
43
|
+
void BindFunction() {
|
|
44
|
+
lynx_vsync_monitor_bind_request_vsync_func(
|
|
45
|
+
c_monitor_,
|
|
46
|
+
[](lynx_vsync_monitor_t* c_monitor,
|
|
47
|
+
lynx_vsync_monitor_on_vsync_callback callback, void* user_data) {
|
|
48
|
+
auto* weak_monitor =
|
|
49
|
+
reinterpret_cast<std::weak_ptr<LynxVSyncMonitor>*>(
|
|
50
|
+
lynx_vsync_monitor_get_user_data(c_monitor));
|
|
51
|
+
std::shared_ptr<LynxVSyncMonitor> shared_monitor =
|
|
52
|
+
weak_monitor ? weak_monitor->lock() : nullptr;
|
|
53
|
+
if (!shared_monitor) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
shared_monitor->RequestVSync(
|
|
57
|
+
[callback, user_data](int64_t frame_start_time,
|
|
58
|
+
int64_t frame_target_time) {
|
|
59
|
+
callback(user_data, frame_start_time, frame_target_time);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
lynx_vsync_monitor_t* c_monitor_ = nullptr;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
} // namespace pub
|
|
68
|
+
} // namespace lynx
|
|
69
|
+
|
|
70
|
+
#endif // PLATFORM_EMBEDDER_PUBLIC_LYNX_VSYNC_MONITOR_H_
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
// Copyright 2025 The Lynx Authors. All rights reserved.
|
|
2
|
+
// Licensed under the Apache License Version 2.0 that can be found in the
|
|
3
|
+
// LICENSE file in the root directory of this source tree.
|
|
4
|
+
#ifndef PLATFORM_EMBEDDER_PUBLIC_LYNX_WINDOWLESS_RENDERER_H_
|
|
5
|
+
#define PLATFORM_EMBEDDER_PUBLIC_LYNX_WINDOWLESS_RENDERER_H_
|
|
6
|
+
|
|
7
|
+
#include <cstdbool>
|
|
8
|
+
#include <memory>
|
|
9
|
+
|
|
10
|
+
#include "capi/lynx_types.h"
|
|
11
|
+
#include "capi/lynx_windowless_renderer_capi.h"
|
|
12
|
+
|
|
13
|
+
namespace lynx {
|
|
14
|
+
namespace pub {
|
|
15
|
+
|
|
16
|
+
class LynxWindowlessRenderer
|
|
17
|
+
: public std::enable_shared_from_this<LynxWindowlessRenderer> {
|
|
18
|
+
public:
|
|
19
|
+
explicit LynxWindowlessRenderer(lynx_windowless_renderer_type_e type)
|
|
20
|
+
: type_(type) {}
|
|
21
|
+
|
|
22
|
+
void InitIfNeeded() {
|
|
23
|
+
if (windowless_renderer_) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
windowless_renderer_ = lynx_windowless_renderer_create_with_finalizer(
|
|
27
|
+
type_, new std::weak_ptr<LynxWindowlessRenderer>(weak_from_this()),
|
|
28
|
+
[](lynx_windowless_renderer_t* renderer, void* user_data) {
|
|
29
|
+
std::weak_ptr<LynxWindowlessRenderer>* weak_ptr =
|
|
30
|
+
reinterpret_cast<std::weak_ptr<LynxWindowlessRenderer>*>(
|
|
31
|
+
user_data);
|
|
32
|
+
delete weak_ptr;
|
|
33
|
+
});
|
|
34
|
+
if (type_ == kRendererTypeSoftware) {
|
|
35
|
+
lynx_windowless_renderer_bind_on_software_present(
|
|
36
|
+
windowless_renderer_,
|
|
37
|
+
[](lynx_windowless_renderer_t* renderer, const void* allocation,
|
|
38
|
+
size_t row_bytes, size_t height) -> bool {
|
|
39
|
+
std::shared_ptr<LynxWindowlessRenderer> renderer_wrapper =
|
|
40
|
+
LynxWindowlessRenderer::Unwrap(
|
|
41
|
+
lynx_windowless_renderer_get_user_data(renderer));
|
|
42
|
+
if (renderer_wrapper) {
|
|
43
|
+
return renderer_wrapper->OnSoftwarePresent(allocation, row_bytes,
|
|
44
|
+
height);
|
|
45
|
+
}
|
|
46
|
+
return false;
|
|
47
|
+
});
|
|
48
|
+
} else if (type_ == kRendererTypeGL || type_ == kRendererTypeGLDirect) {
|
|
49
|
+
lynx_windowless_renderer_bind_on_gl_make_current(
|
|
50
|
+
windowless_renderer_,
|
|
51
|
+
[](lynx_windowless_renderer_t* renderer) -> bool {
|
|
52
|
+
std::shared_ptr<LynxWindowlessRenderer> renderer_wrapper =
|
|
53
|
+
LynxWindowlessRenderer::Unwrap(
|
|
54
|
+
lynx_windowless_renderer_get_user_data(renderer));
|
|
55
|
+
if (renderer_wrapper) {
|
|
56
|
+
return renderer_wrapper->OnGLMakeCurrent();
|
|
57
|
+
}
|
|
58
|
+
return false;
|
|
59
|
+
});
|
|
60
|
+
lynx_windowless_renderer_bind_on_gl_clear_current(
|
|
61
|
+
windowless_renderer_,
|
|
62
|
+
[](lynx_windowless_renderer_t* renderer) -> bool {
|
|
63
|
+
std::shared_ptr<LynxWindowlessRenderer> renderer_wrapper =
|
|
64
|
+
LynxWindowlessRenderer::Unwrap(
|
|
65
|
+
lynx_windowless_renderer_get_user_data(renderer));
|
|
66
|
+
if (renderer_wrapper) {
|
|
67
|
+
return renderer_wrapper->OnGLClearCurrent();
|
|
68
|
+
}
|
|
69
|
+
return false;
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
lynx_windowless_renderer_bind_on_gl_present(
|
|
73
|
+
windowless_renderer_,
|
|
74
|
+
[](lynx_windowless_renderer_t* renderer) -> bool {
|
|
75
|
+
std::shared_ptr<LynxWindowlessRenderer> renderer_wrapper =
|
|
76
|
+
LynxWindowlessRenderer::Unwrap(
|
|
77
|
+
lynx_windowless_renderer_get_user_data(renderer));
|
|
78
|
+
if (renderer_wrapper) {
|
|
79
|
+
return renderer_wrapper->OnGLPresent();
|
|
80
|
+
}
|
|
81
|
+
return false;
|
|
82
|
+
});
|
|
83
|
+
lynx_windowless_renderer_bind_on_gl_create_fbo(
|
|
84
|
+
windowless_renderer_,
|
|
85
|
+
[](lynx_windowless_renderer_t* renderer, int width,
|
|
86
|
+
int height) -> uint32_t {
|
|
87
|
+
std::shared_ptr<LynxWindowlessRenderer> renderer_wrapper =
|
|
88
|
+
LynxWindowlessRenderer::Unwrap(
|
|
89
|
+
lynx_windowless_renderer_get_user_data(renderer));
|
|
90
|
+
if (renderer_wrapper) {
|
|
91
|
+
return renderer_wrapper->OnGLCreateFBO(width, height);
|
|
92
|
+
}
|
|
93
|
+
return 0;
|
|
94
|
+
});
|
|
95
|
+
lynx_windowless_renderer_bind_on_gl_proc_resolver(
|
|
96
|
+
windowless_renderer_,
|
|
97
|
+
[](lynx_windowless_renderer_t* renderer, const char* name) -> void* {
|
|
98
|
+
std::shared_ptr<LynxWindowlessRenderer> renderer_wrapper =
|
|
99
|
+
LynxWindowlessRenderer::Unwrap(
|
|
100
|
+
lynx_windowless_renderer_get_user_data(renderer));
|
|
101
|
+
if (renderer_wrapper) {
|
|
102
|
+
return renderer_wrapper->OnGLProcResolver(name);
|
|
103
|
+
}
|
|
104
|
+
return nullptr;
|
|
105
|
+
});
|
|
106
|
+
} else if (type_ == kRendererTypeAccelerated) {
|
|
107
|
+
lynx_windowless_renderer_bind_on_accelerated_present(
|
|
108
|
+
windowless_renderer_,
|
|
109
|
+
[](lynx_windowless_renderer_t* renderer) -> bool {
|
|
110
|
+
std::shared_ptr<LynxWindowlessRenderer> renderer_wrapper =
|
|
111
|
+
LynxWindowlessRenderer::Unwrap(
|
|
112
|
+
lynx_windowless_renderer_get_user_data(renderer));
|
|
113
|
+
if (renderer_wrapper) {
|
|
114
|
+
return renderer_wrapper->OnAcceleratedPresent();
|
|
115
|
+
}
|
|
116
|
+
return false;
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
lynx_windowless_renderer_bind_on_post_task(
|
|
121
|
+
windowless_renderer_,
|
|
122
|
+
[](lynx_windowless_renderer_t* renderer, lynx_task_t task,
|
|
123
|
+
uint64_t interval_nanoseconds) {
|
|
124
|
+
std::shared_ptr<LynxWindowlessRenderer> renderer_wrapper =
|
|
125
|
+
LynxWindowlessRenderer::Unwrap(
|
|
126
|
+
lynx_windowless_renderer_get_user_data(renderer));
|
|
127
|
+
if (renderer_wrapper) {
|
|
128
|
+
renderer_wrapper->OnPostTask(task, interval_nanoseconds);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
lynx_windowless_renderer_bind_get_clipboard_data(
|
|
132
|
+
windowless_renderer_,
|
|
133
|
+
[](lynx_windowless_renderer_t* renderer) -> const char* {
|
|
134
|
+
std::shared_ptr<LynxWindowlessRenderer> renderer_wrapper =
|
|
135
|
+
LynxWindowlessRenderer::Unwrap(
|
|
136
|
+
lynx_windowless_renderer_get_user_data(renderer));
|
|
137
|
+
if (renderer_wrapper) {
|
|
138
|
+
return renderer_wrapper->GetClipboardData();
|
|
139
|
+
}
|
|
140
|
+
return "";
|
|
141
|
+
});
|
|
142
|
+
lynx_windowless_renderer_bind_set_clipboard_data(
|
|
143
|
+
windowless_renderer_,
|
|
144
|
+
[](lynx_windowless_renderer_t* renderer, const char* data) -> void {
|
|
145
|
+
std::shared_ptr<LynxWindowlessRenderer> renderer_wrapper =
|
|
146
|
+
LynxWindowlessRenderer::Unwrap(
|
|
147
|
+
lynx_windowless_renderer_get_user_data(renderer));
|
|
148
|
+
if (renderer_wrapper) {
|
|
149
|
+
renderer_wrapper->SetClipboardData(data);
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
lynx_windowless_renderer_bind_activate_system_cursor(
|
|
153
|
+
windowless_renderer_,
|
|
154
|
+
[](lynx_windowless_renderer_t* renderer, lynx_cursor_type_e cursor_type,
|
|
155
|
+
const char* path) -> void {
|
|
156
|
+
std::shared_ptr<LynxWindowlessRenderer> renderer_wrapper =
|
|
157
|
+
LynxWindowlessRenderer::Unwrap(
|
|
158
|
+
lynx_windowless_renderer_get_user_data(renderer));
|
|
159
|
+
if (renderer_wrapper) {
|
|
160
|
+
renderer_wrapper->ActivateSystemCursor(cursor_type, path);
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
lynx_windowless_renderer_bind_show_text_input(
|
|
164
|
+
windowless_renderer_,
|
|
165
|
+
[](lynx_windowless_renderer_t* renderer, bool show) -> void {
|
|
166
|
+
std::shared_ptr<LynxWindowlessRenderer> renderer_wrapper =
|
|
167
|
+
LynxWindowlessRenderer::Unwrap(
|
|
168
|
+
lynx_windowless_renderer_get_user_data(renderer));
|
|
169
|
+
if (renderer_wrapper) {
|
|
170
|
+
renderer_wrapper->ShowTextInput(show);
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
lynx_windowless_renderer_bind_update_caret_position(
|
|
174
|
+
windowless_renderer_,
|
|
175
|
+
[](lynx_windowless_renderer_t* renderer, float x, float y, float w,
|
|
176
|
+
float h) -> void {
|
|
177
|
+
std::shared_ptr<LynxWindowlessRenderer> renderer_wrapper =
|
|
178
|
+
LynxWindowlessRenderer::Unwrap(
|
|
179
|
+
lynx_windowless_renderer_get_user_data(renderer));
|
|
180
|
+
if (renderer_wrapper) {
|
|
181
|
+
renderer_wrapper->UpdateCaretPosition(x, y, w, h);
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
lynx_windowless_renderer_bind_set_cursor_position(
|
|
185
|
+
windowless_renderer_,
|
|
186
|
+
[](lynx_windowless_renderer_t* renderer, int position) -> void {
|
|
187
|
+
std::shared_ptr<LynxWindowlessRenderer> renderer_wrapper =
|
|
188
|
+
LynxWindowlessRenderer::Unwrap(
|
|
189
|
+
lynx_windowless_renderer_get_user_data(renderer));
|
|
190
|
+
if (renderer_wrapper) {
|
|
191
|
+
renderer_wrapper->SetCursorPosition(position);
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
lynx_windowless_renderer_bind_set_marked_text_rect(
|
|
195
|
+
windowless_renderer_,
|
|
196
|
+
[](lynx_windowless_renderer_t* renderer, float x, float y, float w,
|
|
197
|
+
float h) -> void {
|
|
198
|
+
std::shared_ptr<LynxWindowlessRenderer> renderer_wrapper =
|
|
199
|
+
LynxWindowlessRenderer::Unwrap(
|
|
200
|
+
lynx_windowless_renderer_get_user_data(renderer));
|
|
201
|
+
if (renderer_wrapper) {
|
|
202
|
+
renderer_wrapper->SetMarkedTextRect(x, y, w, h);
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
lynx_windowless_renderer_bind_set_editable_transform(
|
|
206
|
+
windowless_renderer_,
|
|
207
|
+
[](lynx_windowless_renderer_t* renderer,
|
|
208
|
+
const float transform[16]) -> void {
|
|
209
|
+
std::shared_ptr<LynxWindowlessRenderer> renderer_wrapper =
|
|
210
|
+
LynxWindowlessRenderer::Unwrap(
|
|
211
|
+
lynx_windowless_renderer_get_user_data(renderer));
|
|
212
|
+
if (renderer_wrapper) {
|
|
213
|
+
renderer_wrapper->SetEditableTransform(transform);
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
virtual ~LynxWindowlessRenderer() {
|
|
219
|
+
if (windowless_renderer_) {
|
|
220
|
+
lynx_windowless_renderer_release(windowless_renderer_);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/* ----- Callbacks for Software renderer type ----- */
|
|
225
|
+
virtual bool OnSoftwarePresent(const void* allocation, size_t row_bytes,
|
|
226
|
+
size_t height) {
|
|
227
|
+
return false;
|
|
228
|
+
}
|
|
229
|
+
/* ----- Callbacks for Software renderer type ----- */
|
|
230
|
+
|
|
231
|
+
/* ----- Callbacks for GL renderer type ----- */
|
|
232
|
+
virtual bool OnGLMakeCurrent() { return false; }
|
|
233
|
+
virtual bool OnGLClearCurrent() { return false; }
|
|
234
|
+
virtual bool OnGLPresent() { return false; }
|
|
235
|
+
virtual uint32_t OnGLCreateFBO(int width, int height) { return 0; }
|
|
236
|
+
virtual void* OnGLProcResolver(const char* name) { return nullptr; }
|
|
237
|
+
/* ----- Callbacks for GL renderer type ----- */
|
|
238
|
+
|
|
239
|
+
/* ----- Callbacks for shared texture renderer type ----- */
|
|
240
|
+
virtual bool OnAcceleratedPresent() { return false; }
|
|
241
|
+
/* ----- Callbacks for shared texture renderer type ----- */
|
|
242
|
+
|
|
243
|
+
virtual void OnPostTask(lynx_task_t task, uint64_t interval_nanoseconds) {}
|
|
244
|
+
|
|
245
|
+
void RunTask(lynx_task_t task) {
|
|
246
|
+
if (windowless_renderer_) {
|
|
247
|
+
lynx_windowless_renderer_run_task(windowless_renderer_, task);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
bool GetAcceleratedPaintInfo(lynx_accelerated_paint_info_t* paint_info) {
|
|
252
|
+
if (windowless_renderer_) {
|
|
253
|
+
return lynx_windowless_renderer_get_accelerated_paint_info(
|
|
254
|
+
windowless_renderer_, paint_info);
|
|
255
|
+
}
|
|
256
|
+
return false;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
void SendPointerEvent(lynx_pointer_event_t* event) {
|
|
260
|
+
if (windowless_renderer_) {
|
|
261
|
+
lynx_windowless_renderer_send_pointer_event(windowless_renderer_, event);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
void SendKeyEvent(lynx_key_event_t* event) {
|
|
266
|
+
if (windowless_renderer_) {
|
|
267
|
+
lynx_windowless_renderer_send_key_event(windowless_renderer_, event);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/* ----- Callbacks for platform function ----- */
|
|
272
|
+
virtual const char* GetClipboardData() { return ""; }
|
|
273
|
+
virtual void SetClipboardData(const char* data) {}
|
|
274
|
+
virtual void ActivateSystemCursor(lynx_cursor_type_e cursor_type,
|
|
275
|
+
const char* path) {}
|
|
276
|
+
virtual void ShowTextInput(bool show) {}
|
|
277
|
+
virtual void UpdateCaretPosition(float x, float y, float width,
|
|
278
|
+
float height) {}
|
|
279
|
+
virtual void SetCursorPosition(int position) {}
|
|
280
|
+
virtual void SetMarkedTextRect(float x, float y, float width, float height) {}
|
|
281
|
+
virtual void SetEditableTransform(const float transform[16]) {}
|
|
282
|
+
/* ----- Callbacks for platform function ----- */
|
|
283
|
+
|
|
284
|
+
lynx_windowless_renderer_t* Impl() { return windowless_renderer_; }
|
|
285
|
+
|
|
286
|
+
static std::shared_ptr<LynxWindowlessRenderer> Unwrap(void* user_data) {
|
|
287
|
+
std::weak_ptr<LynxWindowlessRenderer>* weak_ptr =
|
|
288
|
+
reinterpret_cast<std::weak_ptr<LynxWindowlessRenderer>*>(user_data);
|
|
289
|
+
std::shared_ptr<LynxWindowlessRenderer> shared_renderer =
|
|
290
|
+
weak_ptr ? weak_ptr->lock() : nullptr;
|
|
291
|
+
return shared_renderer;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
protected:
|
|
295
|
+
lynx_windowless_renderer_type_e type_;
|
|
296
|
+
lynx_windowless_renderer_t* windowless_renderer_ = nullptr;
|
|
297
|
+
};
|
|
298
|
+
|
|
299
|
+
} // namespace pub
|
|
300
|
+
} // namespace lynx
|
|
301
|
+
|
|
302
|
+
#endif // PLATFORM_EMBEDDER_PUBLIC_LYNX_WINDOWLESS_RENDERER_H_
|