use super::*;
#[cfg(not(target_os = "macos"))]
use crate::abi;
use crate::resolve;
#[cfg(not(target_os = "macos"))]
use core::ffi::c_void;
#[cfg(not(target_os = "macos"))]
pub fn hover_effect_lift(view: &ViewHandle) -> ViewHandle {
hover_effect_impl(view, resolve::lift_hover_getter, resolve::lift_hover_meta_acc)
}
#[cfg(not(target_os = "macos"))]
pub fn hover_effect_automatic(view: &ViewHandle) -> ViewHandle {
hover_effect_impl(view, resolve::automatic_hover_getter, resolve::automatic_hover_meta_acc)
}
#[cfg(not(target_os = "macos"))]
pub fn hover_effect_highlight(view: &ViewHandle) -> ViewHandle {
hover_effect_impl(view, resolve::highlight_hover_getter, resolve::highlight_hover_meta_acc)
}
#[cfg(not(target_os = "macos"))]
pub(crate) fn hover_effect_impl(
view: &ViewHandle,
effect_getter: fn() -> *const c_void,
effect_meta_acc: fn() -> *const c_void,
) -> ViewHandle {
unsafe {
let func = resolve::try_sym(c"$s7SwiftUI4ViewPAAE11hoverEffect_9isEnabledQrqd___SbtAA011CustomHoverE0Rd__lF");
if func.is_null() {
return view.clone();
}
let effect_meta: *const c_void;
let _status: u64;
core::arch::asm!("blr {f}",
f = in(reg) effect_meta_acc(),
in("x0") 0u64, lateout("x0") effect_meta,
lateout("x1") _status,
lateout("x2") _, lateout("x3") _, lateout("x4") _, lateout("x5") _,
lateout("x6") _, lateout("x7") _, lateout("x8") _, lateout("x9") _,
lateout("x10") _, lateout("x11") _, lateout("x12") _, lateout("x13") _,
lateout("x14") _, lateout("x15") _, lateout("x16") _, lateout("x17") _,
lateout("lr") _, clobber_abi("C"),
);
let vwt = &*swift_runtime_sys::SwiftABI::get_value_witness_table(effect_meta);
let effect_size = vwt.size;
let mut effect_buf = vec![0u8; effect_size.max(8)];
core::arch::asm!("blr {f}",
f = in(reg) effect_getter(),
in("x8") effect_buf.as_mut_ptr(), lateout("x0") _, lateout("x1") _, lateout("x2") _, lateout("x3") _,
lateout("x4") _, lateout("x5") _, lateout("x6") _, lateout("x7") _,
lateout("x9") _, lateout("x10") _, lateout("x11") _,
lateout("x12") _, lateout("x13") _, lateout("x14") _, lateout("x15") _,
lateout("x16") _, lateout("x17") _, lateout("lr") _,
lateout("x20") _, lateout("x21") _,
clobber_abi("C"),
);
let effect_wt = super::conformance_wt(effect_meta, resolve::custom_hover_effect_proto());
let subst = [
view.meta, effect_meta, view.wt, effect_wt, ];
let (result_meta, result_view_wt, result_size) =
super::opaque_result_type(resolve::hover_effect_oret(), &subst);
let mut result = vec![0u8; result_size.max(8)];
let self_storage = view.value_ptr();
core::arch::asm!("blr {func}",
func = in(reg) func,
in("x8") result.as_mut_ptr(), in("x0") effect_buf.as_ptr(), in("x1") 1u64, in("x2") view.meta, in("x3") effect_meta, in("x4") view.wt, in("x5") effect_wt, in("x20") self_storage, lateout("x0") _, lateout("x1") _, lateout("x2") _, lateout("x3") _,
lateout("x4") _, lateout("x5") _, lateout("x6") _, lateout("x7") _,
lateout("x9") _, lateout("x10") _, lateout("x11") _,
lateout("x12") _, lateout("x13") _, lateout("x14") _, lateout("x15") _,
lateout("x16") _, lateout("x17") _, lateout("lr") _,
clobber_abi("C"),
);
ViewHandle::wrap(
result.as_ptr() as _, result_meta, result_view_wt,
)
}
}
pub fn on_hover(view: &ViewHandle, callback: impl Fn(bool) + 'static) -> ViewHandle {
unsafe {
opaque_modifier(
resolve::on_hover_fn(),
resolve::on_hover_oret(),
view,
&bool_words(callback),
[0.0; 4],
)
}
}
#[cfg(not(target_os = "macos"))]
pub fn default_hover_effect_highlight(view: &ViewHandle) -> ViewHandle {
default_hover_effect(view, HoverEffect::Highlight)
}
#[cfg(not(target_os = "macos"))]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum HoverEffect {
Automatic,
Highlight,
Lift,
}
#[cfg(not(target_os = "macos"))]
pub fn default_hover_effect(view: &ViewHandle, effect: HoverEffect) -> ViewHandle {
unsafe {
let getter = match effect {
HoverEffect::Automatic => resolve::hover_effect_automatic_static(),
HoverEffect::Highlight => resolve::hover_effect_highlight_static(),
HoverEffect::Lift => resolve::hover_effect_lift_static(),
};
let meta = abi::metadata0(resolve::hover_effect_ma());
assert!(!meta.is_null(), "HoverEffect metadata");
let effect = super::static_getter_indirect(
getter,
meta,
abi::type_bytes(meta),
);
let opt = abi::resolve_type_by_mangled_name(b"7SwiftUI11HoverEffectVSg");
assert!(!opt.is_null(), "Optional<HoverEffect>");
let mut arg = vec![0u8; abi::type_bytes(opt)];
let n = effect.len().min(arg.len());
arg[..n].copy_from_slice(&effect[..n]);
super::opaque_modifier(
resolve::default_hover_effect_fn(),
resolve::default_hover_effect_oret(),
view,
&[arg.as_ptr() as u64],
[0.0; 4],
)
}
}