use glib-genmarshal to create marshalers

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.
    1. # 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 BOOLEAN VOID:OBJECT,OBJECT VOID:BOXED,UINT BOOLEAN:VOID BOOLEAN: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*/

    1. #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*/

    1. #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) */ void xfdesktop_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) */ void xfdesktop_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) */ void xfdesktop_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) */ void xfdesktop_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); }                                                                                                             

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值