use crate::*;
impl From<usize> for &'static mut NativeEventCallbackInner {
#[inline(always)]
fn from(address: usize) -> Self {
unsafe { &mut *(address as *mut NativeEventCallbackInner) }
}
}
impl From<usize> for &'static NativeEventCallbackInner {
#[inline(always)]
fn from(address: usize) -> Self {
unsafe { &*(address as *const NativeEventCallbackInner) }
}
}
impl From<&NativeEventHandler> for usize {
#[inline(always)]
fn from(handler: &NativeEventHandler) -> Self {
handler.callback as usize
}
}
impl NativeEventHandler {
pub fn new<F>(event_name: NativeEventName, callback: F) -> Self
where
F: FnMut(NativeEvent) + 'static,
{
let inner: Box<NativeEventCallbackInner> = Box::new(NativeEventCallbackInner {
callback: Box::new(callback),
});
NativeEventHandler {
event_name: event_name.as_str().into_owned(),
callback: Box::leak(inner) as *mut NativeEventCallbackInner,
}
}
#[allow(clippy::mut_from_ref)]
pub(crate) fn leak_mut(&self) -> &'static mut NativeEventCallbackInner {
let address: usize = self.into();
address.into()
}
pub fn handle(&self, event: NativeEvent) {
let inner: &mut NativeEventCallbackInner = self.leak_mut();
(inner.callback)(event);
}
pub(crate) fn get_event_name(&self) -> &String {
&self.event_name
}
}
impl Clone for NativeEventHandler {
fn clone(&self) -> Self {
NativeEventHandler {
event_name: self.event_name.clone(),
callback: self.callback,
}
}
}