aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xtools/keymap-gen237
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):