g_free(class);
g_free(role);
g_free(title);
- name = class = role = title = NULL;
+ g_free(type_str);
+ name = class = role = title = type_str = NULL;
}
app = obt_xml_find_node(app->next, "application");
static void parse_key(xmlNodePtr node, GList *keylist)
{
- gchar *key;
+ gchar *keystring, **keys, **key;
xmlNodePtr n;
gboolean is_chroot = FALSE;
- if (!obt_xml_attr_string(node, "key", &key))
+ if (!obt_xml_attr_string(node, "key", &keystring))
return;
obt_xml_attr_bool(node, "chroot", &is_chroot);
- keylist = g_list_append(keylist, key);
+ keys = g_strsplit(keystring, " ", 0);
+ for (key = keys; *key; ++key) {
+ keylist = g_list_append(keylist, *key);
- if ((n = obt_xml_find_node(node->children, "keybind"))) {
- while (n) {
- parse_key(n, keylist);
- n = obt_xml_find_node(n->next, "keybind");
+ if ((n = obt_xml_find_node(node->children, "keybind"))) {
+ while (n) {
+ parse_key(n, keylist);
+ n = obt_xml_find_node(n->next, "keybind");
+ }
}
- }
- else if ((n = obt_xml_find_node(node->children, "action"))) {
- while (n) {
- ObActionsAct *action;
-
- action = actions_parse(n);
- if (action)
- keyboard_bind(keylist, action);
- n = obt_xml_find_node(n->next, "action");
+ else if ((n = obt_xml_find_node(node->children, "action"))) {
+ while (n) {
+ ObActionsAct *action;
+
+ action = actions_parse(n);
+ if (action)
+ keyboard_bind(keylist, action);
+ n = obt_xml_find_node(n->next, "action");
+ }
}
- }
- if (is_chroot)
- keyboard_chroot(keylist);
- g_free(key);
- keylist = g_list_delete_link(keylist, g_list_last(keylist));
+ if (is_chroot)
+ keyboard_chroot(keylist);
+ keylist = g_list_delete_link(keylist, g_list_last(keylist));
+ }
+
+ g_strfreev(keys);
+ g_free(keystring);
}
static void parse_keyboard(xmlNodePtr node, gpointer d)
modcxstr = g_strdup(cxstr); /* make a copy to mutilate */
while (frame_next_context_from_string(modcxstr, &cx)) {
if (!cx) {
- g_message(_("Invalid context \"%s\" in mouse binding"),
- cxstr);
- break;
+ gchar *s = strchr(modcxstr, ' ');
+ if (s) {
+ *s = '\0';
+ g_message(_("Invalid context \"%s\" in mouse binding"),
+ modcxstr);
+ *s = ' ';
+ }
+ continue;
}
nbut = obt_xml_find_node(n->children, "mousebind");
mouse_bind(buttonstr, cx, mact, action);
nact = obt_xml_find_node(nact->next, "action");
}
- next_nbut:
g_free(buttonstr);
+ next_nbut:
nbut = obt_xml_find_node(nbut->next, "mousebind");
}
}