Make sure that a key is not pressed when sending new "pressed" event of it.
This commit is contained in:
		@ -175,7 +175,7 @@ eek_gtk_keyboard_real_button_press_event (GtkWidget      *self,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    if (priv->dragged_key && priv->dragged_key != key)
 | 
					    if (priv->dragged_key && priv->dragged_key != key)
 | 
				
			||||||
        g_signal_emit_by_name (priv->dragged_key, "released", priv->keyboard);
 | 
					        g_signal_emit_by_name (priv->dragged_key, "released", priv->keyboard);
 | 
				
			||||||
    if (key) {
 | 
					    if (key && !eek_key_is_pressed (key)) {
 | 
				
			||||||
        priv->dragged_key = key;
 | 
					        priv->dragged_key = key;
 | 
				
			||||||
        g_signal_emit_by_name (key, "pressed", priv->keyboard);
 | 
					        g_signal_emit_by_name (key, "pressed", priv->keyboard);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -188,11 +188,6 @@ eek_gtk_keyboard_real_button_release_event (GtkWidget      *self,
 | 
				
			|||||||
                                            GdkEventButton *event)
 | 
					                                            GdkEventButton *event)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
 | 
					    EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
 | 
				
			||||||
    EekKey *key;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    key = eek_renderer_find_key_by_position (priv->renderer,
 | 
					 | 
				
			||||||
                                             (gdouble)event->x,
 | 
					 | 
				
			||||||
                                             (gdouble)event->y);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (priv->dragged_key) {
 | 
					    if (priv->dragged_key) {
 | 
				
			||||||
        g_signal_emit_by_name (priv->dragged_key, "released", priv->keyboard);
 | 
					        g_signal_emit_by_name (priv->dragged_key, "released", priv->keyboard);
 | 
				
			||||||
 | 
				
			|||||||
@ -468,52 +468,37 @@ get_fakekey_modifiers (EekModifierType modifiers)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
on_key_pressed (EekboardKeyboard *keyboard,
 | 
					on_key_pressed (EekKeyboard *keyboard,
 | 
				
			||||||
                guint          keycode,
 | 
					                EekKey      *key,
 | 
				
			||||||
                gpointer       user_data)
 | 
					                gpointer     user_data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekboardSystemClient *client = user_data;
 | 
					    EekboardSystemClient *client = user_data;
 | 
				
			||||||
    EekKey *key;
 | 
					 | 
				
			||||||
    EekSymbol *symbol;
 | 
					    EekSymbol *symbol;
 | 
				
			||||||
    EekModifierType modifiers;
 | 
					    EekModifierType modifiers;
 | 
				
			||||||
 | 
					    FakeKeyModifier fakekey_modefiers;
 | 
				
			||||||
 | 
					    guint keycode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_assert (client->fakekey);
 | 
					    g_assert (client->fakekey);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    modifiers = eek_keyboard_get_modifiers (client->description);
 | 
					    modifiers = eek_keyboard_get_modifiers (client->description);
 | 
				
			||||||
    key = eek_keyboard_find_key_by_keycode (client->description, keycode);
 | 
					    fakekey_modefiers = get_fakekey_modifiers (modifiers);
 | 
				
			||||||
    if (!key) {
 | 
					 | 
				
			||||||
        // g_debug ("Can't find key for keycode %u", keycode);
 | 
					 | 
				
			||||||
        return;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    symbol = eek_key_get_symbol_with_fallback (key, 0, 0);
 | 
					    symbol = eek_key_get_symbol_with_fallback (key, 0, 0);
 | 
				
			||||||
 | 
					    keycode = eek_key_get_keycode (key);
 | 
				
			||||||
    if (EEK_IS_KEYSYM(symbol) && !eek_symbol_is_modifier (symbol)) {
 | 
					    if (EEK_IS_KEYSYM(symbol) && !eek_symbol_is_modifier (symbol)) {
 | 
				
			||||||
        fakekey_send_keyevent (client->fakekey,
 | 
					        fakekey_send_keyevent (client->fakekey, keycode, True, modifiers);
 | 
				
			||||||
                               keycode,
 | 
					        fakekey_send_keyevent (client->fakekey, keycode, False, modifiers);
 | 
				
			||||||
                               True,
 | 
					 | 
				
			||||||
                               get_fakekey_modifiers (modifiers));
 | 
					 | 
				
			||||||
        fakekey_send_keyevent (client->fakekey,
 | 
					 | 
				
			||||||
                               keycode,
 | 
					 | 
				
			||||||
                               False,
 | 
					 | 
				
			||||||
                               get_fakekey_modifiers (modifiers));
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
on_key_released (EekboardKeyboard *keyboard,
 | 
					on_key_released (EekKeyboard *keyboard,
 | 
				
			||||||
                 guint          keycode,
 | 
					                 EekKey      *key,
 | 
				
			||||||
                 gpointer       user_data)
 | 
					                 gpointer     user_data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekboardSystemClient *client = user_data;
 | 
					    EekboardSystemClient *client = user_data;
 | 
				
			||||||
    EekKey *key;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_assert (client->fakekey);
 | 
					    g_assert (client->fakekey);
 | 
				
			||||||
    fakekey_release (client->fakekey);
 | 
					    fakekey_release (client->fakekey);
 | 
				
			||||||
    key = eek_keyboard_find_key_by_keycode (client->description, keycode);
 | 
					 | 
				
			||||||
    if (!key) {
 | 
					 | 
				
			||||||
        // g_debug ("Can't find key for keycode %u", keycode);
 | 
					 | 
				
			||||||
        return;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
gboolean
 | 
					gboolean
 | 
				
			||||||
@ -530,10 +515,10 @@ eekboard_system_client_enable_fakekey (EekboardSystemClient *client)
 | 
				
			|||||||
    g_assert (client->fakekey);
 | 
					    g_assert (client->fakekey);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    client->key_pressed_handler =
 | 
					    client->key_pressed_handler =
 | 
				
			||||||
        g_signal_connect (client->keyboard, "key-pressed",
 | 
					        g_signal_connect (client->description, "key-pressed",
 | 
				
			||||||
                          G_CALLBACK(on_key_pressed), client);
 | 
					                          G_CALLBACK(on_key_pressed), client);
 | 
				
			||||||
    client->key_released_handler =
 | 
					    client->key_released_handler =
 | 
				
			||||||
        g_signal_connect (client->keyboard, "key-released",
 | 
					        g_signal_connect (client->description, "key-released",
 | 
				
			||||||
                          G_CALLBACK(on_key_released), client);
 | 
					                          G_CALLBACK(on_key_released), client);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return TRUE;
 | 
					    return TRUE;
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user