66 delete[] pcallback->
name;
75 auto *psignal =
new struct signal;
78 psignal->arg_types = parg_types;
79 psignal->callbacks =
new QList<signal_callback *>;
80 psignal->depr_msg =
nullptr;
104 const char *signal_name, va_list args)
111 psignal =
fcl->signals_hash->value(signal_name,
nullptr);
113 for (
auto *pcallback : qAsConst(*psignal->
callbacks)) {
116 va_copy(args_cb, args);
126 "Signal \"%s\" does not exist, so cannot "
139 va_start(args, signal_name);
148 const char *signal_name,
149 int nargs, va_list args)
156 psignal =
fcl->signals_hash->value(signal_name,
nullptr);
162 enum api_types *parg_types =
new api_types[
nargs]();
164 QString sn = QString(signal_name);
167 for (i = 0; i <
nargs; i++) {
168 *(parg_types + i) = api_types(va_arg(args,
int));
171 fcl->signals_hash->insert(signal_name, created);
172 fcl->signal_names->append(sn);
182 const char *signal_name,
188 va_start(args,
nargs);
192 if (created !=
nullptr) {
203 const char *replacement,
const char *deprecated_since)
205 if (deprecator !=
nullptr) {
208 if (deprecated_since !=
nullptr && replacement !=
nullptr) {
210 buffer,
sizeof(buffer),
211 "Deprecated: lua signal \"%s\", deprecated since \"%s\", used. "
212 "Use \"%s\" instead",
213 signal_name, deprecated_since, replacement);
214 }
else if (replacement !=
nullptr) {
216 "Deprecated: lua signal \"%s\" used. Use \"%s\" instead",
217 signal_name, replacement);
220 "Deprecated: lua signal \"%s\" used.", signal_name);
231 const char *callback_name,
bool create)
239 psignal =
fcl->signals_hash->value(signal_name,
nullptr);
242 for (
auto *pcallback : qAsConst(*psignal->
callbacks)) {
243 if (!strcmp(pcallback->name, callback_name)) {
244 pcallback_found = pcallback;
250 qCWarning(deprecations_category,
"%s", psignal->
depr_msg);
254 if (pcallback_found) {
256 "Signal \"%s\" already has a callback "
258 signal_name, callback_name);
263 if (pcallback_found) {
264 psignal->
callbacks->removeAll(pcallback_found);
277 const char *signal_name,
278 const char *callback_name)
285 psignal =
fcl->signals_hash->value(signal_name,
nullptr);
288 for (
auto *pcallback : qAsConst(*psignal->
callbacks)) {
289 if (!strcmp(pcallback->name, callback_name)) {
305 if (
nullptr ==
fcl->signals_hash) {
306 fcl->signals_hash =
new QHash<QString, struct signal *>;
316 if (!
fcl || !
fcl->signals_hash) {
319 for (
auto *nissan : qAsConst(*
fcl->signals_hash)) {
322 delete fcl->signals_hash;
323 delete fcl->signal_names;
324 fcl->signals_hash =
nullptr;
325 fcl->signal_names =
nullptr;
336 return sindex <
fcl->signal_names->size() ?
fcl->signal_names->at(sindex)
345 const char *signal_name,
353 psignal =
fcl->signals_hash->value(signal_name,
nullptr);
354 if (psignal && sindex < psignal->
callbacks->size()) {
357 return pcallback->
name;
#define fc_assert_ret(condition)
#define fc_assert_ret_val(condition, val)
bool luascript_callback_invoke(struct fc_lua *fcl, const char *callback_name, int nargs, enum api_types *parg_types, va_list args)
Invoke the 'callback_name' Lua function.
int luascript_error(lua_State *L, const char *format,...)
Internal api error function - varg version.
void luascript_log(struct fc_lua *fcl, QtMsgType level, const char *format,...)
Print a message to the selected output handle.
void luascript_signal_free(struct fc_lua *fcl)
Free script signals and callbacks.
void luascript_signal_init(struct fc_lua *fcl)
Initialize script signals and callbacks.
static void signal_destroy(struct signal *psignal)
Free a signal.
bool luascript_signal_callback_defined(struct fc_lua *fcl, const char *signal_name, const char *callback_name)
Returns if a callback function to a certain signal is defined.
signal_deprecator * luascript_signal_create(struct fc_lua *fcl, const char *signal_name, int nargs,...)
Create a new signal type.
void deprecate_signal(signal_deprecator *deprecator, const char *signal_name, const char *replacement, const char *deprecated_since)
Mark signal deprecated.
void luascript_signal_emit_valist(struct fc_lua *fcl, const char *signal_name, va_list args)
Invoke all the callback functions attached to a given signal.
static struct signal_callback * signal_callback_new(const char *name)
Signals implementation.
static void signal_callback_destroy(struct signal_callback *pcallback)
Free a signal callback.
const char * luascript_signal_callback_by_index(struct fc_lua *fcl, const char *signal_name, int sindex)
Return the name of the 'index' callback function of the signal with the name 'signal_name'.
void luascript_signal_emit(struct fc_lua *fcl, const char *signal_name,...)
Invoke all the callback functions attached to a given signal.
void luascript_signal_callback(struct fc_lua *fcl, const char *signal_name, const char *callback_name, bool create)
Connects a callback function to a certain signal.
QString luascript_signal_by_index(struct fc_lua *fcl, int sindex)
Return the name of the signal with the given index.
static struct signal * signal_new(int nargs, enum api_types *parg_types)
Create a new signal.
static struct signal * luascript_signal_create_valist(struct fc_lua *fcl, const char *signal_name, int nargs, va_list args)
Create a new signal type.
static void static sol::state * fcl
Lua virtual machine state.
enum api_types * arg_types
QList< signal_callback * > * callbacks
int fc_snprintf(char *str, size_t n, const char *format,...)
See also fc_utf8_snprintf_trunc(), fc_utf8_snprintf_rep().