geometry: Simplify keyboard declarations

This commit is contained in:
Dorota Czaplejewicz
2019-08-02 15:06:17 +00:00
parent a18beca50c
commit 18163e3ecc
3 changed files with 74 additions and 100 deletions

View File

@ -1,48 +1,10 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<geometry version="0.90"> <geometry version="0.90">
<bounds x="10" y="10" width="410.0000" height="229"/> <bounds x="10" y="10" width="410.0000" height="229"/>
<section angle="0"> <section angle="0">AD01 AD02 AD03 AD04 AD05 AD06 AD07 AD08 AD09 AD10</section>
<key name="AD01" /> <section angle="0">AC01 AC02 AC03 AC04 AC05 AC06 AC07 AC08 AC09 AC10</section>
<key name="AD02" /> <section angle="0"> LFSH AB01 AB02 AB03 AB04 AB05 AB06 AB07 BKSP </section>
<key name="AD03" /> <section angle="0"> ABC123 I149 SPCE AB08 RTRN </section>
<key name="AD04" />
<key name="AD05" />
<key name="AD06" />
<key name="AD07" />
<key name="AD08" />
<key name="AD09" />
<key name="AD10" />
</section>
<section angle="0">
<key name="AC01" />
<key name="AC02" />
<key name="AC03" />
<key name="AC04" />
<key name="AC05" />
<key name="AC06" />
<key name="AC07" />
<key name="AC08" />
<key name="AC09" />
<key name="AC10" />
</section>
<section angle="0">
<key name="LFSH" />
<key name="AB01" />
<key name="AB02" />
<key name="AB03" />
<key name="AB04" />
<key name="AB05" />
<key name="AB06" />
<key name="AB07" />
<key name="BKSP" />
</section>
<section angle="0">
<key name="ABC123" />
<key name="I149" />
<key name="SPCE" />
<key name="AB08" />
<key name="RTRN" />
</section>
<button name="LFSH" oref="altline" /> <button name="LFSH" oref="altline" />
<button name="BKSP" oref="altline" /> <button name="BKSP" oref="altline" />
<button name="I149" oref="altline" /> <button name="I149" oref="altline" />

View File

@ -1,34 +1,15 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<geometry version="0.90"> <geometry version="0.90">
<bounds x="0" y="10.000000" width="426.0000" height="296.5853"/> <bounds x="0" y="10.000000" width="426.0000" height="296.5853"/>
<section angle="0"> <section angle="0">AD01 AD02 AD03 AD04 AD05</section>
<key name="AD01" oref="outline2" /> <section angle="0">AC01 AC02 AC03 AC04 AC05</section>
<key name="AD02" oref="outline2" /> <section angle="0">AB01 AB02 AB03 AB04 AB05</section>
<key name="AD03" oref="outline2" /> <section angle="0">BKSP AB06 SPCE RTRN</section>
<key name="AD04" oref="outline2" /> <button name="BKSP" oref="altline" />
<key name="AD05" oref="outline2" /> <button name="SPCE" oref="spaceline" />
</section> <button name="RTRN" oref="outline7" />
<section angle="0">
<key name="AC01" oref="outline2" /> <outline id="default" corner-radius="1.000000">
<key name="AC02" oref="outline2" />
<key name="AC03" oref="outline2" />
<key name="AC04" oref="outline2" />
<key name="AC05" oref="outline2" />
</section>
<section angle="0">
<key name="AB01" oref="outline2" />
<key name="AB02" oref="outline2" />
<key name="AB03" oref="outline2" />
<key name="AB04" oref="outline2" />
<key name="AB05" oref="outline2" />
</section>
<section angle="0">
<key name="BKSP" oref="altline" />
<key name="AB06" oref="outline2" />
<key name="SPCE" oref="spaceline" />
<key name="RTRN" oref="outline7" />
</section>
<outline id="outline2" corner-radius="1.000000">
<point x="0.000000" y="0.000000"/> <point x="0.000000" y="0.000000"/>
<point x="37.46341" y="0.000000"/> <point x="37.46341" y="0.000000"/>
<point x="37.46341" y="52.44877"/> <point x="37.46341" y="52.44877"/>

View File

@ -246,6 +246,8 @@ struct _GeometryParseData {
gchar *oref; gchar *oref;
guint keycode; guint keycode;
GString *text;
GHashTable *name_key_hash; // char* -> EekKey* GHashTable *name_key_hash; // char* -> EekKey*
GHashTable *key_oref_hash; GHashTable *key_oref_hash;
GHashTable *oref_outline_hash; GHashTable *oref_outline_hash;
@ -274,6 +276,8 @@ geometry_parse_data_new (EekKeyboard *keyboard)
g_str_equal, g_str_equal,
g_free, g_free,
NULL); NULL);
data->text = g_string_sized_new (BUFSIZE);
data->keycode = 8; data->keycode = 8;
return data; return data;
} }
@ -284,6 +288,7 @@ geometry_parse_data_free (GeometryParseData *data)
g_object_unref (data->keyboard); g_object_unref (data->keyboard);
g_hash_table_destroy (data->key_oref_hash); g_hash_table_destroy (data->key_oref_hash);
g_hash_table_destroy (data->oref_outline_hash); g_hash_table_destroy (data->oref_outline_hash);
g_string_free (data->text, TRUE);
g_slice_free (GeometryParseData, data); g_slice_free (GeometryParseData, data);
} }
@ -293,7 +298,6 @@ static const gchar *geometry_valid_path_list[] = {
"bounds/geometry", "bounds/geometry",
"section/geometry", "section/geometry",
"outline/geometry", "outline/geometry",
"key/section/geometry",
"point/outline/geometry", "point/outline/geometry",
}; };
@ -380,34 +384,6 @@ geometry_start_element_callback (GMarkupParseContext *pcontext,
angle = strtol (attribute, NULL, 10); angle = strtol (attribute, NULL, 10);
eek_section_set_angle (data->section, angle); eek_section_set_angle (data->section, angle);
} }
goto out;
}
if (g_strcmp0 (element_name, "key") == 0) {
attribute = get_attribute (attribute_names, attribute_values,
"name");
if (attribute == NULL) {
g_set_error (error,
G_MARKUP_ERROR,
G_MARKUP_ERROR_MISSING_ATTRIBUTE,
"no \"name\" attribute for \"key\"");
return;
}
gchar *name = g_strdup (attribute);
guint keycode = data->keycode++;
data->key = eek_section_create_key (data->section,
name,
keycode);
g_hash_table_insert (data->name_key_hash,
g_strdup(name),
data->key);
data->num_columns++;
g_hash_table_insert (data->key_oref_hash,
data->key,
g_strdup ("default"));
goto out; goto out;
} }
@ -497,6 +473,7 @@ geometry_start_element_callback (GMarkupParseContext *pcontext,
out: out:
data->element_stack = g_slist_prepend (data->element_stack, data->element_stack = g_slist_prepend (data->element_stack,
g_strdup (element_name)); g_strdup (element_name));
data->text->len = 0;
} }
static void static void
@ -512,7 +489,50 @@ geometry_end_element_callback (GMarkupParseContext *pcontext,
data->element_stack = g_slist_next (data->element_stack); data->element_stack = g_slist_next (data->element_stack);
g_slist_free1 (head); g_slist_free1 (head);
const gchar *text = g_strndup (data->text->str, data->text->len);
if (g_strcmp0 (element_name, "section") == 0) { if (g_strcmp0 (element_name, "section") == 0) {
// Split text on spaces and process each part
unsigned head = 0;
while (head < strlen(text)) {
// Skip to the first non-space character
for (; head < strlen(text); head++) {
if (text[head] != ' ') {
break;
}
}
unsigned start = head;
// Skip to the first space character
for (; head < strlen(text); head++) {
if (text[head] == ' ') {
break;
}
}
unsigned end = head;
/// Reached the end
if (start == end) {
break;
}
gchar *name = g_strndup (&text[start], end - start);
guint keycode = data->keycode++;
data->key = eek_section_create_key (data->section,
name,
keycode);
g_hash_table_insert (data->name_key_hash,
g_strdup(name),
data->key);
data->num_columns++;
g_hash_table_insert (data->key_oref_hash,
data->key,
g_strdup ("default"));
}
data->section = NULL; data->section = NULL;
data->num_rows = 0; data->num_rows = 0;
return; return;
@ -557,10 +577,21 @@ geometry_end_element_callback (GMarkupParseContext *pcontext,
} }
} }
static void
geometry_text_callback (GMarkupParseContext *pcontext,
const gchar *text,
gsize text_len,
gpointer user_data,
GError **error)
{
GeometryParseData *data = user_data;
g_string_append_len (data->text, text, text_len);
}
static const GMarkupParser geometry_parser = { static const GMarkupParser geometry_parser = {
geometry_start_element_callback, geometry_start_element_callback,
geometry_end_element_callback, geometry_end_element_callback,
0, geometry_text_callback,
0, 0,
0 0
}; };