import kudzu
import string
from simpleconfig import SimpleConfigFile
class Keyboard (SimpleConfigFile):
# the *first* item in each of these wins conflicts
console2xlist = [
("be-latin1" , ('pc102', 'be')),
("be2-latin1" , ('pc102', 'be')),
("bg" , ('pc102', 'bg')),
("cf" , ('pc102', 'cf')),
("cz-lat2" , ('pc102', 'cs')),
("cz-lat2-prog" , ('pc102', 'cs')),
("de-latin1" , ('pc102', 'de')),
("de" , ('pc102', 'de')),
("de-latin1-nodeadkeys" , ('pc102', 'de')),
("dk" , ('pc102', 'dk')),
("dk-latin1" , ('pc102', 'dk')),
("es" , ('pc102', 'es')),
("fi" , ('pc102', 'fi')),
("fi-latin1" , ('pc102', 'fi')),
("fr" , ('pc102', 'fr')),
("fr-latin0" , ('pc102', 'fr')),
("fr-latin1" , ('pc102', 'fr')),
("fr-pc" , ('pc102', 'fr')),
("fr_CH" , ('pc102', 'fr_CH')),
("fr_CH-latin1" , ('pc102', 'fr_CH')),
("hu" , ('pc102', 'fr_CH')),
("hu101" , ('pc102', 'hu')),
("it" , ('pc102', 'it')),
("it-ibm" , ('pc101', 'it')),
("it2" , ('pc102', 'it')),
("jp106" , ('jp106', 'jp')),
("no-latin1" , ('pc102', 'no')),
("no" , ('pc102', 'no')),
("pl" , ('pc102', 'pl')),
("pt-latin1" , ('pc102', 'pt')),
("ru" , ('pc102', 'ru')),
("ru-cp1251" , ('pc102', 'ru')),
("ru-ms" , ('microsoft', 'ru')),
("ru1" , ('pc102', 'ru')),
("ru2" , ('pc102', 'ru')),
("ru_win" , ('pc105', 'ru')),
("se-latin1" , ('pc102', 'se')),
("uk" , ('pc101', 'gb')),
("us" , ('pc101', 'us')),
]
console2xsun = {
"sun-pl-altgraph" : 'pl',
"sun-pl" : 'pl',
"sunt4-es" : 'es',
"sunt5-cz-us" : 'cs',
"sunt5-de-latin1" : 'de',
"sunt5-es" : 'es',
"sunt5-fi-latin1" : 'fi',
"sunt5-fr-latin1" : 'fr',
"sunt5-ru" : 'ru',
"sunt5-uk" : 'en_US',
"sunt5-us-cz" : 'cs',
}
console2x = {}
for (console, (map, layout)) in console2xlist:
console2x[console] = (map, layout)
x2console = {}
for (console, (map, layout)) in console2xlist:
if not x2console.has_key((map, layout)):
x2console [(map, layout)] = console
xsun2console = {}
for (key, value) in console2xsun.items():
xsun2console [value] = key
def __init__ (self):
self.type = "PC"
self.model = None
self.layout = None
self.info = {}
list = kudzu.probe(kudzu.CLASS_KEYBOARD, kudzu.BUS_UNSPEC,
kudzu.PROBE_ONE)
if list:
(device, module, desc) = list[0]
if desc[:14] == 'Serial console':
self.type = "Serial"
elif desc[:8] == 'Sun Type':
self.type = "Sun"
if desc[8:9] == '4':
self.model = 'type4'
desc = desc[10:]
elif desc[8:14] == '5 Euro':
self.model = 'type5_euro'
desc = desc[15:]
elif desc[8:14] == '5 Unix':
self.model = 'type5_unix'
desc = desc[15:]
else:
self.model = 'type5'
desc = desc[10:]
if desc[:8] == 'Keyboard':
self.layout = 'us'
else:
xx = string.split (desc)
if xx[0] == 'fr_BE':
self.layout = 'be'
elif xx[0] == 'fr_CA':
self.layout = 'fr'
elif xx[0] == 'nl' or xx[0] == 'ko' or xx[0] == 'tw':
self.layout = 'us'
else:
self.layout = xx[0]
if self.type == "Sun":
self.info["KEYBOARDTYPE"] = "sun"
elif self.type != "Serial":
self.info["KEYBOARDTYPE"] = "pc"
def available (self):
if self.type == "Sun":
return [
"sun-pl-altgraph",
"sun-pl",
"sundvorak",
"sunkeymap",
"sunt4-es",
"sunt4-no-latin1",
"sunt5-cz-us",
"sunt5-de-latin1",
"sunt5-es",
"sunt5-fi-latin1",
"sunt5-fr-latin1",
"sunt5-ru",
"sunt5-uk",
"sunt5-us-cz",
]
if self.type == "Serial":
return [ "us" ]
return [
"azerty",
"be-latin1",
"be2-latin1",
"fr-latin0",
"fr-latin1",
"fr-pc",
"fr",
"wangbe",
"ANSI-dvorak",
"dvorak-l",
"dvorak-r",
"dvorak",
"pc-dvorak-latin1",
"tr_f-latin5",
"trf",
"bg",
"cf",
"cz-lat2-prog",
"cz-lat2",
"defkeymap",
"defkeymap_V1.0",
"dk-latin1",
"dk",
"emacs",
"emacs2",
"es",
"fi-latin1",
"fi",
"gr-pc",
"gr",
"hebrew",
"hu101",
"is-latin1",
"it-ibm",
"it",
"it2",
"jp106",
"la-latin1",
"lt",
"lt.l4",
"nl",
"no-latin1",
"no",
"pc110",
"pl",
"pt-latin1",
"pt-old",
"ro",
"ru-cp1251",
"ru-ms",
"ru-yawerty",
"ru",
"ru1",
"ru2",
"ru_win",
"se-latin1",
"sk-prog-qwerty",
"sk-prog",
"sk-qwerty",
"tr_q-latin5",
"tralt",
"trf",
"trq",
"ua",
"uk",
"us",
"croat",
"cz-us-qwertz",
"de-latin1-nodeadkeys",
"de-latin1",
"de",
"fr_CH-latin1",
"fr_CH",
"hu",
"sg-latin1-lk450",
"sg-latin1",
"sg",
"sk-prog-qwertz",
"sk-qwertz",
"slovene",
]
def set (self, keytable):
if self.type != "Serial":
self.info["KEYTABLE"] = keytable
def setfromx (self, model, layout):
if self.type == "PC":
mapping = Keyboard.x2console
else:
mapping = Keyboard.xsun2console
keys = mapping.keys ()
fuzzy = None
for key in keys:
if type(key) == type(()):
(mod, lay) = key
else:
mod = model
lay = key;
if model == mod and layout == lay:
self.info["KEYTABLE"] = mapping[key]
return
if layout == lay:
fuzzy = key
if fuzzy:
self.info["KEYTABLE"] = mapping[fuzzy]
else:
if self.type == "PC":
self.info["KEYTABLE"] = "us"
else:
return "sunkeymap"
def get (self):
if self.info.has_key ("KEYTABLE"):
return self.info["KEYTABLE"]
else:
if self.type == "Sun":
for map in Keyboard.console2xsun.keys():
if Keyboard.console2xsun[map] == self.layout:
return map
return "sunkeymap"
else:
return "us"
def getXKB (self):
if self.type == "PC":
if Keyboard.console2x.has_key (self.get ()):
(model, keylayout) = Keyboard.console2x[self.get ()]
return ("xfree86", model, keylayout, "", "")
else:
if Keyboard.console2xsun.has_key (self.get ()):
keylayout = Keyboard.console2xsun[self.get ()]
return ("sun", self.model, keylayout, "", "")