[Xfce4-commits] <xfce4-panel:devel> Add new api for defining object oriented panel plugins.

Nick Schermer nick at xfce.org
Tue Aug 11 20:30:14 CEST 2009


Updating branch refs/heads/devel
         to f132d30dd547ba1812c033c8e407090d3f3851c4 (commit)
       from 65c51a955613a2603d2e2e0c0ea84eaf63c26c93 (commit)

commit f132d30dd547ba1812c033c8e407090d3f3851c4
Author: Nick Schermer <nick at xfce.org>
Date:   Sun Mar 15 15:29:18 2009 +0100

    Add new api for defining object oriented panel plugins.

 libxfce4panel/libxfce4panel.h              |   91 +++++++++++++++++++++-------
 libxfce4panel/xfce-panel-plugin-provider.h |   17 ++++--
 2 files changed, 81 insertions(+), 27 deletions(-)

diff --git a/libxfce4panel/libxfce4panel.h b/libxfce4panel/libxfce4panel.h
index 741d008..f032b9c 100644
--- a/libxfce4panel/libxfce4panel.h
+++ b/libxfce4panel/libxfce4panel.h
@@ -34,29 +34,78 @@ G_BEGIN_DECLS
 
 #undef LIBXFCE4PANEL_INSIDE_LIBXFCE4PANEL_H
 
-#define XFCE_PANEL_PLUGIN_REGISTER_OBJECT(TYPE) \
-  PANEL_SYMBOL_EXPORT G_MODULE_EXPORT XfcePanelPlugin * \
-  __xpp_construct_obj (const gchar  *name, \
-                       gint          unique_id, \
-                       const gchar  *display_name, \
-                       gchar       **arguments, \
-                       GdkScreen    *screen); \
-  PANEL_SYMBOL_EXPORT G_MODULE_EXPORT XfcePanelPlugin * \
-  __xpp_construct_obj (const gchar  *name, \
-                       gint          unique_id, \
-                       const gchar  *display_name, \
-                       gchar       **arguments, \
-                       GdkScreen    *screen) \
+/* register a resident panel plugin */
+#define XFCE_PANEL_DEFINE_PLUGIN_RESIDENT(TypeName, type_name, args...) \
+  _XPP_DEFINE_PLUGIN (TypeName, type_name, TRUE, args)
+
+/* register a panel plugin that can unload the module */
+#define XFCE_PANEL_DEFINE_PLUGIN(TypeName, type_name, args...) \
+  _XPP_DEFINE_PLUGIN (TypeName, type_name, FALSE, args)
+
+#define XFCE_PANEL_DEFINE_TYPE(TypeName, type_name, TYPE_PARENT) \
+  static gpointer type_name##_parent_class = NULL; \
+  static GType    type_name##_type = 0; \
+  \
+  static void     type_name##_init              (TypeName        *self); \
+  static void     type_name##_class_init        (TypeName##Class *klass); \
+  static void     type_name##_class_intern_init (gpointer klass) \
   { \
-    panel_return_val_if_fail (GDK_IS_SCREEN (screen), NULL); \
-    panel_return_val_if_fail (name != NULL && unique_id != -1, NULL); \
-    panel_return_val_if_fail (g_type_is_a (TYPE, XFCE_TYPE_PANEL_PLUGIN), NULL); \
+    type_name##_parent_class = g_type_class_peek_parent (klass); \
+    type_name##_class_init ((TypeName##Class*) klass); \
+  } \
+  \
+  GType \
+  type_name##_get_type (void) \
+  { \
+    return type_name##_type; \
+  } \
+  \
+  void \
+  type_name##_register_type (GTypeModule *type_module) \
+  { \
+    GType plugin_define_type_id; \
+    static const GTypeInfo plugin_define_type_info = \
+    { \
+      sizeof (TypeName##Class), \
+      NULL, \
+      NULL, \
+      (GClassInitFunc) type_name##_class_intern_init, \
+      NULL, \
+      NULL, \
+      sizeof (TypeName), \
+      0, \
+      (GInstanceInitFunc) type_name##_init, \
+      NULL, \
+    }; \
+    \
+    g_type_module_register_type (type_module, TYPE_PARENT, \
+                                 #TypeName, &plugin_define_type_info, 0); \
+    \
+    type_name##_type = plugin_define_type_id; \
+  }
+
+#define _XPP_DEFINE_PLUGIN(TypeName, type_name, resident, args...) \
+  GType __xpp_initialize (GTypeModule *type_module, gboolean *make_resident); \
+  \
+  XFCE_PANEL_DEFINE_TYPE (TypeName, type_name, XFCE_TYPE_PANEL_PLUGIN) \
+  \
+  PANEL_SYMBOL_EXPORT GType \
+  __xpp_initialize (GTypeModule *type_module, \
+                    gboolean    *make_resident) \
+  { \
+    typedef void (*XppRegFunc) (GTypeModule *module); \
+    XppRegFunc reg_funcs[] = { type_name##_register_type, args }; \
+    guint      i; \
+    \
+    /* whether to make this plugin resident */ \
+    if (make_resident != NULL) \
+      *make_resident = resident; \
+    \
+    /* register the plugin types */ \
+    for (i = 0; i < G_N_ELEMENTS (reg_funcs); i++) \
+      (* reg_funcs[i]) (type_module); \
     \
-    return g_object_new (TYPE, \
-                         "name", name, \
-                         "unique-id", unique_id, \
-                         "display-name", display_name, \
-                         "arguments", arguments, NULL); \
+    return type_name##_get_type (); \
   }
 
 #define XFCE_PANEL_PLUGIN_REGISTER(init_func) \
diff --git a/libxfce4panel/xfce-panel-plugin-provider.h b/libxfce4panel/xfce-panel-plugin-provider.h
index a5f06c5..b0cf04a 100644
--- a/libxfce4panel/xfce-panel-plugin-provider.h
+++ b/libxfce4panel/xfce-panel-plugin-provider.h
@@ -34,12 +34,14 @@ typedef enum   _XfcePanelPluginProviderSignal XfcePanelPluginProviderSignal;
 #define XFCE_IS_PANEL_PLUGIN_PROVIDER(obj)        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), XFCE_TYPE_PANEL_PLUGIN_PROVIDER))
 #define XFCE_PANEL_PLUGIN_PROVIDER_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), XFCE_TYPE_PANEL_PLUGIN_PROVIDER, XfcePanelPluginProviderIface))
 
-/* provider contruct function */
-typedef XfcePanelPluginProvider *(*PluginConstructFunc) (const gchar  *name,
-                                                         gint          id,
-                                                         const gchar  *display_name,
-                                                         gchar       **arguments,
-                                                         GdkScreen    *screen);
+/* plugin module functions */
+typedef XfcePanelPluginProvider *(*PluginConstructFunc)   (const gchar  *name,
+                                                           gint          unique_id,
+                                                           const gchar  *display_name,
+                                                           gchar       **arguments,
+                                                           GdkScreen    *screen);
+typedef GType                     (*PluginInitializeFunc) (GTypeModule  *module,
+                                                           gboolean     *make_resident);
 
 struct _XfcePanelPluginProviderIface
 {
@@ -116,6 +118,9 @@ gboolean     xfce_panel_plugin_provider_get_show_about      (XfcePanelPluginProv
 
 void         xfce_panel_plugin_provider_show_about          (XfcePanelPluginProvider       *provider);
 
+void         xfce_panel_plugin_provider_register_types      (XfcePanelPluginProvider       *provider,
+                                                             GTypeModule                   *module);
+
 G_END_DECLS
 
 #endif /* !__XFCE_PANEL_PLUGIN_PROVIDER_H__ */



More information about the Xfce4-commits mailing list