diff options
author | glacambre <code@lacamb.re> | 2019-08-19 19:16:23 +0200 |
---|---|---|
committer | Gaute Hope <eg@gaute.vetsj.com> | 2019-09-01 12:08:49 +0200 |
commit | 582cd35feaa4f3489a57b77896a20ab456a75a4e (patch) | |
tree | 1b78b863ba8e8b7959d3d7c39ff074bf3ad76488 | |
parent | 3813a5171b24eff083c94cbed619f2de4db34e34 (diff) |
Add get_queries() extension method
This patch adds a way to programmatically generate queries on startup.
This is done by adding a new method named "get_queries" to the
astroid_activatable interface.
Closes https://github.com/astroidmail/astroid/issues/614.
-rw-r--r-- | src/astroid.cc | 14 | ||||
-rw-r--r-- | src/plugin/astroid_activatable.c | 20 | ||||
-rw-r--r-- | src/plugin/astroid_activatable.h | 2 | ||||
-rw-r--r-- | src/plugin/manager.cc | 26 | ||||
-rw-r--r-- | src/plugin/manager.hh | 1 |
5 files changed, 63 insertions, 0 deletions
diff --git a/src/astroid.cc b/src/astroid.cc index dc52973..3d5dc9f 100644 --- a/src/astroid.cc +++ b/src/astroid.cc @@ -493,6 +493,17 @@ namespace Astroid { mw->add_mode (s); } +# ifndef DISABLE_PLUGINS + auto queries = plugin_manager->astroid_extension->get_queries (); + LOG (info) << "extension queries: " << queries.size(); + if (queries.size() > 0) { + for (auto query : queries) { + Mode * ti = new ThreadIndex(mw, query.second, query.first); + ti->invincible = true; + mw->add_mode(ti); + } + } else { +# endif ptree qpt = config ("startup.queries"); for (const auto &kv : qpt) { @@ -504,6 +515,9 @@ namespace Astroid { ti->invincible = true; // set startup queries to be invincible mw->add_mode (ti); } +# ifndef DISABLE_PLUGINS + } +# endif mw->set_active (0); } diff --git a/src/plugin/astroid_activatable.c b/src/plugin/astroid_activatable.c index c8e7cfc..9655b05 100644 --- a/src/plugin/astroid_activatable.c +++ b/src/plugin/astroid_activatable.c @@ -158,6 +158,26 @@ astroid_activatable_get_tag_colors (AstroidActivatable * activatable, const char } /** + * astroid_activatable_get_queries: + * @activatable: A #AstroidActivatable. + * + * Returns: (element-type utf8) (transfer container): List of lists containing a name and a query. + */ +GList * +astroid_activatable_get_queries (AstroidActivatable * activatable) +{ + AstroidActivatableInterface *iface; + + if (!ASTROID_IS_ACTIVATABLE (activatable)) return NULL; + + iface = ASTROID_ACTIVATABLE_GET_IFACE (activatable); + if (iface->get_queries) + return iface->get_queries (activatable); + + return NULL; +} + +/** * astroid_activatable_process: * @activatable: A #AstroidActivatable. * @fname: A #utf8. diff --git a/src/plugin/astroid_activatable.h b/src/plugin/astroid_activatable.h index f175f81..ae111f6 100644 --- a/src/plugin/astroid_activatable.h +++ b/src/plugin/astroid_activatable.h @@ -28,6 +28,7 @@ struct _AstroidActivatableInterface const char * (*get_user_agent) (AstroidActivatable * activatable); const char * (*generate_mid) (AstroidActivatable * activatable); GList * (*get_tag_colors) (AstroidActivatable * activatable, const char * tag, const char * bg); + GList * (*get_queries) (AstroidActivatable * activatable); GMimeStream * (*process) (AstroidActivatable * activatable, const char * fname); }; @@ -43,6 +44,7 @@ void astroid_activatable_update_state (AstroidActivatable *activatable); const char * astroid_activatable_get_user_agent (AstroidActivatable * activatable); const char * astroid_activatable_generate_mid (AstroidActivatable * activatable); GList * astroid_activatable_get_tag_colors (AstroidActivatable * activatable, const char * tag, const char * bg); +GList * astroid_activatable_get_queries (AstroidActivatable * activatable); GMimeStream * astroid_activatable_process (AstroidActivatable * activatable, const char * fname); G_END_DECLS diff --git a/src/plugin/manager.cc b/src/plugin/manager.cc index 2ea165f..a811773 100644 --- a/src/plugin/manager.cc +++ b/src/plugin/manager.cc @@ -241,6 +241,32 @@ namespace Astroid { return clrs; } + std::vector<std::pair<ustring, ustring>> PluginManager::AstroidExtension::get_queries () { + std::vector<std::pair<ustring, ustring>> queries = {}; + + if (!active || astroid->plugin_manager->disabled) return queries; + + for (PeasPluginInfo * p : astroid->plugin_manager->astroid_plugins) { + PeasExtension * pe = peas_extension_set_get_extension (extensions, p); + + GList * list = astroid_activatable_get_queries (ASTROID_ACTIVATABLE(pe)); + + if (list != NULL) { + std::vector<ustring> _list = Glib::ListHandler<ustring>::list_to_vector (list, Glib::OWNERSHIP_NONE); + if (_list.size() % 2 != 0) { + return queries; + } + for (auto it = _list.begin(); it != _list.end(); it += 2) { + queries.push_back(std::make_pair(*it, *(it+1))); + } + + g_list_free(list); + } + } + + return queries; + } + GMimeStream * PluginManager::AstroidExtension::process ( const char * fname) { if (!active || astroid->plugin_manager->disabled) return NULL; diff --git a/src/plugin/manager.hh b/src/plugin/manager.hh index a346667..95219a1 100644 --- a/src/plugin/manager.hh +++ b/src/plugin/manager.hh @@ -45,6 +45,7 @@ namespace Astroid { bool get_user_agent (ustring &); bool generate_mid (ustring &); std::pair<ustring, ustring> get_tag_colors (ustring tag, ustring bg); + std::vector<std::pair<ustring, ustring>> get_queries (); GMimeStream * process (const char * fname); }; |