/// <summary> /// Load and init all Wox plugins /// </summary> public static void Init(IPublicAPI api) { if (api == null) { throw new WoxFatalException("api is null"); } SetupPluginDirectories(); API = api; var metadatas = PluginConfig.Parse(pluginDirectories); AllPlugins = (new CSharpPluginLoader().LoadPlugin(metadatas)). Concat(new JsonRPCPluginLoader <PythonPlugin>().LoadPlugin(metadatas)); //load plugin i18n languages ResourceMerger.UpdatePluginLanguages(); foreach (PluginPair pluginPair in AllPlugins) { PluginPair pair = pluginPair; ThreadPool.QueueUserWorkItem(o => { var milliseconds = Stopwatch.Normal($"Plugin init: {pair.Metadata.Name}", () => { pair.Plugin.Init(new PluginInitContext { CurrentPluginMetadata = pair.Metadata, Proxy = HttpProxy.Instance, API = API }); }); pair.InitTime = milliseconds; InternationalizationManager.Instance.UpdatePluginMetadataTranslations(pair); }); } ThreadPool.QueueUserWorkItem(o => { InstantQueryPlugins = GetPluginsForInterface <IInstantQuery>(); contextMenuPlugins = GetPluginsForInterface <IContextMenu>(); foreach (var plugin in AllPlugins) { if (IsGlobalPlugin(plugin.Metadata)) { GlobalPlugins.Add(plugin); } else { foreach (string actionKeyword in plugin.Metadata.ActionKeywords) { NonGlobalPlugins[actionKeyword] = plugin; } } } }); }
public static void UpdateActionKeywordForPlugin(PluginPair plugin, string oldActionKeyword, string newActionKeyword) { var actionKeywords = plugin.Metadata.ActionKeywords; if (string.IsNullOrEmpty(newActionKeyword)) { string msg = InternationalizationManager.Instance.GetTranslation("newActionKeywordsCannotBeEmpty"); throw new WoxPluginException(plugin.Metadata.Name, msg); } // do nothing if they are same if (oldActionKeyword == newActionKeyword) { return; } if (NonGlobalPlugins.ContainsKey(newActionKeyword)) { string msg = InternationalizationManager.Instance.GetTranslation("newActionKeywordsHasBeenAssigned"); throw new WoxPluginException(plugin.Metadata.Name, msg); } // add new action keyword if (string.IsNullOrEmpty(oldActionKeyword)) { actionKeywords.Add(newActionKeyword); if (newActionKeyword == Query.GlobalPluginWildcardSign) { GlobalPlugins.Add(plugin); } else { NonGlobalPlugins[newActionKeyword] = plugin; } } // update existing action keyword else { int index = actionKeywords.IndexOf(oldActionKeyword); actionKeywords[index] = newActionKeyword; if (oldActionKeyword == Query.GlobalPluginWildcardSign) { GlobalPlugins.Remove(plugin); } else { NonGlobalPlugins.Remove(oldActionKeyword); } if (newActionKeyword == Query.GlobalPluginWildcardSign) { GlobalPlugins.Add(plugin); } else { NonGlobalPlugins[newActionKeyword] = plugin; } } }