7 #ifndef _FCITX_ADDONINSTANCE_H_ 8 #define _FCITX_ADDONINSTANCE_H_ 13 #include <fcitx-config/configuration.h> 14 #include <fcitx-config/rawconfig.h> 15 #include <fcitx-utils/macros.h> 17 #include <fcitx/addoninfo.h> 18 #include <fcitx/addoninstance_details.h> 19 #include <fcitx/fcitxcore_export.h> 28 class AddonManagerPrivate;
93 getSubConfig(
const std::string & )
const {
96 virtual void setSubConfig(
const std::string & ,
99 template <
typename Signature,
typename... Args>
100 typename std::function<Signature>::result_type
101 callWithSignature(
const std::string &name, Args &&...args) {
102 auto *adaptor = findCall(name);
103 auto erasureAdaptor =
105 return erasureAdaptor->callback(std::forward<Args>(args)...);
107 template <
typename MetaSignatureString,
typename... Args>
108 AddonFunctionSignatureReturnType<MetaSignatureString>
109 callWithMetaString(Args &&...args) {
110 return callWithSignature<
111 AddonFunctionSignatureType<MetaSignatureString>>(
112 MetaSignatureString::data(), std::forward<Args>(args)...);
116 template <
typename MetaType,
typename... Args>
117 AddonFunctionSignatureReturnType<typename MetaType::Name>
119 return callWithSignature<typename MetaType::Signature>(
120 MetaType::Name::data(), std::forward<Args>(args)...);
123 void registerCallback(
const std::string &name,
138 bool canRestart()
const;
157 void setCanRestart(
bool canRestart);
161 std::unique_ptr<AddonInstancePrivate> d_ptr;
167 #define FCITX_ADDON_EXPORT __declspec(dllexport) 169 #define FCITX_ADDON_EXPORT __attribute__((visibility("default"))) 172 #define FCITX_ADDON_DECLARE_FUNCTION(NAME, FUNCTION, SIGNATURE...) \ 175 struct AddonFunctionSignature<fcitxMakeMetaString(#NAME "::" #FUNCTION)> { \ 177 std::remove_reference_t<decltype(std::declval<SIGNATURE>())>; \ 179 namespace I##NAME { \ 181 using Name = fcitxMakeMetaString(#NAME "::" #FUNCTION); \ 182 using Signature = AddonFunctionSignatureType<Name>; \ 187 #define FCITX_ADDON_EXPORT_FUNCTION(CLASS, FUNCTION) \ 188 static_assert(std::is_same_v<::fcitx::I##CLASS::FUNCTION::Name, \ 189 fcitxMakeMetaString(#CLASS "::" #FUNCTION)>, \ 191 decltype(::fcitx::MakeAddonFunctionAdaptor( \ 192 &CLASS::FUNCTION)) FUNCTION##Adaptor{#CLASS "::" #FUNCTION, this, \ 195 std::is_same_v<decltype(::fcitx::MakeAddonFunctionAdaptor( \ 196 &CLASS::FUNCTION))::Signature, \ 197 ::fcitx::AddonFunctionSignatureType< \ 198 fcitxMakeMetaString(#CLASS "::" #FUNCTION)>>, \ 199 "Signature doesn't match"); 201 #define FCITX_ADDON_FACTORY(ClassName) \ 203 FCITX_ADDON_EXPORT ::fcitx::AddonFactory *fcitx_addon_factory_instance() { \ 204 static ClassName factory; \ 209 #define FCITX_ADDON_FACTORY_V2(AddonName, ClassName) \ 211 FCITX_ADDON_EXPORT ::fcitx::AddonFactory * \ 212 fcitx_addon_factory_instance_##AddonName() { \ 213 static ClassName factory; \ 218 #define FCITX_DEFINE_STATIC_ADDON_REGISTRY(Name, ...) \ 219 ::fcitx::StaticAddonRegistry &Name() { \ 220 static ::fcitx::StaticAddonRegistry registry{__VA_ARGS__}; \ 224 #define FCITX_ADDON_FACTORY_V2_BACKWARDS(AddonName, ClassName) \ 225 FCITX_ADDON_FACTORY_V2(AddonName, ClassName) \ 226 FCITX_ADDON_FACTORY(ClassName) 228 #define FCITX_IMPORT_ADDON_FACTORY(StaticRegistryGetter, AddonName) \ 230 ::fcitx::AddonFactory *fcitx_addon_factory_instance_##AddonName(); \ 232 class StaticAddonRegistrar_##AddonName { \ 234 StaticAddonRegistrar_##AddonName() { \ 235 (StaticRegistryGetter)().emplace( \ 236 FCITX_STRINGIFY(AddonName), \ 237 fcitx_addon_factory_instance_##AddonName()); \ 240 StaticAddonRegistrar_##AddonName staticAddonRegistrar_##AddonName 243 #define FCITX_ADDON_DEPENDENCY_LOADER(NAME, ADDONMANAGER) \ 245 if (_##NAME##FirstCall_) { \ 246 _##NAME##_ = (ADDONMANAGER).addon(#NAME, true); \ 247 _##NAME##FirstCall_ = false; \ 251 bool _##NAME##FirstCall_ = true; \ 252 ::fcitx::AddonInstance *_##NAME##_ = nullptr; 254 #endif // _FCITX_ADDONINSTANCE_H_ virtual void reloadConfig()
Reload configuration from disk.
virtual const Configuration * getConfig() const
Get the configuration.
virtual void setConfig(const RawConfig &)
Set configuration from Raw Config.
virtual void save()
Save any relevant data. Usually, it will be invoked when fcitx exits.
Base class for any addon in fcitx.
AddonFunctionSignatureReturnType< typename MetaType::Name > call(Args &&...args)
Call an exported function for this addon.