2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#ifndef GIMBAL_SIGNAL_H
20#define GIMBAL_SIGNAL_H
22#include "../types/gimbal_type.h"
26
27
28
30#define GBL_SIGNALS(instanceStruct, ...)
32#define GBL_SIGNALS_REGISTER(instanceStruct, ...)
34#define GBL_EMIT(emitter, ...) (GblSignal_emit(GBL_INSTANCE(emitter), __VA_ARGS__))
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
135
136
137
141 GblMarshalFn pFnCMarshal,
152
153
154
157 const char* pSignalName,
158 GblInstance* pReceiver,
163 const char* pSignalName,
164 GblInstance* pReceiver,
169 const char* pSignalName,
170 GblInstance* pDstEmitter,
174 const char* pSignalName,
175 GblInstance* pReceiver,
179 const char* pSignalName,
180 GblInstance* pReceiver,
185
186
187
190 const char* pSignalName,
202
203
204
207 const char* pSignalName,
211 const char* pSignalName,
215 const char* pSignalName,
220
221
222
237#define GblSignal_connect_3(emitter, signal, callback)
238 (GblSignal_connect_4
(emitter, signal, emitter, callback))
239#define GblSignal_connect_4(emitter, signal, receiver, callback)
240 (GblSignal_connect_5
(emitter, signal, receiver, callback, GBL_NULL))
241#define GblSignal_connect_5(emitter, signal, receiver, callback, userdata)
244#define GBL_CONNECT_3(emitter, signal, callback)
245 (GBL_CONNECT_4
(emitter, signal, emitter, callback))
246#define GBL_CONNECT_4(emitter, signal, receiver, callback)
247 (GBL_CONNECT_5
(emitter, signal, receiver, callback, GBL_NULL))
248#define GBL_CONNECT_5(emitter, signal, receiver, callback, userdata)
251#define GBL_SIGNALS_(instance, ...)
252 GBL_INLINE GBL_RESULT instance##_registerSignals_(instance* pSelf, GblMarshalFn* pMarshals) {
260#define GBL_SIGNAL_INSTALL_(instance, signal)
263GBL_CTX_VERIFY_CALL(GblSignal_install(GBL_TYPEID(instance),
264 GBL_STRINGIFY(GBL_TUPLE_FIRST signal),
267 GBL_TUPLE_FOREACH(GBL_SIGNAL_ARG_TYPE_, instance, GBL_TUPLE_REST(signal) )));
270#define GBL_SIGNAL_ARG_TYPE_(instance, pair)
273#define GBL_SIGNALS_REGISTER_(instance, marshals)
274 instance##_registerSignals_(instance, marshals)
#define GBL_TUPLE_FIRST(...)
#define GBL_TUPLE_FOREACH(MACRO_, DATA_, TUPLE_)
#define GBL_VA_OVERLOAD_CALL_ARGC(BASE,...)
GblBool GblSignal_block(GblInstance *pInstance, const char *pSignalName, GblBool blocked)
Blocks pSignalName from being emitted from pInstance if blocked is true, otherwise enables its emissi...
GBL_RESULT GblSignal_uninstallAll(GblType instanceType)
Uninstalls all signals which have been installed onto the associated instanceType.
GBL_RESULT GblSignal_install(GblType instanceType, const char *pName, GblMarshalFn pFnCMarshal, size_t argCount,...)
Installs a named signal onto the given type, taking a number of arguments and an associated list of G...
GblBool GblSignal_blockAll(GblInstance *pInstance, GblBool blocked)
Blocks all signals from being emitted from pinstance if block is true, otherwise enables them.
#define GblSignal_connect(...)
GBL_RESULT GblSignal_emitVaList(GblInstance *pEmitter, const char *pSignalName, va_list *pVarArgs)
Equivalent to GblSignal_emit(), except taking arguments as a va_list* rather than variadic args.
size_t GblSignal_connectionCount(GblInstance *pInstance, const char *pSignalName)
Returns the number of connections which have been registered for pSignalName on pInstance.
GBL_RESULT GblSignal_emit(GblInstance *pEmitter, const char *pSignalName,...)
Fires pSignalName from pEmitter, with the given variadic argument list.
#define GBL_CONNECT(...)
Connects the signal with the given name from the given emitter to a receiver with the given callback ...
GblInstance * GblSignal_receiver(void)
Returns a pointer to the GblInstance which received the active signal or NULL if there isn't an activ...
GBL_RESULT GblSignal_connect(GblInstance *pEmitter, const char *pSignalName, GblInstance *pReceiver, GblFnPtr pFnCCallback, void *pUserdata)
Connects the given C callback function, pFnCCallback, to the given pSignalName, which is emitted from...
GblBool GblSignal_blocked(GblInstance *pInstance, const char *pSignalName)
Returns true if the signal is blocked on the given instance or if all signals are blocked,...
GBL_RESULT GblSignal_connectSignal(GblInstance *pEmitter, const char *pSignalName, GblInstance *pDstEmitter, const char *pDstSignalName)
Creates a forwarding signal by reemitting the pSignalName coming from pEmitter as pDstSignalName comi...
GBL_RESULT GblSignal_uninstall(GblType instanceType, const char *pName)
Uninstalls the signal with the given name which was previously installed onto the given instanceType.
GBL_RESULT GblSignal_connectClass(GblInstance *pEmitter, const char *pSignalName, GblInstance *pReceiver, GblType classType, size_t methodOffset)
Forwards the signal, pSignalName on pEmitter, to the virtual function at methodOffset located on the ...
GBL_RESULT GblSignal_emitVariants(GblInstance *pEmitter, const char *pSignalName, GblVariant *pArgs)
Equivalent to GblSignal_emit(), except taking arguments as an array of GblVariants rather than variad...
size_t GblSignal_disconnect(GblInstance *pEmitter, const char *pSignalName, GblInstance *pReceiver, GblClosure *pClosure)
Disconnects the given pClosure on the given pReceiver from the given pSignalName on the given pEmitte...
GblInstance * GblSignal_emitter(void)
Returns a pointer to the GblInstance which emitted the acive signal or NULL if there isn't an active ...
GBL_RESULT GblSignal_connectClosure(GblInstance *pEmitter, const char *pSignalName, GblInstance *pReceiver, GblClosure *pClosure)
Connects the generic closure instance, GblClosure, on the given pReceiver, from the given pSignalName...
void(* GblFnPtr)()
Type used for holding an untyped function pointer.
uint8_t GblBool
Basic boolean type, standardized to sizeof(char)
#define GBL_CALLBACK(fn)
Casts a C function pointer to a generic callback type.