Make sure that a key is not pressed when sending new "pressed" event of it.

This commit is contained in:
Daiki Ueno
2011-02-21 16:13:19 +09:00
parent bf2b9c968d
commit 12cc310e38
2 changed files with 15 additions and 35 deletions

View File

@ -175,7 +175,7 @@ eek_gtk_keyboard_real_button_press_event (GtkWidget *self,
if (priv->dragged_key && priv->dragged_key != key)
g_signal_emit_by_name (priv->dragged_key, "released", priv->keyboard);
if (key) {
if (key && !eek_key_is_pressed (key)) {
priv->dragged_key = key;
g_signal_emit_by_name (key, "pressed", priv->keyboard);
}
@ -188,11 +188,6 @@ eek_gtk_keyboard_real_button_release_event (GtkWidget *self,
GdkEventButton *event)
{
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) {
g_signal_emit_by_name (priv->dragged_key, "released", priv->keyboard);

View File

@ -468,52 +468,37 @@ get_fakekey_modifiers (EekModifierType modifiers)
}
static void
on_key_pressed (EekboardKeyboard *keyboard,
guint keycode,
gpointer user_data)
on_key_pressed (EekKeyboard *keyboard,
EekKey *key,
gpointer user_data)
{
EekboardSystemClient *client = user_data;
EekKey *key;
EekSymbol *symbol;
EekModifierType modifiers;
FakeKeyModifier fakekey_modefiers;
guint keycode;
g_assert (client->fakekey);
modifiers = eek_keyboard_get_modifiers (client->description);
key = eek_keyboard_find_key_by_keycode (client->description, keycode);
if (!key) {
// g_debug ("Can't find key for keycode %u", keycode);
return;
}
fakekey_modefiers = get_fakekey_modifiers (modifiers);
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)) {
fakekey_send_keyevent (client->fakekey,
keycode,
True,
get_fakekey_modifiers (modifiers));
fakekey_send_keyevent (client->fakekey,
keycode,
False,
get_fakekey_modifiers (modifiers));
fakekey_send_keyevent (client->fakekey, keycode, True, modifiers);
fakekey_send_keyevent (client->fakekey, keycode, False, modifiers);
}
}
static void
on_key_released (EekboardKeyboard *keyboard,
guint keycode,
gpointer user_data)
on_key_released (EekKeyboard *keyboard,
EekKey *key,
gpointer user_data)
{
EekboardSystemClient *client = user_data;
EekKey *key;
g_assert (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
@ -530,10 +515,10 @@ eekboard_system_client_enable_fakekey (EekboardSystemClient *client)
g_assert (client->fakekey);
client->key_pressed_handler =
g_signal_connect (client->keyboard, "key-pressed",
g_signal_connect (client->description, "key-pressed",
G_CALLBACK(on_key_pressed), client);
client->key_released_handler =
g_signal_connect (client->keyboard, "key-released",
g_signal_connect (client->description, "key-released",
G_CALLBACK(on_key_released), client);
return TRUE;