From f6e6fda47ecf35dbbd30b062447c823ba87876de Mon Sep 17 00:00:00 2001 From: Daiki Ueno Date: Wed, 9 Jun 2010 18:37:07 +0900 Subject: [PATCH] Fix finalization. --- eek/eek-clutter-key-actor.c | 24 +++++++++--------------- eek/eek-clutter-key.c | 6 +++--- eek/eek-clutter-keyboard.c | 32 +++++++++++++++++++++++++++----- eek/eek-clutter-section.c | 6 +++--- eek/eek-keyboard.c | 10 ++++++---- eek/eek-xkb-layout.c | 6 +----- 6 files changed, 49 insertions(+), 35 deletions(-) diff --git a/eek/eek-clutter-key-actor.c b/eek/eek-clutter-key-actor.c index 0bdaae92..080e5fd8 100644 --- a/eek/eek-clutter-key-actor.c +++ b/eek/eek-clutter-key-actor.c @@ -123,11 +123,7 @@ static void eek_clutter_key_actor_finalize (GObject *object) { EekClutterKeyActorPrivate *priv = EEK_CLUTTER_KEY_ACTOR_GET_PRIVATE(object); - - clutter_group_remove_all (CLUTTER_GROUP(object)); g_object_unref (priv->key); - if (priv->texture) - g_object_unref (priv->texture); G_OBJECT_CLASS (eek_clutter_key_actor_parent_class)->finalize (object); } @@ -140,11 +136,6 @@ eek_clutter_key_actor_class_init (EekClutterKeyActorClass *klass) g_type_class_add_private (gobject_class, sizeof (EekClutterKeyActorPrivate)); - klass->outline_textures = g_hash_table_new_full (g_direct_hash, - g_direct_equal, - NULL, - g_free); - actor_class->paint = eek_clutter_key_actor_real_paint; /* FIXME: This is a workaround for the bug * http://bugzilla.openedhand.com/show_bug.cgi?id=2137 A developer @@ -488,18 +479,21 @@ create_texture_for_key (EekKey *key) static ClutterActor * get_texture (EekClutterKeyActor *actor) { + EekClutterKeyActorClass *actor_class = + EEK_CLUTTER_KEY_ACTOR_GET_CLASS(actor); ClutterActor *texture; - GHashTable *outline_textures; EekOutline *outline; - outline_textures = EEK_CLUTTER_KEY_ACTOR_GET_CLASS(actor)-> - outline_textures; - + if (!actor_class->outline_textures) + actor_class->outline_textures = g_hash_table_new_full (g_direct_hash, + g_direct_equal, + NULL, + g_free); outline = eek_key_get_outline (actor->priv->key); - texture = g_hash_table_lookup (outline_textures, outline); + texture = g_hash_table_lookup (actor_class->outline_textures, outline); if (texture == NULL) { texture = create_texture_for_key (actor->priv->key); - g_hash_table_insert (outline_textures, outline, texture); + g_hash_table_insert (actor_class->outline_textures, outline, texture); } else texture = clutter_clone_new (texture); return texture; diff --git a/eek/eek-clutter-key.c b/eek/eek-clutter-key.c index f1ed84a7..b1048c48 100644 --- a/eek/eek-clutter-key.c +++ b/eek/eek-clutter-key.c @@ -73,10 +73,10 @@ eek_clutter_key_finalize (GObject *object) { EekClutterKeyPrivate *priv = EEK_CLUTTER_KEY_GET_PRIVATE(object); - if (priv->actor) { - clutter_group_remove_all (CLUTTER_GROUP(priv->actor)); + /* No need for clutter_group_remove_all() since + ClutterGroup#dispose() unrefs all the children. */ + if (priv->actor) g_object_unref (priv->actor); - } G_OBJECT_CLASS (eek_clutter_key_parent_class)->finalize (object); } diff --git a/eek/eek-clutter-keyboard.c b/eek/eek-clutter-keyboard.c index 9b2c435c..06885a9b 100644 --- a/eek/eek-clutter-keyboard.c +++ b/eek/eek-clutter-keyboard.c @@ -40,6 +40,7 @@ G_DEFINE_TYPE (EekClutterKeyboard, eek_clutter_keyboard, EEK_TYPE_KEYBOARD); struct _EekClutterKeyboardPrivate { ClutterActor *actor; + EekLayout *layout; }; static void @@ -97,8 +98,10 @@ eek_clutter_keyboard_real_create_section (EekKeyboard *self) g_return_val_if_fail (section, NULL); g_object_ref_sink (section); - g_signal_connect (section, "key-pressed", G_CALLBACK(key_pressed_event), self); - g_signal_connect (section, "key-released", G_CALLBACK(key_released_event), self); + g_signal_connect (section, "key-pressed", + G_CALLBACK(key_pressed_event), self); + g_signal_connect (section, "key-released", + G_CALLBACK(key_released_event), self); EEK_CONTAINER_GET_CLASS(self)->add_child (EEK_CONTAINER(self), EEK_ELEMENT(section)); @@ -111,15 +114,31 @@ eek_clutter_keyboard_real_create_section (EekKeyboard *self) return section; } +static void +eek_clutter_keyboard_real_set_layout (EekKeyboard *self, + EekLayout *layout) +{ + EekClutterKeyboardPrivate *priv = EEK_CLUTTER_KEYBOARD_GET_PRIVATE(self); + + g_return_if_fail (EEK_IS_LAYOUT(layout)); + + /* Don't apply the layout to keyboard right now, so to delay + drawing until eek_clutter_keyboard_get_actor. */ + priv->layout = layout; + g_object_ref_sink (priv->layout); +} + static void eek_clutter_keyboard_finalize (GObject *object) { EekClutterKeyboardPrivate *priv = EEK_CLUTTER_KEYBOARD_GET_PRIVATE(object); - if (priv->actor) { - clutter_group_remove_all (CLUTTER_GROUP(priv->actor)); + /* No need for clutter_group_remove_all() since + ClutterGroup#dispose() unrefs all the children. */ + if (priv->actor) g_object_unref (priv->actor); - } + if (priv->layout) + g_object_unref (priv->layout); G_OBJECT_CLASS (eek_clutter_keyboard_parent_class)->finalize (object); } @@ -146,6 +165,7 @@ eek_clutter_keyboard_init (EekClutterKeyboard *self) priv = self->priv = EEK_CLUTTER_KEYBOARD_GET_PRIVATE(self); priv->actor = NULL; + priv->layout = NULL; } /** @@ -182,5 +202,7 @@ eek_clutter_keyboard_get_actor (EekClutterKeyboard *keyboard) EEK_CLUTTER_KEYBOARD_GET_PRIVATE(keyboard); if (!priv->actor) priv->actor = clutter_group_new (); + if (priv->layout) + eek_layout_apply (priv->layout, EEK_KEYBOARD(keyboard)); return priv->actor; } diff --git a/eek/eek-clutter-section.c b/eek/eek-clutter-section.c index 562b633c..4d320c38 100644 --- a/eek/eek-clutter-section.c +++ b/eek/eek-clutter-section.c @@ -137,10 +137,10 @@ eek_clutter_section_finalize (GObject *object) { EekClutterSectionPrivate *priv = EEK_CLUTTER_SECTION_GET_PRIVATE(object); - if (priv->actor) { - clutter_group_remove_all (CLUTTER_GROUP(priv->actor)); + /* No need for clutter_group_remove_all() since + ClutterGroup#dispose() unrefs all the children. */ + if (priv->actor) g_object_unref (priv->actor); - } G_OBJECT_CLASS (eek_clutter_section_parent_class)->finalize (object); } diff --git a/eek/eek-keyboard.c b/eek/eek-keyboard.c index c49c96fe..e6f88f28 100644 --- a/eek/eek-keyboard.c +++ b/eek/eek-keyboard.c @@ -143,8 +143,10 @@ eek_keyboard_real_create_section (EekKeyboard *self) g_return_val_if_fail (section, NULL); g_object_ref_sink (section); - g_signal_connect (section, "key-pressed", G_CALLBACK(key_pressed_event), self); - g_signal_connect (section, "key-released", G_CALLBACK(key_released_event), self); + g_signal_connect (section, "key-pressed", + G_CALLBACK(key_pressed_event), self); + g_signal_connect (section, "key-released", + G_CALLBACK(key_released_event), self); EEK_CONTAINER_GET_CLASS(self)->add_child (EEK_CONTAINER(self), EEK_ELEMENT(section)); @@ -152,12 +154,12 @@ eek_keyboard_real_create_section (EekKeyboard *self) } static void -eek_keyboard_real_set_layout (EekKeyboard *keyboard, +eek_keyboard_real_set_layout (EekKeyboard *self, EekLayout *layout) { g_return_if_fail (EEK_IS_LAYOUT(layout)); - EEK_LAYOUT_GET_IFACE(layout)->apply (layout, keyboard); + EEK_LAYOUT_GET_IFACE(layout)->apply (layout, self); if (g_object_is_floating (layout)) g_object_unref (layout); diff --git a/eek/eek-xkb-layout.c b/eek/eek-xkb-layout.c index 186d58f9..1c32d3e4 100644 --- a/eek/eek-xkb-layout.c +++ b/eek/eek-xkb-layout.c @@ -305,9 +305,6 @@ eek_xkb_layout_real_apply (EekLayout *layout, EekKeyboard *keyboard) g_return_if_fail (EEK_IS_KEYBOARD(keyboard)); create_keyboard (EEK_XKB_LAYOUT(layout), keyboard); - - if (g_object_is_floating (keyboard)) - g_object_unref (keyboard); } static void @@ -318,8 +315,7 @@ eek_xkb_layout_finalize (GObject *object) g_free (priv->names.keycodes); g_free (priv->names.geometry); g_free (priv->names.symbols); - /* XXX */ - //g_hash_table_unref (priv->outline_hash); + g_hash_table_unref (priv->outline_hash); XkbFreeKeyboard (priv->xkb, 0, TRUE); /* free_all = TRUE */ G_OBJECT_CLASS (eek_xkb_layout_parent_class)->finalize (object); }