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:
-
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
-
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
-
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);}
- use glib-genmarshal to create marshalers
- Use command to create database
- How to Create and Use the DLL
- Use Maven3 to create JavaWeb Project
- use WLST to create weblogic domain automatically
- use WLST to create weblogic cluster
- Use StringBuilder to create large string
- Use SWT to create browser application
- Yii2 use spl_autoload_register to create autoload feature
- how to use Dom to create and remove element
- Using RTest to Create Test Harness(use in Symbian OS)
- Use Spring to create a simple workflow engine
- Can I use Java to create or manage XML files?
- How to Create, Use and Maintain DataStage 8 Parameter Sets
- Use ZFS and CIFS to create a home NAS box
- How to: Create and Use a Data Connection Library
- Use the JQuery To upload images and create thumbnail
- How to use freetts create/generate a wave file
- MsSqlServer临时表和游标
- VC#与安全编程
- Beyond Compare 2.x 注册机
- VC#与电子邮件处理
- 深入浅出之正则表达式
- use glib-genmarshal to create marshalers
- 关于NetBox2.8端口问题
- 小马看GIS--UDig(二)
- VC#杂项
- 工具的使用
- MDA模型驱动介绍
- iframe 设置iframe高度
- 正则表达式
- Qt多线程