diff --git a/eek/eek-layout.c b/eek/eek-layout.c index 99c0f433..82458b63 100644 --- a/eek/eek-layout.c +++ b/eek/eek-layout.c @@ -20,9 +20,9 @@ /** * SECTION:eek-layout - * @short_description: Base interface of a layout engine + * @short_description: Base class of a layout engine * - * The #EekLayout class is a base interface of layout engine which + * The #EekLayout class is a base class of layout engine which * arranges keyboard elements. */ @@ -41,66 +41,53 @@ enum { static guint signals[LAST_SIGNAL] = { 0, }; +G_DEFINE_TYPE (EekLayout, eek_layout, G_TYPE_OBJECT); + static void -eek_layout_base_init (gpointer gobject_class) +eek_layout_class_init (EekLayoutClass *klass) { - static gboolean is_initialized = FALSE; + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - if (!is_initialized) { - /** - * EekLayout::group-changed: - * @layout: an #EekLayout that received the signal - * @group: group index - * - * The ::group-changed signal is emitted each time group - * configuration of @layout changed. - */ - signals[GROUP_CHANGED] = - g_signal_new ("group-changed", - G_TYPE_FROM_INTERFACE(gobject_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET(EekLayoutIface, group_changed), - NULL, - NULL, - g_cclosure_marshal_VOID__INT, - G_TYPE_NONE, 1, - G_TYPE_INT); + /** + * EekLayout::group-changed: + * @layout: an #EekLayout that received the signal + * @group: group index + * + * The ::group-changed signal is emitted each time group + * configuration of @layout changed. + */ + signals[GROUP_CHANGED] = + g_signal_new ("group-changed", + G_TYPE_FROM_CLASS(gobject_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET(EekLayoutClass, group_changed), + NULL, + NULL, + g_cclosure_marshal_VOID__INT, + G_TYPE_NONE, 1, + G_TYPE_INT); - /** - * EekLayout::changed: - * @layout: an #EekLayout that received the signal - * - * The ::changed signal is emitted each time @layout changed - * and re-layout of #EekKeyboard is needed. - */ - signals[CHANGED] = - g_signal_new ("changed", - G_TYPE_FROM_INTERFACE(gobject_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET(EekLayoutIface, changed), - NULL, - NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - is_initialized = TRUE; - } + /** + * EekLayout::changed: + * @layout: an #EekLayout that received the signal + * + * The ::changed signal is emitted each time @layout changed + * and re-layout of #EekKeyboard is needed. + */ + signals[CHANGED] = + g_signal_new ("changed", + G_TYPE_FROM_CLASS(gobject_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET(EekLayoutClass, changed), + NULL, + NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); } -GType -eek_layout_get_type (void) +void +eek_layout_init (EekLayout *self) { - static GType iface_type = 0; - if (iface_type == 0) { - static const GTypeInfo info = { - sizeof (EekLayoutIface), - eek_layout_base_init, - NULL, - }; - iface_type = g_type_register_static (G_TYPE_INTERFACE, - "EekLayout", - &info, 0); - } - return iface_type; } /** @@ -115,8 +102,9 @@ eek_layout_apply (EekLayout *layout, EekKeyboard *keyboard) { g_return_if_fail (EEK_IS_LAYOUT(layout)); g_return_if_fail (EEK_IS_KEYBOARD(keyboard)); + g_return_if_fail (EEK_LAYOUT_GET_CLASS(layout)->apply); - return EEK_LAYOUT_GET_IFACE(layout)->apply (layout, keyboard); + return EEK_LAYOUT_GET_CLASS(layout)->apply (layout, keyboard); } /** @@ -130,6 +118,8 @@ eek_layout_apply (EekLayout *layout, EekKeyboard *keyboard) gint eek_layout_get_group (EekLayout *layout) { - g_return_val_if_fail (EEK_IS_LAYOUT(layout), -1); - return EEK_LAYOUT_GET_IFACE(layout)->get_group (layout); + g_assert (EEK_IS_LAYOUT(layout)); + g_assert (EEK_LAYOUT_GET_CLASS(layout)->get_group); + + return EEK_LAYOUT_GET_CLASS(layout)->get_group (layout); } diff --git a/eek/eek-layout.h b/eek/eek-layout.h index f924f476..f7986f37 100644 --- a/eek/eek-layout.h +++ b/eek/eek-layout.h @@ -28,24 +28,32 @@ G_BEGIN_DECLS #define EEK_TYPE_LAYOUT (eek_layout_get_type()) #define EEK_LAYOUT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_LAYOUT, EekLayout)) +#define EEK_LAYOUT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEK_TYPE_LAYOUT, EekLayoutClass)) #define EEK_IS_LAYOUT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_LAYOUT)) -#define EEK_LAYOUT_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), EEK_TYPE_LAYOUT, EekLayoutIface)) +#define EEK_IS_LAYOUT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEK_TYPE_LAYOUT)) +#define EEK_LAYOUT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEK_TYPE_LAYOUT, EekLayoutClass)) -typedef struct _EekLayoutIface EekLayoutIface; +typedef struct _EekLayoutClass EekLayoutClass; typedef struct _EekLayout EekLayout; +struct _EekLayout +{ + /*< private >*/ + GObject parent; +}; + /** - * EekLayoutIface: + * EekLayoutClass: * @apply: virtual function for applying the layout to a keyboard * @get_group: virtual function for getting the current group setting * of the layout * @group_changed: class handler for #EekLayout::group-changed signal * @changed: class handler for #EekLayout::changed signal */ -struct _EekLayoutIface +struct _EekLayoutClass { /*< private >*/ - GTypeInterface parent_iface; + GObjectClass parent_class; /*< public >*/ void (* apply) (EekLayout *self, diff --git a/eek/eek-xkb-layout.c b/eek/eek-xkb-layout.c index dce006c2..7cca09a9 100644 --- a/eek/eek-xkb-layout.c +++ b/eek/eek-xkb-layout.c @@ -45,11 +45,7 @@ #define noKBDRAW_DEBUG -static void eek_layout_iface_init (EekLayoutIface *iface); - -G_DEFINE_TYPE_WITH_CODE (EekXkbLayout, eek_xkb_layout, G_TYPE_INITIALLY_UNOWNED, - G_IMPLEMENT_INTERFACE (EEK_TYPE_LAYOUT, - eek_layout_iface_init)); +G_DEFINE_TYPE (EekXkbLayout, eek_xkb_layout, EEK_TYPE_LAYOUT); #define EEK_XKB_LAYOUT_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_XKB_LAYOUT, EekXkbLayoutPrivate)) @@ -314,19 +310,19 @@ outline_free (gpointer data) } static void -eek_xkb_layout_real_apply (EekLayout *layout, EekKeyboard *keyboard) +eek_xkb_layout_real_apply (EekLayout *self, EekKeyboard *keyboard) { - EekXkbLayoutPrivate *priv = EEK_XKB_LAYOUT_GET_PRIVATE (layout); + EekXkbLayoutPrivate *priv = EEK_XKB_LAYOUT_GET_PRIVATE (self); - g_return_if_fail (priv); if (priv->outline_hash) g_hash_table_unref (priv->outline_hash); + priv->outline_hash = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, outline_free); - create_keyboard (EEK_XKB_LAYOUT(layout), keyboard); + create_keyboard (EEK_XKB_LAYOUT(self), keyboard); } static gint @@ -427,21 +423,18 @@ eek_xkb_layout_real_get_group (EekLayout *self) return state.group; } -static void -eek_layout_iface_init (EekLayoutIface *iface) -{ - iface->apply = eek_xkb_layout_real_apply; - iface->get_group = eek_xkb_layout_real_get_group; -} - static void eek_xkb_layout_class_init (EekXkbLayoutClass *klass) { + EekLayoutClass *layout_class = EEK_LAYOUT_CLASS (klass); GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GParamSpec *pspec; g_type_class_add_private (gobject_class, sizeof (EekXkbLayoutPrivate)); + layout_class->apply = eek_xkb_layout_real_apply; + layout_class->get_group = eek_xkb_layout_real_get_group; + gobject_class->finalize = eek_xkb_layout_finalize; gobject_class->set_property = eek_xkb_layout_set_property; gobject_class->get_property = eek_xkb_layout_get_property; diff --git a/eek/eek-xkb-layout.h b/eek/eek-xkb-layout.h index 82326e8d..f20c5384 100644 --- a/eek/eek-xkb-layout.h +++ b/eek/eek-xkb-layout.h @@ -40,7 +40,7 @@ typedef struct _EekXkbLayoutPrivate EekXkbLayoutPrivate; struct _EekXkbLayout { /*< private >*/ - GInitiallyUnowned parent; + EekLayout parent; EekXkbLayoutPrivate *priv; }; @@ -48,7 +48,7 @@ struct _EekXkbLayout struct _EekXkbLayoutClass { /*< private >*/ - GInitiallyUnownedClass parent_class; + EekLayoutClass parent_class; /*< private >*/ /* padding */ diff --git a/eek/eek-xkl-layout.c b/eek/eek-xkl-layout.c index de6ad967..ef710e40 100644 --- a/eek/eek-xkl-layout.c +++ b/eek/eek-xkl-layout.c @@ -38,12 +38,7 @@ #define noKBDRAW_DEBUG -static void eek_layout_iface_init (EekLayoutIface *iface); -static EekLayoutIface *parent_layout_iface; - -G_DEFINE_TYPE_WITH_CODE (EekXklLayout, eek_xkl_layout, EEK_TYPE_XKB_LAYOUT, - G_IMPLEMENT_INTERFACE(EEK_TYPE_LAYOUT, - eek_layout_iface_init)); +G_DEFINE_TYPE (EekXklLayout, eek_xkl_layout, EEK_TYPE_XKB_LAYOUT); #define EEK_XKL_LAYOUT_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_XKL_LAYOUT, EekXklLayoutPrivate)) @@ -90,15 +85,6 @@ eek_xkl_layout_real_get_group (EekLayout *self) return state->group; } -static void -eek_layout_iface_init (EekLayoutIface *iface) -{ - parent_layout_iface = g_type_interface_peek_parent (iface); - if (!parent_layout_iface) - parent_layout_iface = g_type_default_interface_peek (EEK_TYPE_LAYOUT); - iface->get_group = eek_xkl_layout_real_get_group; -} - static void eek_xkl_layout_dispose (GObject *object) { @@ -108,10 +94,12 @@ eek_xkl_layout_dispose (GObject *object) g_object_unref (priv->config); priv->config = NULL; } + if (priv->engine) { g_object_unref (priv->engine); priv->engine = NULL; } + G_OBJECT_CLASS (eek_xkl_layout_parent_class)->dispose (object); } @@ -186,11 +174,14 @@ eek_xkl_layout_get_property (GObject *object, static void eek_xkl_layout_class_init (EekXklLayoutClass *klass) { + EekLayoutClass *layout_class = EEK_LAYOUT_CLASS (klass); GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GParamSpec *pspec; g_type_class_add_private (gobject_class, sizeof (EekXklLayoutPrivate)); + layout_class->get_group = eek_xkl_layout_real_get_group; + gobject_class->dispose = eek_xkl_layout_dispose; gobject_class->set_property = eek_xkl_layout_set_property; gobject_class->get_property = eek_xkl_layout_get_property;