From 40a6a6c7fdb3a607b4c0e8379b312a85a149dd57 Mon Sep 17 00:00:00 2001 From: Daiki Ueno Date: Fri, 11 Jun 2010 18:11:19 +0900 Subject: [PATCH] Fix "Capture Key Event" feature. --- eek/eek-clutter-keyboard.c | 16 +++++++++++++--- src/eekboard.c | 12 +++++++----- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/eek/eek-clutter-keyboard.c b/eek/eek-clutter-keyboard.c index ae789d14..4f9dcae8 100644 --- a/eek/eek-clutter-keyboard.c +++ b/eek/eek-clutter-keyboard.c @@ -40,6 +40,8 @@ G_DEFINE_TYPE (EekClutterKeyboard, eek_clutter_keyboard, EEK_TYPE_KEYBOARD); struct _EekClutterKeyboardPrivate { ClutterActor *actor; + guint key_press_event_handler; + guint key_release_event_handler; }; static void @@ -117,8 +119,14 @@ eek_clutter_keyboard_finalize (GObject *object) { EekClutterKeyboardPrivate *priv = EEK_CLUTTER_KEYBOARD_GET_PRIVATE(object); - if (priv->actor) + if (priv->actor) { + ClutterActor *stage; + + stage = clutter_actor_get_stage (priv->actor); + g_signal_handler_disconnect (stage, priv->key_press_event_handler); + g_signal_handler_disconnect (stage, priv->key_release_event_handler); g_object_unref (priv->actor); + } G_OBJECT_CLASS (eek_clutter_keyboard_parent_class)->finalize (object); } @@ -217,8 +225,10 @@ on_clutter_realize (ClutterActor *actor, gpointer user_data) ClutterActor *stage; stage = clutter_actor_get_stage (priv->actor); - g_signal_connect (stage, "key-press-event", - G_CALLBACK (on_clutter_key_press_event), keyboard); + priv->key_press_event_handler = + g_signal_connect (stage, "key-press-event", + G_CALLBACK (on_clutter_key_press_event), keyboard); + priv->key_release_event_handler = g_signal_connect (stage, "key-release-event", G_CALLBACK (on_clutter_key_release_event), keyboard); } diff --git a/src/eekboard.c b/src/eekboard.c index 9dc586df..692d110d 100644 --- a/src/eekboard.c +++ b/src/eekboard.c @@ -26,7 +26,7 @@ FakeKey *fakekey; Window target; EekLayout *layout; -EekKeyboard *keyboard; +EekKeyboard *eek_keyboard; static void on_capture_key_event_toggled (GtkToggleAction *action, GtkWidget *window); @@ -130,10 +130,12 @@ on_changed (EekLayout *layout, gpointer user_data) clutter_actor_get_size (stage, &width, &height); actor = clutter_container_find_child_by_name (stage, "keyboard"); + + /* FIXME: currently keyboard must be finalized before actor. */ + g_object_unref (eek_keyboard); if (actor) clutter_container_remove_actor (CLUTTER_CONTAINER(stage), actor); - g_object_unref (keyboard); - create_keyboard (stage, layout, width, height); + eek_keyboard = create_keyboard (stage, layout, width, height); } static const char ui_description[] = @@ -384,8 +386,8 @@ main (int argc, char *argv[]) exit (1); } - keyboard = create_keyboard (stage, layout, CSW, CSH); - if (!keyboard) { + eek_keyboard = create_keyboard (stage, layout, CSW, CSH); + if (!eek_keyboard) { g_object_unref (layout); fprintf (stderr, "Failed to create keyboard\n"); exit (1);