diff --git a/honoka/libhonoka/honokapluginbase.cpp b/honoka/libhonoka/honokapluginbase.cpp index a6f020e..bcc0c95 100644 --- a/honoka/libhonoka/honokapluginbase.cpp +++ b/honoka/libhonoka/honokapluginbase.cpp @@ -91,3 +91,4 @@ timerEventId.clear(); } + diff --git a/honoka/libhonoka/honokapluginbase.h b/honoka/libhonoka/honokapluginbase.h index 52d0aee..5205e6d 100644 --- a/honoka/libhonoka/honokapluginbase.h +++ b/honoka/libhonoka/honokapluginbase.h @@ -36,7 +36,7 @@ #include #include -#define HONOKA_CONFIG_PLUGINLOADER_PREFIX "/IMEngine/Honoka/PluginLoader" +#define HONOKA_CONFIG_PLUGINLOADER_PREFIX "/IMEngine/Honoka/PluginLoader" #define HONOKA_CONFIG_KEY_CONVERTOR_PREFIX "/IMEngine/Honoka/Key/Convertor" #define HONOKA_CONFIG_KEY_PREEDITOR_PREFIX "/IMEngine/Honoka/Key/PreEditor" #define HONOKA_CONFIG_KEY_PREDICTOR_PREFIX "/IMEngine/Honoka/Key/Predictor" @@ -61,6 +61,12 @@ extern "C" { \ HonokaSetupCorePage *HonokaPluginSetup() { return pName::setup(); }; \ } + +#define HonokaPluginReload(pName) \ + extern "C" { \ + bool HonokaPluginReload(ConfigPointer cfg) { return pName::reload(cfg); }; \ + } + #ifndef HonokaSetup #define HonokaSetupItem HonokaSetupCoreItem #define HonokaSetupEntryItem HonokaSetupCoreEntryItem @@ -74,7 +80,7 @@ #endif - +class HonokaPluginBase; class HonokaPluginBase{ protected: HonokaPluginBase(const String pluginType); diff --git a/honoka/src/honoka_imengine.cpp b/honoka/src/honoka_imengine.cpp index 171a2e6..dda37ad 100644 --- a/honoka/src/honoka_imengine.cpp +++ b/honoka/src/honoka_imengine.cpp @@ -237,6 +237,25 @@ if (!_scim_config->read(String(HONOKA_CONFIG_PLUGINLOADER_PREFIX) + "/" + d.substr(0,d.length() - 3),true)) continue; d = String(HONOKA_PLUGINDIR) + "/" + d; + // + bool rl = false; + for(unsigned int i = 0;i < plugins.size();i ++) { + if (plugins[i].filename == d) { + HonokaPluginBase *p = plugins[i].instance; + if (pluginNameList.find(p->getName()) != pluginNameList.end()) break; + rl = true; + if (p->getPluginType() == "Multiple") { + pluginNameList.insert(p->getName()); + for(unsigned int j = 0;j < static_cast(p)->getPluginCount();j++) + pluginCheck(static_cast(p)->getPluginInstanceAt(j)); + break; + } else if (pluginCheck(p)) { + pluginNameList.insert(p->getName()); + break; + } + } + } + if (rl) continue; // 実際にロードします。 void* plugin = dlopen(d.c_str(), RTLD_LAZY); if (!plugin) continue; @@ -244,6 +263,7 @@ createInstanceFunc *getInstance = (createInstanceFunc *)dlsym(plugin,"getHonokaPluginInstance"); deleteInstanceFunc *deleteInstance = (deleteInstanceFunc *)dlsym(plugin,"deleteHonokaPluginInstance"); getPluginVersionFunc *getPluginVersion = (getPluginVersionFunc *)dlsym(plugin,"getHonokaPluginVersion"); + reloadInstanceFunc *reloadInstance = (reloadInstanceFunc *)dlsym(plugin,"HonokaPluginReload"); // 関数が不足した場合はアンロードします。 if ((!getInstance) || (!deleteInstance) || (!getPluginVersion)) { dlclose(plugin); @@ -259,6 +279,7 @@ pe.createInstance = getInstance; pe.deleteInstance = deleteInstance; pe.getPluginVersion = getPluginVersion; + pe.reloadInstance = reloadInstance; pe.instance = p; pe.name = p->getName(); pe.dll = plugin; @@ -330,6 +351,45 @@ } /*! + \fn HonokaInstance::allReset() + */ +void HonokaInstance::allReset() +{ +// unload(); + vector pb; + HonokaTimer::destruct(); + m_preeditor->reset(); + for(unsigned int i = 0;i < plugins.size();i ++) { + if (plugins[i].reloadInstance != 0) { + if (plugins[i].reloadInstance(_scim_config)) { + pb.push_back(plugins[i]); + } else { + plugins[i].deleteInstance(plugins[i].instance); + dlclose(plugins[i].dll); + } + } else { + plugins[i].deleteInstance(plugins[i].instance); + dlclose(plugins[i].dll); + } + } + convertors.clear(); + preeditors.clear(); + predictors.clear(); + filters.clear(); + delete acpredictor; + delete m_multi; + plugins.clear(); + plugins = pb; + + loadPlugins(); + init(); + m_proplist.clear(); + updateProperty(); + updatePreEditor(); + return; +} + +/*! \fn HonokaInstance::init() */ void HonokaInstance::init() @@ -938,12 +998,7 @@ bool HonokaInstance::process_preedit_key_event(const KeyEvent &key) { if (k_allreset.comp(key)) { - unload(); - loadPlugins(); - init(); - m_proplist.clear(); - updateProperty(); - updatePreEditor(); + allReset(); return true; } if (!m_preeditor->getTextLength()) pStringType = NORMAL; diff --git a/honoka/src/honoka_imengine.h b/honoka/src/honoka_imengine.h index 611b0bc..27a6a1d 100644 --- a/honoka/src/honoka_imengine.h +++ b/honoka/src/honoka_imengine.h @@ -54,6 +54,7 @@ typedef HonokaPluginBase* createInstanceFunc(ConfigPointer); typedef void deleteInstanceFunc(HonokaPluginBase *); typedef int getPluginVersionFunc(); +typedef bool reloadInstanceFunc(ConfigPointer); using namespace scim; using namespace std; @@ -89,6 +90,7 @@ createInstanceFunc *createInstance; deleteInstanceFunc *deleteInstance; getPluginVersionFunc *getPluginVersion; + reloadInstanceFunc *reloadInstance; HonokaPluginBase *instance; }; @@ -175,6 +177,7 @@ void loadPlugins(); void init(); void unload(); + void allReset(); void updatePreEditor(); void updateProperty(); void updateConversion();