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_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
83// ClassiCube/src/Event.h
84
85// Event_RaiseVoid, Event_RaiseInt, Event_RaiseFloat are already exported
86make_register_unregister!(Void);
87make_register_unregister!(Int);
88make_register_unregister!(Float);
89
90make_register_unregister!(Entry);
91make_raise!(
92    /// Calls all registered callbacks for an event which has data stream and name arguments.
93    Entry, (stream: *mut Stream, name: *const cc_string)
94);
95
96make_register_unregister!(Block);
97make_raise!(
98    /// Calls all registered callbacks for an event which takes block change arguments.
99    /// These are the coordinates/location of the change, block there before, block there now.
100    Block, (coords: IVec3, oldBlock: BlockID, block: BlockID)
101);
102
103make_register_unregister!(Chat);
104make_raise!(
105    /// Calls all registered callbacks for an event which has chat message type and contents.
106    /// See MsgType enum in Chat.h for what types of messages there are.
107    Chat, (msg: *const cc_string, msgType: c_int)
108);
109
110make_register_unregister!(Input);
111make_raise!(
112    /// Calls all registered callbacks for an event which has keyboard key/mouse button.
113    /// repeating is whether the key/button was already pressed down. (i.e. user is holding down key)
114    Input, (key: c_int, repeating: cc_bool, device: *mut InputDevice)
115);
116
117make_register_unregister!(String);
118make_raise!(
119    /// Calls all registered callbacks for an event which has a string argument.
120    String, (s: *const cc_string)
121);
122
123make_register_unregister!(RawMove);
124make_raise!(
125    /// Calls all registered callbacks for an event which has raw pointer movement arguments.
126    RawMove, (x_delta: c_float, y_delta: c_float)
127);
128
129make_register_unregister!(PadAxis);
130make_raise!(
131    /// Calls all registered callbacks for an event which has pad axis arguments.
132    PadAxis, (port: c_int, axis: c_int, x: c_float, y: c_float)
133);
134
135make_register_unregister!(PluginMessage);
136make_raise!(
137    /// Calls all registered callbacks for an event which has a channel and a 64 byte data argument.
138    PluginMessage, (channel: cc_uint8, data: *mut cc_uint8)
139);
140
141make_register_unregister!(LightingMode);
142make_raise!(
143    /// Calls all registered callbacks for an event called when the Lighting_LightingMode is changed
144    LightingMode, (oldMode: cc_uint8, fromServer: cc_bool)
145);