Preserve symbol attributes when serializing/deserializing XML.
This commit is contained in:
		@ -444,3 +444,38 @@ eek_symbol_get_icon_name (EekSymbol *symbol)
 | 
				
			|||||||
        return NULL;
 | 
					        return NULL;
 | 
				
			||||||
    return priv->icon_name;
 | 
					    return priv->icon_name;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const struct {
 | 
				
			||||||
 | 
					    EekSymbolCategory category;
 | 
				
			||||||
 | 
					    gchar *name;
 | 
				
			||||||
 | 
					} category_names[] = {
 | 
				
			||||||
 | 
					    { EEK_SYMBOL_CATEGORY_LETTER, "letter" },
 | 
				
			||||||
 | 
					    { EEK_SYMBOL_CATEGORY_FUNCTION, "function" },
 | 
				
			||||||
 | 
					    { EEK_SYMBOL_CATEGORY_KEYNAME, "keyname" },
 | 
				
			||||||
 | 
					    { EEK_SYMBOL_CATEGORY_USER0, "user0" },
 | 
				
			||||||
 | 
					    { EEK_SYMBOL_CATEGORY_USER1, "user1" },
 | 
				
			||||||
 | 
					    { EEK_SYMBOL_CATEGORY_USER2, "user2" },
 | 
				
			||||||
 | 
					    { EEK_SYMBOL_CATEGORY_USER3, "user3" },
 | 
				
			||||||
 | 
					    { EEK_SYMBOL_CATEGORY_USER4, "user4" },
 | 
				
			||||||
 | 
					    { EEK_SYMBOL_CATEGORY_UNKNOWN, NULL }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_CONST_RETURN gchar *
 | 
				
			||||||
 | 
					eek_symbol_category_get_name (EekSymbolCategory category)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    gint i;
 | 
				
			||||||
 | 
					    for (i = 0; i < G_N_ELEMENTS(category_names); i++)
 | 
				
			||||||
 | 
					        if (category_names[i].category == category)
 | 
				
			||||||
 | 
					            return category_names[i].name;
 | 
				
			||||||
 | 
					    return NULL;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					EekSymbolCategory
 | 
				
			||||||
 | 
					eek_symbol_category_from_name (const gchar *name)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    gint i;
 | 
				
			||||||
 | 
					    for (i = 0; i < G_N_ELEMENTS(category_names); i++)
 | 
				
			||||||
 | 
					        if (g_strcmp0 (category_names[i].name, name) == 0)
 | 
				
			||||||
 | 
					            return category_names[i].category;
 | 
				
			||||||
 | 
					    return EEK_SYMBOL_CATEGORY_UNKNOWN;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -111,6 +111,11 @@ void                  eek_symbol_set_icon_name (EekSymbol        *symbol,
 | 
				
			|||||||
                                                const gchar      *icon_name);
 | 
					                                                const gchar      *icon_name);
 | 
				
			||||||
G_CONST_RETURN gchar *eek_symbol_get_icon_name (EekSymbol        *symbol);
 | 
					G_CONST_RETURN gchar *eek_symbol_get_icon_name (EekSymbol        *symbol);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_CONST_RETURN gchar *eek_symbol_category_get_name
 | 
				
			||||||
 | 
					                                               (EekSymbolCategory category);
 | 
				
			||||||
 | 
					EekSymbolCategory     eek_symbol_category_from_name
 | 
				
			||||||
 | 
					                                               (const gchar      *name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
G_END_DECLS
 | 
					G_END_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif  /* EEK_SYMBOL_H */
 | 
					#endif  /* EEK_SYMBOL_H */
 | 
				
			||||||
 | 
				
			|||||||
@ -66,8 +66,10 @@ struct _ParseCallbackData {
 | 
				
			|||||||
    gdouble corner_radius;
 | 
					    gdouble corner_radius;
 | 
				
			||||||
    GSList *points;
 | 
					    GSList *points;
 | 
				
			||||||
    GSList *symbols;
 | 
					    GSList *symbols;
 | 
				
			||||||
 | 
					    gchar *name;
 | 
				
			||||||
    gchar *label;
 | 
					    gchar *label;
 | 
				
			||||||
    gchar *icon;
 | 
					    gchar *icon;
 | 
				
			||||||
 | 
					    EekSymbolCategory category;
 | 
				
			||||||
    guint keyval;
 | 
					    guint keyval;
 | 
				
			||||||
    gint groups, levels;
 | 
					    gint groups, levels;
 | 
				
			||||||
    EekOutline outline;
 | 
					    EekOutline outline;
 | 
				
			||||||
@ -166,6 +168,7 @@ start_element_callback (GMarkupParseContext *pcontext,
 | 
				
			|||||||
    gint column = -1, row = -1, groups = -1, levels = -1;
 | 
					    gint column = -1, row = -1, groups = -1, levels = -1;
 | 
				
			||||||
    guint keyval = EEK_INVALID_KEYSYM;
 | 
					    guint keyval = EEK_INVALID_KEYSYM;
 | 
				
			||||||
    gchar *name = NULL, *label = NULL, *icon = NULL, *id = NULL, *version = NULL;
 | 
					    gchar *name = NULL, *label = NULL, *icon = NULL, *id = NULL, *version = NULL;
 | 
				
			||||||
 | 
					    EekSymbolCategory category;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    validate (element_name, data->element_stack, error);
 | 
					    validate (element_name, data->element_stack, error);
 | 
				
			||||||
    if (error && *error)
 | 
					    if (error && *error)
 | 
				
			||||||
@ -184,6 +187,8 @@ start_element_callback (GMarkupParseContext *pcontext,
 | 
				
			|||||||
            label = g_strdup (*values);
 | 
					            label = g_strdup (*values);
 | 
				
			||||||
        else if (g_strcmp0 (*names, "icon") == 0)
 | 
					        else if (g_strcmp0 (*names, "icon") == 0)
 | 
				
			||||||
            icon = g_strdup (*values);
 | 
					            icon = g_strdup (*values);
 | 
				
			||||||
 | 
					        else if (g_strcmp0 (*names, "category") == 0)
 | 
				
			||||||
 | 
					            category = eek_symbol_category_from_name (*values);
 | 
				
			||||||
        else if (g_strcmp0 (*names, "keyval") == 0)
 | 
					        else if (g_strcmp0 (*names, "keyval") == 0)
 | 
				
			||||||
            keyval = strtoul (*values, NULL, 10);
 | 
					            keyval = strtoul (*values, NULL, 10);
 | 
				
			||||||
        else if (g_strcmp0 (*names, "version") == 0)
 | 
					        else if (g_strcmp0 (*names, "version") == 0)
 | 
				
			||||||
@ -230,9 +235,11 @@ start_element_callback (GMarkupParseContext *pcontext,
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (g_strcmp0 (element_name, "symbol") == 0 ||
 | 
					    if (g_strcmp0 (element_name, "symbol") == 0 ||
 | 
				
			||||||
        g_strcmp0 (element_name, "keysym") == 0) {
 | 
					        g_strcmp0 (element_name, "keysym") == 0 ||
 | 
				
			||||||
 | 
					        g_strcmp0 (element_name, "text") == 0) {
 | 
				
			||||||
        data->label = g_strdup (label);
 | 
					        data->label = g_strdup (label);
 | 
				
			||||||
        data->icon = g_strdup (icon);
 | 
					        data->icon = g_strdup (icon);
 | 
				
			||||||
 | 
					        data->category = category;
 | 
				
			||||||
        if (g_strcmp0 (element_name, "keysym") == 0)
 | 
					        if (g_strcmp0 (element_name, "keysym") == 0)
 | 
				
			||||||
            data->keyval = keyval;
 | 
					            data->keyval = keyval;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -77,6 +77,21 @@ output_bounds (GString *output, EekBounds *bounds)
 | 
				
			|||||||
                            bounds->height);
 | 
					                            bounds->height);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					output_symbol_attributes (GString   *output,
 | 
				
			||||||
 | 
					                          EekSymbol *symbol)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (eek_symbol_get_name (symbol) != NULL)
 | 
				
			||||||
 | 
					        g_string_markup_printf (output, " name=\"%s\"",
 | 
				
			||||||
 | 
					                                eek_symbol_get_name (symbol));
 | 
				
			||||||
 | 
					    if (eek_symbol_get_label (symbol) != NULL)
 | 
				
			||||||
 | 
					        g_string_markup_printf (output, " label=\"%s\"",
 | 
				
			||||||
 | 
					                                eek_symbol_get_label (symbol));
 | 
				
			||||||
 | 
					    if (eek_symbol_get_category (symbol) != EEK_SYMBOL_CATEGORY_UNKNOWN)
 | 
				
			||||||
 | 
					        g_string_markup_printf (output, " category=\"%s\"",
 | 
				
			||||||
 | 
					                                eek_symbol_category_get_name (eek_symbol_get_category (symbol)));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
output_key_callback (EekElement *element, gpointer user_data)
 | 
					output_key_callback (EekElement *element, gpointer user_data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -146,27 +161,29 @@ output_key_callback (EekElement *element, gpointer user_data)
 | 
				
			|||||||
            if (EEK_IS_KEYSYM(symbol)) {
 | 
					            if (EEK_IS_KEYSYM(symbol)) {
 | 
				
			||||||
                guint xkeysym = eek_keysym_get_xkeysym (EEK_KEYSYM(symbol));
 | 
					                guint xkeysym = eek_keysym_get_xkeysym (EEK_KEYSYM(symbol));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                g_string_markup_printf (data->output, "<keysym");
 | 
				
			||||||
 | 
					                output_symbol_attributes (data->output, symbol);
 | 
				
			||||||
                if (xkeysym != EEK_INVALID_KEYSYM)
 | 
					                if (xkeysym != EEK_INVALID_KEYSYM)
 | 
				
			||||||
                    g_string_markup_printf
 | 
					                    g_string_markup_printf (data->output, " keyval=\"%u\"",
 | 
				
			||||||
                        (data->output,
 | 
					                                            xkeysym);
 | 
				
			||||||
                         "<keysym keyval=\"%u\">%s</keysym>\n",
 | 
					                g_string_markup_printf (data->output, ">%s</keysym>\n",
 | 
				
			||||||
                         xkeysym,
 | 
					 | 
				
			||||||
                         eek_symbol_get_name (symbol));
 | 
					 | 
				
			||||||
                else
 | 
					 | 
				
			||||||
                    g_string_markup_printf (data->output,
 | 
					 | 
				
			||||||
                                            "<keysym>%s</keysym>\n",
 | 
					 | 
				
			||||||
                                        eek_symbol_get_name (symbol));
 | 
					                                        eek_symbol_get_name (symbol));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            else if (EEK_IS_TEXT(symbol)) {
 | 
					            else if (EEK_IS_TEXT(symbol)) {
 | 
				
			||||||
 | 
					                g_string_markup_printf (data->output, "<text");
 | 
				
			||||||
 | 
					                output_symbol_attributes (data->output, symbol);
 | 
				
			||||||
                g_string_markup_printf (data->output,
 | 
					                g_string_markup_printf (data->output,
 | 
				
			||||||
                                        "<text>%s</text>\n",
 | 
					                                        ">%s</text>\n",
 | 
				
			||||||
                                        eek_text_get_text (EEK_TEXT(symbol)));
 | 
					                                        eek_text_get_text (EEK_TEXT(symbol)));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            else
 | 
					            else {
 | 
				
			||||||
 | 
					                g_string_markup_printf (data->output, "<symbol");
 | 
				
			||||||
 | 
					                output_symbol_attributes (data->output, symbol);
 | 
				
			||||||
                g_string_markup_printf (data->output,
 | 
					                g_string_markup_printf (data->output,
 | 
				
			||||||
                                        "<symbol>%s</symbol>\n",
 | 
					                                        ">%s</symbol>\n",
 | 
				
			||||||
                                        eek_symbol_get_name (symbol));
 | 
					                                        eek_symbol_get_name (symbol));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        g_string_append_indent (data->output, data->indent + 1);
 | 
					        g_string_append_indent (data->output, data->indent + 1);
 | 
				
			||||||
        g_string_markup_printf (data->output, "</symbols>\n");
 | 
					        g_string_markup_printf (data->output, "</symbols>\n");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -44,7 +44,8 @@ def remap(keyboard, mapping):
 | 
				
			|||||||
                    if mapped.has_key('label'):
 | 
					                    if mapped.has_key('label'):
 | 
				
			||||||
                        replace.set_label(mapped['label'])
 | 
					                        replace.set_label(mapped['label'])
 | 
				
			||||||
                    if mapped.has_key('category'):
 | 
					                    if mapped.has_key('category'):
 | 
				
			||||||
                        replace.set_category(mapped['category'])
 | 
					                        cat = Eek.symbol_category_from_name(mapped['category'])
 | 
				
			||||||
 | 
					                        replace.set_category(cat)
 | 
				
			||||||
                    matrix.set_symbol(0, level, replace)
 | 
					                    matrix.set_symbol(0, level, replace)
 | 
				
			||||||
    def __each_section(element, data):
 | 
					    def __each_section(element, data):
 | 
				
			||||||
        element.foreach_child(__each_key, data)
 | 
					        element.foreach_child(__each_key, data)
 | 
				
			||||||
 | 
				
			|||||||
@ -149,9 +149,10 @@
 | 
				
			|||||||
		      (car from)
 | 
							      (car from)
 | 
				
			||||||
		    (or (mim2remap--char-to-keyname (aref from 0))
 | 
							    (or (mim2remap--char-to-keyname (aref from 0))
 | 
				
			||||||
			(error "No keyname for %c" (aref from 0))))
 | 
								(error "No keyname for %c" (aref from 0))))
 | 
				
			||||||
		  (if (characterp to)
 | 
							  (list (cons :text (if (characterp to)
 | 
				
			||||||
		      (list (cons :text (char-to-string to)))
 | 
										(char-to-string to)
 | 
				
			||||||
		    (list (cons :text to))))))
 | 
									      to))
 | 
				
			||||||
 | 
								(cons :category 'letter)))))
 | 
				
			||||||
	(cdr sexp))))))
 | 
						(cdr sexp))))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(defun batch-mim2remap ()
 | 
					(defun batch-mim2remap ()
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user