diff options
-rwxr-xr-x | tools/keymap-gen | 237 |
1 files changed, 143 insertions, 94 deletions
diff --git a/tools/keymap-gen b/tools/keymap-gen index 1f65f61..a2852c8 100755 --- a/tools/keymap-gen +++ b/tools/keymap-gen @@ -121,6 +121,10 @@ class Database: MAP_XKB: 15, } + ENUM_COLUMNS = { + MAP_QCODE: 14, + } + NAME_COLUMNS = { MAP_LINUX: 0, MAP_OSX: 2, @@ -274,6 +278,12 @@ class Database: self.mapto[self.MAP_RFB][linux] = rfb self.mapfrom[self.MAP_RFB][rfb] = linux + if linux in self.mapname[self.MAP_QCODE]: + qcodeenum = self.mapname[self.MAP_QCODE][linux] + qcodeenum = "Q_KEY_CODE_" + qcodeenum.upper() + self.mapto[self.MAP_QCODE][linux] = qcodeenum + self.mapfrom[self.MAP_QCODE][qcodeenum] = linux + class LanguageGenerator(object): def _boilerplate(self, lines): @@ -290,19 +300,17 @@ class LanguageGenerator(object): class LanguageSrcGenerator(LanguageGenerator): - def _array_start_code(self, varname, length, fromtype, totype): - raise NotImplementedError() - - def _array_start_name(self, varname, length): - raise NotImplementedError() + TYPE_INT = "integer" + TYPE_STRING = "string" + TYPE_ENUM = "enum" - def _array_end(self): + def _array_start(self, varname, length, fromtype, totype): raise NotImplementedError() - def _array_entry_code(self, index, value, comment): + def _array_end(self, fromtype, totype): raise NotImplementedError() - def _array_entry_name(self, index, value, comment): + def _array_entry(self, index, value, comment, fromtype, totype): raise NotImplementedError() def generate_code_map(self, varname, database, frommapname, tomapname): @@ -319,12 +327,32 @@ class LanguageSrcGenerator(LanguageGenerator): if varname is None: varname = "code_map_%s_to_%s" % (frommapname, tomapname) + if frommapname in database.ENUM_COLUMNS: + fromtype = self.TYPE_ENUM + elif type(tolinux.keys()[0]) == str: + fromtype = self.TYPE_STRING + else: + fromtype = self.TYPE_INT + + if tomapname in database.ENUM_COLUMNS: + totype = self.TYPE_ENUM + elif type(fromlinux.values()[0]) == str: + totype = self.TYPE_STRING + else: + totype = self.TYPE_INT + keys = tolinux.keys() keys.sort() - if type(keys[0]) == int: + if fromtype == self.TYPE_INT: keys = range(keys[-1] + 1) - self._array_start_code(varname, len(keys), type(keys[0]), type(fromlinux.values()[0])) + if fromtype == self.TYPE_ENUM: + keymax = None + else: + keymax = len(keys) + + self._array_start(varname, keymax, fromtype, totype) + for src in keys: linux = tolinux.get(src, None) if linux is None: @@ -335,8 +363,8 @@ class LanguageSrcGenerator(LanguageGenerator): comment = "%s -> %s -> %s" % (self._label(database, frommapname, src, linux), self._label(database, Database.MAP_LINUX, linux, linux), self._label(database, tomapname, dst, linux)) - self._array_entry_code(src, dst, comment) - self._array_end() + self._array_entry(src, dst, comment, fromtype, totype) + self._array_end(fromtype, totype) def generate_code_table(self, varname, database, mapname): if mapname not in database.mapto: @@ -350,14 +378,21 @@ class LanguageSrcGenerator(LanguageGenerator): if varname is None: varname = "code_table_%s" % mapname - self._array_start_code(varname, len(keys), int, type(database.mapto[mapname].values()[0])) + if mapname in database.ENUM_COLUMNS: + totype = self.TYPE_ENUM + elif type(database.mapto[mapname].values()[0]) == str: + totype = self.TYPE_STRING + else: + totype = self.TYPE_INT + + self._array_start(varname, len(keys), self.TYPE_INT, totype) for i in range(len(keys)): key = keys[i] dst = database.mapto[mapname].get(key, None) - self._array_entry_code(i, dst, names[i]) + self._array_entry(i, dst, names[i], self.TYPE_INT, totype) - self._array_end() + self._array_end(self.TYPE_INT, totype) def generate_name_map(self, varname, database, frommapname, tomapname): if frommapname not in database.mapfrom: @@ -378,7 +413,12 @@ class LanguageSrcGenerator(LanguageGenerator): if type(keys[0]) == int: keys = range(keys[-1] + 1) - self._array_start_name(varname, len(keys), type(keys[0])) + if type(keys[0]) == int: + fromtype = self.TYPE_INT + else: + fromtype = self.TYPE_STRING + + self._array_start(varname, len(keys), fromtype, self.TYPE_STRING) for src in keys: linux = tolinux.get(src, None) @@ -390,8 +430,8 @@ class LanguageSrcGenerator(LanguageGenerator): comment = "%s -> %s -> %s" % (self._label(database, frommapname, src, linux), self._label(database, Database.MAP_LINUX, linux, linux), self._label(database, tomapname, dst, linux)) - self._array_entry_name(src, dst, comment) - self._array_end() + self._array_entry(src, dst, comment, fromtype, self.TYPE_STRING) + self._array_end(fromtype, self.TYPE_STRING) def generate_name_table(self, varname, database, mapname): if mapname not in database.mapname: @@ -405,14 +445,14 @@ class LanguageSrcGenerator(LanguageGenerator): if varname is None: varname = "name_table_%s" % mapname - self._array_start_name(varname, len(keys), int) + self._array_start(varname, len(keys), self.TYPE_INT, self.TYPE_STRING) for i in range(len(keys)): key = keys[i] dst = database.mapname[mapname].get(key, None) - self._array_entry_name(i, dst, names[i]) + self._array_entry(i, dst, names[i], self.TYPE_INT, self.TYPE_STRING) - self._array_end() + self._array_end(self.TYPE_INT, self.TYPE_STRING) def _label(self, database, mapname, val, linux): if mapname in database.mapname: @@ -497,47 +537,54 @@ class CLanguageGenerator(LanguageSrcGenerator): print(" * %s" % line) print("*/") - def _array_start_code(self, varname, length, fromtype, totype): + def _array_start(self, varname, length, fromtype, totype): self._varname = varname; - totypename = self.inttypename if totype == int else self.strtypename - if fromtype == int: - print("const %s %s[%d] = {" % (totypename, varname, length)) + totypename = self.strtypename if totype == self.TYPE_STRING else self.inttypename + if fromtype in (self.TYPE_INT, self.TYPE_ENUM): + if length is None: + print("const %s %s[] = {" % (totypename, varname)) + else: + print("const %s %s[%d] = {" % (totypename, varname, length)) else: print("const struct _%s {" % varname) print(" const %s from;" % self.strtypename) print(" const %s to;" % totypename) print("} %s[] = {" % varname) - def _array_start_name(self, varname, length, fromtype): - self._array_start_code(varname, length, fromtype, str); - - def _array_end(self): + def _array_end(self, fromtype, totype): print("};") print("const unsigned int %s_len = sizeof(%s)/sizeof(%s[0]);" % (self._varname, self._varname, self._varname)) - def _array_entry_code(self, index, value, comment): + def _array_entry(self, index, value, comment, fromtype, totype): if value is None: return - if type(index) == int: - if type(value) == int: - print(" [0x%x] = 0x%x, /* %s */" % (index, value, comment)) - else: - print(" [0x%x] = \"%s\", /* %s */" % (index, value, comment)) + if fromtype == self.TYPE_INT: + indexfmt = "0x%x" + elif fromtype == self.TYPE_ENUM: + indexfmt = "%s" else: - if type(value) == int: - print(" {\"%s\", 0x%x}, /* %s */" % (index, value, comment)) - else: - print(" {\"%s\", \"%s\"}, /* %s */" % (index, value, comment)) + indexfmt = "\"%s\"" - def _array_entry_name(self, index, value, comment): - self._array_entry_code(index, value, comment) + if totype == self.TYPE_INT: + valuefmt = "0x%x" + elif totype == self.TYPE_ENUM: + valuefmt = "%s" + else: + valuefmt = "\"%s\"" + + if fromtype != self.TYPE_STRING: + print((" [" + indexfmt + "] = " + valuefmt + ", /* %s */") % (index, value, comment)) + else: + print((" {" + indexfmt + ", " + valuefmt + "}, /* %s */") % (index, value, comment)) class CppLanguageGenerator(CLanguageGenerator): - def _array_start_code(self, varname, length, fromtype, totype): - totypename = self.inttypename if totype == int else "const " + self.strtypename - if fromtype == int: + def _array_start(self, varname, length, fromtype, totype): + if fromtype == self.TYPE_ENUM: + raise NotImplementedError("Enums not supported as source in C++ generator") + totypename = "const " + self.strtypename if totype == self.TYPE_STRING else self.inttypename + if fromtype == self.TYPE_INT: print("#include <vector>") print("const std::vector<%s> %s = {" % (totypename, varname)) else: @@ -545,18 +592,20 @@ class CppLanguageGenerator(CLanguageGenerator): print("#include <string>") print("const std::map<const std::string, %s> %s = {" % (totypename, varname)) - def _array_end(self): + def _array_end(self, fromtype, totype): print("};") # designated initializers not available in C++ - def _array_entry_code(self, index, value, comment): - if type(index) != int: - return super(CppLanguageGenerator, self)._array_entry_code(index, value, comment) + def _array_entry(self, index, value, comment, fromtype, totype): + if fromtype == self.TYPE_STRING: + return super(CppLanguageGenerator, self)._array_entry(index, value, comment, fromtype, totype) if value is None: print(" 0, /* %s */" % comment) - elif type(value) == int: + elif totype == self.TYPE_INT: print(" 0x%x, /* %s */" % (value, comment)) + elif totype == self.TYPE_ENUM: + print(" %s, /* %s */" % (value, comment)) else: print(" \"%s\", /* %s */" % (value, comment)) @@ -583,41 +632,41 @@ class PythonLanguageGenerator(LanguageSrcGenerator): print("# %s" % line) print("#") - def _array_start_code(self, varname, length, fromtype, totype): - self._fromtype = fromtype - if fromtype == int: + def _array_start(self, varname, length, fromtype, totype): + if fromtype == self.TYPE_ENUM: + raise NotImplementedError("Enums not supported as source in Python generator") + + if fromtype != self.TYPE_STRING: print("%s = [" % varname) else: print("%s = {" % varname) - def _array_start_name(self, varname, length, fromtype): - self._array_start_code(varname, length, fromtype, str); - - def _array_end(self): - if self._fromtype == int: + def _array_end(self, fromtype, totype): + if fromtype != self.TYPE_STRING: print("]") else: print("}") - def _array_entry_code(self, index, value, comment): - if type(index) == int: + def _array_entry(self, index, value, comment, fromtype, totype): + if fromtype == self.TYPE_INT: if value is None: print(" None, # %s" % (comment)) - elif type(value) == int: + elif totype == self.TYPE_INT: print(" 0x%x, # %s" % (value, comment)) + elif totype == self.TYPE_ENUM: + print(" %s, # %s" % (value, comment)) else: print(" \"%s\", # %s" % (value, comment)) else: if value is None: print(" \"%s\": None, # %s" % (index, comment)) - elif type(value) == int: + elif totype == self.TYPE_INT: print(" \"%s\": 0x%x, # %s" % (index, value, comment)) + elif totype == self.TYPE_ENUM: + print(" \"%s\": %s, # %s" % (index, value, comment)) else: print(" \"%s\": \"%s\", # %s" % (index, value, comment)) - def _array_entry_name(self, index, value, comment): - self._array_entry_code(index, value, comment) - class PerlLanguageGenerator(LanguageSrcGenerator): def _boilerplate(self, lines): @@ -626,37 +675,37 @@ class PerlLanguageGenerator(LanguageSrcGenerator): print("# %s" % line) print("#") - def _array_start_code(self, varname, length, fromtype, totype): - if fromtype == int: + def _array_start(self, varname, length, fromtype, totype): + if fromtype == self.TYPE_ENUN: + raise NotImplementedError("Enums not supported as source in Python generator") + if fromtype == self.TYPE_INT: print("my @%s = (" % varname) else: print("my %%%s = (" % varname) - def _array_start_name(self, varname, length, fromtype): - self._array_start_code(varname, length, fromtype, str); - - def _array_end(self): + def _array_end(self, fromtype, totype): print(");") - def _array_entry_code(self, index, value, comment): - if type(index) == int: + def _array_entry(self, index, value, comment, fromtype, totype): + if fromtype == self.TYPE_INT: if value is None: print(" undef, # %s" % (comment)) - elif type(value) == int: + elif totype == self.TYPE_INT: print(" 0x%x, # %s" % (value, comment)) + elif totype == self.TYPE_ENUM: + print(" %s, # %s" % (value, comment)) else: print(" \"%s\", # %s" % (value, comment)) else: if value is None: print(" \"%s\", undef, # %s" % (index, comment)) - elif type(value) == int: + elif totype == self.TYPE_INT: + print(" \"%s\", 0x%x, # %s" % (index, value, comment)) + elif totype == self.TYPE_ENUM: print(" \"%s\", 0x%x, # %s" % (index, value, comment)) else: print(" \"%s\", \"%s\", # %s" % (index, value, comment)) - def _array_entry_name(self, index, value, comment): - self._array_entry_code(index, value, comment) - class JavaScriptLanguageGenerator(LanguageSrcGenerator): def _boilerplate(self, lines): @@ -665,31 +714,31 @@ class JavaScriptLanguageGenerator(LanguageSrcGenerator): print(" * %s" % line) print("*/") - def _array_start_code(self, varname, length, fromtype, totype): + def _array_start(self, varname, length, fromtype, totype): print("export default {") - def _array_start_name(self, varname, length, fromtype): - print("export default {") - - def _array_end(self): + def _array_end(self, fromtype, totype): print("};") - def _array_entry_code(self, index, value, comment): + def _array_entry(self, index, value, comment, fromtype, totype): if value is None: return - if type(index) == int: - if type(value) == int: - print(" 0x%x: 0x%x, /* %s */" % (index, value, comment)) - else: - print(" 0x%x: \"%s\", /* %s */" % (index, value, comment)) + + if fromtype == self.TYPE_INT: + fromfmt = "0x%x" + elif fromtype == self.TYPE_ENUM: + fromfmt = "%s" else: - if type(value) == int: - print(" \"%s\": 0x%x, /* %s */" % (index, value, comment)) - else: - print(" \"%s\": \"%s\", /* %s */" % (index, value, comment)) + fromfmt = "\"%s\"" + + if totype == self.TYPE_INT: + tofmt = "0x%x" + elif totype == self.TYPE_ENUM: + tofmt = "%s" + else: + tofmt = "\"%s\"" - def _array_entry_name(self, index, value, comment): - self._array_entry_code(index, value, comment) + print((" " + fromfmt + ": " + tofmt + ", /* %s */") % (index, value, comment)) class PodLanguageGenerator(LanguageDocGenerator): |