Skip to main content

qtbridge_runtime/
qmlprivate.rs

1// Copyright (C) 2026 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only
3
4//! Low-level QML type registration and the registry of automatic
5//! registration callbacks.
6
7// Storage for callbacks performing QML registration of user defined types
8#[doc(hidden)]
9#[cfg(feature = "linkme")]
10#[linkme::distributed_slice]
11pub static QML_REGISTER_CALLBACKS: [fn()];
12
13#[doc(hidden)]
14pub fn call_qml_register_callbacks() {
15    #[cfg(feature = "linkme")]
16    {
17        use std::sync::Once;
18        static INIT_ONCE: Once = Once::new();
19        INIT_ONCE.call_once(|| {
20            for reg_fn in QML_REGISTER_CALLBACKS {
21                reg_fn();
22            }
23        });
24    }
25}
26
27#[cxx::bridge]
28mod ffi {
29    unsafe extern "C++" {
30        include!("qtbridge-type-lib/src/core/qmetaobject/cpp/qmetaobject.h");
31        type QMetaObject = qtbridge_type_lib::QMetaObject;
32        include!("qtbridge-type-lib/src/core/qmetatype/cpp/qmetatype.h");
33        type QMetaType = qtbridge_type_lib::QMetaType;
34
35        include!("cpp/qmlprivate.h");
36    }
37    #[allow(clippy::too_many_arguments)]
38    #[namespace = "rust::bridge::qmlprivate"]
39    unsafe extern "C++" {
40        // Qt keeps the meta object pointer for the lifetime of the type
41        // registration, hence &'static.
42        fn qml_register_element(
43            type_id: QMetaType,
44            list_id: QMetaType,
45            object_size: u32,
46            parser_status_cast: i32,
47            create_fn: usize,
48            uri: &[u8],
49            version_major: u8,
50            version_minor: u8,
51            elm_name: &[u8],
52            meta_object: &'static QMetaObject,
53        );
54        fn qml_register_singleton(
55            type_id: QMetaType,
56            create_fn: usize,
57            uri: &[u8],
58            version_major: u8,
59            version_minor: u8,
60            elm_name: &[u8],
61            meta_object: &'static QMetaObject,
62        );
63    }
64}
65
66#[doc(hidden)]
67pub use ffi::{qml_register_element, qml_register_singleton};