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, clippy::missing_safety_doc)]
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        /// Registers a creatable QML element.
43        ///
44        /// # Safety
45        ///
46        /// `create_fn` must be the address of an
47        /// `extern "C" fn(addr: *mut u8, userdata: *mut u8)` that
48        /// placement-constructs an object of `object_size` bytes at `addr`.
49        unsafe fn qml_register_element(
50            type_id: QMetaType,
51            list_id: QMetaType,
52            object_size: u32,
53            parser_status_cast: i32,
54            create_fn: usize,
55            uri: &[u8],
56            version_major: u8,
57            version_minor: u8,
58            elm_name: &[u8],
59            meta_object: &'static QMetaObject,
60        );
61        /// Registers a QML singleton.
62        ///
63        /// # Safety
64        ///
65        /// `create_fn` must be the address of an `extern "C" fn() -> *mut QObject`
66        /// returning a live `QObject` of the registered type.
67        unsafe fn qml_register_singleton(
68            type_id: QMetaType,
69            create_fn: usize,
70            uri: &[u8],
71            version_major: u8,
72            version_minor: u8,
73            elm_name: &[u8],
74            meta_object: &'static QMetaObject,
75        );
76    }
77}
78
79#[doc(hidden)]
80pub use ffi::{qml_register_element, qml_register_singleton};