Remove released and cancelled key events
This commit is contained in:
		@ -61,31 +61,25 @@ struct _EekGtkKeyboardPrivate
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    EekRenderer *renderer;
 | 
					    EekRenderer *renderer;
 | 
				
			||||||
    EekKeyboard *keyboard;
 | 
					    EekKeyboard *keyboard;
 | 
				
			||||||
    gulong key_pressed_handler;
 | 
					 | 
				
			||||||
    gulong key_released_handler;
 | 
					 | 
				
			||||||
    gulong key_locked_handler;
 | 
					    gulong key_locked_handler;
 | 
				
			||||||
    gulong key_unlocked_handler;
 | 
					    gulong key_unlocked_handler;
 | 
				
			||||||
    gulong key_cancelled_handler;
 | 
					 | 
				
			||||||
    gulong symbol_index_changed_handler;
 | 
					    gulong symbol_index_changed_handler;
 | 
				
			||||||
    EekTheme *theme;
 | 
					    EekTheme *theme;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static EekColor * color_from_gdk_color    (GdkColor    *gdk_color);
 | 
					static EekColor * color_from_gdk_color    (GdkColor    *gdk_color);
 | 
				
			||||||
static void       on_key_pressed          (EekKeyboard *keyboard,
 | 
					static void       on_key_pressed          (EekKey      *key,
 | 
				
			||||||
                                           EekKey      *key, guint32 timestamp,
 | 
					                                           EekGtkKeyboard *self);
 | 
				
			||||||
 | 
					static void       on_key_released         (EekKey      *key,
 | 
				
			||||||
                                           EekGtkKeyboard *self);
 | 
					                                           EekGtkKeyboard *self);
 | 
				
			||||||
static void       on_key_released         (EekKeyboard *keyboard,
 | 
					 | 
				
			||||||
                                           EekKey      *key,
 | 
					 | 
				
			||||||
                                           gpointer     user_data);
 | 
					 | 
				
			||||||
static void       on_key_locked          (EekKeyboard *keyboard,
 | 
					static void       on_key_locked          (EekKeyboard *keyboard,
 | 
				
			||||||
                                           EekKey      *key,
 | 
					                                           EekKey      *key,
 | 
				
			||||||
                                           gpointer     user_data);
 | 
					                                           gpointer     user_data);
 | 
				
			||||||
static void       on_key_unlocked         (EekKeyboard *keyboard,
 | 
					static void       on_key_unlocked         (EekKeyboard *keyboard,
 | 
				
			||||||
                                           EekKey      *key,
 | 
					                                           EekKey      *key,
 | 
				
			||||||
                                           gpointer     user_data);
 | 
					                                           gpointer     user_data);
 | 
				
			||||||
static void       on_key_cancelled        (EekKeyboard *keyboard,
 | 
					static void       on_key_cancelled        (EekKey      *key,
 | 
				
			||||||
                                           EekKey      *key,
 | 
					                                           EekGtkKeyboard *self);
 | 
				
			||||||
                                           gpointer     user_data);
 | 
					 | 
				
			||||||
static void       on_symbol_index_changed (EekKeyboard *keyboard,
 | 
					static void       on_symbol_index_changed (EekKeyboard *keyboard,
 | 
				
			||||||
                                           gint         group,
 | 
					                                           gint         group,
 | 
				
			||||||
                                           gint         level,
 | 
					                                           gint         level,
 | 
				
			||||||
@ -211,11 +205,12 @@ eek_gtk_keyboard_real_button_press_event (GtkWidget      *self,
 | 
				
			|||||||
                                             (gdouble)event->y);
 | 
					                                             (gdouble)event->y);
 | 
				
			||||||
    if (key) {
 | 
					    if (key) {
 | 
				
			||||||
        eek_keyboard_press_key(priv->keyboard, key, event->time);
 | 
					        eek_keyboard_press_key(priv->keyboard, key, event->time);
 | 
				
			||||||
        on_key_pressed(priv->keyboard, key, event->time, EEK_GTK_KEYBOARD(self));
 | 
					        on_key_pressed(key, EEK_GTK_KEYBOARD(self));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return TRUE;
 | 
					    return TRUE;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TODO: this belongs more in gtk_keyboard, with a way to find out which key to re-render
 | 
				
			||||||
static gboolean
 | 
					static gboolean
 | 
				
			||||||
eek_gtk_keyboard_real_button_release_event (GtkWidget      *self,
 | 
					eek_gtk_keyboard_real_button_release_event (GtkWidget      *self,
 | 
				
			||||||
                                            GdkEventButton *event)
 | 
					                                            GdkEventButton *event)
 | 
				
			||||||
@ -225,12 +220,12 @@ eek_gtk_keyboard_real_button_release_event (GtkWidget      *self,
 | 
				
			|||||||
        return TRUE;
 | 
					        return TRUE;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
 | 
					    EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
 | 
				
			||||||
    GList *list, *head;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    list = eek_keyboard_get_pressed_keys (priv->keyboard);
 | 
					    GList *list = eek_keyboard_get_pressed_keys (priv->keyboard);
 | 
				
			||||||
    for (head = list; head; head = g_list_next (head)) {
 | 
					    for (GList *head = list; head; head = g_list_next (head)) {
 | 
				
			||||||
        g_log("squeek", G_LOG_LEVEL_DEBUG, "emit EekKey released");
 | 
					        EekKey *key = EEK_KEY(head->data);
 | 
				
			||||||
        g_signal_emit_by_name (head->data, "released", priv->keyboard);
 | 
					        eek_keyboard_release_key(priv->keyboard, key, event->time);
 | 
				
			||||||
 | 
					        on_key_released(key, EEK_GTK_KEYBOARD(self));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    g_list_free (list);
 | 
					    g_list_free (list);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -325,18 +320,12 @@ eek_gtk_keyboard_set_keyboard (EekGtkKeyboard *self,
 | 
				
			|||||||
    EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
 | 
					    EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
 | 
				
			||||||
    priv->keyboard = g_object_ref (keyboard);
 | 
					    priv->keyboard = g_object_ref (keyboard);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    priv->key_released_handler =
 | 
					 | 
				
			||||||
        g_signal_connect (priv->keyboard, "key-released",
 | 
					 | 
				
			||||||
                          G_CALLBACK(on_key_released), self);
 | 
					 | 
				
			||||||
    priv->key_locked_handler =
 | 
					    priv->key_locked_handler =
 | 
				
			||||||
        g_signal_connect (priv->keyboard, "key-locked",
 | 
					        g_signal_connect (priv->keyboard, "key-locked",
 | 
				
			||||||
                          G_CALLBACK(on_key_locked), self);
 | 
					                          G_CALLBACK(on_key_locked), self);
 | 
				
			||||||
    priv->key_unlocked_handler =
 | 
					    priv->key_unlocked_handler =
 | 
				
			||||||
        g_signal_connect (priv->keyboard, "key-unlocked",
 | 
					        g_signal_connect (priv->keyboard, "key-unlocked",
 | 
				
			||||||
                          G_CALLBACK(on_key_unlocked), self);
 | 
					                          G_CALLBACK(on_key_unlocked), self);
 | 
				
			||||||
    priv->key_cancelled_handler =
 | 
					 | 
				
			||||||
        g_signal_connect (priv->keyboard, "key-cancelled",
 | 
					 | 
				
			||||||
                          G_CALLBACK(on_key_cancelled), self);
 | 
					 | 
				
			||||||
    priv->symbol_index_changed_handler =
 | 
					    priv->symbol_index_changed_handler =
 | 
				
			||||||
        g_signal_connect (priv->keyboard, "symbol-index-changed",
 | 
					        g_signal_connect (priv->keyboard, "symbol-index-changed",
 | 
				
			||||||
                          G_CALLBACK(on_symbol_index_changed), self);
 | 
					                          G_CALLBACK(on_symbol_index_changed), self);
 | 
				
			||||||
@ -372,14 +361,6 @@ eek_gtk_keyboard_dispose (GObject *object)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (priv->keyboard) {
 | 
					    if (priv->keyboard) {
 | 
				
			||||||
        if (g_signal_handler_is_connected (priv->keyboard,
 | 
					 | 
				
			||||||
                                           priv->key_pressed_handler))
 | 
					 | 
				
			||||||
            g_signal_handler_disconnect (priv->keyboard,
 | 
					 | 
				
			||||||
                                         priv->key_pressed_handler);
 | 
					 | 
				
			||||||
        if (g_signal_handler_is_connected (priv->keyboard,
 | 
					 | 
				
			||||||
                                           priv->key_released_handler))
 | 
					 | 
				
			||||||
            g_signal_handler_disconnect (priv->keyboard,
 | 
					 | 
				
			||||||
                                         priv->key_released_handler);
 | 
					 | 
				
			||||||
        if (g_signal_handler_is_connected (priv->keyboard,
 | 
					        if (g_signal_handler_is_connected (priv->keyboard,
 | 
				
			||||||
                                           priv->key_locked_handler))
 | 
					                                           priv->key_locked_handler))
 | 
				
			||||||
            g_signal_handler_disconnect (priv->keyboard,
 | 
					            g_signal_handler_disconnect (priv->keyboard,
 | 
				
			||||||
@ -388,10 +369,6 @@ eek_gtk_keyboard_dispose (GObject *object)
 | 
				
			|||||||
                                           priv->key_unlocked_handler))
 | 
					                                           priv->key_unlocked_handler))
 | 
				
			||||||
            g_signal_handler_disconnect (priv->keyboard,
 | 
					            g_signal_handler_disconnect (priv->keyboard,
 | 
				
			||||||
                                         priv->key_unlocked_handler);
 | 
					                                         priv->key_unlocked_handler);
 | 
				
			||||||
        if (g_signal_handler_is_connected (priv->keyboard,
 | 
					 | 
				
			||||||
                                           priv->key_cancelled_handler))
 | 
					 | 
				
			||||||
            g_signal_handler_disconnect (priv->keyboard,
 | 
					 | 
				
			||||||
                                         priv->key_cancelled_handler);
 | 
					 | 
				
			||||||
        if (g_signal_handler_is_connected (priv->keyboard,
 | 
					        if (g_signal_handler_is_connected (priv->keyboard,
 | 
				
			||||||
                                           priv->symbol_index_changed_handler))
 | 
					                                           priv->symbol_index_changed_handler))
 | 
				
			||||||
            g_signal_handler_disconnect (priv->keyboard,
 | 
					            g_signal_handler_disconnect (priv->keyboard,
 | 
				
			||||||
@ -577,13 +554,9 @@ render_released_key (GtkWidget *widget,
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
on_key_pressed (EekKeyboard *keyboard,
 | 
					on_key_pressed (EekKey      *key,
 | 
				
			||||||
                EekKey      *key,
 | 
					 | 
				
			||||||
                guint32      timestamp,
 | 
					 | 
				
			||||||
                EekGtkKeyboard *self)
 | 
					                EekGtkKeyboard *self)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    (void)keyboard;
 | 
					 | 
				
			||||||
    (void)timestamp;
 | 
					 | 
				
			||||||
    EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
 | 
					    EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* renderer may have not been set yet if the widget is a popup */
 | 
					    /* renderer may have not been set yet if the widget is a popup */
 | 
				
			||||||
@ -602,18 +575,16 @@ on_key_pressed (EekKeyboard *keyboard,
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
on_key_released (EekKeyboard *keyboard,
 | 
					on_key_released (EekKey      *key,
 | 
				
			||||||
                 EekKey      *key,
 | 
					                 EekGtkKeyboard *self)
 | 
				
			||||||
                 gpointer     user_data)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    GtkWidget *widget = user_data;
 | 
					    EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
 | 
				
			||||||
    EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(widget);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* renderer may have not been set yet if the widget is a popup */
 | 
					    /* renderer may have not been set yet if the widget is a popup */
 | 
				
			||||||
    if (!priv->renderer)
 | 
					    if (!priv->renderer)
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    render_released_key (widget, key);
 | 
					    render_released_key (GTK_WIDGET(self), key);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if HAVE_LIBCANBERRA
 | 
					#if HAVE_LIBCANBERRA
 | 
				
			||||||
    ca_gtk_play_for_widget (widget, 0,
 | 
					    ca_gtk_play_for_widget (widget, 0,
 | 
				
			||||||
@ -625,18 +596,16 @@ on_key_released (EekKeyboard *keyboard,
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
on_key_cancelled (EekKeyboard *keyboard,
 | 
					on_key_cancelled (EekKey      *key,
 | 
				
			||||||
                 EekKey      *key,
 | 
					                  EekGtkKeyboard *self)
 | 
				
			||||||
                 gpointer     user_data)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    GtkWidget *widget = user_data;
 | 
					    EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
 | 
				
			||||||
    EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(widget);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* renderer may have not been set yet if the widget is a popup */
 | 
					    /* renderer may have not been set yet if the widget is a popup */
 | 
				
			||||||
    if (!priv->renderer)
 | 
					    if (!priv->renderer)
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    render_released_key (widget, key);
 | 
					    render_released_key (self, key);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
 | 
				
			|||||||
@ -47,7 +47,6 @@ enum {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum {
 | 
					enum {
 | 
				
			||||||
    RELEASED,
 | 
					 | 
				
			||||||
    LOCKED,
 | 
					    LOCKED,
 | 
				
			||||||
    UNLOCKED,
 | 
					    UNLOCKED,
 | 
				
			||||||
    CANCELLED,
 | 
					    CANCELLED,
 | 
				
			||||||
@ -73,17 +72,6 @@ struct _EekKeyPrivate
 | 
				
			|||||||
    gboolean is_locked;
 | 
					    gboolean is_locked;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					 | 
				
			||||||
eek_key_real_released (EekKey *self)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    EekKeyPrivate *priv = EEK_KEY_GET_PRIVATE(self);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    priv->is_pressed = FALSE;
 | 
					 | 
				
			||||||
#if DEBUG
 | 
					 | 
				
			||||||
    g_debug ("released %X", eek_key_get_keycode (self));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
eek_key_real_locked (EekKey *self)
 | 
					eek_key_real_locked (EekKey *self)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -206,7 +194,6 @@ eek_key_class_init (EekKeyClass *klass)
 | 
				
			|||||||
    gobject_class->finalize     = eek_key_finalize;
 | 
					    gobject_class->finalize     = eek_key_finalize;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* signals */
 | 
					    /* signals */
 | 
				
			||||||
    klass->released = eek_key_real_released;
 | 
					 | 
				
			||||||
    klass->locked = eek_key_real_locked;
 | 
					    klass->locked = eek_key_real_locked;
 | 
				
			||||||
    klass->unlocked = eek_key_real_unlocked;
 | 
					    klass->unlocked = eek_key_real_unlocked;
 | 
				
			||||||
    klass->cancelled = eek_key_real_cancelled;
 | 
					    klass->cancelled = eek_key_real_cancelled;
 | 
				
			||||||
@ -271,23 +258,6 @@ eek_key_class_init (EekKeyClass *klass)
 | 
				
			|||||||
                                G_PARAM_READWRITE);
 | 
					                                G_PARAM_READWRITE);
 | 
				
			||||||
    g_object_class_install_property (gobject_class, PROP_OREF, pspec);
 | 
					    g_object_class_install_property (gobject_class, PROP_OREF, pspec);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * EekKey::released:
 | 
					 | 
				
			||||||
     * @key: an #EekKey
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * The ::released signal is emitted each time @key is shifted to
 | 
					 | 
				
			||||||
     * the released state.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
   signals[RELEASED] =
 | 
					 | 
				
			||||||
        g_signal_new (I_("released"),
 | 
					 | 
				
			||||||
                      G_TYPE_FROM_CLASS(gobject_class),
 | 
					 | 
				
			||||||
                      G_SIGNAL_RUN_LAST,
 | 
					 | 
				
			||||||
                      G_STRUCT_OFFSET(EekKeyClass, released),
 | 
					 | 
				
			||||||
                      NULL,
 | 
					 | 
				
			||||||
                      NULL,
 | 
					 | 
				
			||||||
                      g_cclosure_marshal_VOID__VOID,
 | 
					 | 
				
			||||||
                      G_TYPE_NONE, 0);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * EekKey::locked:
 | 
					     * EekKey::locked:
 | 
				
			||||||
     * @key: an #EekKey
 | 
					     * @key: an #EekKey
 | 
				
			||||||
 | 
				
			|||||||
@ -74,7 +74,6 @@ struct _EekKeyClass
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    /*< public >*/
 | 
					    /*< public >*/
 | 
				
			||||||
    /* signals */
 | 
					    /* signals */
 | 
				
			||||||
    void (* released)  (EekKey *key);
 | 
					 | 
				
			||||||
    void (* locked)    (EekKey *key);
 | 
					    void (* locked)    (EekKey *key);
 | 
				
			||||||
    void (* unlocked)  (EekKey *key);
 | 
					    void (* unlocked)  (EekKey *key);
 | 
				
			||||||
    void (* cancelled) (EekKey *key);
 | 
					    void (* cancelled) (EekKey *key);
 | 
				
			||||||
 | 
				
			|||||||
@ -50,7 +50,6 @@ enum {
 | 
				
			|||||||
    KEY_RELEASED,
 | 
					    KEY_RELEASED,
 | 
				
			||||||
    KEY_LOCKED,
 | 
					    KEY_LOCKED,
 | 
				
			||||||
    KEY_UNLOCKED,
 | 
					    KEY_UNLOCKED,
 | 
				
			||||||
    KEY_CANCELLED,
 | 
					 | 
				
			||||||
    LAST_SIGNAL
 | 
					    LAST_SIGNAL
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -92,15 +91,6 @@ eek_modifier_key_free (EekModifierKey *modkey)
 | 
				
			|||||||
    g_slice_free (EekModifierKey, modkey);
 | 
					    g_slice_free (EekModifierKey, modkey);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					 | 
				
			||||||
on_key_released (EekSection  *section,
 | 
					 | 
				
			||||||
                 EekKey      *key,
 | 
					 | 
				
			||||||
                 EekKeyboard *keyboard)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    g_log("squeek", G_LOG_LEVEL_DEBUG, "emit EekKeyboard key-released");
 | 
					 | 
				
			||||||
    g_signal_emit (keyboard, signals[KEY_RELEASED], 0, key);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
on_key_locked (EekSection  *section,
 | 
					on_key_locked (EekSection  *section,
 | 
				
			||||||
                EekKey      *key,
 | 
					                EekKey      *key,
 | 
				
			||||||
@ -117,14 +107,6 @@ on_key_unlocked (EekSection  *section,
 | 
				
			|||||||
    g_signal_emit (keyboard, signals[KEY_UNLOCKED], 0, key);
 | 
					    g_signal_emit (keyboard, signals[KEY_UNLOCKED], 0, key);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					 | 
				
			||||||
on_key_cancelled (EekSection  *section,
 | 
					 | 
				
			||||||
                 EekKey      *key,
 | 
					 | 
				
			||||||
                 EekKeyboard *keyboard)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    g_signal_emit (keyboard, signals[KEY_CANCELLED], 0, key);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
on_symbol_index_changed (EekSection *section,
 | 
					on_symbol_index_changed (EekSection *section,
 | 
				
			||||||
                         gint group,
 | 
					                         gint group,
 | 
				
			||||||
@ -278,7 +260,7 @@ void eek_keyboard_press_key(EekKeyboard *keyboard, EekKey *key, guint32 timestam
 | 
				
			|||||||
    EekModifierType modifier;
 | 
					    EekModifierType modifier;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    eek_key_set_pressed(key, TRUE);
 | 
					    eek_key_set_pressed(key, TRUE);
 | 
				
			||||||
 | 
					    key = EEK_KEY(key);
 | 
				
			||||||
    priv->pressed_keys = g_list_prepend (priv->pressed_keys, key);
 | 
					    priv->pressed_keys = g_list_prepend (priv->pressed_keys, key);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    symbol = eek_key_get_symbol_with_fallback (key, 0, 0);
 | 
					    symbol = eek_key_get_symbol_with_fallback (key, 0, 0);
 | 
				
			||||||
@ -302,53 +284,55 @@ void eek_keyboard_press_key(EekKeyboard *keyboard, EekKey *key, guint32 timestam
 | 
				
			|||||||
    emit_key_activated(&ec, keycode, symbol, modifiers, &c, TRUE, timestamp);
 | 
					    emit_key_activated(&ec, keycode, symbol, modifiers, &c, TRUE, timestamp);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					void eek_keyboard_release_key( EekKeyboard *keyboard,
 | 
				
			||||||
eek_keyboard_real_key_released (EekKeyboard *self,
 | 
					                               EekKey      *key,
 | 
				
			||||||
                                EekKey      *key)
 | 
					                               guint32      timestamp) {
 | 
				
			||||||
{
 | 
					    EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(keyboard);
 | 
				
			||||||
    EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(self);
 | 
					 | 
				
			||||||
    EekSymbol *symbol;
 | 
					 | 
				
			||||||
    EekModifierType modifier;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    EEK_KEYBOARD_GET_CLASS (self)->key_cancelled (self, key);
 | 
					    for (GList *head = priv->pressed_keys; head; head = g_list_next (head)) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
    symbol = eek_key_get_symbol_with_fallback (key, 0, 0);
 | 
					 | 
				
			||||||
    if (!symbol)
 | 
					 | 
				
			||||||
        return;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    modifier = eek_symbol_get_modifier_mask (symbol);
 | 
					 | 
				
			||||||
    switch (priv->modifier_behavior) {
 | 
					 | 
				
			||||||
    case EEK_MODIFIER_BEHAVIOR_NONE:
 | 
					 | 
				
			||||||
        set_modifiers_with_key (self, key, priv->modifiers & ~modifier);
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
    case EEK_MODIFIER_BEHAVIOR_LOCK:
 | 
					 | 
				
			||||||
        priv->modifiers ^= modifier;
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
    case EEK_MODIFIER_BEHAVIOR_LATCH:
 | 
					 | 
				
			||||||
        if (modifier)
 | 
					 | 
				
			||||||
            set_modifiers_with_key (self, key, priv->modifiers ^ modifier);
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
            set_modifiers_with_key (self, key,
 | 
					 | 
				
			||||||
                                    (priv->modifiers ^ modifier) & modifier);
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    set_level_from_modifiers (self);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void
 | 
					 | 
				
			||||||
eek_keyboard_real_key_cancelled (EekKeyboard *self,
 | 
					 | 
				
			||||||
                                 EekKey      *key)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(self);
 | 
					 | 
				
			||||||
    GList *head;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (head = priv->pressed_keys; head; head = g_list_next (head)) {
 | 
					 | 
				
			||||||
        if (head->data == key) {
 | 
					        if (head->data == key) {
 | 
				
			||||||
            priv->pressed_keys = g_list_remove_link (priv->pressed_keys, head);
 | 
					            priv->pressed_keys = g_list_remove_link (priv->pressed_keys, head);
 | 
				
			||||||
            g_list_free1 (head);
 | 
					            g_list_free1 (head);
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    EekSymbol *symbol = eek_key_get_symbol_with_fallback (key, 0, 0);
 | 
				
			||||||
 | 
					    if (!symbol)
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    EekModifierType modifier = eek_symbol_get_modifier_mask (symbol);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!symbol)
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    modifier = eek_symbol_get_modifier_mask (symbol);
 | 
				
			||||||
 | 
					    switch (priv->modifier_behavior) {
 | 
				
			||||||
 | 
					    case EEK_MODIFIER_BEHAVIOR_NONE:
 | 
				
			||||||
 | 
					        set_modifiers_with_key (keyboard, key, priv->modifiers & ~modifier);
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    case EEK_MODIFIER_BEHAVIOR_LOCK:
 | 
				
			||||||
 | 
					        priv->modifiers ^= modifier;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    case EEK_MODIFIER_BEHAVIOR_LATCH:
 | 
				
			||||||
 | 
					        if (modifier)
 | 
				
			||||||
 | 
					            set_modifiers_with_key (keyboard, key, priv->modifiers ^ modifier);
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            set_modifiers_with_key (keyboard, key,
 | 
				
			||||||
 | 
					                                    (priv->modifiers ^ modifier) & modifier);
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    set_level_from_modifiers (keyboard);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // "Borrowed" from eek-context-service; doesn't influence the state but forwards the event
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    guint keycode = eek_key_get_keycode (key);
 | 
				
			||||||
 | 
					    guint modifiers = eek_keyboard_get_modifiers (keyboard);
 | 
				
			||||||
 | 
					    // Insert
 | 
				
			||||||
 | 
					    EekboardContext ec = {0};
 | 
				
			||||||
 | 
					    Client c = {&ec, 0, {0}};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    emit_key_activated(&ec, keycode, symbol, modifiers, &c, FALSE, timestamp);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
@ -392,14 +376,10 @@ static void
 | 
				
			|||||||
eek_keyboard_real_child_added (EekContainer *self,
 | 
					eek_keyboard_real_child_added (EekContainer *self,
 | 
				
			||||||
                               EekElement   *element)
 | 
					                               EekElement   *element)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    g_signal_connect (element, "key-released",
 | 
					 | 
				
			||||||
                      G_CALLBACK(on_key_released), self);
 | 
					 | 
				
			||||||
    g_signal_connect (element, "key-locked",
 | 
					    g_signal_connect (element, "key-locked",
 | 
				
			||||||
                      G_CALLBACK(on_key_locked), self);
 | 
					                      G_CALLBACK(on_key_locked), self);
 | 
				
			||||||
    g_signal_connect (element, "key-unlocked",
 | 
					    g_signal_connect (element, "key-unlocked",
 | 
				
			||||||
                      G_CALLBACK(on_key_unlocked), self);
 | 
					                      G_CALLBACK(on_key_unlocked), self);
 | 
				
			||||||
    g_signal_connect (element, "key-cancelled",
 | 
					 | 
				
			||||||
                      G_CALLBACK(on_key_cancelled), self);
 | 
					 | 
				
			||||||
    g_signal_connect (element, "symbol-index-changed",
 | 
					    g_signal_connect (element, "symbol-index-changed",
 | 
				
			||||||
                      G_CALLBACK(on_symbol_index_changed), self);
 | 
					                      G_CALLBACK(on_symbol_index_changed), self);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -408,10 +388,8 @@ static void
 | 
				
			|||||||
eek_keyboard_real_child_removed (EekContainer *self,
 | 
					eek_keyboard_real_child_removed (EekContainer *self,
 | 
				
			||||||
                                 EekElement   *element)
 | 
					                                 EekElement   *element)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    g_signal_handlers_disconnect_by_func (element, on_key_released, self);
 | 
					 | 
				
			||||||
    g_signal_handlers_disconnect_by_func (element, on_key_locked, self);
 | 
					    g_signal_handlers_disconnect_by_func (element, on_key_locked, self);
 | 
				
			||||||
    g_signal_handlers_disconnect_by_func (element, on_key_unlocked, self);
 | 
					    g_signal_handlers_disconnect_by_func (element, on_key_unlocked, self);
 | 
				
			||||||
    g_signal_handlers_disconnect_by_func (element, on_key_cancelled, self);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
@ -427,9 +405,6 @@ eek_keyboard_class_init (EekKeyboardClass *klass)
 | 
				
			|||||||
    klass->create_section = eek_keyboard_real_create_section;
 | 
					    klass->create_section = eek_keyboard_real_create_section;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* signals */
 | 
					    /* signals */
 | 
				
			||||||
    klass->key_released = eek_keyboard_real_key_released;
 | 
					 | 
				
			||||||
    klass->key_cancelled = eek_keyboard_real_key_cancelled;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    container_class->child_added = eek_keyboard_real_child_added;
 | 
					    container_class->child_added = eek_keyboard_real_child_added;
 | 
				
			||||||
    container_class->child_removed = eek_keyboard_real_child_removed;
 | 
					    container_class->child_removed = eek_keyboard_real_child_removed;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -467,26 +442,6 @@ eek_keyboard_class_init (EekKeyboardClass *klass)
 | 
				
			|||||||
                                     PROP_MODIFIER_BEHAVIOR,
 | 
					                                     PROP_MODIFIER_BEHAVIOR,
 | 
				
			||||||
                                     pspec);
 | 
					                                     pspec);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * EekKeyboard::key-released:
 | 
					 | 
				
			||||||
     * @keyboard: an #EekKeyboard
 | 
					 | 
				
			||||||
     * @key: an #EekKey
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * The ::key-released signal is emitted each time a key in @keyboard
 | 
					 | 
				
			||||||
     * is shifted to the released state.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    signals[KEY_RELEASED] =
 | 
					 | 
				
			||||||
        g_signal_new (I_("key-released"),
 | 
					 | 
				
			||||||
                      G_TYPE_FROM_CLASS(gobject_class),
 | 
					 | 
				
			||||||
                      G_SIGNAL_RUN_LAST,
 | 
					 | 
				
			||||||
                      G_STRUCT_OFFSET(EekKeyboardClass, key_released),
 | 
					 | 
				
			||||||
                      NULL,
 | 
					 | 
				
			||||||
                      NULL,
 | 
					 | 
				
			||||||
                      g_cclosure_marshal_VOID__OBJECT,
 | 
					 | 
				
			||||||
                      G_TYPE_NONE,
 | 
					 | 
				
			||||||
                      1,
 | 
					 | 
				
			||||||
                      EEK_TYPE_KEY);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * EekKeyboard::key-locked:
 | 
					     * EekKeyboard::key-locked:
 | 
				
			||||||
     * @keyboard: an #EekKeyboard
 | 
					     * @keyboard: an #EekKeyboard
 | 
				
			||||||
@ -526,26 +481,6 @@ eek_keyboard_class_init (EekKeyboardClass *klass)
 | 
				
			|||||||
                      G_TYPE_NONE,
 | 
					                      G_TYPE_NONE,
 | 
				
			||||||
                      1,
 | 
					                      1,
 | 
				
			||||||
                      EEK_TYPE_KEY);
 | 
					                      EEK_TYPE_KEY);
 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * EekKeyboard::key-cancelled:
 | 
					 | 
				
			||||||
     * @keyboard: an #EekKeyboard
 | 
					 | 
				
			||||||
     * @key: an #EekKey
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * The ::key-cancelled signal is emitted each time a key in @keyboard
 | 
					 | 
				
			||||||
     * is shifted to the cancelled state.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    signals[KEY_CANCELLED] =
 | 
					 | 
				
			||||||
        g_signal_new (I_("key-cancelled"),
 | 
					 | 
				
			||||||
                      G_TYPE_FROM_CLASS(gobject_class),
 | 
					 | 
				
			||||||
                      G_SIGNAL_RUN_LAST,
 | 
					 | 
				
			||||||
                      G_STRUCT_OFFSET(EekKeyboardClass, key_cancelled),
 | 
					 | 
				
			||||||
                      NULL,
 | 
					 | 
				
			||||||
                      NULL,
 | 
					 | 
				
			||||||
                      g_cclosure_marshal_VOID__OBJECT,
 | 
					 | 
				
			||||||
                      G_TYPE_NONE,
 | 
					 | 
				
			||||||
                      1,
 | 
					 | 
				
			||||||
                      EEK_TYPE_KEY);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
 | 
				
			|||||||
@ -84,10 +84,6 @@ struct _EekKeyboardClass
 | 
				
			|||||||
    EekKey     *(* find_key_by_keycode) (EekKeyboard *self,
 | 
					    EekKey     *(* find_key_by_keycode) (EekKeyboard *self,
 | 
				
			||||||
                                         guint        keycode);
 | 
					                                         guint        keycode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* signals */
 | 
					 | 
				
			||||||
    void        (* key_released)        (EekKeyboard *self,
 | 
					 | 
				
			||||||
                                         EekKey      *key);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /*< private >*/
 | 
					    /*< private >*/
 | 
				
			||||||
    /* obsolete members moved to EekElement */
 | 
					    /* obsolete members moved to EekElement */
 | 
				
			||||||
    gpointer symbol_index_changed;
 | 
					    gpointer symbol_index_changed;
 | 
				
			||||||
@ -98,8 +94,6 @@ struct _EekKeyboardClass
 | 
				
			|||||||
                                         EekKey      *key);
 | 
					                                         EekKey      *key);
 | 
				
			||||||
    void        (* key_unlocked)        (EekKeyboard *self,
 | 
					    void        (* key_unlocked)        (EekKeyboard *self,
 | 
				
			||||||
                                         EekKey      *key);
 | 
					                                         EekKey      *key);
 | 
				
			||||||
    void        (* key_cancelled)        (EekKeyboard *self,
 | 
					 | 
				
			||||||
                                         EekKey      *key);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /*< private >*/
 | 
					    /*< private >*/
 | 
				
			||||||
    /* padding */
 | 
					    /* padding */
 | 
				
			||||||
@ -189,6 +183,7 @@ void                eek_modifier_key_free
 | 
				
			|||||||
                                     (EekModifierKey      *modkey);
 | 
					                                     (EekModifierKey      *modkey);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void eek_keyboard_press_key(EekKeyboard *keyboard, EekKey *key, guint32 timestamp);
 | 
					void eek_keyboard_press_key(EekKeyboard *keyboard, EekKey *key, guint32 timestamp);
 | 
				
			||||||
 | 
					void eek_keyboard_release_key(EekKeyboard *keyboard, EekKey *key, guint32 timestamp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
G_END_DECLS
 | 
					G_END_DECLS
 | 
				
			||||||
#endif  /* EEK_KEYBOARD_H */
 | 
					#endif  /* EEK_KEYBOARD_H */
 | 
				
			||||||
 | 
				
			|||||||
@ -45,11 +45,8 @@ enum {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum {
 | 
					enum {
 | 
				
			||||||
    KEY_PRESSED,
 | 
					 | 
				
			||||||
    KEY_RELEASED,
 | 
					 | 
				
			||||||
    KEY_LOCKED,
 | 
					    KEY_LOCKED,
 | 
				
			||||||
    KEY_UNLOCKED,
 | 
					    KEY_UNLOCKED,
 | 
				
			||||||
    KEY_CANCELLED,
 | 
					 | 
				
			||||||
    LAST_SIGNAL
 | 
					    LAST_SIGNAL
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -114,14 +111,6 @@ eek_section_real_get_row (EekSection     *self,
 | 
				
			|||||||
        *orientation = row->orientation;
 | 
					        *orientation = row->orientation;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					 | 
				
			||||||
on_released (EekKey     *key,
 | 
					 | 
				
			||||||
             EekSection *section)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    g_log("squeek", G_LOG_LEVEL_DEBUG, "emit EekSection key-released");
 | 
					 | 
				
			||||||
    g_signal_emit (section, signals[KEY_RELEASED], 0, key);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
on_locked (EekKey     *key,
 | 
					on_locked (EekKey     *key,
 | 
				
			||||||
           EekSection *section)
 | 
					           EekSection *section)
 | 
				
			||||||
@ -136,13 +125,6 @@ on_unlocked (EekKey     *key,
 | 
				
			|||||||
    g_signal_emit (section, signals[KEY_UNLOCKED], 0, key);
 | 
					    g_signal_emit (section, signals[KEY_UNLOCKED], 0, key);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					 | 
				
			||||||
on_cancelled (EekKey     *key,
 | 
					 | 
				
			||||||
             EekSection *section)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    g_signal_emit (section, signals[KEY_CANCELLED], 0, key);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static EekKey *
 | 
					static EekKey *
 | 
				
			||||||
eek_section_real_create_key (EekSection *self,
 | 
					eek_section_real_create_key (EekSection *self,
 | 
				
			||||||
                             guint       keycode,
 | 
					                             guint       keycode,
 | 
				
			||||||
@ -290,20 +272,16 @@ static void
 | 
				
			|||||||
eek_section_real_child_added (EekContainer *self,
 | 
					eek_section_real_child_added (EekContainer *self,
 | 
				
			||||||
                              EekElement   *element)
 | 
					                              EekElement   *element)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    g_signal_connect (element, "released", G_CALLBACK(on_released), self);
 | 
					 | 
				
			||||||
    g_signal_connect (element, "locked", G_CALLBACK(on_locked), self);
 | 
					    g_signal_connect (element, "locked", G_CALLBACK(on_locked), self);
 | 
				
			||||||
    g_signal_connect (element, "unlocked", G_CALLBACK(on_unlocked), self);
 | 
					    g_signal_connect (element, "unlocked", G_CALLBACK(on_unlocked), self);
 | 
				
			||||||
    g_signal_connect (element, "cancelled", G_CALLBACK(on_cancelled), self);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
eek_section_real_child_removed (EekContainer *self,
 | 
					eek_section_real_child_removed (EekContainer *self,
 | 
				
			||||||
                                EekElement   *element)
 | 
					                                EekElement   *element)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    g_signal_handlers_disconnect_by_func (element, on_released, self);
 | 
					 | 
				
			||||||
    g_signal_handlers_disconnect_by_func (element, on_locked, self);
 | 
					    g_signal_handlers_disconnect_by_func (element, on_locked, self);
 | 
				
			||||||
    g_signal_handlers_disconnect_by_func (element, on_unlocked, self);
 | 
					    g_signal_handlers_disconnect_by_func (element, on_unlocked, self);
 | 
				
			||||||
    g_signal_handlers_disconnect_by_func (element, on_cancelled, self);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
@ -345,26 +323,6 @@ eek_section_class_init (EekSectionClass *klass)
 | 
				
			|||||||
                                     PROP_ANGLE,
 | 
					                                     PROP_ANGLE,
 | 
				
			||||||
                                     pspec);
 | 
					                                     pspec);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * EekSection::key-released:
 | 
					 | 
				
			||||||
     * @section: an #EekSection
 | 
					 | 
				
			||||||
     * @key: an #EekKey
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * The ::key-released signal is emitted each time a key in @section
 | 
					 | 
				
			||||||
     * is shifted to the released state.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    signals[KEY_RELEASED] =
 | 
					 | 
				
			||||||
        g_signal_new (I_("key-released"),
 | 
					 | 
				
			||||||
                      G_TYPE_FROM_CLASS(gobject_class),
 | 
					 | 
				
			||||||
                      G_SIGNAL_RUN_LAST,
 | 
					 | 
				
			||||||
                      G_STRUCT_OFFSET(EekSectionClass, key_released),
 | 
					 | 
				
			||||||
                      NULL,
 | 
					 | 
				
			||||||
                      NULL,
 | 
					 | 
				
			||||||
                      g_cclosure_marshal_VOID__OBJECT,
 | 
					 | 
				
			||||||
                      G_TYPE_NONE,
 | 
					 | 
				
			||||||
                      1,
 | 
					 | 
				
			||||||
                      EEK_TYPE_KEY);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * EekSection::key-locked:
 | 
					     * EekSection::key-locked:
 | 
				
			||||||
     * @section: an #EekSection
 | 
					     * @section: an #EekSection
 | 
				
			||||||
@ -404,26 +362,6 @@ eek_section_class_init (EekSectionClass *klass)
 | 
				
			|||||||
                      G_TYPE_NONE,
 | 
					                      G_TYPE_NONE,
 | 
				
			||||||
                      1,
 | 
					                      1,
 | 
				
			||||||
                      EEK_TYPE_KEY);
 | 
					                      EEK_TYPE_KEY);
 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * EekSection::key-cancelled:
 | 
					 | 
				
			||||||
     * @section: an #EekSection
 | 
					 | 
				
			||||||
     * @key: an #EekKey
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * The ::key-cancelled signal is emitted each time a key in @section
 | 
					 | 
				
			||||||
     * is shifted to the cancelled state.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    signals[KEY_CANCELLED] =
 | 
					 | 
				
			||||||
        g_signal_new (I_("key-cancelled"),
 | 
					 | 
				
			||||||
                      G_TYPE_FROM_CLASS(gobject_class),
 | 
					 | 
				
			||||||
                      G_SIGNAL_RUN_LAST,
 | 
					 | 
				
			||||||
                      G_STRUCT_OFFSET(EekSectionClass, key_cancelled),
 | 
					 | 
				
			||||||
                      NULL,
 | 
					 | 
				
			||||||
                      NULL,
 | 
					 | 
				
			||||||
                      g_cclosure_marshal_VOID__OBJECT,
 | 
					 | 
				
			||||||
                      G_TYPE_NONE,
 | 
					 | 
				
			||||||
                      1,
 | 
					 | 
				
			||||||
                      EEK_TYPE_KEY);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
 | 
				
			|||||||
@ -700,58 +700,9 @@ on_repeat_timeout_init (EekboardContextService *context)
 | 
				
			|||||||
    return FALSE;
 | 
					    return FALSE;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					 | 
				
			||||||
on_key_activated(EekKeyboard *keyboard,
 | 
					 | 
				
			||||||
                 EekKey      *key,
 | 
					 | 
				
			||||||
                 EekboardContextService *context,
 | 
					 | 
				
			||||||
                 gboolean pressed)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    guint keycode = eek_key_get_keycode (key);
 | 
					 | 
				
			||||||
    EekSymbol *symbol = eek_key_get_symbol_with_fallback (key, 0, 0);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    guint modifiers = eek_keyboard_get_modifiers (context->priv->keyboard);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Insert
 | 
					 | 
				
			||||||
    EekboardContext ec = {0};
 | 
					 | 
				
			||||||
    Client c = {&ec, 0, {0}};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    emit_key_activated(&ec, keycode, symbol, modifiers, &c, pressed, 0);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void
 | 
					 | 
				
			||||||
on_key_released (EekKeyboard *keyboard,
 | 
					 | 
				
			||||||
                 EekKey      *key,
 | 
					 | 
				
			||||||
                 gpointer     user_data)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    EekboardContextService *context = user_data;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (context->priv->repeat_timeout_id > 0) {
 | 
					 | 
				
			||||||
        g_source_remove (context->priv->repeat_timeout_id);
 | 
					 | 
				
			||||||
        context->priv->repeat_timeout_id = 0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    on_key_activated(keyboard, key, context, FALSE);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void
 | 
					 | 
				
			||||||
on_key_cancelled (EekKeyboard *keyboard,
 | 
					 | 
				
			||||||
                 EekKey      *key,
 | 
					 | 
				
			||||||
                 gpointer     user_data)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    on_key_released(keyboard, key, user_data);
 | 
					 | 
				
			||||||
    // TODO: special handling when composing text via text-input? text may not be committed until button released
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
connect_keyboard_signals (EekboardContextService *context)
 | 
					connect_keyboard_signals (EekboardContextService *context)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    context->priv->key_released_handler =
 | 
					 | 
				
			||||||
        g_signal_connect (context->priv->keyboard, "key-released",
 | 
					 | 
				
			||||||
                          G_CALLBACK(on_key_released),
 | 
					 | 
				
			||||||
                          context);
 | 
					 | 
				
			||||||
    context->priv->key_cancelled_handler =
 | 
					 | 
				
			||||||
        g_signal_connect (context->priv->keyboard, "key-cancelled",
 | 
					 | 
				
			||||||
                          G_CALLBACK(on_key_cancelled),
 | 
					 | 
				
			||||||
                          context);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user