예제 #1
0
파일: Plugins.cs 프로젝트: JackHang/Wox
        public static void Init()
        {
            if (initializing != null) return;

            initializing = new ManualResetEvent(false);
            plugins.Clear();
            BasePluginLoader.ParsePluginsConfig();

            if (UserSettingStorage.Instance.EnablePythonPlugins) {
                plugins.AddRange(new PythonPluginLoader().LoadPlugin());
            }

            plugins.AddRange(new CSharpPluginLoader().LoadPlugin());
            Forker forker = new Forker();
            foreach (IPlugin plugin in plugins.Select(pluginPair => pluginPair.Plugin)) {
                IPlugin plugin1 = plugin;
                PluginPair pluginPair = plugins.FirstOrDefault(o => o.Plugin == plugin1);
                if (pluginPair != null) {
                    PluginMetadata metadata = pluginPair.Metadata;
                    pluginPair.InitContext = new PluginInitContext() {
                        Plugins = plugins,
                        CurrentPluginMetadata = metadata,
                        ChangeQuery = s => App.Window.Dispatcher.Invoke(new Action(() => App.Window.ChangeQuery(s))),
                        CloseApp = () => App.Window.Dispatcher.Invoke(new Action(() => App.Window.CloseApp())),
                        HideApp = () => App.Window.Dispatcher.Invoke(new Action(() => App.Window.HideApp())),
                        ShowApp = () => App.Window.Dispatcher.Invoke(new Action(() => App.Window.ShowApp())),
                        ShowMsg = (title, subTitle, iconPath) => App.Window.Dispatcher.Invoke(new Action(() =>
                            App.Window.ShowMsg(title, subTitle, iconPath))),
                        OpenSettingDialog = () => App.Window.Dispatcher.Invoke(new Action(() => App.Window.OpenSettingDialog())),
                        ShowCurrentResultItemTooltip = (msg) => App.Window.Dispatcher.Invoke(new Action(() => App.Window.ShowCurrentResultItemTooltip(msg))),
                        ReloadPlugins = () => App.Window.Dispatcher.Invoke(new Action(() => Init())),
                        InstallPlugin = (filePath) => App.Window.Dispatcher.Invoke(new Action(() => {
                            PluginInstaller.Install(filePath);
                        })),
                        StartLoadingBar = () => App.Window.Dispatcher.Invoke(new Action(() => App.Window.StartLoadingBar())),
                        StopLoadingBar = () => App.Window.Dispatcher.Invoke(new Action(() => App.Window.StopLoadingBar())),
                        //ShellRun = (cmd) => (bool)App.Window.Dispatcher.Invoke(new Func<bool>(() => App.Window.ShellRun(cmd)))
                    };

                    pluginPair.InitContext.ShellRun = (cmd) => {
                        try {
                            return (bool)App.Window.Dispatcher.Invoke(new Func<bool>(() => App.Window.ShellRun(cmd)));
                        }
                        catch (Exception) {
                            return false;
                        }
                    };

                    forker.Fork(() => plugin1.Init(pluginPair.InitContext));
                }
            }

            ThreadPool.QueueUserWorkItem(o => {
                forker.Join();
                initializing.Set();
                initializing = null;
            });
        }
예제 #2
0
        public static void Init()
        {
            plugins.Clear();
            List<PluginMetadata> pluginMetadatas = PluginConfigLoader.ParsePluginsConfig();

            plugins.AddRange(new CSharpPluginLoader().LoadPlugin(pluginMetadatas));
            plugins.AddRange(new BasePluginLoader<PythonPlugin>().LoadPlugin(pluginMetadatas));

            Forker forker = new Forker();
            foreach (PluginPair pluginPair in plugins)
            {
                PluginPair pair = pluginPair;
                forker.Fork(() => pair.Plugin.Init(new PluginInitContext()
                {
                    CurrentPluginMetadata = pair.Metadata,
                    Proxy = HttpProxy.Instance,
                    API = App.Window
                }));
            }

            forker.Join();
        }