+class KeymapError(Exception):
+ def __init__(self, message):
+ self.msg = message
+
+ def __str__(self):
+ return self.msg
+
+def parseKeys(context, filename, actionmap, device, keys):
+ for x in keys.findall("key"):
+ get_attr = x.attrib.get
+ mapto = get_attr("mapto")
+ id = get_attr("id")
+ flags = get_attr("flags")
+
+ flag_ascii_to_id = lambda x: {'m':1,'b':2,'r':4,'l':8}[x]
+
+ flags = sum(map(flag_ascii_to_id, flags))
+
+ assert mapto, "%s: must specify mapto in context %s, id '%s'" % (filename, context, id)
+ assert id, "%s: must specify id in context %s, mapto '%s'" % (filename, context, mapto)
+ assert flags, "%s: must specify at least one flag in context %s, id '%s'" % (filename, context, id)
+
+ if len(id) == 1:
+ keyid = ord(id) | 0x8000
+ elif id[0] == '\\':
+ if id[1] == 'x':
+ keyid = int(id[2:], 0x10) | 0x8000
+ elif id[1] == 'd':
+ keyid = int(id[2:]) | 0x8000
+ else:
+ raise KeymapError("key id '" + str(id) + "' is neither hex nor dec")
+ else:
+ try:
+ keyid = KEYIDS[id]
+ except:
+ raise KeymapError("key id '" + str(id) + "' is illegal")
+# print context + "::" + mapto + " -> " + device + "." + hex(keyid)
+ actionmap.bindKey(filename, device, keyid, flags, context, mapto)
+ addKeyBinding(filename, keyid, context, mapto, flags)