commonlibsse_ng\skse\interfaces/
scaleform.rs

1// C++ Original code
2// - ref: https://github.com/SARDONYX-forks/CommonLibVR/blob/ng/include/SKSE/Interfaces.h
3// - ref: https://github.com/SARDONYX-forks/CommonLibVR/blob/ng/src/SKSE/Interfaces.cpp
4// SPDX-FileCopyrightText: (C) 2018 Ryan-rsm-McKenzie
5// SPDX-License-Identifier: MIT
6//
7// SPDX-FileCopyrightText: (C) 2025 SARDONYX
8// SPDX-License-Identifier: Apache-2.0 OR MIT
9
10use crate::re::GFxValue::GFxValue;
11use crate::re::{GFxMovieView, InventoryEntryData::InventoryEntryData};
12use crate::skse::impls::stab::SKSEScaleformInterface;
13use core::ffi::{CStr, c_void};
14
15type RegCallback = fn(a_view: *mut GFxMovieView, a_root: *mut GFxValue) -> bool;
16type RegInvCallback =
17    fn(a_view: *mut GFxMovieView, a_object: *mut GFxValue, a_item: *mut InventoryEntryData);
18
19#[derive(Debug, Clone)]
20pub struct ScaleformInterface(&'static SKSEScaleformInterface);
21
22impl ScaleformInterface {
23    pub const VERSION: u32 = 2;
24
25    #[inline]
26    pub(crate) const fn new(interface: &'static SKSEScaleformInterface) -> Self {
27        Self(interface)
28    }
29
30    #[inline]
31    pub const fn version(&self) -> u32 {
32        self.0.interfaceVersion
33    }
34
35    pub fn register(&self, callback: RegCallback, name: &CStr) -> bool {
36        #[allow(clippy::fn_to_numeric_cast_any)]
37        let void_callback = (callback as *mut RegInvCallback).cast::<c_void>();
38        let result = unsafe { (self.0.Register)(name.as_ptr(), void_callback) };
39
40        if !result {
41            #[cfg(feature = "tracing")]
42            tracing::error!("Failed to register scaleform callback: {:?}", name);
43        };
44        result
45    }
46
47    #[inline]
48    pub fn register_for_inventory(&self, callback: RegInvCallback) {
49        #[allow(clippy::fn_to_numeric_cast_any)]
50        let void_callback = (callback as *mut RegInvCallback).cast::<c_void>();
51        unsafe { (self.0.RegisterForInventory)(void_callback) }
52    }
53}