<!-- ##### SECTION Title ##### -->
ThunarxProviderPlugin

<!-- ##### SECTION Short_Description ##### -->
The interface to the plugin type registration

<!-- ##### SECTION Long_Description ##### -->
<para>
  #ThunarxProviderPlugin is the interface to the file manager's type plugin loader implementation. It
  provides methods to extensions - also called <emphasis>provider plugins</emphasis> - to register dynamic
  types and control certain aspects of the plugin (see thunarx_provider_plugin_set_resident()).
</para>

<!-- ##### SECTION See_Also ##### -->
<para>
	#ThunarxProviderFactory
</para>

<!-- ##### SECTION Stability_Level ##### -->
Stable

<!-- ##### SECTION Image ##### -->


<!-- ##### STRUCT ThunarxProviderPlugin ##### -->
<para>
  The #ThunarxProviderPlugin struct is just a typedef for
  the interface instance type.
</para>


<!-- ##### ARG ThunarxProviderPlugin:resident ##### -->
<para>

</para>

<!-- ##### STRUCT ThunarxProviderPluginIface ##### -->
<para>
  Interface with virtual methods implemented by the file manager and
  accessible from the extensions.
</para>

@get_resident: see thunarx_provider_plugin_get_resident().
@set_resident: see thunarx_provider_plugin_set_resident().
@register_type: see thunarx_provider_plugin_register_type().
@add_interface: see thunarx_provider_plugin_add_interface().
@register_enum: see thunarx_provider_plugin_register_enum().
@register_flags: see thunarx_provider_plugin_register_flags().

<!-- ##### FUNCTION thunarx_provider_plugin_get_resident ##### -->
<para>

</para>

@plugin: 
@Returns: 


<!-- ##### FUNCTION thunarx_provider_plugin_set_resident ##### -->
<para>

</para>

@plugin: 
@resident: 


<!-- ##### FUNCTION thunarx_provider_plugin_register_type ##### -->
<para>

</para>

@plugin: 
@type_parent: 
@type_name: 
@type_info: 
@type_flags: 
@Returns: 


<!-- ##### FUNCTION thunarx_provider_plugin_add_interface ##### -->
<para>

</para>

@plugin: 
@instance_type: 
@interface_type: 
@interface_info: 


<!-- ##### FUNCTION thunarx_provider_plugin_register_enum ##### -->
<para>

</para>

@plugin: 
@name: 
@const_static_values: 
@Returns: 


<!-- ##### FUNCTION thunarx_provider_plugin_register_flags ##### -->
<para>

</para>

@plugin: 
@name: 
@const_static_values: 
@Returns: 


<!-- ##### MACRO THUNARX_DEFINE_TYPE ##### -->
<para>
  A convenience macro for plugin type implementations, which declares a class
  initialization function, a static variable named @t_n<!---->_parent_class
  pointing to the parent and a static variable named @t_n<!---->_type containing
  the #GType of the type to define. Furthermore, it defines a @t_n<!---->_get_type()
  function and a @t_n<!---->_register_type() function. See THUNARX_DEFINE_TYPE_EXTENDED()
  for an example.
</para>

@TN: the name of the new type, in Camel case.
@t_n: the name of the new type, in lowercase, with words separated by '_'.
@T_P: the #GType of the parent type.


<!-- ##### MACRO THUNARX_DEFINE_TYPE_WITH_CODE ##### -->
<para>
  A convenience macro for plugin type implementations. Similar to THUNARX_DEFINE_TYPE(), but
  allows to insert custom code into the <code>*_get_type()</code> function, e.g. interface
  implemenations via THUNARX_IMPLEMENT_INTERFACE(). See THUNARX_DEFINE_TYPE_EXTENDED() for
  an example.
</para>

@TN: the name of the new type, in Camel case.
@t_n: the name of the new type, in lowercase, with words separated by '_'.
@T_P: the #GType of the parent type.
@_C_: custom code that gets inserted in the <code>*_get_type()</code> function.


<!-- ##### MACRO THUNARX_DEFINE_ABSTRACT_TYPE ##### -->
<para>
  A convenience macro for plugin type implementations. Similar to THUNARX_DEFINE_TYPE(), but defines
  an abstract type. See THUNARX_DEFINE_TYPE_EXTENDED() for an example.
</para>

@TN: the name of the new type, in Camel case.
@t_n: the name of the new type, in lowercase, with words separated by '_'.
@T_P: the #GType of the parent type.


<!-- ##### MACRO THUNARX_DEFINE_ABSTRACT_TYPE_WITH_CODE ##### -->
<para>
  A convenience macro for plugin type implementations. Similar to THUNARX_DEFINE_TYPE_WITH_CODE(), but defines
  an abstract type and allows to insert custom code into the <code>*_get_type()</code> function, e.g. interface
  implementations via THUNARX_IMPLEMENT_INTERFACE(). See THUNARX_DEFINE_TYPE_EXTENDED() for an example.
</para>

@TN: the name of the new type, in Camel case.
@t_n: the name of the new type, in lowercase, with words separated by '_'.
@T_P: the #GType of the parent type.
@_C_: custom code that gets inserted in the <code>*_get_type()</code> function.


<!-- ##### MACRO THUNARX_DEFINE_TYPE_EXTENDED ##### -->
<para>
  The most general convenience macro for plugin type implementations, on which THUNARX_DEFINE_TYPE(), THUNARX_DEFINE_TYPE_WITH_CODE(),
  THUNARX_DEFINE_ABSTRACT_TYPE() and THUNARX_DEFINE_ABSTRACT_TYPE_WITH_CODE() are based.

</para>

<informalexample><programlisting>
THUNARX_DEFINE_TYPE_EXTENDED (FooExtension,
                              foo_extension,
                              G_TYPE_OBJECT,
                              0,
                              THUNARX_IMPLEMENT_INTERFACE (TYPE_BAR,
                                                           foo_extension_bar_init));
</programlisting></informalexample>

<para>
  expands to
</para>

<informalexample><programlisting>
static gpointer foo_extension_parent_class = NULL;
static GType    foo_extension_type = G_TYPE_INVALID;

static void     foo_extension_init              (FooExtension *self);
static void     foo_extension_class_init        (FooExtensionClass *klass);
static void     foo_extension_class_intern_init (FooExtensionClass *klass)
{
  foo_extension_parent_class = g_type_class_peek_parent (klass);
  foo_extension_class_init (klass);
}

GType
foo_extension_get_type (void)
{
  return foo_extension_type;
}

void
foo_extension_register_type (ThunarxProviderPlugin *plugin)
{
  GType thunarx_define_type_id;
  static const thunarx_define_type_info =
  {
    sizeof (FooExtensionClass),
    NULL,
    NULL,
    (GClassInitFunc) foo_extension_class_intern_init,
    NULL,
    NULL,
    sizeof (FooExtension),
    0,
    (GInstanceInitFunc) foo_extension_init,
    NULL,
  };
  thunarx_define_type_id = thunarx_provider_plugin_register_type (thunarx_define_type_plugin, G_TYPE_OBJECT,
                                                                  "FooExtension", &amp;thunarx_define_type_info, 0);
  {
    static const GInterfaceInfo thunarx_implement_interface_info =
    {
      (GInterfaceInitFunc) foo_extension_bar_init,
    };
    thunarx_provider_plugin_add_interface (thunarx_define_type_plugin, thunarx_define_type_id,
                                           TYPE_BAR, &amp;thunarx_implement_interface_info);
  };
  foo_extension_type = thunarx_define_type_id;
}
</programlisting></informalexample>

<para>
  The only pieces which have to be manually provided are the definitions of the instance and
  class structure and the definitions of the instance and class init functions.
</para>

@TypeName:    The name of the new type, in Camel case.
@type_name:   The name of the new type, in lowercase, with words separated by '_'.
@TYPE_PARENT: The #GType of the parent type.
@flags:       #GTypeFlags to pass to thunarx_provider_plugin_register_type().
@CODE:        Custom code that gets inserted in the <code>*_register_type()</code> function.


<!-- ##### MACRO THUNARX_IMPLEMENT_INTERFACE ##### -->
<para>
  A convenience macro to ease interface addition in the @_C_ section of THUNARX_DEFINE_TYPE_WITH_CODE()
  or THUNARX_DEFINE_ABSTRACT_TYPE_WITH_CODE(). See THUNARX_DEFINE_TYPE_EXTENDED() for an example.
</para>

<para>
  Note that this macro can only be used together with the <code>THUNARX_DEFINE_*</code> macros, since
  it depends on variable names used by those macros.
</para>

@TYPE_IFACE: the #GType of the interface to add.
@iface_init: the interface init function.


