[Geany-Devel] Plugins which register new GType-s can be unloadable

Dimitar Zhekov dimitar.zhekov at xxxxx
Sat Sep 21 18:17:17 UTC 2013

Hi, all,

I found a way to make plugin that registers a new GType unloadable.
That requires some work and is a bit hackish, so you'd better avoid
it for simple plugins.

First, replace g_intern_static_string() with g_intern_string(). Note
that G_DEFINE_TYPE_WITH_CODE() uses g_intern_static_string(), so you
have to expand and change it. Remove any G_PARAM_STATIC_NICK or
G_PARAM_STATIC_BLURB flags from the properties registration too.

Second, create a constructor and move your instance initialization
code there.

Third, each time your plugin is loaded:
    - check if the class exists with g_type_from_name()
    - if it does not, register it class normally and reference it at
      least once, to make sure it's fully created; there is no need
      to hold the reference
    - if it exists, but your class_type_id_volatile is zero, get the
      class info and fix type's constructor, finalizer and any other
      virtual methods, fix the interface virtual methods, and set
      class_type_id_volatile the g_type_from_name() value

      See scp_tree_store_register_dynamic() for example.

That's all, folks! How does it work is left as an exercise for the
reader. :)

Obviously, the above is not possible if:
    - your constructor properties, if any, depend on your instance
      initialization code (glib/gtk+ ctor properties are ok, depend
      on glib/gtk+ instance init is ok)
    - your type has class finalization code (glib/gtk+ class
      finalize is ok, your instance finalize is of course ok)

E-gards: Jimmy

More information about the Devel mailing list