[Geany-Devel] New plugin loader mechanisms

Thomas Martitz kugel at xxxxx
Sat Mar 28 22:56:02 UTC 2015


based on the discussion I refined my proposal (see below). Additionally 
I have implemented all of this, including updating demoplugin.c, see 
[1]. And last but not least, I have a fully working implementation of 
proxy plugins aka pluxies (in fact, I simply updated my year-old branch 
to use the new hooks) plus a real-world pluxy for libpeas-based plugins, 
see [2], [3].

I also formally suggest this work for merging. I havent done a pull 
request yet, though, because it depends on the linkage-cleanup work, 
which should be merged first. I do target the 1.25 release still, and 
I'd absolutely love to if we can make this happen.

The changes since my initial proposal summed up:
- geany_plugin_register() now additionally takes the API version the 
plugin is compiled against (in addition to the minimum API it needs and 
the ABI version). This gives Geany full insight of what the plugin can 
be expected to work with.
- set_info() is removed from the hooks. version_check() is obviously 
obsolete (the checks are performed within geany_plugin_register()). The 
plugin is expected to full plugin->info before calling 
geany_plugin_register() which makes set_info() superfluous
- The conceptual role of geany_load_module() is extended: It should also 
check for plugin-specific runtime dependencies, and return FALSE if such 
checks fail (as a result the plugin will be hidden from the PM dialog). 
Otherwise call geany_plugin_register() appropriately.
- geany_load_module() passes Geany's API version, sos that plugins can 
perform their own specific checks based on the API of the currently 
running Geany instance (this can very well be != the plugins 
- The GeanyData pointer is now part of GeanyPlugin structure for plugins 
to access (not passed to init anymore). Actually it was this way in my 
first version too, but I didn't explicitly mention it.
- PluginHooks is renamed to GeanyPluginHooks

Now to the (updated) proposal:

Please see my initial mail [4] about the motivation and advantages of 
this work.

gboolean geany_load_module(GeanyPlugin *plugin, GModule *module, gint 
gboolean geany_plugin_register(GeanyPlugin *plugin, gint api_version, 
gint min_api_version,
                                gint abi_version, GeanyPluginHooks 
*hooks, gpointer pdata);

typedef struct _GeanyPluginHooks
     /** Array of plugin-provided signal handlers (@see PluginCallback) */
     PluginCallback *callbacks;
     /** Called when the plugin is enabled by the user */
     void        (*init)      (GeanyPlugin *plugin, gpointer pdata);
     /** plugins configure dialog, optional (can be @c NULL) */
     GtkWidget*  (*configure) (GeanyPlugin *plugin, GtkDialog *dialog, 
gpointer pdata);
     /** Called when the plugin should show some help, optional (can be 
@c NULL) */
     void        (*help)      (GeanyPlugin *plugin, gpointer pdata);
     /** Called when the plugin is disabled or when Geany exits */
     void        (*cleanup)   (GeanyPlugin *plugin, gpointer pdata);

Plugins from now on define a single global function, 
geany_load_module(), which is called by Geany via pointer obtained from 
g_module_symbol(). In this function the plugin should perform the 
following steps:

- Test against the passed geany_api_version if it can function under the 
current Geany.
- Test for any additional runtime dependencies
- Call geany_plugin_register() appropate and test the return value

If any of the above steps fail FALSE should be returned, else TRUE.

The plugin shall pass a statically allocated instance of 
GeanyPluginHooks as part of the geany_plugin_register() call. The 
function pointers should point to function that are semantically the 
same as the current plugin_{init,configure,help,cleanup}. Except these 
function get other parameters and can make use of them.

This proposal does not implement pluxies by itself, however I have done 
the work to implement pluxies on top of the new loader. I will post 
another mail about this when we finalized the new loader.

[1] https://github.com/kugel-/geany/tree/new_hooks
[2] https://github.com/kugel-/geany/tree/pluxy
[3] https://github.com/kugel-/peasy
[4] http://lists.geany.org/pipermail/devel/2015-March/009299.html

Please reply with your options or other ideas.

Best regards

More information about the Devel mailing list