Skip to content

Commit

Permalink
Create plugins developer guide (#66)
Browse files Browse the repository at this point in the history
* Add Type Modules Plugin info in developer guides

* Add Libpeas Plugin info in developer guides
  • Loading branch information
colinkiama authored Feb 1, 2025
1 parent 29bc420 commit 9cea940
Show file tree
Hide file tree
Showing 3 changed files with 129 additions and 0 deletions.
8 changes: 8 additions & 0 deletions source/developer-guides/plugins.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
Plugins
=======

.. toctree::
:glob:
:maxdepth: 1

plugins/*
109 changes: 109 additions & 0 deletions source/developer-guides/plugins/01-type-modules.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
Type Modules
============

This example shows you how to implement a GLib.TypeModule based plugin in Vala. It also shows the usage of static construct/destruct block.

.. code-block:: vala
// plugin.vala
public class MyClass : Object
{
static construct
{
message("MyClass init");
}
static ~MyClass()
{
message("MyClass deinit");
}
}
[ModuleInit]
Type plugin_init(GLib.TypeModule type_modul)
{
return typeof(MyClass);
}
.. code-block:: vala
// loader.vala
class MyModule : TypeModule
{
[CCode (has_target = false)]
private delegate Type PluginInitFunc(TypeModule module);
private GLib.Module module = null;
private string name = null;
public MyModule(string name)
{
this.name = name;
}
public override bool load()
{
string path = Module.build_path(null, name);
module = Module.open(path, GLib.ModuleFlags.BIND_LAZY);
if(null == module) {
error("Module not found");
}
void * plugin_init = null;
if(! module.symbol("plugin_init", out plugin_init)) {
error("No such symbol");
}
((PluginInitFunc) plugin_init)(this);
return true;
}
public override void unload()
{
module = null;
message("Library unloaded");
}
}
// Never unref instance of GTypeModule
// http://www.lanedo.com/~mitch/module-system-talk-guadec-2006/Module-System-Talk-Guadec-2006.pdf
static TypeModule module = null;
int main()
{
module = new MyModule("plugin");
module.load();
var o = GLib.Object.new(Type.from_name("MyClass"));
// free last instance, plugin unload
o = null;
return 0;
}
**Build**:

.. code-block:: console
$ valac -o loader loader.vala --pkg=gmodule-2.0
$ valac --ccode plugin.vala
$ gcc -fPIC -shared -o libplugin.so plugin.c $(pkg-config --libs --cflags gobject-2.0 gmodule-2.0)
**Run**:

.. code-block:: console
$ LD_LIBRARY_PATH=$PWD ./loader
Which should output something like this:

.. code-block:: output
** Message: plugin.vala:5: MyClass init
** Message: plugin.vala:10: MyClass deinit
** Message: loader.vala:37: Library unloaded
12 changes: 12 additions & 0 deletions source/developer-guides/plugins/02-libpeas.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
Libpeas
=======

In advanced scenarios, you may need to create a plugin engine to manage plugins in your application.

You can save time by using Libpeas, a library that handles that logic of making your application extensible with plugins.

**Links**:

* `Project Repository <https://gitlab.gnome.org/GNOME/libpeas>`_
* `libpeas-2 - Valadoc Package page <https://valadoc.org/libpeas-2/index.htm>`_
* `libpeas-2 - C Documentation <https://gnome.pages.gitlab.gnome.org/libpeas/libpeas-2/>`_

0 comments on commit 9cea940

Please sign in to comment.