Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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/>`_