#![allow(unsafe_code)]
use alloc::rc::Rc;
use core::ffi::c_void;
use super::DataTransfer;
use crate::SharedString;
use crate::api::Image;
#[repr(C)]
pub struct DataTransferOpaque {
_rc_inner: *mut core::ffi::c_void,
_rc_any_0: *mut core::ffi::c_void,
_rc_any_1: *mut core::ffi::c_void,
}
static_assertions::assert_eq_align!(DataTransferOpaque, DataTransfer);
static_assertions::assert_eq_size!(DataTransferOpaque, DataTransfer);
#[unsafe(no_mangle)]
pub unsafe extern "C" fn slint_data_transfer_init_default(out: *mut DataTransfer) {
unsafe { core::ptr::write(out, DataTransfer::default()) }
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn slint_data_transfer_drop(d: *mut DataTransfer) {
unsafe { core::ptr::drop_in_place(d) }
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn slint_data_transfer_clone(out: *mut DataTransfer, src: &DataTransfer) {
unsafe { core::ptr::write(out, src.clone()) }
}
#[unsafe(no_mangle)]
pub extern "C" fn slint_data_transfer_eq(a: &DataTransfer, b: &DataTransfer) -> bool {
a == b
}
#[unsafe(no_mangle)]
pub extern "C" fn slint_data_transfer_set_plain_text(d: &mut DataTransfer, text: &SharedString) {
d.set_plain_text(text.clone());
}
#[unsafe(no_mangle)]
pub extern "C" fn slint_data_transfer_set_image(d: &mut DataTransfer, image: &Image) {
d.set_image(image.clone());
}
#[unsafe(no_mangle)]
pub extern "C" fn slint_data_transfer_has_plain_text(d: &DataTransfer) -> bool {
d.has_plain_text()
}
#[unsafe(no_mangle)]
pub extern "C" fn slint_data_transfer_has_image(d: &DataTransfer) -> bool {
d.has_image()
}
#[unsafe(no_mangle)]
pub extern "C" fn slint_data_transfer_is_empty(d: &DataTransfer) -> bool {
d.is_empty()
}
#[unsafe(no_mangle)]
pub extern "C" fn slint_data_transfer_plain_text(d: &DataTransfer, out: &mut SharedString) -> bool {
match d.plain_text() {
Ok(s) => {
*out = s;
true
}
Err(_) => false,
}
}
#[unsafe(no_mangle)]
pub extern "C" fn slint_data_transfer_image(d: &DataTransfer, out: &mut Image) -> bool {
match d.image() {
Ok(i) => {
*out = i;
true
}
Err(_) => false,
}
}
struct CppUserData {
handle: *mut c_void,
drop_fn: unsafe extern "C" fn(*mut c_void),
}
impl Drop for CppUserData {
fn drop(&mut self) {
unsafe { (self.drop_fn)(self.handle) }
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn slint_data_transfer_set_user_data(
d: &mut DataTransfer,
handle: *mut c_void,
drop_fn: unsafe extern "C" fn(*mut c_void),
) {
d.set_user_data(Rc::new(CppUserData { handle, drop_fn }));
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn slint_data_transfer_user_data(
d: &DataTransfer,
out_handle: *mut *const c_void,
) -> bool {
let Some(any) = d.user_data() else { return false };
let Some(cpp) = any.downcast_ref::<CppUserData>() else { return false };
unsafe { *out_handle = cpp.handle as *const c_void };
true
}
#[unsafe(no_mangle)]
pub extern "C" fn slint_data_transfer_clear_user_data(d: &mut DataTransfer) {
d.user_data = None;
}