use glib-genmarshal to create marshalers

来源:互联网 发布:淘宝空包是什么 编辑:程序博客网 时间:2024/05/20 10:13

When splitting widget iconview( the one modified by us) out of gtk, we have to face a problem that certain marshalers that we can use internally in gtk are unaccessible outside. Well, rather than export those marshaler and ruin the library's deliberate private data protection, there's another choice -- create one of our own.

And glib provides a handy code generator for this purpose.

Here's the steps:

  1. create a list file for marshaler

    e.g. xfdesktop-marshal.list.

      # see glib-genmarshal(1) for a detailed description of the file format,# possible parameter types are:#   VOID        indicates   no   return   type,  or  no  extra#               parameters. if VOID is used as  the  parameter#               list, no additional parameters may be present.#   BOOLEAN     for boolean types (gboolean)#   CHAR        for signed char types (gchar)#   UCHAR       for unsigned char types (guchar)#   INT         for signed integer types (gint)#   UINT        for unsigned integer types (guint)#   LONG        for signed long integer types (glong)#   ULONG       for unsigned long integer types (gulong)#   ENUM        for enumeration types (gint)#   FLAGS       for flag enumeration types (guint)#   FLOAT       for single-precision float types (gfloat)#   DOUBLE      for double-precision float types (gdouble)#   STRING      for string types (gchar*)#   PARAM       for GParamSpec or derived types  (GParamSpec*)#   BOXED       for boxed (anonymous but reference counted) types (GBoxed*)#   POINTER     for anonymous pointer types (gpointer)#   OBJECT      for GObject or derived types (GObject*)#   NONE        deprecated alias for VOID#   BOOL        deprecated alias for BOOLEANVOID:OBJECT,OBJECTVOID:BOXED,UINTBOOLEAN:VOIDBOOLEAN:ENUM,INT

  2. create c header and c body

    glib-genmarshal --header xfdesktop-marshal.list  --prefix=xfdesktop_marshal >xfdesktop-marshal.h

    glib-genmarshal --body xfdesktop-marshal.list  --prefix=xfdesktop_marshal >xfdesktop-marshal.c

  3. ok! here's the content of those two files:

    /*xfdesktop-marshal.h*/

      #ifndef __xfdesktop_marshal_MARSHAL_H__#define __xfdesktop_marshal_MARSHAL_H__#include    <glib-object.h>G_BEGIN_DECLS/* VOID:OBJECT,OBJECT (xfdesktop-marshal.list:25) */extern void xfdesktop_marshal_VOID__OBJECT_OBJECT (GClosure     *closure,                                                   GValue       *return_value,                                                   guint         n_param_values,                                                   const GValue *param_values,                                                   gpointer      invocation_hint,                                                   gpointer      marshal_data);/* VOID:BOXED,UINT (xfdesktop-marshal.list:26) */extern void xfdesktop_marshal_VOID__BOXED_UINT (GClosure     *closure,                                                GValue       *return_value,                                                guint         n_param_values,                                                const GValue *param_values,                                                gpointer      invocation_hint,                                                gpointer      marshal_data);/* BOOLEAN:VOID (xfdesktop-marshal.list:27) */extern void xfdesktop_marshal_BOOLEAN__VOID (GClosure     *closure,                                             GValue       *return_value,                                             guint         n_param_values,                                             const GValue *param_values,                                             gpointer      invocation_hint,                                             gpointer      marshal_data);/* BOOLEAN:ENUM,INT (xfdesktop-marshal.list:28) */extern void xfdesktop_marshal_BOOLEAN__ENUM_INT (GClosure     *closure,                                                 GValue       *return_value,                                                 guint         n_param_values,                                                 const GValue *param_values,G_END_DECLS#endif /* __xfdesktop_marshal_MARSHAL_H__ */

    /*xfdesktop-marshal.c*/

      #include    <glib-object.h>#ifdef G_ENABLE_DEBUG#define g_marshal_value_peek_boolean(v)  g_value_get_boolean (v)#define g_marshal_value_peek_char(v)     g_value_get_char (v)#define g_marshal_value_peek_uchar(v)    g_value_get_uchar (v)#define g_marshal_value_peek_int(v)      g_value_get_int (v)#define g_marshal_value_peek_uint(v)     g_value_get_uint (v)#define g_marshal_value_peek_long(v)     g_value_get_long (v)#define g_marshal_value_peek_ulong(v)    g_value_get_ulong (v)#define g_marshal_value_peek_int64(v)    g_value_get_int64 (v)#define g_marshal_value_peek_uint64(v)   g_value_get_uint64 (v)#define g_marshal_value_peek_enum(v)     g_value_get_enum (v)#define g_marshal_value_peek_flags(v)    g_value_get_flags (v)#define g_marshal_value_peek_float(v)    g_value_get_float (v)#define g_marshal_value_peek_double(v)   g_value_get_double (v)#define g_marshal_value_peek_string(v)   (char*) g_value_get_string (v)#define g_marshal_value_peek_param(v)    g_value_get_param (v)#define g_marshal_value_peek_boxed(v)    g_value_get_boxed (v)#define g_marshal_value_peek_pointer(v)  g_value_get_pointer (v)#define g_marshal_value_peek_object(v)   g_value_get_object (v)#else /* !G_ENABLE_DEBUG *//* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. *          Do not access GValues directly in your code. Instead, use the *          g_value_get_*() functions */#define g_marshal_value_peek_boolean(v)  (v)->data[0].v_int#define g_marshal_value_peek_char(v)     (v)->data[0].v_int#define g_marshal_value_peek_uchar(v)    (v)->data[0].v_uint#define g_marshal_value_peek_int(v)      (v)->data[0].v_int#define g_marshal_value_peek_uint(v)     (v)->data[0].v_uint#define g_marshal_value_peek_long(v)     (v)->data[0].v_long#define g_marshal_value_peek_ulong(v)    (v)->data[0].v_ulong#define g_marshal_value_peek_int64(v)    (v)->data[0].v_int64#define g_marshal_value_peek_uint64(v)   (v)->data[0].v_uint64#define g_marshal_value_peek_enum(v)     (v)->data[0].v_long#define g_marshal_value_peek_flags(v)    (v)->data[0].v_ulong#define g_marshal_value_peek_float(v)    (v)->data[0].v_float#define g_marshal_value_peek_double(v)   (v)->data[0].v_double#define g_marshal_value_peek_string(v)   (v)->data[0].v_pointer#define g_marshal_value_peek_param(v)    (v)->data[0].v_pointer#define g_marshal_value_peek_boxed(v)    (v)->data[0].v_pointer#define g_marshal_value_peek_pointer(v)  (v)->data[0].v_pointer#define g_marshal_value_peek_object(v)   (v)->data[0].v_pointer#endif /* !G_ENABLE_DEBUG *//* VOID:OBJECT,OBJECT (xfdesktop-marshal.list:25) */voidxfdesktop_marshal_VOID__OBJECT_OBJECT (GClosure     *closure,                                       GValue       *return_value G_GNUC_UNUSED,                                       guint         n_param_values,                                       const GValue *param_values,                                       gpointer      invocation_hint G_GNUC_UNUSED,                                       gpointer      marshal_data){  typedef void (*GMarshalFunc_VOID__OBJECT_OBJECT) (gpointer     data1,                                                    gpointer     arg_1,                                                    gpointer     arg_2,                                                    gpointer     data2);  register GMarshalFunc_VOID__OBJECT_OBJECT callback;  register GCClosure *cc = (GCClosure*) closure;  register gpointer data1, data2;  g_return_if_fail (n_param_values == 3);  if (G_CCLOSURE_SWAP_DATA (closure))    {  data1 = closure->data;      data2 = g_value_peek_pointer (param_values + 0);    }  else    {      data1 = g_value_peek_pointer (param_values + 0);      data2 = closure->data;    }  callback = (GMarshalFunc_VOID__OBJECT_OBJECT) (marshal_data ? marshal_data : cc->callback);  callback (data1,            g_marshal_value_peek_object (param_values + 1),            g_marshal_value_peek_object (param_values + 2),            data2);}/* VOID:BOXED,UINT (xfdesktop-marshal.list:26) */voidxfdesktop_marshal_VOID__BOXED_UINT (GClosure     *closure,                                    GValue       *return_value G_GNUC_UNUSED,                                    guint         n_param_values,                                    const GValue *param_values,                                    gpointer      invocation_hint G_GNUC_UNUSED,                                    gpointer      marshal_data){  typedef void (*GMarshalFunc_VOID__BOXED_UINT) (gpointer     data1,                                                 gpointer     arg_1,                                                 guint        arg_2,                                                 gpointer     data2);  register GMarshalFunc_VOID__BOXED_UINT callback;  register GCClosure *cc = (GCClosure*) closure; register gpointer data1, data2;  g_return_if_fail (n_param_values == 3);  if (G_CCLOSURE_SWAP_DATA (closure))    {      data1 = closure->data;      data2 = g_value_peek_pointer (param_values + 0);    }  else    {      data1 = g_value_peek_pointer (param_values + 0);      data2 = closure->data;    }  callback = (GMarshalFunc_VOID__BOXED_UINT) (marshal_data ? marshal_data : cc->callback);  callback (data1,            g_marshal_value_peek_boxed (param_values + 1),            g_marshal_value_peek_uint (param_values + 2),            data2);}/* BOOLEAN:VOID (xfdesktop-marshal.list:27) */voidxfdesktop_marshal_BOOLEAN__VOID (GClosure     *closure,                                 GValue       *return_value G_GNUC_UNUSED,                                 guint         n_param_values,                                 const GValue *param_values,                                 gpointer      invocation_hint G_GNUC_UNUSED,                                 gpointer      marshal_data){  typedef gboolean (*GMarshalFunc_BOOLEAN__VOID) (gpointer     data1,                                                  gpointer     data2);  register GMarshalFunc_BOOLEAN__VOID callback;  register GCClosure *cc = (GCClosure*) closure; register gpointer data1, data2;  gboolean v_return;  g_return_if_fail (return_value != NULL);  g_return_if_fail (n_param_values == 1);  if (G_CCLOSURE_SWAP_DATA (closure))    {      data1 = closure->data;      data2 = g_value_peek_pointer (param_values + 0);    }  else    {      data1 = g_value_peek_pointer (param_values + 0);      data2 = closure->data;    }  callback = (GMarshalFunc_BOOLEAN__VOID) (marshal_data ? marshal_data : cc->callback);  v_return = callback (data1,                       data2);  g_value_set_boolean (return_value, v_return);}/* BOOLEAN:ENUM,INT (xfdesktop-marshal.list:28) */voidxfdesktop_marshal_BOOLEAN__ENUM_INT (GClosure     *closure,                                     GValue       *return_value G_GNUC_UNUSED,                                     guint         n_param_values,                                     const GValue *param_values,                                     gpointer      invocation_hint G_GNUC_UNUSED,                                     gpointer      marshal_data){  typedef gboolean (*GMarshalFunc_BOOLEAN__ENUM_INT) (gpointer     data1,                                                      gint         arg_1,                                                      gint         arg_2,                                                      gpointer     data2);  register GMarshalFunc_BOOLEAN__ENUM_INT callback;  register GCClosure *cc = (GCClosure*) closure;  register gpointer data1, data2;  gboolean v_return;  g_return_if_fail (return_value != NULL);  g_return_if_fail (n_param_values == 3);  if (G_CCLOSURE_SWAP_DATA (closure))    {      data1 = closure->data;      data2 = g_value_peek_pointer (param_values + 0);    }  else    {      data1 = g_value_peek_pointer (param_values + 0);      data2 = closure->data;    }  callback = (GMarshalFunc_BOOLEAN__ENUM_INT) (marshal_data ? marshal_data : cc->callback);  v_return = callback (data1,                       g_marshal_value_peek_enum (param_values + 1),                       g_marshal_value_peek_int (param_values + 2),                       data2);  g_value_set_boolean (return_value, v_return);}                                                                                                            

原创粉丝点击