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:
Christoph Holtermann 2018-12-23 21:58:31 +01:00 committed by c-holtermann
parent 2cb6807323
commit 8545ca408c
2 changed files with 65 additions and 7 deletions

View File

@ -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(" ");
}

View File

@ -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 */
/** @} */