Don't embed native keycode/keysym values in XML layout data.
This commit is contained in:
@ -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
|
||||
|
||||
Reference in New Issue
Block a user