1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#![allow(clippy::missing_safety_doc)]
use core::mem;
use crate::{
bindings::*,
std_types::{c_float, c_int, c_void},
};
macro_rules! make_register_unregister {
(
$(#[$attr:meta])*
$func_name:ident,
$name:ident
) => {
paste::item! {
$(#[$attr])*
pub unsafe fn [<Event_Register $func_name>] (
handlers: *mut [<Event_ $name>],
obj: *mut c_void,
handler: [<Event_ $name _Callback>],
) {
unsafe {
Event_Register(
handlers as *mut Event_Void,
obj,
#[allow(clippy::useless_transmute)]
mem::transmute::<[<Event_ $name _Callback>], Event_Void_Callback>(handler),
)
}
}
$(#[$attr])*
pub unsafe fn [<Event_Unregister $func_name>] (
handlers: *mut [<Event_ $name>],
obj: *mut c_void,
handler: [<Event_ $name _Callback>],
) {
unsafe {
Event_Unregister(
handlers as *mut Event_Void,
obj,
#[allow(clippy::useless_transmute)]
mem::transmute::<[<Event_ $name _Callback>], Event_Void_Callback>(handler),
)
}
}
}
};
($name:ident) => {
make_register_unregister!($name, $name);
};
}
macro_rules! make_raise {
(
$(#[$attr:meta])*
$name:ident,
( $($arg:ident: $arg_type:ty),* )
) => {
paste::item! {
$(#[$attr])*
pub unsafe fn [<Event_Raise $name>] (
handlers: &mut [<Event_ $name>],
$($arg: $arg_type,)*
) {
for i in 0..handlers.Count {
if let Some(f) = handlers.Handlers[i as usize] {
unsafe {
(f)(
handlers.Objs[i as usize],
$($arg),*
);
}
}
}
}
}
};
}
// ClassiCube/src/Event.h
// Event_RaiseVoid, Event_RaiseInt, Event_RaiseFloat are already exported
make_register_unregister!(Void);
make_register_unregister!(Int);
make_register_unregister!(Float);
make_register_unregister!(Entry);
make_raise!(
/// Calls all registered callbacks for an event which has data stream and name arguments.
Entry, (stream: *mut Stream, name: *const cc_string)
);
make_register_unregister!(Block);
make_raise!(
/// Calls all registered callbacks for an event which takes block change arguments.
/// These are the coordinates/location of the change, block there before, block there now.
Block, (coords: IVec3, oldBlock: BlockID, block: BlockID)
);
make_register_unregister!(Chat);
make_raise!(
/// Calls all registered callbacks for an event which has chat message type and contents.
/// See MsgType enum in Chat.h for what types of messages there are.
Chat, (msg: *const cc_string, msgType: c_int)
);
make_register_unregister!(Input);
make_raise!(
/// Calls all registered callbacks for an event which has keyboard key/mouse button.
/// repeating is whether the key/button was already pressed down. (i.e. user is holding down key)
Input, (key: c_int, repeating: cc_bool, device: *mut InputDevice)
);
make_register_unregister!(String);
make_raise!(
/// Calls all registered callbacks for an event which has a string argument.
String, (s: *const cc_string)
);
make_register_unregister!(RawMove);
make_raise!(
/// Calls all registered callbacks for an event which has raw pointer movement arguments.
RawMove, (x_delta: c_float, y_delta: c_float)
);
make_register_unregister!(PadAxis);
make_raise!(
/// Calls all registered callbacks for an event which has pad axis arguments.
PadAxis, (upd: *mut PadAxisUpdate)
);
make_register_unregister!(PluginMessage);
make_raise!(
/// Calls all registered callbacks for an event which has a channel and a 64 byte data argument.
PluginMessage, (channel: cc_uint8, data: *mut cc_uint8)
);
make_register_unregister!(LightingMode);
make_raise!(
/// Calls all registered callbacks for an event called when the Lighting_LightingMode is changed
LightingMode, (oldMode: cc_uint8, fromServer: cc_bool)
);