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