This commit is contained in:
Daiki Ueno
2011-09-12 17:24:36 +09:00
parent ef3ea618d2
commit 596b33f149

View File

@ -905,39 +905,6 @@ send_fake_key_event (Client *client,
guint xkeysym; guint xkeysym;
guint keycode, replaced_keysym = 0; guint keycode, replaced_keysym = 0;
/* Ignore modifier keys */
if (eek_symbol_is_modifier (symbol))
return;
/* If symbol is a text, convert chars in it to keysym */
if (EEK_IS_TEXT(symbol)) {
gchar *utf8 = eek_text_get_text (EEK_TEXT(symbol));
glong items_written;
gunichar *ucs4 = g_utf8_to_ucs4_fast (utf8, -1, &items_written);
gint i;
for (i = 0; i < items_written; i++) {
EekKeysym *keysym;
gchar *name;
name = g_strdup_printf ("U%04X", ucs4[i]);
xkeysym = XStringToKeysym (name);
g_free (name);
keysym = eek_keysym_new (xkeysym);
send_fake_key_event (client,
EEK_SYMBOL(keysym),
keyboard_modifiers,
is_pressed);
}
g_free (ucs4);
return;
}
/* Ignore special keys */
if (!EEK_IS_KEYSYM(symbol))
return;
xkeysym = eek_keysym_get_xkeysym (EEK_KEYSYM(symbol)); xkeysym = eek_keysym_get_xkeysym (EEK_KEYSYM(symbol));
g_return_if_fail (xkeysym > 0); g_return_if_fail (xkeysym > 0);
@ -950,7 +917,7 @@ send_fake_key_event (Client *client,
return; return;
} }
} }
/* Clear level shift modifiers */ /* Clear level shift modifiers */
keyboard_modifiers &= ~EEK_SHIFT_MASK; keyboard_modifiers &= ~EEK_SHIFT_MASK;
keyboard_modifiers &= ~EEK_LOCK_MASK; keyboard_modifiers &= ~EEK_LOCK_MASK;
@ -964,8 +931,7 @@ send_fake_key_event (Client *client,
send_fake_modifier_key_event (client, modifiers, is_pressed); send_fake_modifier_key_event (client, modifiers, is_pressed);
XSync (GDK_DISPLAY_XDISPLAY (display), False); XSync (GDK_DISPLAY_XDISPLAY (display), False);
keycode = XKeysymToKeycode (GDK_DISPLAY_XDISPLAY (display), keycode = XKeysymToKeycode (GDK_DISPLAY_XDISPLAY (display), xkeysym);
xkeysym);
g_return_if_fail (keycode > 0); g_return_if_fail (keycode > 0);
XTestFakeKeyEvent (GDK_DISPLAY_XDISPLAY (display), XTestFakeKeyEvent (GDK_DISPLAY_XDISPLAY (display),
@ -978,6 +944,48 @@ send_fake_key_event (Client *client,
replace_keycode (client, &keycode, &replaced_keysym); replace_keycode (client, &keycode, &replaced_keysym);
} }
static void
send_fake_key_events (Client *client,
EekSymbol *symbol,
guint keyboard_modifiers)
{
/* Ignore modifier keys */
if (eek_symbol_is_modifier (symbol))
return;
/* If symbol is a text, convert chars in it to keysym */
if (EEK_IS_TEXT(symbol)) {
gchar *utf8 = eek_text_get_text (EEK_TEXT(symbol));
glong items_written;
gunichar *ucs4 = g_utf8_to_ucs4_fast (utf8, -1, &items_written);
gint i;
for (i = 0; i < items_written; i++) {
guint xkeysym;
EekKeysym *keysym;
gchar *name;
name = g_strdup_printf ("U%04X", ucs4[i]);
xkeysym = XStringToKeysym (name);
g_free (name);
keysym = eek_keysym_new (xkeysym);
send_fake_key_events (client,
EEK_SYMBOL(keysym),
keyboard_modifiers);
}
g_free (ucs4);
return;
}
/* Ignore special keys */
if (!EEK_IS_KEYSYM(symbol))
return;
send_fake_key_event (client, symbol, keyboard_modifiers, TRUE);
send_fake_key_event (client, symbol, keyboard_modifiers, FALSE);
}
static void static void
on_key_pressed (EekboardContext *context, on_key_pressed (EekboardContext *context,
const gchar *keyname, const gchar *keyname,
@ -1001,9 +1009,7 @@ on_key_pressed (EekboardContext *context,
return; return;
} }
send_fake_key_events (client, symbol, modifiers);
send_fake_key_event (client, symbol, modifiers, TRUE);
send_fake_key_event (client, symbol, modifiers, FALSE);
} }
static void static void