slint/internal/backends/testing/ffi.rs
Olivier Goffart 23962b3e25
Upgrade cbindgen and use unsafe(no_mangle) attributes (#8539)
To be compatible with the 2024 edition, we need to wrap the
`no_mangle` attribute in `unsafe()`.

The parsing for that in cbindgen was only added in the version 0.28,
but we couldn't upgrade cbindgen before because of a regression in
cbindgen 0.27 that prevented us from upgrading.
Now that cbindgen 0.29 is released with a fix, we can prepare for the
2024 edition
2025-05-26 11:21:33 +02:00

106 lines
2.8 KiB
Rust

// Copyright © SixtyFPS GmbH <info@slint.dev>
// SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-2.0 OR LicenseRef-Slint-Software-3.0
use crate::{ElementHandle, ElementRoot};
use i_slint_core::item_tree::ItemTreeRc;
use i_slint_core::slice::Slice;
use i_slint_core::{SharedString, SharedVector};
use std::os::raw::c_void;
struct RootWrapper<'a>(&'a ItemTreeRc);
impl ElementRoot for RootWrapper<'_> {
fn item_tree(&self) -> ItemTreeRc {
self.0.clone()
}
}
impl super::Sealed for RootWrapper<'_> {}
#[unsafe(no_mangle)]
pub extern "C" fn slint_testing_init_backend() {
crate::init_integration_test_with_mock_time();
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn slint_testing_element_visit_elements(
root: &ItemTreeRc,
user_data: *mut c_void,
visitor: unsafe extern "C" fn(*mut c_void, &ElementHandle) -> bool,
) -> bool {
RootWrapper(root)
.root_element()
.query_descendants()
.match_predicate(move |element| visitor(user_data, element))
.find_first()
.is_some()
}
#[unsafe(no_mangle)]
pub extern "C" fn slint_testing_element_find_by_accessible_label(
root: &ItemTreeRc,
label: &Slice<u8>,
out: &mut SharedVector<ElementHandle>,
) {
let Ok(label) = core::str::from_utf8(label.as_slice()) else { return };
out.extend(ElementHandle::find_by_accessible_label(&RootWrapper(root), label))
}
#[unsafe(no_mangle)]
pub extern "C" fn slint_testing_element_find_by_element_id(
root: &ItemTreeRc,
element_id: &Slice<u8>,
out: &mut SharedVector<ElementHandle>,
) {
let Ok(element_id) = core::str::from_utf8(element_id.as_slice()) else { return };
out.extend(ElementHandle::find_by_element_id(&RootWrapper(root), element_id));
}
#[unsafe(no_mangle)]
pub extern "C" fn slint_testing_element_find_by_element_type_name(
root: &ItemTreeRc,
type_name: &Slice<u8>,
out: &mut SharedVector<ElementHandle>,
) {
let Ok(type_name) = core::str::from_utf8(type_name.as_slice()) else { return };
out.extend(ElementHandle::find_by_element_type_name(&RootWrapper(root), type_name));
}
#[unsafe(no_mangle)]
pub extern "C" fn slint_testing_element_id(
element: &ElementHandle,
out: &mut SharedString,
) -> bool {
if let Some(id) = element.id() {
*out = id;
true
} else {
false
}
}
#[unsafe(no_mangle)]
pub extern "C" fn slint_testing_element_type_name(
element: &ElementHandle,
out: &mut SharedString,
) -> bool {
if let Some(type_name) = element.type_name() {
*out = type_name;
true
} else {
false
}
}
#[unsafe(no_mangle)]
pub extern "C" fn slint_testing_element_bases(
element: &ElementHandle,
out: &mut SharedVector<SharedString>,
) -> bool {
if let Some(bases_it) = element.bases() {
out.extend(bases_it);
true
} else {
false
}
}