Fix "Capture Key Event" feature.
This commit is contained in:
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user