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_unregister {
11 (
12 $(#[$attr:meta])*
13 $func_name:ident,
14 $name:ident
15 ) => {
16 paste::item! {
17 $(#[$attr])*
18 pub unsafe fn [<Event_Register $func_name>] (
19 handlers: *mut [<Event_ $name>],
20 obj: *mut c_void,
21 handler: [<Event_ $name _Callback>],
22 ) {
23 unsafe {
24 Event_Register(
25 handlers as *mut Event_Void,
26 obj,
27 #[allow(clippy::useless_transmute)]
28 mem::transmute::<[<Event_ $name _Callback>], Event_Void_Callback>(handler),
29 )
30 }
31 }
32
33 $(#[$attr])*
34 pub unsafe fn [<Event_Unregister $func_name>] (
35 handlers: *mut [<Event_ $name>],
36 obj: *mut c_void,
37 handler: [<Event_ $name _Callback>],
38 ) {
39 unsafe {
40 Event_Unregister(
41 handlers as *mut Event_Void,
42 obj,
43 #[allow(clippy::useless_transmute)]
44 mem::transmute::<[<Event_ $name _Callback>], Event_Void_Callback>(handler),
45 )
46 }
47 }
48 }
49 };
50
51 ($name:ident) => {
52 make_register_unregister!($name, $name);
53 };
54}
55
56macro_rules! make_raise {
57 (
58 $(#[$attr:meta])*
59 $name:ident,
60 ( $($arg:ident: $arg_type:ty),* )
61 ) => {
62 paste::item! {
63 $(#[$attr])*
64 pub unsafe fn [<Event_Raise $name>] (
65 handlers: &mut [<Event_ $name>],
66 $($arg: $arg_type,)*
67 ) {
68 for i in 0..handlers.Count {
69 if let Some(f) = handlers.Handlers[i as usize] {
70 unsafe {
71 (f)(
72 handlers.Objs[i as usize],
73 $($arg),*
74 );
75 }
76 }
77 }
78 }
79 }
80 };
81}
82
83make_register_unregister!(Void);
87make_register_unregister!(Int);
88make_register_unregister!(Float);
89
90make_register_unregister!(Entry);
91make_raise!(
92 Entry, (stream: *mut Stream, name: *const cc_string)
94);
95
96make_register_unregister!(Block);
97make_raise!(
98 Block, (coords: IVec3, oldBlock: BlockID, block: BlockID)
101);
102
103make_register_unregister!(Chat);
104make_raise!(
105 Chat, (msg: *const cc_string, msgType: c_int)
108);
109
110make_register_unregister!(Input);
111make_raise!(
112 Input, (key: c_int, repeating: cc_bool, device: *mut InputDevice)
115);
116
117make_register_unregister!(String);
118make_raise!(
119 String, (s: *const cc_string)
121);
122
123make_register_unregister!(RawMove);
124make_raise!(
125 RawMove, (x_delta: c_float, y_delta: c_float)
127);
128
129make_register_unregister!(PadAxis);
130make_raise!(
131 PadAxis, (port: c_int, axis: c_int, x: c_float, y: c_float)
133);
134
135make_register_unregister!(PluginMessage);
136make_raise!(
137 PluginMessage, (channel: cc_uint8, data: *mut cc_uint8)
139);
140
141make_register_unregister!(LightingMode);
142make_raise!(
143 LightingMode, (oldMode: cc_uint8, fromServer: cc_bool)
145);