mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
redefine macro to provide 2nd parameter for init
Use older (pre-glib-2.53.3) versions of _G_DEFINE_TYPE_EXTENDED_BEGIN _G_DEFINE_TYPE_EXTENDED_END, and implement GNC_IMPLEMENT_INTERFACE to take a two-parameter interface_init function. Required to compile on distributions with older versions of glib-2.0. some explanation about derived type macros
This commit is contained in:
parent
2cb6807323
commit
8545ca408c
@ -57,7 +57,6 @@ static void gnc_window_embedded_window_init (GncWindowIface *iface);
|
||||
|
||||
static void gnc_embedded_window_setup_window (GncEmbeddedWindow *window);
|
||||
|
||||
|
||||
/** The instance private data for an embedded window object. */
|
||||
typedef struct GncEmbeddedWindowPrivate
|
||||
{
|
||||
@ -86,6 +85,11 @@ typedef struct GncEmbeddedWindowPrivate
|
||||
GtkWidget *parent_window;
|
||||
} GncEmbeddedWindowPrivate;
|
||||
|
||||
GNC_DEFINE_TYPE_WITH_CODE(GncEmbeddedWindow, gnc_embedded_window, GTK_TYPE_BOX,
|
||||
G_ADD_PRIVATE(GncEmbeddedWindow)
|
||||
GNC_IMPLEMENT_INTERFACE(GNC_TYPE_WINDOW,
|
||||
gnc_window_embedded_window_init))
|
||||
|
||||
#define GNC_EMBEDDED_WINDOW_GET_PRIVATE(o) \
|
||||
(G_TYPE_INSTANCE_GET_PRIVATE ((o), GNC_TYPE_EMBEDDED_WINDOW, GncEmbeddedWindowPrivate))
|
||||
|
||||
@ -157,10 +161,6 @@ gnc_embedded_window_get_page (GncEmbeddedWindow *window)
|
||||
return priv->page;
|
||||
}
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE(GncEmbeddedWindow, gnc_embedded_window, GTK_TYPE_BOX,
|
||||
G_ADD_PRIVATE(GncEmbeddedWindow)
|
||||
G_IMPLEMENT_INTERFACE(GNC_TYPE_WINDOW,
|
||||
gnc_window_embedded_window_init))
|
||||
|
||||
/** Initialize the class for a new gnucash embedded window. This will
|
||||
* set up any function pointers that override functions in the parent
|
||||
@ -193,8 +193,9 @@ gnc_embedded_window_class_init (GncEmbeddedWindowClass *klass)
|
||||
* @param klass A pointer to the class data structure for this
|
||||
* object. */
|
||||
static void
|
||||
gnc_embedded_window_init (GncEmbeddedWindow *window)
|
||||
gnc_embedded_window_init (GncEmbeddedWindow *window, void *data)
|
||||
{
|
||||
GncEmbeddedWindowClass *klass = (GncEmbeddedWindowClass*)data;
|
||||
ENTER("window %p", window);
|
||||
|
||||
gtk_orientable_set_orientation (GTK_ORIENTABLE(window), GTK_ORIENTATION_VERTICAL);
|
||||
@ -204,7 +205,8 @@ gnc_embedded_window_init (GncEmbeddedWindow *window)
|
||||
|
||||
gnc_embedded_window_setup_window (window);
|
||||
|
||||
gnc_gobject_tracking_remember(G_OBJECT(window), NULL);
|
||||
gnc_gobject_tracking_remember(G_OBJECT(window),
|
||||
G_OBJECT_CLASS(klass));
|
||||
LEAVE(" ");
|
||||
}
|
||||
|
||||
|
@ -109,6 +109,62 @@ void gnc_gobject_tracking_dump (void);
|
||||
|
||||
/** @} */
|
||||
|
||||
/** Some macros derived from glib type macros.
|
||||
* In glib type_name##init function only has one parameter. We need
|
||||
* the 2nd class parameter in certain calls. The main difference is
|
||||
* static void type_name##_init (TypeName *self, void *class);
|
||||
* instead of
|
||||
* static void type_name##_init (TypeName *self);
|
||||
* this code may need updating in future releases as glib changes.
|
||||
**/
|
||||
#define GNC_IMPLEMENT_INTERFACE(TYPE_IFACE, iface_init) { \
|
||||
const GInterfaceInfo g_implement_interface_info = { \
|
||||
(GInterfaceInitFunc)(void (*)(void *, void *)) iface_init, NULL, NULL \
|
||||
}; \
|
||||
g_type_add_interface_static (g_define_type_id, TYPE_IFACE, &g_implement_interface_info); \
|
||||
}
|
||||
|
||||
#define GNC_DEFINE_TYPE_WITH_CODE(TN, t_n, T_P, _C_) _GNC_DEFINE_TYPE_EXTENDED_BEGIN (TN, t_n, T_P, 0) {_C_;} _GNC_DEFINE_TYPE_EXTENDED_END()
|
||||
|
||||
#define _GNC_DEFINE_TYPE_EXTENDED_BEGIN(TypeName, type_name, TYPE_PARENT, flags) \
|
||||
\
|
||||
static void type_name##_init (TypeName *self, void *class); \
|
||||
static void type_name##_class_init (TypeName##Class *klass); \
|
||||
static gpointer type_name##_parent_class = NULL; \
|
||||
static gint TypeName##_private_offset; \
|
||||
\
|
||||
_G_DEFINE_TYPE_EXTENDED_CLASS_INIT(TypeName, type_name) \
|
||||
\
|
||||
G_GNUC_UNUSED \
|
||||
static inline gpointer \
|
||||
type_name##_get_instance_private (TypeName *self) \
|
||||
{ \
|
||||
return (G_STRUCT_MEMBER_P (self, TypeName##_private_offset)); \
|
||||
} \
|
||||
\
|
||||
GType \
|
||||
type_name##_get_type (void) \
|
||||
{ \
|
||||
static volatile gsize g_define_type_id__volatile = 0; \
|
||||
if (g_once_init_enter (&g_define_type_id__volatile)) \
|
||||
{ \
|
||||
GType g_define_type_id = \
|
||||
g_type_register_static_simple (TYPE_PARENT, \
|
||||
g_intern_static_string (#TypeName), \
|
||||
sizeof (TypeName##Class), \
|
||||
(GClassInitFunc) type_name##_class_intern_init, \
|
||||
sizeof (TypeName), \
|
||||
(GInstanceInitFunc) type_name##_init, \
|
||||
(GTypeFlags) flags); \
|
||||
{ /* custom code follows */
|
||||
#define _GNC_DEFINE_TYPE_EXTENDED_END() \
|
||||
/* following custom code */ \
|
||||
} \
|
||||
g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); \
|
||||
} \
|
||||
return g_define_type_id__volatile; \
|
||||
} /* closes type_name##_get_type() */
|
||||
|
||||
|
||||
#endif /* GNC_GOBJECT_UTILS_H */
|
||||
/** @} */
|
||||
|
Loading…
Reference in New Issue
Block a user