package keyboard; # $Id$ use diagnostics; use strict; #-###################################################################################### #- misc imports #-###################################################################################### use common; use detect_devices; use run_program; use log; use c; #-###################################################################################### #- Globals #-###################################################################################### my $KMAP_MAGIC = 0x8B39C07F; #- a best guess of the keyboard layout, based on the choosen locale #- beware only the first 5 characters of the locale are used my %lang2keyboard = ( 'af' => 'us_intl', 'ar' => 'ar:90', 'as' => 'ben:90 dev:20 us_intl:5', 'az' => 'az:90 tr_q:10 us_intl:5', 'be' => 'by:90 ru:50 ru_yawerty:40', 'bg' => 'bg_phonetic:60 bg:50', 'bn' => 'ben:90 dev:20 us_intl:5', 'br' => 'fr:90', 'bs' => 'bs:90', 'ca' => 'es:90 fr:15', 'cs' => 'cz_qwerty:70 cz:50', 'cy' => 'uk:90', 'da' => 'dk:90', 'de' => 'de_nodeadkeys:70 de:50 be:50 ch_de:50', 'el' => 'gr:90', 'en' => 'us:89 us_intl:50 qc:50 uk:50', 'en_US' => 'us:90 us_intl:50', 'en_GB' => 'uk:89 us:60 us_intl:50', 'eo' => 'us_intl:89 dvorak:20', 'es' => 'es:85 la:80 us_intl:50', 'et' => 'ee:90', 'eu' => 'es:90 fr:15', 'fa' => 'ir:90', 'fi' => 'fi:90', 'fr' => 'fr:89 qc:85 be:85 ch_fr:70', 'ga' => 'ie:80 uk:70', 'gd' => 'uk:80 ie:70', 'gl' => 'es:90', 'gu' => 'guj:90', 'gv' => 'uk:80 ie:70', 'he' => 'il:90 il_phonetic:10', 'hi' => 'dev:90', 'hr' => 'hr:90 si:50', 'hu' => 'hu:90', 'hy' => 'am:90 am_old:10 am_phonetic:5', 'id' => 'us:90 us_intl:20', 'is' => 'is:90', 'iu' => 'iu:90', 'it' => 'it:90 ch_fr:50 ch_de:50', 'ja' => 'jp:90 us:50 us_intl:20', 'ka' => 'ge_la:90 ge_ru:50', 'kl' => 'dk:80 us_intl:30', 'kn' => 'kan:90', 'ko' => 'kr:90 us:60', 'ku' => 'tr_q:90 tr_f:30', 'kw' => 'uk:80 ie:70', 'li' => 'us_intl:80 be:70 nl:10 us:5', 'lo' => 'lao:90', 'lt' => 'lt:80 lt_new:70 lt_b:60 lt_p:50', 'lv' => 'lv:90 lt:40 lt_new:30 lt_b:20 lt_p:10 ee:5', 'mi' => 'us_intl:90 uk:20 us:10', 'mk' => 'mk:90', 'ml' => 'mal:90', 'mn' => 'mng:90 ru:20 ru_yawerty:5', 'mr' => 'dev:90', 'ms' => 'us:90 us_intl:20', 'mt' => 'mt:90 mt_us:35 us_intl:10', 'my' => 'mm:90', 'nb' => 'no:90 dvorak_no:10', 'nl' => 'us_intl:80 be:70 nl:10 us:5', 'nn' => 'no:90 dvorak_no:10', 'no' => 'no:90 dvorak_no:10', 'oc' => 'fr:90', 'or' => 'ori:90', 'pa' => 'gur:90', 'ph' => 'us:90 us_intl:20', 'pl' => 'pl:90 pl2:60', 'pp' => 'br:80 la:20 pt:10 us_intl:30', 'pt_BR' => 'br:90 la:20 pt:10 us_intl:30', 'pt' => 'pt:90', 'ro' => 'ro2:80 ro:40 us_intl:10', 'ru' => 'ru:85 ru_yawerty:80 ua:50', 'se' => 'sapmi:70 sapmi_sefi:50', 'sh' => 'yu:80', 'sk' => 'sk_qwerty:80 sk:70', 'sl' => 'si:90 hr:50', 'sq' => 'al:90', 'sr' => 'sr:80', 'sv' => 'se:90 fi:30 dvorak_se:10', 'ta' => 'tscii:80 tml:20', 'te' => 'tel:90', 'tg' => 'tj:90 ru_yawerty:40', 'th' => 'th:90', 'tr' => 'tr_q:90 tr_f:30', 'tt' => 'ru:50 ru_yawerty:40', 'uk' => 'ua:90 ru:50 ru_yawerty:40', 'uz' => 'us:80 uz:80', 'uz\@Cyrl' => 'uz:80 ru_yawerty:40', 'vi' => 'vn:80 us:60 us_intl:50', 'wa' => 'be:90 fr:5', 'yi' => 'il_phonetic:90 il:10 us_intl:10', 'zh_CN' => 'us:60', 'zh_TW' => 'us:60', ); # USB kbd table # The numeric values are the bCountryCode field (5th byte) of HID descriptor my @usb2keyboard = ( qw(SKIP ar_SKIP be ca_SKIP qc cz dk fi fr de gr il hu us_intl it jp), #- 0x10 qw(kr la nl no ir pl pt ru sk es se ch_de ch_de ch_de tw_SKIP tr_q), #- 0x20 qw(uk us yu tr_f), #- higher codes not attribued as of 2002-02 ); #- key = extension for Xmodmap file, [0] = description of the keyboard, #- [1] = name for loadkeys, [2] = name for XKB, [3] = "1" if it is #- a multigroup layout (eg: one with latin/non-latin letters) my %keyboards = ( arch() =~ /^sparc/ ? ( "cz" => [ N_("Czech (QWERTZ)"), "sunt5-cz-us", "cz", 0 ], "de" => [ N_("German"), "sunt5-de-latin1", "de", 0 ], "dvorak" => [ N_("Dvorak"), "sundvorak", "dvorak",0 ], "es" => [ N_("Spanish"), "sunt5-es", "es", 0 ], "fi" => [ N_("Finnish"), "sunt5-fi-latin1", "fi", 0 ], "fr" => [ N_("French"), "sunt5-fr-latin1", "fr", 0 ], "no" => [ N_("Norwegian"), "sunt4-no-latin1", "no", 0 ], "pl" => [ N_("Polish"), "sun-pl-altgraph", "pl", 0 ], "ru" => [ N_("Russian"), "sunt5-ru", "ru", 1 ], # TODO: check the console map "se" => [ N_("Swedish"), "sunt5-fi-latin1", "se", 0 ], "uk" => [ N_("UK keyboard"), "sunt5-uk", "gb", 0 ], "us" => [ N_("US keyboard"), "sunkeymap", "us", 0 ], ) : ( "al" => [ N_("Albanian"), "al", "al", 0 ], "am_old" => [ N_("Armenian (old)"), "am_old", "am(old)", 1 ], "am" => [ N_("Armenian (typewriter)"), "am-armscii8", "am", 1 ], "am_phonetic" => [ N_("Armenian (phonetic)"), "am_phonetic", "am(phonetic)",1 ], "ar" => [ N_("Arabic"), "us", "ar(digits)", 1 ], "az" => [ N_("Azerbaidjani (latin)"), "az", "az", 0 ], #"a3" => [ N_("Azerbaidjani (cyrillic)"), "az-koi8k","az(cyrillic)",1 ], "be" => [ N_("Belgian"), "be2-latin1", "be", 0 ], "ben" => [ N_("Bengali"), "us", "ben", 1 ], "bg_phonetic" => [ N_("Bulgarian (phonetic)"), "bg", "bg(phonetic)", 1 ], "bg" => [ N_("Bulgarian (BDS)"), "bg", "bg", 1 ], "br" => [ N_("Brazilian (ABNT-2)"), "br-abnt2", "br", 0 ], #- Bosnia and Croatia use the same layout, but people are confused if there #- isn't an antry for their country "bs" => [ N_("Bosnian"), "croat", "hr", 0 ], "by" => [ N_("Belarusian"), "by-cp1251", "by", 1 ], "ch_de" => [ N_("Swiss (German layout)"), "sg-latin1", "de_CH", 0 ], "ch_fr" => [ N_("Swiss (French layout)"), "fr_CH-latin1", "fr_CH", 0 ], "cz" => [ N_("Czech (QWERTZ)"), "cz", "cz", 0 ], "cz_qwerty" => [ N_("Czech (QWERTY)"), "cz-lat2", "cz_qwerty", 0 ], "de" => [ N_("German"), "de-latin1", "de", 0 ], "de_nodeadkeys" => [ N_("German (no dead keys)"), "de-latin1-nodeadkeys", "de(nodeadkeys)", 0 ], "dev" => [ N_("Devanagari"), "us", "dev", 0 ], "dk" => [ N_("Danish"), "dk-latin1", "dk", 0 ], "dvorak" => [ N_("Dvorak (US)"), "pc-dvorak-latin1", "dvorak", 0 ], "dvorak_no" => [ N_("Dvorak (Norwegian)"), "no-dvorak", "dvorak(no)", 0 ],