99
120
* @param args arguments
102
124
void* FcitxModuleInvokeFunctionByName(struct _FcitxInstance* instance, const char* name, int functionId, FcitxModuleFunctionArg args);
125
#define FcitxModuleInvokeVaArgsByName(instance, name, functionId, ARGV...) \
126
(FcitxModuleInvokeFunctionByName(instance, name, functionId, \
127
(FcitxModuleFunctionArg){ {ARGV} }))
104
129
/** call a function provides by other addon */
105
#define InvokeFunction(INST, MODULE, FUNC, ARG) \
106
((MODULE##_##FUNC##_RETURNTYPE) FcitxModuleInvokeFunctionByName(INST, MODULE##_NAME, MODULE##_##FUNC, ARG))
108
/** add a function to current addon */
109
#define AddFunction(ADDON, Realname) \
111
void *temp = Realname; \
112
utarray_push_back(&ADDON->functionList, &temp); \
130
#define InvokeFunction(INST, MODULE, FUNC, ARG) \
131
((MODULE##_##FUNC##_RETURNTYPE)FcitxModuleInvokeFunctionByName(INST, MODULE##_NAME, MODULE##_##FUNC, ARG))
133
#define InvokeVaArgs(INST, MODULE, FUNC, ARGV...) \
134
((MODULE##_##FUNC##_RETURNTYPE)FcitxModuleInvokeFunctionByName( \
135
INST, MODULE##_NAME, MODULE##_##FUNC, \
136
(FcitxModuleFunctionArg){ {ARGV} }))
138
/** add a function to a addon */
139
#define AddFunction(ADDON, Realname) \
141
FCITX_DEPRECATED void *(AddonFunction) = (void*)Realname; \
142
utarray_push_back(&ADDON->functionList, &(AddonFunction)); \
146
* add a function to a addon
151
void FcitxModuleAddFunction(FcitxAddon *addon, FcitxModuleFunction func);
154
#define DECLARE_ADDFUNCTIONS(prefix) \
156
static inline FcitxAddon* \
157
Fcitx_##prefix##_GetAddon(FcitxInstance *instance); \
158
static void Fcitx##prefix##AddFunctions(FcitxInstance *instance); \
161
#define DECLARE_ADDFUNCTIONS(prefix) \
162
static inline FcitxAddon* \
163
Fcitx_##prefix##_GetAddon(FcitxInstance *instance); \
164
static void Fcitx##prefix##AddFunctions(FcitxInstance *instance);
167
// Well won't work if there are multiple instances, but that will also break
168
// lots of other things anyway.
169
#define DEFINE_GET_ADDON(name, prefix) \
170
static inline FcitxAddon* \
171
Fcitx##prefix##GetAddon(FcitxInstance *instance) \
173
static FcitxAddon *addon = NULL; \
174
static FcitxInstance *_instance = NULL; \
175
if (fcitx_unlikely(_instance != instance)) { \
176
_instance = instance; \
177
addon = FcitxAddonsGetAddonByName( \
178
FcitxInstanceGetAddons(instance), name); \
183
#define DEFINE_GET_AND_INVOKE_FUNC(prefix, suffix, id) \
184
DEFINE_GET_AND_INVOKE_FUNC_WITH_ERROR(prefix, suffix, id, NULL)
185
#define DEFINE_GET_AND_INVOKE_FUNC_WITH_ERROR(prefix, suffix, id, err_ret) \
186
DEFINE_GET_AND_INVOKE_FUNC_WITH_TYPE_AND_ERROR(prefix, suffix, id, \
187
intptr_t, (intptr_t)err_ret)
189
#define DEFINE_GET_AND_INVOKE_FUNC_WITH_TYPE_AND_ERROR(prefix, suffix, \
191
static inline FcitxModuleFunction \
192
Fcitx##prefix##Find##suffix(FcitxAddon *addon) \
194
static FcitxAddon *_addon = NULL; \
195
static FcitxModuleFunction func = NULL; \
196
if (fcitx_unlikely(addon != _addon)) { \
198
func = FcitxModuleFindFunction(addon, id); \
202
static inline void* \
203
Fcitx##prefix##Invoke##suffix(FcitxInstance *instance, \
204
FcitxModuleFunctionArg args) \
206
static type _on_err = (err_ret); \
207
FCITX_DEF_CAST_TO_PTR(on_err, type, _on_err); \
208
FcitxAddon *addon = Fcitx##prefix##GetAddon(instance); \
209
if (fcitx_unlikely(!addon)) \
211
FcitxModuleFunction func = Fcitx##prefix##Find##suffix(addon); \
212
if (fcitx_unlikely(!func)) \
214
return FcitxModuleInvokeOnAddon(addon, func, &args); \
217
#define FCITX_DEF_MODULE_ARGS(var, ARGV...) \
218
FcitxModuleFunctionArg var = { {ARGV} }
219
/* void *__##var##_array[] = {ARGV}; \ */
220
/* size_t __##var##_length = sizeof(__##var##_array) / sizeof(void*); \ */
221
/* FcitxModuleFunctionArg var[] = { { .n = __##var##_length, \ */
222
/* .args = __##var##_array } } */
224
#define FCITX_MODULE_FUNCTION_ARGS void *arg, FcitxModuleFunctionArg args
225
#define FCITX_MODULE_SELF(NAME, TYPE) TYPE *NAME = (TYPE*)arg
226
#define FCITX_MODULE_ARG(NAME, TYPE, INDEX) \
227
FCITX_DEF_CAST_FROM_PTR(TYPE, NAME, args.args[(INDEX)])
115
229
#ifdef __cplusplus