summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorglacambre <code@lacamb.re>2019-08-19 19:16:23 +0200
committerGaute Hope <eg@gaute.vetsj.com>2019-09-01 12:08:49 +0200
commit582cd35feaa4f3489a57b77896a20ab456a75a4e (patch)
tree1b78b863ba8e8b7959d3d7c39ff074bf3ad76488
parent3813a5171b24eff083c94cbed619f2de4db34e34 (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.cc14
-rw-r--r--src/plugin/astroid_activatable.c20
-rw-r--r--src/plugin/astroid_activatable.h2
-rw-r--r--src/plugin/manager.cc26
-rw-r--r--src/plugin/manager.hh1
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);
};