classicube_sys/
event.rs

1#![allow(clippy::missing_safety_doc)]
2
3use core::mem;
4
5use crate::{
6    bindings::*,
7    std_types::{c_float, c_int, c_void},
8};
9
10macro_rules! make_register {
11    ($func_name:ident, $name:ident) => {
12        paste::item! {
13            pub unsafe fn [<Event_Register $func_name>] (
14                handlers: *mut [<Event_ $name>],
15                obj: *mut c_void,
16                handler: [<Event_ $name _Callback>],
17            ) {
18                Event_Register(
19                    handlers as *mut Event_Void,
20                    obj,
21                    #[allow(clippy::useless_transmute)]
22                    mem::transmute::<[<Event_ $name _Callback>], Event_Void_Callback>(handler),
23                )
24            }
25
26            pub unsafe fn [<Event_Unregister $func_name>] (
27                handlers: *mut [<Event_ $name>],
28                obj: *mut c_void,
29                handler: [<Event_ $name _Callback>],
30            ) {
31                Event_Unregister(
32                    handlers as *mut Event_Void,
33                    obj,
34                    #[allow(clippy::useless_transmute)]
35                    mem::transmute::<[<Event_ $name _Callback>], Event_Void_Callback>(handler),
36                )
37            }
38        }
39    };
40
41    ($name:ident) => {
42        make_register!($name, $name);
43    };
44}
45
46macro_rules! make_raise {
47    (
48        $func_name:ident,
49        $name:ident,
50        ( $($arg:ident: $arg_type:ty),* )
51    ) => {
52        paste::item! {
53            pub unsafe fn [<Event_Raise $func_name>] (
54                handlers: &mut [<Event_ $name>],
55                $($arg: $arg_type,)*
56            ) {
57                for i in 0..handlers.Count {
58                    if let Some(f) = handlers.Handlers[i as usize] {
59                        (f)(
60                            handlers.Objs[i as usize],
61                            $($arg),*
62                        );
63                    }
64                }
65            }
66        }
67    };
68
69    (
70        $name:ident,
71        ( $($arg:ident: $arg_type:ty),* )
72    ) => {
73        make_raise!($name, $name, ( $($arg: $arg_type),* ));
74    }
75}
76
77// Raise_ Void, Int, Float are already exported
78
79make_register!(Void);
80make_register!(Int);
81make_register!(Float);
82
83make_register!(Entry);
84make_raise!(Entry, (stream: *mut Stream, name: *const cc_string));
85
86make_register!(Block);
87make_raise!(Block, (coords: IVec3, oldBlock: BlockID, block: BlockID));
88
89make_register!(Chat);
90make_raise!(Chat, (msg: *const cc_string, msgType: c_int));
91
92make_register!(Input);
93make_raise!(Input, (key: c_int, repeating: cc_bool, device: *mut InputDevice));
94
95make_register!(String);
96make_raise!(String, (s: *const cc_string));
97
98make_register!(RawMove);
99make_raise!(RawMove, (x_delta: c_float, y_delta: c_float));
100
101make_register!(PluginMessage);
102make_raise!(PluginMessage, (channel: u8, data: *mut u8));