[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