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 =			\
 | 
			
		||||
	$(srcdir)/eek-renderer.h		\
 | 
			
		||||
	$(srcdir)/eek-xml-layout.h		\
 | 
			
		||||
	$(srcdir)/eek-special-keysym-labels.h	\
 | 
			
		||||
	$(srcdir)/eek-unicode-keysym-labels.h	\
 | 
			
		||||
	$(srcdir)/eek-keyname-keysym-labels.h	\
 | 
			
		||||
	$(srcdir)/eek-special-keysym-entries.h	\
 | 
			
		||||
	$(srcdir)/eek-unicode-keysym-entries.h	\
 | 
			
		||||
	$(srcdir)/eek-keyname-keysym-entries.h	\
 | 
			
		||||
	$(srcdir)/eek-marshallers.h
 | 
			
		||||
 | 
			
		||||
libeek_sources =				\
 | 
			
		||||
@ -61,9 +61,9 @@ libeek_sources =				\
 | 
			
		||||
	$(srcdir)/eek-keyboard-drawing.c
 | 
			
		||||
 | 
			
		||||
libeek_keysym_sources =				\
 | 
			
		||||
	$(srcdir)/eek-special-keysym-labels.h	\
 | 
			
		||||
	$(srcdir)/eek-unicode-keysym-labels.h	\
 | 
			
		||||
	$(srcdir)/eek-keyname-keysym-labels.h
 | 
			
		||||
	$(srcdir)/eek-special-keysym-entries.h	\
 | 
			
		||||
	$(srcdir)/eek-unicode-keysym-entries.h	\
 | 
			
		||||
	$(srcdir)/eek-keyname-keysym-entries.h
 | 
			
		||||
 | 
			
		||||
libeek_enumtypes_sources =			\
 | 
			
		||||
	$(srcdir)/eek-enumtypes.c		\
 | 
			
		||||
@ -152,12 +152,12 @@ noinst_HEADERS =				\
 | 
			
		||||
	$(libeek_xkb_private_headers)		\
 | 
			
		||||
	$(libeek_xkl_private_headers)
 | 
			
		||||
 | 
			
		||||
eek-special-keysym-labels.h: special-keysym-labels.txt
 | 
			
		||||
	$(PYTHON) ./gen-keysym-labels.py special_keysym_labels < $< > $@
 | 
			
		||||
eek-unicode-keysym-labels.h: unicode-keysym-labels.txt
 | 
			
		||||
	$(PYTHON) ./gen-keysym-labels.py unicode_keysym_labels < $< > $@
 | 
			
		||||
eek-keyname-keysym-labels.h: keyname-keysym-labels.txt
 | 
			
		||||
	$(PYTHON) ./gen-keysym-labels.py keyname_keysym_labels < $< > $@
 | 
			
		||||
eek-special-keysym-entries.h: special-keysym-entries.txt
 | 
			
		||||
	$(PYTHON) ./gen-keysym-entries.py special_keysym_entries < $< > $@
 | 
			
		||||
eek-unicode-keysym-entries.h: unicode-keysym-entries.txt
 | 
			
		||||
	$(PYTHON) ./gen-keysym-entries.py unicode_keysym_entries < $< > $@
 | 
			
		||||
eek-keyname-keysym-entries.h: keyname-keysym-entries.txt
 | 
			
		||||
	$(PYTHON) ./gen-keysym-entries.py keyname_keysym_entries < $< > $@
 | 
			
		||||
 | 
			
		||||
# gen marshal
 | 
			
		||||
eek-marshallers.h: eek-marshallers.list
 | 
			
		||||
@ -187,10 +187,10 @@ DISTCLEANFILES =				\
 | 
			
		||||
	$(pkgconfig_DATA)
 | 
			
		||||
 | 
			
		||||
EXTRA_DIST =					\
 | 
			
		||||
	gen-keysym-labels.py			\
 | 
			
		||||
	special-keysym-labels.txt		\
 | 
			
		||||
	unicode-keysym-labels.txt		\
 | 
			
		||||
	keyname-keysym-labels.txt		\
 | 
			
		||||
	gen-keysym-entries.py			\
 | 
			
		||||
	special-keysym-entries.txt		\
 | 
			
		||||
	unicode-keysym-entries.txt		\
 | 
			
		||||
	keyname-keysym-entries.txt		\
 | 
			
		||||
	eek-marshallers.list
 | 
			
		||||
 | 
			
		||||
-include $(INTROSPECTION_MAKEFILE)
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -56,6 +56,10 @@ typedef enum {
 | 
			
		||||
} EekKeysymCategory;
 | 
			
		||||
 | 
			
		||||
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);
 | 
			
		||||
 | 
			
		||||
typedef enum
 | 
			
		||||
 | 
			
		||||
@ -86,12 +86,12 @@ static const gchar *valid_path_list[] = {
 | 
			
		||||
    "key/section/keyboard",
 | 
			
		||||
    "bounds/key/section/keyboard",
 | 
			
		||||
    "outline-ref/key/section/keyboard",
 | 
			
		||||
    "keysyms/key/section/keyboard",
 | 
			
		||||
    "keycode/key/section/keyboard",
 | 
			
		||||
    "symbols/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",
 | 
			
		||||
    "groups/keysyms/key/section/keyboard",
 | 
			
		||||
    "levels/keysyms/key/section/keyboard",
 | 
			
		||||
    "keysym/keysyms/key/section/keyboard",
 | 
			
		||||
    "point/outline/keyboard"
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -204,7 +204,7 @@ start_element_callback (GMarkupParseContext *pcontext,
 | 
			
		||||
        goto out;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (g_strcmp0 (element_name, "keysyms") == 0) {
 | 
			
		||||
    if (g_strcmp0 (element_name, "symbols") == 0) {
 | 
			
		||||
        data->groups = groups;
 | 
			
		||||
        data->levels = levels;
 | 
			
		||||
        data->keysyms = NULL;
 | 
			
		||||
@ -252,15 +252,15 @@ end_element_callback (GMarkupParseContext *pcontext,
 | 
			
		||||
        goto out;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (g_strcmp0 (element_name, "keysyms") == 0) {
 | 
			
		||||
    if (g_strcmp0 (element_name, "symbols") == 0) {
 | 
			
		||||
        gint num_keysyms = data->groups * data->levels;
 | 
			
		||||
        guint *keysyms = g_slice_alloc0 (sizeof(guint) * num_keysyms);
 | 
			
		||||
 | 
			
		||||
        head = data->keysyms = g_slist_reverse (data->keysyms);
 | 
			
		||||
        for (i = 0; i < num_keysyms; i++) {
 | 
			
		||||
            if (head) {
 | 
			
		||||
                keysyms[i] = *(guint *)head->data;
 | 
			
		||||
                g_slice_free (guint, head->data);
 | 
			
		||||
            if (head && head->data) {
 | 
			
		||||
                keysyms[i] = eek_xkeysym_from_string (head->data);
 | 
			
		||||
                g_free (head->data);
 | 
			
		||||
                head = g_slist_next (head);
 | 
			
		||||
            } else
 | 
			
		||||
                keysyms[i] = EEK_INVALID_KEYSYM;
 | 
			
		||||
@ -376,11 +376,13 @@ end_element_callback (GMarkupParseContext *pcontext,
 | 
			
		||||
        goto out;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (g_strcmp0 (element_name, "keysym") == 0) {
 | 
			
		||||
        guint *keysym = g_slice_new(guint);
 | 
			
		||||
    if (g_strcmp0 (element_name, "xkeysym") == 0) {
 | 
			
		||||
        data->keysyms = g_slist_prepend (data->keysyms, g_strdup (text));
 | 
			
		||||
        goto out;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        *keysym = strtoul (text, NULL, 10);
 | 
			
		||||
        data->keysyms = g_slist_prepend (data->keysyms, keysym);
 | 
			
		||||
    if (g_strcmp0 (element_name, "invalid") == 0) {
 | 
			
		||||
        data->keysyms = g_slist_prepend (data->keysyms, NULL);
 | 
			
		||||
        goto out;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -108,10 +108,6 @@ output_key_callback (EekElement *element, gpointer user_data)
 | 
			
		||||
                                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);
 | 
			
		||||
    num_keysyms = num_groups * num_levels;
 | 
			
		||||
    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);
 | 
			
		||||
        g_string_append_indent (data->output, data->indent + 1);
 | 
			
		||||
        g_string_markup_printf (data->output,
 | 
			
		||||
                                "<keysyms groups=\"%d\" levels=\"%d\">\n",
 | 
			
		||||
                                "<symbols groups=\"%d\" levels=\"%d\">\n",
 | 
			
		||||
                                num_groups, num_levels);
 | 
			
		||||
 | 
			
		||||
        for (i = 0; i < num_groups * num_levels; i++) {
 | 
			
		||||
            g_string_append_indent (data->output, data->indent + 2);
 | 
			
		||||
            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,
 | 
			
		||||
                                        "<keysym name=\"%s\">%u</keysym>\n",
 | 
			
		||||
                                        name, keysyms[i]);
 | 
			
		||||
                g_free (name);
 | 
			
		||||
                if (name) {
 | 
			
		||||
                    g_string_markup_printf (data->output,
 | 
			
		||||
                                            "<xkeysym>%s</xkeysym>\n",
 | 
			
		||||
                                            name);
 | 
			
		||||
                    g_free (name);
 | 
			
		||||
                } else
 | 
			
		||||
                    g_string_markup_printf (data->output,
 | 
			
		||||
                                            "<invalid/>\n");
 | 
			
		||||
            } else
 | 
			
		||||
                g_string_markup_printf (data->output,
 | 
			
		||||
                                        "<keysym>%u</keysym>\n",
 | 
			
		||||
                                        keysyms[i]);
 | 
			
		||||
                                        "<invalid/>\n");
 | 
			
		||||
        }
 | 
			
		||||
        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);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -32,7 +32,7 @@ for line in sys.stdin:
 | 
			
		||||
    if match:
 | 
			
		||||
        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])
 | 
			
		||||
 | 
			
		||||
for index, (keysym, (l, c)) in enumerate([(keysym, table[keysym])
 | 
			
		||||
		Reference in New Issue
	
	Block a user