mod callback;
mod device_sync;
mod enums;
mod fp_device;
mod user_data;
pub use device_sync::{FpEnrollProgress, FpMatchCb};
use gio::AsyncInitable;
use glib::wrapper;
wrapper! {
#[cfg(not(doctest))]
pub struct FpDevice(Object<libfprint_sys::FpDevice, libfprint_sys::FpDeviceClass>)
@implements AsyncInitable;
match fn {
type_ => || libfprint_sys::fp_device_get_type() as usize,
}
}
pub(crate) struct UserData<F, T> {
function: F,
data: Option<T>,
}
impl<F, T> Drop for UserData<F, T> {
fn drop(&mut self) {
if self.data.is_some() {
drop(self.data.take())
}
}
}
macro_rules! fn_pointer {
($function:ident, $struct:ident) => {{
let ptr: *mut std::ffi::c_void = match $function {
Some(cb) => {
let data = crate::device::UserData {
function: cb,
data: $struct,
};
let boxed = std::sync::Arc::new(data);
std::sync::Arc::into_raw(boxed) as *mut std::ffi::c_void
}
None => std::ptr::null_mut(),
};
ptr
}};
}
use fn_pointer;