Don't embed native keycode/keysym values in XML layout data.

This commit is contained in:
Daiki Ueno
2011-01-27 19:06:59 +09:00
parent 880ba76bd8
commit 0c77bd45f2
11 changed files with 1158 additions and 64 deletions

View File

@ -31,15 +31,16 @@
#endif /* HAVE_CONFIG_H */
#include "eek-keysym.h"
struct eek_keysym_label {
struct _EekKeysymEntry {
guint keysym;
const gchar *label;
EekKeysymCategory category;
};
typedef struct _EekKeysymEntry EekKeysymEntry;
#include "eek-special-keysym-labels.h"
#include "eek-unicode-keysym-labels.h"
#include "eek-keyname-keysym-labels.h"
#include "eek-special-keysym-entries.h"
#include "eek-unicode-keysym-entries.h"
#include "eek-keyname-keysym-entries.h"
static gchar *
unichar_to_utf8 (gunichar uc)
@ -57,9 +58,9 @@ unichar_to_utf8 (gunichar uc)
}
static int
keysym_label_compare (const void *key0, const void *key1)
keysym_entry_compare_keysym (const void *key0, const void *key1)
{
const struct eek_keysym_label *entry0 = key0, *entry1 = key1;
const EekKeysymEntry *entry0 = key0, *entry1 = key1;
return (gint)entry0->keysym - (gint)entry1->keysym;
}
@ -68,15 +69,15 @@ find_keysym (guint keysym,
gchar **label,
EekKeysymCategory *category)
{
struct eek_keysym_label bsearch_key, *bsearch_val;
EekKeysymEntry bsearch_key, *bsearch_val;
/* First, search special keysyms. */
bsearch_key.keysym = keysym;
bsearch_val = bsearch (&bsearch_key,
special_keysym_labels,
G_N_ELEMENTS(special_keysym_labels),
sizeof (struct eek_keysym_label),
keysym_label_compare);
special_keysym_entries,
G_N_ELEMENTS(special_keysym_entries),
sizeof (EekKeysymEntry),
keysym_entry_compare_keysym);
if (bsearch_val) {
if (label)
*label = g_strdup (bsearch_val->label);
@ -108,10 +109,10 @@ find_keysym (guint keysym,
/* Search known unicode keysyms. */
bsearch_key.keysym = keysym;
bsearch_val = bsearch (&bsearch_key,
unicode_keysym_labels,
G_N_ELEMENTS(unicode_keysym_labels),
sizeof (struct eek_keysym_label),
keysym_label_compare);
unicode_keysym_entries,
G_N_ELEMENTS(unicode_keysym_entries),
sizeof (EekKeysymEntry),
keysym_entry_compare_keysym);
if (bsearch_val) {
if (label)
*label = g_strdup (bsearch_val->label);
@ -123,10 +124,10 @@ find_keysym (guint keysym,
/* Finally, search keynames. */
bsearch_key.keysym = keysym;
bsearch_val = bsearch (&bsearch_key,
keyname_keysym_labels,
G_N_ELEMENTS(keyname_keysym_labels),
sizeof (struct eek_keysym_label),
keysym_label_compare);
keyname_keysym_entries,
G_N_ELEMENTS(keyname_keysym_entries),
sizeof (EekKeysymEntry),
keysym_entry_compare_keysym);
if (bsearch_val) {
if (label)
*label = g_strdup (bsearch_val->label);
@ -154,6 +155,57 @@ eek_keysym_to_string (guint keysym)
return g_strdup ("");
}
gchar *
eek_xkeysym_to_string (guint xkeysym)
{
EekKeysymEntry bsearch_key, *bsearch_val;
bsearch_key.keysym = xkeysym;
bsearch_val = bsearch (&bsearch_key,
keyname_keysym_entries,
G_N_ELEMENTS(keyname_keysym_entries),
sizeof (EekKeysymEntry),
keysym_entry_compare_keysym);
if (bsearch_val)
return g_strdup (bsearch_val->label);
return NULL;
}
static GHashTable *xkeysym_hash = NULL;
static void
xkeysym_free (gpointer xkeysym)
{
g_slice_free (guint, xkeysym);
}
guint
eek_xkeysym_from_string (gchar *string)
{
guint *xkeysym;
if (!xkeysym_hash) {
gint i;
xkeysym_hash = g_hash_table_new_full (g_str_hash,
g_str_equal,
g_free,
xkeysym_free);
for (i = 0; i < G_N_ELEMENTS(keyname_keysym_entries); i++) {
xkeysym = g_slice_new (guint);
*xkeysym = keyname_keysym_entries[i].keysym;
g_hash_table_insert (xkeysym_hash,
g_strdup (keyname_keysym_entries[i].label),
xkeysym);
}
}
xkeysym = g_hash_table_lookup (xkeysym_hash, string);
if (xkeysym)
return *xkeysym;
return EEK_INVALID_KEYSYM;
}
/**
* eek_keysym_get_category:
* @keysym: keysym ID