Fix object finalization.
Add XKL wrapper (not ready).
This commit is contained in:
		@ -40,7 +40,6 @@ G_DEFINE_TYPE (EekClutterKeyboard, eek_clutter_keyboard, EEK_TYPE_KEYBOARD);
 | 
			
		||||
struct _EekClutterKeyboardPrivate
 | 
			
		||||
{
 | 
			
		||||
    ClutterActor *actor;
 | 
			
		||||
    EekLayout *layout;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@ -96,7 +95,6 @@ eek_clutter_keyboard_real_create_section (EekKeyboard *self)
 | 
			
		||||
 | 
			
		||||
    section = g_object_new (EEK_TYPE_CLUTTER_SECTION, NULL);
 | 
			
		||||
    g_return_val_if_fail (section, NULL);
 | 
			
		||||
    g_object_ref_sink (section);
 | 
			
		||||
 | 
			
		||||
    g_signal_connect (section, "key-pressed",
 | 
			
		||||
                      G_CALLBACK(key_pressed_event), self);
 | 
			
		||||
@ -114,31 +112,13 @@ 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);
 | 
			
		||||
 | 
			
		||||
    /* 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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -165,7 +145,6 @@ eek_clutter_keyboard_init (EekClutterKeyboard *self)
 | 
			
		||||
 | 
			
		||||
    priv = self->priv = EEK_CLUTTER_KEYBOARD_GET_PRIVATE(self);
 | 
			
		||||
    priv->actor = NULL;
 | 
			
		||||
    priv->layout = NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@ -195,14 +174,67 @@ eek_clutter_keyboard_new (gfloat width,
 | 
			
		||||
    return keyboard;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
on_clutter_key_press_event (ClutterActor *actor,
 | 
			
		||||
                            ClutterEvent *event,
 | 
			
		||||
                            gpointer      user_data)
 | 
			
		||||
{
 | 
			
		||||
    guint keycode;
 | 
			
		||||
    EekKey *key;
 | 
			
		||||
 | 
			
		||||
    keycode = clutter_event_get_key_code (event);
 | 
			
		||||
    key = eek_keyboard_find_key_by_keycode (user_data, keycode);
 | 
			
		||||
    if (key) {
 | 
			
		||||
        g_signal_emit_by_name (key, "pressed", NULL);
 | 
			
		||||
        return TRUE;
 | 
			
		||||
    }
 | 
			
		||||
    return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
on_clutter_key_release_event (ClutterActor *actor,
 | 
			
		||||
                              ClutterEvent *event,
 | 
			
		||||
                              gpointer      user_data)
 | 
			
		||||
{
 | 
			
		||||
    guint keycode;
 | 
			
		||||
    EekKey *key;
 | 
			
		||||
 | 
			
		||||
    keycode = clutter_event_get_key_code (event);
 | 
			
		||||
    key = eek_keyboard_find_key_by_keycode (user_data, keycode);
 | 
			
		||||
    if (key) {
 | 
			
		||||
        g_signal_emit_by_name (key, "released", NULL);
 | 
			
		||||
        return TRUE;
 | 
			
		||||
    }
 | 
			
		||||
    return FALSE;    
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_clutter_realize (ClutterActor *actor, gpointer user_data)
 | 
			
		||||
{
 | 
			
		||||
    EekClutterKeyboard *keyboard = user_data;
 | 
			
		||||
    EekClutterKeyboardPrivate *priv =
 | 
			
		||||
        EEK_CLUTTER_KEYBOARD_GET_PRIVATE(keyboard);
 | 
			
		||||
    ClutterActor *stage;
 | 
			
		||||
 | 
			
		||||
    stage = clutter_actor_get_stage (priv->actor);
 | 
			
		||||
    g_signal_connect (stage, "key-press-event",
 | 
			
		||||
                      G_CALLBACK (on_clutter_key_press_event), keyboard);
 | 
			
		||||
    g_signal_connect (stage, "key-release-event",
 | 
			
		||||
                      G_CALLBACK (on_clutter_key_release_event), keyboard);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ClutterActor *
 | 
			
		||||
eek_clutter_keyboard_get_actor (EekClutterKeyboard *keyboard)
 | 
			
		||||
{
 | 
			
		||||
    EekClutterKeyboardPrivate *priv =
 | 
			
		||||
        EEK_CLUTTER_KEYBOARD_GET_PRIVATE(keyboard);
 | 
			
		||||
    if (!priv->actor)
 | 
			
		||||
    if (!priv->actor) {
 | 
			
		||||
        priv->actor = clutter_group_new ();
 | 
			
		||||
    if (priv->layout)
 | 
			
		||||
        eek_layout_apply (priv->layout, EEK_KEYBOARD(keyboard));
 | 
			
		||||
        g_object_ref_sink (priv->actor);
 | 
			
		||||
        g_signal_connect (priv->actor, "realize",
 | 
			
		||||
                          G_CALLBACK (on_clutter_realize), keyboard);
 | 
			
		||||
        g_return_val_if_fail (priv->actor, NULL);
 | 
			
		||||
        eek_keyboard_realize (EEK_KEYBOARD(keyboard));
 | 
			
		||||
    }
 | 
			
		||||
    return priv->actor;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user