diff options
author | Pierre Ossman <ossman@cendio.se> | 2017-05-31 15:51:59 +0200 |
---|---|---|
committer | Daniel P. Berrange <berrange@redhat.com> | 2017-08-02 15:31:13 +0100 |
commit | 199ddce53eb5e1db1b9d4e3b3a38c551ed16388d (patch) | |
tree | a6a0f7c7e8434f173d89eb94f192fb6e5dcf712b | |
parent | 57f3cd34445e186f5a50cd246f77964f95515cf6 (diff) | |
download | keycodemapdb-199ddce53eb5e1db1b9d4e3b3a38c551ed16388d.zip keycodemapdb-199ddce53eb5e1db1b9d4e3b3a38c551ed16388d.tar.gz keycodemapdb-199ddce53eb5e1db1b9d4e3b3a38c551ed16388d.tar.bz2 |
Handle string based codes
Some systems use string identifiers rather than integers.
Signed-off-by: Pierre Ossman <ossman@cendio.se>
-rw-r--r-- | tests/.gitignore | 4 | ||||
-rw-r--r-- | tests/Makefile | 43 | ||||
-rw-r--r-- | tests/stdc++.cc | 29 | ||||
-rw-r--r-- | tests/stdc.c | 29 | ||||
-rw-r--r-- | tests/test.py | 13 | ||||
-rwxr-xr-x | tools/keymap-gen | 151 |
6 files changed, 212 insertions, 57 deletions
diff --git a/tests/.gitignore b/tests/.gitignore index cbc31ba..88e7c03 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -1,5 +1,9 @@ osx2win32.* osx2win32_name.* +osx2xkb.* +osx2xkb_name.* +html2win32.* +html2win32_name.* osx.* osx_name.* stdc diff --git a/tests/Makefile b/tests/Makefile index 2cf5903..ccb3686 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -13,33 +13,66 @@ SOURCES := $(GEN) $(DATA) .DELETE_ON_ERROR: -stdc: stdc.c osx2win32.h osx2win32_name.h osx.h osx_name.h +stdc: stdc.c osx2win32.h osx2win32_name.h \ + osx2xkb.h osx2xkb_name.h \ + html2win32.h html2win32_name.h \ + osx.h osx_name.h $(CC) -o $@ $^ osx2win32.h: $(SOURCES) $(GEN) --lang stdc code-map $(DATA) osx win32 > $@ osx2win32_name.h: $(SOURCES) $(GEN) --lang stdc name-map $(DATA) osx win32 > $@ +osx2xkb.h: $(SOURCES) + $(GEN) --lang stdc code-map $(DATA) osx xkb > $@ +osx2xkb_name.h: $(SOURCES) + $(GEN) --lang stdc name-map $(DATA) osx xkb > $@ +html2win32.h: $(SOURCES) + $(GEN) --lang stdc code-map $(DATA) html win32 > $@ +html2win32_name.h: $(SOURCES) + $(GEN) --lang stdc name-map $(DATA) html win32 > $@ osx.h: $(SOURCES) $(GEN) --lang stdc code-table $(DATA) osx > $@ osx_name.h: $(SOURCES) $(GEN) --lang stdc name-table $(DATA) osx > $@ -stdc++: stdc++.cc osx2win32.hh osx2win32_name.hh osx.hh osx_name.hh +stdc++: stdc++.cc osx2win32.hh osx2win32_name.hh \ + osx2xkb.hh osx2xkb_name.hh \ + html2win32.hh html2win32_name.hh \ + osx.hh osx_name.hh $(CC) -o $@ $^ osx2win32.hh: $(SOURCES) $(GEN) --lang stdc++ code-map $(DATA) osx win32 > $@ osx2win32_name.hh: $(SOURCES) $(GEN) --lang stdc++ name-map $(DATA) osx win32 > $@ +osx2xkb.hh: $(SOURCES) + $(GEN) --lang stdc++ code-map $(DATA) osx xkb > $@ +osx2xkb_name.hh: $(SOURCES) + $(GEN) --lang stdc++ name-map $(DATA) osx xkb > $@ +html2win32.hh: $(SOURCES) + $(GEN) --lang stdc++ code-map $(DATA) html win32 > $@ +html2win32_name.hh: $(SOURCES) + $(GEN) --lang stdc++ name-map $(DATA) html win32 > $@ osx.hh: $(SOURCES) $(GEN) --lang stdc++ code-table $(DATA) osx > $@ osx_name.hh: $(SOURCES) $(GEN) --lang stdc++ name-table $(DATA) osx > $@ -python2: osx2win32.py osx2win32_name.py osx.py osx_name.py +python2: osx2win32.py osx2win32_name.py \ + osx2xkb.py osx2xkb_name.py \ + html2win32.py html2win32_name.py \ + osx.py osx_name.py osx2win32.py: $(SOURCES) $(GEN) --lang python2 code-map $(DATA) osx win32 > $@ osx2win32_name.py: $(SOURCES) $(GEN) --lang python2 name-map $(DATA) osx win32 > $@ +osx2xkb.py: $(SOURCES) + $(GEN) --lang python2 code-map $(DATA) osx xkb > $@ +osx2xkb_name.py: $(SOURCES) + $(GEN) --lang python2 name-map $(DATA) osx xkb > $@ +html2win32.py: $(SOURCES) + $(GEN) --lang python2 code-map $(DATA) html win32 > $@ +html2win32_name.py: $(SOURCES) + $(GEN) --lang python2 name-map $(DATA) html win32 > $@ osx.py: $(SOURCES) $(GEN) --lang python2 code-table $(DATA) osx > $@ osx_name.py: $(SOURCES) @@ -48,6 +81,10 @@ osx_name.py: $(SOURCES) clean: rm -f osx2win32.* rm -f osx2win32_name.* + rm -f osx2xkb.* + rm -f osx2xkb_name.* + rm -f html2win32.* + rm -f html2win32_name.* rm -f osx.* rm -f osx_name.* rm -f stdc stdc++ diff --git a/tests/stdc++.cc b/tests/stdc++.cc index 51e1fb0..38551f0 100644 --- a/tests/stdc++.cc +++ b/tests/stdc++.cc @@ -12,14 +12,43 @@ #include "osx2win32.hh" #include "osx2win32_name.hh" + +#include "osx2xkb.hh" +#include "osx2xkb_name.hh" + +#include "html2win32.hh" +#include "html2win32_name.hh" + #include "osx.hh" #include "osx_name.hh" +#define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0])) + int main(int argc, char** argv) { + unsigned i; + assert(code_map_osx_to_win32[0x1d] == 0x30); assert(strcmp(name_map_osx_to_win32[0x1d], "VK_0") == 0); + assert(strcmp(code_map_osx_to_xkb[0x1d], "AE10") == 0); + assert(strcmp(name_map_osx_to_xkb[0x1d], "AE10") == 0); + + for (i = 0;i < ARRAY_SIZE(code_map_osx_to_win32);i++) { + if (strcmp(code_map_html_to_win32[i].from, "ControlLeft") == 0) { + assert(code_map_html_to_win32[i].to == 0x11); + break; + } + } + assert(i != ARRAY_SIZE(code_map_osx_to_win32)); + for (i = 0;i < ARRAY_SIZE(name_map_html_to_win32);i++) { + if (strcmp(name_map_html_to_win32[i].from, "ControlLeft") == 0) { + assert(strcmp(name_map_html_to_win32[i].to, "VK_CONTROL") == 0); + break; + } + } + assert(i != ARRAY_SIZE(name_map_html_to_win32)); + assert(code_table_osx[0x1d] == 0x3b); assert(strcmp(name_table_osx[0x1d], "Control") == 0); diff --git a/tests/stdc.c b/tests/stdc.c index 8668b74..df65116 100644 --- a/tests/stdc.c +++ b/tests/stdc.c @@ -12,14 +12,43 @@ #include "osx2win32.h" #include "osx2win32_name.h" + +#include "osx2xkb.h" +#include "osx2xkb_name.h" + +#include "html2win32.h" +#include "html2win32_name.h" + #include "osx.h" #include "osx_name.h" +#define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0])) + int main(int argc, char** argv) { + unsigned i; + assert(code_map_osx_to_win32[0x1d] == 0x30); assert(strcmp(name_map_osx_to_win32[0x1d], "VK_0") == 0); + assert(strcmp(code_map_osx_to_xkb[0x1d], "AE10") == 0); + assert(strcmp(name_map_osx_to_xkb[0x1d], "AE10") == 0); + + for (i = 0;i < ARRAY_SIZE(code_map_osx_to_win32);i++) { + if (strcmp(code_map_html_to_win32[i].from, "ControlLeft") == 0) { + assert(code_map_html_to_win32[i].to == 0x11); + break; + } + } + assert(i != ARRAY_SIZE(code_map_osx_to_win32)); + for (i = 0;i < ARRAY_SIZE(name_map_html_to_win32);i++) { + if (strcmp(name_map_html_to_win32[i].from, "ControlLeft") == 0) { + assert(strcmp(name_map_html_to_win32[i].to, "VK_CONTROL") == 0); + break; + } + } + assert(i != ARRAY_SIZE(name_map_html_to_win32)); + assert(code_table_osx[0x1d] == 0x3b); assert(strcmp(name_table_osx[0x1d], "Control") == 0); diff --git a/tests/test.py b/tests/test.py index 21bcefc..f265145 100644 --- a/tests/test.py +++ b/tests/test.py @@ -7,11 +7,24 @@ import osx2win32 import osx2win32_name + +import osx2xkb +import osx2xkb_name + +import html2win32 +import html2win32_name + import osx import osx_name assert osx2win32.code_map_osx_to_win32[0x1d] == 0x30 assert osx2win32_name.name_map_osx_to_win32[0x1d] == "VK_0" +assert osx2xkb.code_map_osx_to_xkb[0x1d] == "AE10" +assert osx2xkb_name.name_map_osx_to_xkb[0x1d] == "AE10" + +assert html2win32.code_map_html_to_win32["ControlLeft"] == 0x11 +assert html2win32_name.name_map_html_to_win32["ControlLeft"] == "VK_CONTROL" + assert osx.code_table_osx[0x1d] == 0x3b; assert osx_name.name_table_osx[0x1d] == "Control"; diff --git a/tools/keymap-gen b/tools/keymap-gen index 8663497..b59ba50 100755 --- a/tools/keymap-gen +++ b/tools/keymap-gen @@ -90,6 +90,8 @@ class Database: MAP_XWINXT, MAP_XKBDXT, MAP_X11, + MAP_HTML, + MAP_XKB, # These are derived from maps above MAP_XTKBD, @@ -111,6 +113,8 @@ class Database: MAP_XWINXT: 10, MAP_XKBDXT: 11, MAP_X11: 13, + MAP_HTML: 14, + MAP_XKB: 15, } NAME_COLUMNS = { @@ -201,7 +205,7 @@ class Database: if val.startswith("0x"): val = int(val, 16) - else: + elif val.isdigit(): val = int(val, 10) self.mapto[mapname][linux] = val @@ -281,7 +285,7 @@ class LanguageGenerator(object): class LanguageSrcGenerator(LanguageGenerator): - def _array_start_code(self, varname, length): + def _array_start_code(self, varname, length, fromtype, totype): raise NotImplementedError() def _array_start_name(self, varname, length): @@ -310,13 +314,13 @@ class LanguageSrcGenerator(LanguageGenerator): if varname is None: varname = "code_map_%s_to_%s" % (frommapname, tomapname) - frommax = 0 - for key in tolinux.keys(): - if key > frommax: - frommax = key + keys = tolinux.keys() + keys.sort() + if type(keys[0]) == int: + keys = range(keys[-1] + 1) - self._array_start_code(varname, frommax + 1) - for src in range(frommax + 1): + self._array_start_code(varname, len(keys), type(keys[0]), type(fromlinux.values()[0])) + for src in keys: linux = tolinux.get(src, None) if linux is None: dst = None @@ -341,7 +345,7 @@ class LanguageSrcGenerator(LanguageGenerator): if varname is None: varname = "code_table_%s" % mapname - self._array_start_code(varname, len(keys)) + self._array_start_code(varname, len(keys), int, type(database.mapto[mapname].values()[0])) for i in range(len(keys)): key = keys[i] @@ -364,14 +368,14 @@ class LanguageSrcGenerator(LanguageGenerator): if varname is None: varname = "name_map_%s_to_%s" % (frommapname, tomapname) - frommax = 0 - for key in tolinux.keys(): - if key > frommax: - frommax = key + keys = tolinux.keys() + keys.sort() + if type(keys[0]) == int: + keys = range(keys[-1] + 1) - self._array_start_name(varname, frommax + 1) + self._array_start_name(varname, len(keys), type(keys[0])) - for src in range(frommax + 1): + for src in keys: linux = tolinux.get(src, None) if linux is None: dst = None @@ -396,7 +400,7 @@ class LanguageSrcGenerator(LanguageGenerator): if varname is None: varname = "name_table_%s" % mapname - self._array_start_name(varname, len(keys)) + self._array_start_name(varname, len(keys), int) for i in range(len(keys)): key = keys[i] @@ -488,37 +492,52 @@ class CLanguageGenerator(LanguageSrcGenerator): print(" * %s" % line) print("*/") - def _array_start_code(self, varname, length): - print("const %s %s[%d] = {" % (self.inttypename, varname, length)) + def _array_start_code(self, varname, length, fromtype, totype): + totypename = self.inttypename if totype == int else self.strtypename + if fromtype == int: + 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): - print("const %s %s[%d] = {" % (self.strtypename, varname, length)) + def _array_start_name(self, varname, length, fromtype): + self._array_start_code(varname, length, fromtype, str); def _array_end(self): print("};") def _array_entry_code(self, index, value, comment): - if value is not None: - print(" [0x%x] = 0x%x, /* %s */" % (index, value, comment)) + 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)) + else: + if type(value) == int: + print(" {\"%s\", 0x%x}, /* %s */" % (index, value, comment)) + else: + print(" {\"%s\", \"%s\"}, /* %s */" % (index, value, comment)) def _array_entry_name(self, index, value, comment): - if value is not None: - print(" [0x%x] = \"%s\", /* %s */" % (index, value, comment)) + self._array_entry_code(index, value, comment) class CppLanguageGenerator(CLanguageGenerator): # designated initializers not available in C++ def _array_entry_code(self, index, value, comment): - if value is not None: + if type(index) != int: + return super(CppLanguageGenerator, self)._array_entry_code(index, value, comment) + + if value is None: + print(" 0, /* %s */" % comment) + elif type(value) == int: print(" 0x%x, /* %s */" % (value, comment)) else: - print(" 0, /* %s */" % comment) - - def _array_entry_name(self, index, value, comment): - if value is not None: print(" \"%s\", /* %s */" % (value, comment)) - else: - print(" 0, /* %s */" % comment) class StdCLanguageGenerator(CLanguageGenerator): @@ -543,26 +562,40 @@ class PythonLanguageGenerator(LanguageSrcGenerator): print("# %s" % line) print("#") - def _array_start_code(self, varname, length): - print("%s = [" % varname) + def _array_start_code(self, varname, length, fromtype, totype): + self._fromtype = fromtype + if fromtype == int: + print("%s = [" % varname) + else: + print("%s = {" % varname) - def _array_start_name(self, varname, length): - print("%s = [" % varname) + def _array_start_name(self, varname, length, fromtype): + self._array_start_code(varname, length, fromtype, str); def _array_end(self): - print("]") + if self._fromtype == int: + print("]") + else: + print("}") def _array_entry_code(self, index, value, comment): - if value is None: - print(" None, # %s" % (comment)) + if type(index) == int: + if value is None: + print(" None, # %s" % (comment)) + elif type(value) == int: + print(" 0x%x, # %s" % (value, comment)) + else: + print(" \"%s\", # %s" % (value, comment)) else: - print(" 0x%x, # %s" % (value, comment)) + if value is None: + print(" \"%s\": None, # %s" % (index, comment)) + elif type(value) == int: + print(" \"%s\": 0x%x, # %s" % (index, value, comment)) + else: + print(" \"%s\": \"%s\", # %s" % (index, value, comment)) def _array_entry_name(self, index, value, comment): - if value is None: - print(" None, # %s" % (comment)) - else: - print(" \"%s\", # %s" % (value, comment)) + self._array_entry_code(index, value, comment) class PerlLanguageGenerator(LanguageSrcGenerator): @@ -572,26 +605,36 @@ class PerlLanguageGenerator(LanguageSrcGenerator): print("# %s" % line) print("#") - def _array_start_code(self, varname, length): - print("my @%s = (" % varname) + def _array_start_code(self, varname, length, fromtype, totype): + if fromtype == int: + print("my @%s = (" % varname) + else: + print("my %%%s = (" % varname) - def _array_start_name(self, varname, length): - print("my @%s = (" % varname) + def _array_start_name(self, varname, length, fromtype): + self._array_start_code(varname, length, fromtype, str); def _array_end(self): print(");") def _array_entry_code(self, index, value, comment): - if value is None: - print(" undef, # %s" % (comment)) + if type(index) == int: + if value is None: + print(" undef, # %s" % (comment)) + elif type(value) == int: + print(" 0x%x, # %s" % (value, comment)) + else: + print(" \"%s\", # %s" % (value, comment)) else: - print(" 0x%x, # %s" % (value, comment)) + if value is None: + print(" \"%s\", undef, # %s" % (index, comment)) + elif type(value) == int: + print(" \"%s\", 0x%x, # %s" % (index, value, comment)) + else: + print(" \"%s\", \"%s\", # %s" % (index, value, comment)) def _array_entry_name(self, index, value, comment): - if value is None: - print(" undef, # %s" % (comment)) - else: - print(" \"%s\", # %s" % (value, comment)) + self._array_entry_code(index, value, comment) class PodLanguageGenerator(LanguageDocGenerator): |