Fix unicode keysym.

This commit is contained in:
Daiki Ueno
2011-02-01 07:31:48 +09:00
parent da4552c61c
commit 53b96d3f44

View File

@ -113,11 +113,31 @@ eek_keysym_real_get_name (EekSymbol *self)
return priv->name; return priv->name;
} }
static gboolean
get_unichar (guint xkeysym, gunichar *uc) {
/* Check for Latin-1 characters (1:1 mapping) */
if ((xkeysym >= 0x0020 && xkeysym <= 0x007e) ||
(xkeysym >= 0x00a0 && xkeysym <= 0x00ff)) {
*uc = xkeysym;
return TRUE;
}
/* Also check for directly encoded 24-bit UCS characters:
*/
if ((xkeysym & 0xff000000) == 0x01000000) {
*uc = xkeysym & 0x00ffffff;
return TRUE;
}
return FALSE;
}
static gchar * static gchar *
eek_keysym_real_get_label (EekSymbol *self) eek_keysym_real_get_label (EekSymbol *self)
{ {
EekKeysymPrivate *priv = EEK_KEYSYM_GET_PRIVATE(self); EekKeysymPrivate *priv = EEK_KEYSYM_GET_PRIVATE(self);
EekKeysymEntry *entry; EekKeysymEntry *entry;
gunichar uc;
/* First, search special keysyms. */ /* First, search special keysyms. */
entry = find_keysym_entry_by_xkeysym (priv->xkeysym, entry = find_keysym_entry_by_xkeysym (priv->xkeysym,
@ -125,16 +145,9 @@ eek_keysym_real_get_label (EekSymbol *self)
G_N_ELEMENTS(special_keysym_entries)); G_N_ELEMENTS(special_keysym_entries));
if (entry) if (entry)
return g_strdup (entry->name); return g_strdup (entry->name);
/* Check for Latin-1 characters (1:1 mapping) */
if ((priv->xkeysym >= 0x0020 && priv->xkeysym <= 0x007e) ||
(priv->xkeysym >= 0x00a0 && priv->xkeysym <= 0x00ff))
return unichar_to_utf8 (priv->xkeysym);
/* Also check for directly encoded 24-bit UCS characters: if (get_unichar (priv->xkeysym, &uc))
*/ return unichar_to_utf8 (uc);
if ((priv->xkeysym & 0xff000000) == 0x01000000)
return unichar_to_utf8 (priv->xkeysym & 0x00ffffff);
/* Search known unicode keysyms. */ /* Search known unicode keysyms. */
entry = find_keysym_entry_by_xkeysym (priv->xkeysym, entry = find_keysym_entry_by_xkeysym (priv->xkeysym,
@ -217,17 +230,30 @@ eek_keysym_new (guint xkeysym)
keysym = g_object_new (EEK_TYPE_KEYSYM, NULL); keysym = g_object_new (EEK_TYPE_KEYSYM, NULL);
priv = EEK_KEYSYM_GET_PRIVATE(keysym); priv = EEK_KEYSYM_GET_PRIVATE(keysym);
priv->xkeysym = xkeysym;
/* First check the X standard keysyms */
entry = find_keysym_entry_by_xkeysym (xkeysym, entry = find_keysym_entry_by_xkeysym (xkeysym,
xkeysym_keysym_entries, xkeysym_keysym_entries,
G_N_ELEMENTS(xkeysym_keysym_entries)); G_N_ELEMENTS(xkeysym_keysym_entries));
if (!entry) {
gunichar uc;
/* Check the special unicode mappings */
if (get_unichar (priv->xkeysym, &uc)) {
priv->category = EEK_SYMBOL_CATEGORY_LETTER;
return keysym;
}
entry = find_keysym_entry_by_xkeysym
(priv->xkeysym,
unicode_keysym_entries,
G_N_ELEMENTS(unicode_keysym_entries));
}
if (entry) if (entry)
memcpy (priv, entry, sizeof (EekKeysymEntry)); memcpy (priv, entry, sizeof (EekKeysymEntry));
else {
// g_warning ("can't find keysym entry %u", xkeysym);
memcpy (priv, &invalid_keysym_entry, sizeof (EekKeysymEntry));
priv->xkeysym = xkeysym;
}
return keysym; return keysym;
} }