Don't embed native keycode/keysym values in XML layout data.
This commit is contained in:
@ -41,9 +41,9 @@ libeek_public_headers = \
|
|||||||
libeek_private_headers = \
|
libeek_private_headers = \
|
||||||
$(srcdir)/eek-renderer.h \
|
$(srcdir)/eek-renderer.h \
|
||||||
$(srcdir)/eek-xml-layout.h \
|
$(srcdir)/eek-xml-layout.h \
|
||||||
$(srcdir)/eek-special-keysym-labels.h \
|
$(srcdir)/eek-special-keysym-entries.h \
|
||||||
$(srcdir)/eek-unicode-keysym-labels.h \
|
$(srcdir)/eek-unicode-keysym-entries.h \
|
||||||
$(srcdir)/eek-keyname-keysym-labels.h \
|
$(srcdir)/eek-keyname-keysym-entries.h \
|
||||||
$(srcdir)/eek-marshallers.h
|
$(srcdir)/eek-marshallers.h
|
||||||
|
|
||||||
libeek_sources = \
|
libeek_sources = \
|
||||||
@ -61,9 +61,9 @@ libeek_sources = \
|
|||||||
$(srcdir)/eek-keyboard-drawing.c
|
$(srcdir)/eek-keyboard-drawing.c
|
||||||
|
|
||||||
libeek_keysym_sources = \
|
libeek_keysym_sources = \
|
||||||
$(srcdir)/eek-special-keysym-labels.h \
|
$(srcdir)/eek-special-keysym-entries.h \
|
||||||
$(srcdir)/eek-unicode-keysym-labels.h \
|
$(srcdir)/eek-unicode-keysym-entries.h \
|
||||||
$(srcdir)/eek-keyname-keysym-labels.h
|
$(srcdir)/eek-keyname-keysym-entries.h
|
||||||
|
|
||||||
libeek_enumtypes_sources = \
|
libeek_enumtypes_sources = \
|
||||||
$(srcdir)/eek-enumtypes.c \
|
$(srcdir)/eek-enumtypes.c \
|
||||||
@ -152,12 +152,12 @@ noinst_HEADERS = \
|
|||||||
$(libeek_xkb_private_headers) \
|
$(libeek_xkb_private_headers) \
|
||||||
$(libeek_xkl_private_headers)
|
$(libeek_xkl_private_headers)
|
||||||
|
|
||||||
eek-special-keysym-labels.h: special-keysym-labels.txt
|
eek-special-keysym-entries.h: special-keysym-entries.txt
|
||||||
$(PYTHON) ./gen-keysym-labels.py special_keysym_labels < $< > $@
|
$(PYTHON) ./gen-keysym-entries.py special_keysym_entries < $< > $@
|
||||||
eek-unicode-keysym-labels.h: unicode-keysym-labels.txt
|
eek-unicode-keysym-entries.h: unicode-keysym-entries.txt
|
||||||
$(PYTHON) ./gen-keysym-labels.py unicode_keysym_labels < $< > $@
|
$(PYTHON) ./gen-keysym-entries.py unicode_keysym_entries < $< > $@
|
||||||
eek-keyname-keysym-labels.h: keyname-keysym-labels.txt
|
eek-keyname-keysym-entries.h: keyname-keysym-entries.txt
|
||||||
$(PYTHON) ./gen-keysym-labels.py keyname_keysym_labels < $< > $@
|
$(PYTHON) ./gen-keysym-entries.py keyname_keysym_entries < $< > $@
|
||||||
|
|
||||||
# gen marshal
|
# gen marshal
|
||||||
eek-marshallers.h: eek-marshallers.list
|
eek-marshallers.h: eek-marshallers.list
|
||||||
@ -187,10 +187,10 @@ DISTCLEANFILES = \
|
|||||||
$(pkgconfig_DATA)
|
$(pkgconfig_DATA)
|
||||||
|
|
||||||
EXTRA_DIST = \
|
EXTRA_DIST = \
|
||||||
gen-keysym-labels.py \
|
gen-keysym-entries.py \
|
||||||
special-keysym-labels.txt \
|
special-keysym-entries.txt \
|
||||||
unicode-keysym-labels.txt \
|
unicode-keysym-entries.txt \
|
||||||
keyname-keysym-labels.txt \
|
keyname-keysym-entries.txt \
|
||||||
eek-marshallers.list
|
eek-marshallers.list
|
||||||
|
|
||||||
-include $(INTROSPECTION_MAKEFILE)
|
-include $(INTROSPECTION_MAKEFILE)
|
||||||
|
|||||||
@ -31,15 +31,16 @@
|
|||||||
#endif /* HAVE_CONFIG_H */
|
#endif /* HAVE_CONFIG_H */
|
||||||
#include "eek-keysym.h"
|
#include "eek-keysym.h"
|
||||||
|
|
||||||
struct eek_keysym_label {
|
struct _EekKeysymEntry {
|
||||||
guint keysym;
|
guint keysym;
|
||||||
const gchar *label;
|
const gchar *label;
|
||||||
EekKeysymCategory category;
|
EekKeysymCategory category;
|
||||||
};
|
};
|
||||||
|
typedef struct _EekKeysymEntry EekKeysymEntry;
|
||||||
|
|
||||||
#include "eek-special-keysym-labels.h"
|
#include "eek-special-keysym-entries.h"
|
||||||
#include "eek-unicode-keysym-labels.h"
|
#include "eek-unicode-keysym-entries.h"
|
||||||
#include "eek-keyname-keysym-labels.h"
|
#include "eek-keyname-keysym-entries.h"
|
||||||
|
|
||||||
static gchar *
|
static gchar *
|
||||||
unichar_to_utf8 (gunichar uc)
|
unichar_to_utf8 (gunichar uc)
|
||||||
@ -57,9 +58,9 @@ unichar_to_utf8 (gunichar uc)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
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;
|
return (gint)entry0->keysym - (gint)entry1->keysym;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -68,15 +69,15 @@ find_keysym (guint keysym,
|
|||||||
gchar **label,
|
gchar **label,
|
||||||
EekKeysymCategory *category)
|
EekKeysymCategory *category)
|
||||||
{
|
{
|
||||||
struct eek_keysym_label bsearch_key, *bsearch_val;
|
EekKeysymEntry bsearch_key, *bsearch_val;
|
||||||
|
|
||||||
/* First, search special keysyms. */
|
/* First, search special keysyms. */
|
||||||
bsearch_key.keysym = keysym;
|
bsearch_key.keysym = keysym;
|
||||||
bsearch_val = bsearch (&bsearch_key,
|
bsearch_val = bsearch (&bsearch_key,
|
||||||
special_keysym_labels,
|
special_keysym_entries,
|
||||||
G_N_ELEMENTS(special_keysym_labels),
|
G_N_ELEMENTS(special_keysym_entries),
|
||||||
sizeof (struct eek_keysym_label),
|
sizeof (EekKeysymEntry),
|
||||||
keysym_label_compare);
|
keysym_entry_compare_keysym);
|
||||||
if (bsearch_val) {
|
if (bsearch_val) {
|
||||||
if (label)
|
if (label)
|
||||||
*label = g_strdup (bsearch_val->label);
|
*label = g_strdup (bsearch_val->label);
|
||||||
@ -108,10 +109,10 @@ find_keysym (guint keysym,
|
|||||||
/* Search known unicode keysyms. */
|
/* Search known unicode keysyms. */
|
||||||
bsearch_key.keysym = keysym;
|
bsearch_key.keysym = keysym;
|
||||||
bsearch_val = bsearch (&bsearch_key,
|
bsearch_val = bsearch (&bsearch_key,
|
||||||
unicode_keysym_labels,
|
unicode_keysym_entries,
|
||||||
G_N_ELEMENTS(unicode_keysym_labels),
|
G_N_ELEMENTS(unicode_keysym_entries),
|
||||||
sizeof (struct eek_keysym_label),
|
sizeof (EekKeysymEntry),
|
||||||
keysym_label_compare);
|
keysym_entry_compare_keysym);
|
||||||
if (bsearch_val) {
|
if (bsearch_val) {
|
||||||
if (label)
|
if (label)
|
||||||
*label = g_strdup (bsearch_val->label);
|
*label = g_strdup (bsearch_val->label);
|
||||||
@ -123,10 +124,10 @@ find_keysym (guint keysym,
|
|||||||
/* Finally, search keynames. */
|
/* Finally, search keynames. */
|
||||||
bsearch_key.keysym = keysym;
|
bsearch_key.keysym = keysym;
|
||||||
bsearch_val = bsearch (&bsearch_key,
|
bsearch_val = bsearch (&bsearch_key,
|
||||||
keyname_keysym_labels,
|
keyname_keysym_entries,
|
||||||
G_N_ELEMENTS(keyname_keysym_labels),
|
G_N_ELEMENTS(keyname_keysym_entries),
|
||||||
sizeof (struct eek_keysym_label),
|
sizeof (EekKeysymEntry),
|
||||||
keysym_label_compare);
|
keysym_entry_compare_keysym);
|
||||||
if (bsearch_val) {
|
if (bsearch_val) {
|
||||||
if (label)
|
if (label)
|
||||||
*label = g_strdup (bsearch_val->label);
|
*label = g_strdup (bsearch_val->label);
|
||||||
@ -154,6 +155,57 @@ eek_keysym_to_string (guint keysym)
|
|||||||
return g_strdup ("");
|
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:
|
* eek_keysym_get_category:
|
||||||
* @keysym: keysym ID
|
* @keysym: keysym ID
|
||||||
|
|||||||
@ -56,6 +56,10 @@ typedef enum {
|
|||||||
} EekKeysymCategory;
|
} EekKeysymCategory;
|
||||||
|
|
||||||
gchar *eek_keysym_to_string (guint keysym);
|
gchar *eek_keysym_to_string (guint keysym);
|
||||||
|
|
||||||
|
gchar *eek_xkeysym_to_string (guint xkeysym);
|
||||||
|
guint eek_xkeysym_from_string (gchar *string);
|
||||||
|
|
||||||
EekKeysymCategory eek_keysym_get_category (guint keysym);
|
EekKeysymCategory eek_keysym_get_category (guint keysym);
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
|
|||||||
@ -86,12 +86,12 @@ static const gchar *valid_path_list[] = {
|
|||||||
"key/section/keyboard",
|
"key/section/keyboard",
|
||||||
"bounds/key/section/keyboard",
|
"bounds/key/section/keyboard",
|
||||||
"outline-ref/key/section/keyboard",
|
"outline-ref/key/section/keyboard",
|
||||||
"keysyms/key/section/keyboard",
|
"symbols/key/section/keyboard",
|
||||||
"keycode/key/section/keyboard",
|
"groups/symbols/key/section/keyboard",
|
||||||
|
"levels/symbols/key/section/keyboard",
|
||||||
|
"xkeysym/symbols/key/section/keyboard",
|
||||||
|
"invalid/symbols/key/section/keyboard",
|
||||||
"index/key/section/keyboard",
|
"index/key/section/keyboard",
|
||||||
"groups/keysyms/key/section/keyboard",
|
|
||||||
"levels/keysyms/key/section/keyboard",
|
|
||||||
"keysym/keysyms/key/section/keyboard",
|
|
||||||
"point/outline/keyboard"
|
"point/outline/keyboard"
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -204,7 +204,7 @@ start_element_callback (GMarkupParseContext *pcontext,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_strcmp0 (element_name, "keysyms") == 0) {
|
if (g_strcmp0 (element_name, "symbols") == 0) {
|
||||||
data->groups = groups;
|
data->groups = groups;
|
||||||
data->levels = levels;
|
data->levels = levels;
|
||||||
data->keysyms = NULL;
|
data->keysyms = NULL;
|
||||||
@ -252,15 +252,15 @@ end_element_callback (GMarkupParseContext *pcontext,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_strcmp0 (element_name, "keysyms") == 0) {
|
if (g_strcmp0 (element_name, "symbols") == 0) {
|
||||||
gint num_keysyms = data->groups * data->levels;
|
gint num_keysyms = data->groups * data->levels;
|
||||||
guint *keysyms = g_slice_alloc0 (sizeof(guint) * num_keysyms);
|
guint *keysyms = g_slice_alloc0 (sizeof(guint) * num_keysyms);
|
||||||
|
|
||||||
head = data->keysyms = g_slist_reverse (data->keysyms);
|
head = data->keysyms = g_slist_reverse (data->keysyms);
|
||||||
for (i = 0; i < num_keysyms; i++) {
|
for (i = 0; i < num_keysyms; i++) {
|
||||||
if (head) {
|
if (head && head->data) {
|
||||||
keysyms[i] = *(guint *)head->data;
|
keysyms[i] = eek_xkeysym_from_string (head->data);
|
||||||
g_slice_free (guint, head->data);
|
g_free (head->data);
|
||||||
head = g_slist_next (head);
|
head = g_slist_next (head);
|
||||||
} else
|
} else
|
||||||
keysyms[i] = EEK_INVALID_KEYSYM;
|
keysyms[i] = EEK_INVALID_KEYSYM;
|
||||||
@ -376,11 +376,13 @@ end_element_callback (GMarkupParseContext *pcontext,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_strcmp0 (element_name, "keysym") == 0) {
|
if (g_strcmp0 (element_name, "xkeysym") == 0) {
|
||||||
guint *keysym = g_slice_new(guint);
|
data->keysyms = g_slist_prepend (data->keysyms, g_strdup (text));
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
*keysym = strtoul (text, NULL, 10);
|
if (g_strcmp0 (element_name, "invalid") == 0) {
|
||||||
data->keysyms = g_slist_prepend (data->keysyms, keysym);
|
data->keysyms = g_slist_prepend (data->keysyms, NULL);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -108,10 +108,6 @@ output_key_callback (EekElement *element, gpointer user_data)
|
|||||||
i);
|
i);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_string_append_indent (data->output, data->indent + 1);
|
|
||||||
g_string_markup_printf (data->output, "<keycode>%u</keycode>\n",
|
|
||||||
eek_key_get_keycode (EEK_KEY(element)));
|
|
||||||
|
|
||||||
eek_key_get_keysyms (EEK_KEY(element), NULL, &num_groups, &num_levels);
|
eek_key_get_keysyms (EEK_KEY(element), NULL, &num_groups, &num_levels);
|
||||||
num_keysyms = num_groups * num_levels;
|
num_keysyms = num_groups * num_levels;
|
||||||
if (num_keysyms > 0) {
|
if (num_keysyms > 0) {
|
||||||
@ -119,25 +115,28 @@ output_key_callback (EekElement *element, gpointer user_data)
|
|||||||
eek_key_get_keysyms (EEK_KEY(element), &keysyms, NULL, NULL);
|
eek_key_get_keysyms (EEK_KEY(element), &keysyms, NULL, NULL);
|
||||||
g_string_append_indent (data->output, data->indent + 1);
|
g_string_append_indent (data->output, data->indent + 1);
|
||||||
g_string_markup_printf (data->output,
|
g_string_markup_printf (data->output,
|
||||||
"<keysyms groups=\"%d\" levels=\"%d\">\n",
|
"<symbols groups=\"%d\" levels=\"%d\">\n",
|
||||||
num_groups, num_levels);
|
num_groups, num_levels);
|
||||||
|
|
||||||
for (i = 0; i < num_groups * num_levels; i++) {
|
for (i = 0; i < num_groups * num_levels; i++) {
|
||||||
g_string_append_indent (data->output, data->indent + 2);
|
g_string_append_indent (data->output, data->indent + 2);
|
||||||
if (keysyms[i] != EEK_INVALID_KEYSYM) {
|
if (keysyms[i] != EEK_INVALID_KEYSYM) {
|
||||||
gchar *name = eek_keysym_to_string (keysyms[i]);
|
gchar *name = eek_xkeysym_to_string (keysyms[i]);
|
||||||
|
|
||||||
g_string_markup_printf (data->output,
|
if (name) {
|
||||||
"<keysym name=\"%s\">%u</keysym>\n",
|
g_string_markup_printf (data->output,
|
||||||
name, keysyms[i]);
|
"<xkeysym>%s</xkeysym>\n",
|
||||||
g_free (name);
|
name);
|
||||||
|
g_free (name);
|
||||||
|
} else
|
||||||
|
g_string_markup_printf (data->output,
|
||||||
|
"<invalid/>\n");
|
||||||
} else
|
} else
|
||||||
g_string_markup_printf (data->output,
|
g_string_markup_printf (data->output,
|
||||||
"<keysym>%u</keysym>\n",
|
"<invalid/>\n");
|
||||||
keysyms[i]);
|
|
||||||
}
|
}
|
||||||
g_string_append_indent (data->output, data->indent + 1);
|
g_string_append_indent (data->output, data->indent + 1);
|
||||||
g_string_markup_printf (data->output, "</keysyms>\n");
|
g_string_markup_printf (data->output, "</symbols>\n");
|
||||||
g_slice_free1 (num_keysyms * sizeof(guint), keysyms);
|
g_slice_free1 (num_keysyms * sizeof(guint), keysyms);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -32,7 +32,7 @@ for line in sys.stdin:
|
|||||||
if match:
|
if match:
|
||||||
table[int(match.group(1), 16)] = (match.group(2), match.group(3))
|
table[int(match.group(1), 16)] = (match.group(2), match.group(3))
|
||||||
|
|
||||||
sys.stdout.write("static const struct eek_keysym_label %s[] = {\n" %
|
sys.stdout.write("static const EekKeysymEntry %s[] = {\n" %
|
||||||
sys.argv[1])
|
sys.argv[1])
|
||||||
|
|
||||||
for index, (keysym, (l, c)) in enumerate([(keysym, table[keysym])
|
for index, (keysym, (l, c)) in enumerate([(keysym, table[keysym])
|
||||||
@ -41,7 +41,7 @@ test_output_parse (void)
|
|||||||
eek_keyboard_output (keyboard, output, 0);
|
eek_keyboard_output (keyboard, output, 0);
|
||||||
g_object_unref (keyboard);
|
g_object_unref (keyboard);
|
||||||
|
|
||||||
#if 0
|
#if 1
|
||||||
fwrite (output->str, sizeof(gchar), output->len, stdout);
|
fwrite (output->str, sizeof(gchar), output->len, stdout);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
1037
tests/test-keyboard.xml
Normal file
1037
tests/test-keyboard.xml
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user