Fix "Capture Key Event" feature.

This commit is contained in:
Daiki Ueno
2010-06-11 18:11:19 +09:00
parent 4b7f244062
commit 40a6a6c7fd
2 changed files with 20 additions and 8 deletions

View File

@ -40,6 +40,8 @@ G_DEFINE_TYPE (EekClutterKeyboard, eek_clutter_keyboard, EEK_TYPE_KEYBOARD);
struct _EekClutterKeyboardPrivate struct _EekClutterKeyboardPrivate
{ {
ClutterActor *actor; ClutterActor *actor;
guint key_press_event_handler;
guint key_release_event_handler;
}; };
static void static void
@ -117,8 +119,14 @@ eek_clutter_keyboard_finalize (GObject *object)
{ {
EekClutterKeyboardPrivate *priv = EEK_CLUTTER_KEYBOARD_GET_PRIVATE(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_unref (priv->actor);
}
G_OBJECT_CLASS (eek_clutter_keyboard_parent_class)->finalize (object); G_OBJECT_CLASS (eek_clutter_keyboard_parent_class)->finalize (object);
} }
@ -217,8 +225,10 @@ on_clutter_realize (ClutterActor *actor, gpointer user_data)
ClutterActor *stage; ClutterActor *stage;
stage = clutter_actor_get_stage (priv->actor); stage = clutter_actor_get_stage (priv->actor);
priv->key_press_event_handler =
g_signal_connect (stage, "key-press-event", g_signal_connect (stage, "key-press-event",
G_CALLBACK (on_clutter_key_press_event), keyboard); G_CALLBACK (on_clutter_key_press_event), keyboard);
priv->key_release_event_handler =
g_signal_connect (stage, "key-release-event", g_signal_connect (stage, "key-release-event",
G_CALLBACK (on_clutter_key_release_event), keyboard); G_CALLBACK (on_clutter_key_release_event), keyboard);
} }

View File

@ -26,7 +26,7 @@ FakeKey *fakekey;
Window target; Window target;
EekLayout *layout; EekLayout *layout;
EekKeyboard *keyboard; EekKeyboard *eek_keyboard;
static void on_capture_key_event_toggled (GtkToggleAction *action, static void on_capture_key_event_toggled (GtkToggleAction *action,
GtkWidget *window); GtkWidget *window);
@ -130,10 +130,12 @@ on_changed (EekLayout *layout, gpointer user_data)
clutter_actor_get_size (stage, &width, &height); clutter_actor_get_size (stage, &width, &height);
actor = clutter_container_find_child_by_name (stage, "keyboard"); actor = clutter_container_find_child_by_name (stage, "keyboard");
/* FIXME: currently keyboard must be finalized before actor. */
g_object_unref (eek_keyboard);
if (actor) if (actor)
clutter_container_remove_actor (CLUTTER_CONTAINER(stage), actor); clutter_container_remove_actor (CLUTTER_CONTAINER(stage), actor);
g_object_unref (keyboard); eek_keyboard = create_keyboard (stage, layout, width, height);
create_keyboard (stage, layout, width, height);
} }
static const char ui_description[] = static const char ui_description[] =
@ -384,8 +386,8 @@ main (int argc, char *argv[])
exit (1); exit (1);
} }
keyboard = create_keyboard (stage, layout, CSW, CSH); eek_keyboard = create_keyboard (stage, layout, CSW, CSH);
if (!keyboard) { if (!eek_keyboard) {
g_object_unref (layout); g_object_unref (layout);
fprintf (stderr, "Failed to create keyboard\n"); fprintf (stderr, "Failed to create keyboard\n");
exit (1); exit (1);