[Pkg-kbd-commit] r185 - people/zinoviev/console-setup/Keyboard
Anton Zinoviev
zinoviev at costa.debian.org
Thu Jul 20 13:41:54 UTC 2006
Author: zinoviev
Date: 2006-07-20 13:41:54 +0000 (Thu, 20 Jul 2006)
New Revision: 185
Modified:
people/zinoviev/console-setup/Keyboard/kbdcompiler
Log:
console-setup(kbdcompiler): New file to generate file with compressed encoded keymaps
Modified: people/zinoviev/console-setup/Keyboard/kbdcompiler
===================================================================
--- people/zinoviev/console-setup/Keyboard/kbdcompiler 2006-07-20 13:40:07 UTC (rev 184)
+++ people/zinoviev/console-setup/Keyboard/kbdcompiler 2006-07-20 13:41:54 UTC (rev 185)
@@ -4,26 +4,19 @@
use strict;
BEGIN {
- do "$ARGV[0]";
+ do "KeyboardNames.pl";
}
-my $keymapsdir = $ARGV[1];
+my $model = $ARGV[0];
+my $dir = 'keymaps';
-my $ckbdir;
-if ($ARGV[2]) {
- $ckbdir = $ARGV[2];
-} else {
- $ckbdir = 'ckb';
-}
+my $nonlatin = ' am ara ben bg by deva ge gr guj guru il ir iku kan
+ lao mk mm mal ori ru scc syr tel th tj tam ua ';
-if (! $keymapsdir) {
- $keymapsdir = 'keymaps';
-}
+my %keymaps;
-sub debug {
- if (1) {
- print STDERR "@_";
- }
+sub warning {
+ print STDERR "WARNING: @_";
}
sub execute {
@@ -33,274 +26,137 @@
return system ($_[0]);
}
-sub warning {
- print STDERR "WARNING: @_";
-}
-
-my %legacy_charmaps = (
- 'ARMSCII-8' => ['am'],
- 'CP1251' => ['by', 'bg', 'mk', 'ru', 'sr', 'ua'],
- 'CP1255' => ['il', 'il_phonetic'],
- 'CP1256' => ['ar'],
- 'GEORGIAN-ACADEMY' => ['ge_la', 'ge_ru'],
- 'GEORGIAN-PS' => ['ge_la', 'ge_ru'],
- 'IBM1133' => [ 'lo' ],
- 'ISIRI-3342' => [ 'ir' ],
- 'ISO-8859-1' => [ 'al', 'br', 'ca', 'dvorak', 'is', 'la', 'se_NO',
- 'no', 'ch', 'us', 'en_US', 'us_intl', 'gb' ],
- 'ISO-8859-2' => [ 'bs', 'hr', 'cz', 'cz_qwerty', 'hu', 'pl',
- 'pl2', 'ro', 'sk', 'sk_qwerty', 'si', 'yu' ],
- 'ISO-8859-3' => ['mt', 'mt_us'],
- 'ISO-8859-5' => ['mk', 'sr'],
- 'ISO-8859-6' => ['ar'],
- 'ISO-8859-7' => ['el'],
- 'ISO-8859-9' => ['tr'],
- 'ISO-8859-8' => ['il', 'il_phonetic'],
- 'ISO-8859-13' => ['ee', 'lv', 'lt_std', 'lt'],
- 'ISO-8859-15' => [ 'be', 'dk', 'dvorak', 'nl', 'ee', 'fi', 'fr',
- 'fr-latin9', 'de', 'ie', 'it', 'se_FI',
- 'se_SE', 'pt', 'es', 'se', 'us', 'en_US',
- 'us_intl', 'gb' ],
- 'KOI8-R' => ['ru', 'ru_yawerty'],
- 'KOI8-U' => ['ua'],
- 'TIS-620' => ['th', 'th_pat', 'th_tis'],
- 'VISCII' => ['vn'],
-);
-
sub ensuredir {
if (! -d $_[0]) {
mkdir $_[0] or die "$0: $_[0]: $!\n";
}
}
-my %generated;
+sub read_temp_kmap {
+ my $name = $_[0];
+ open (KMAP, "$dir/$model-$name") or die "$0: $dir/$model-$name: $!\n";
+ while (<KMAP>) {
+ if (/^keycode ([0-9]+) =.*/) {
+ $keymaps{$name}[$1] = $_;
+ }
+ }
+ close KMAP;
+}
-my %model_dir = (
- 'amiga' => 'amiga',
- 'ataritt' => 'ataritt',
- 'macintosh' => 'macintosh',
- 'macintosh_old' => 'macintosh_old',
- 'pc105' => 'pc',
- 'sun4' => 'sun4',
- 'sun5' => 'sun5',
- 'abnt2' => 'pc',
-);
-
-# my %model_prefix = (
-# 'amiga' => 'amiga-',
-# 'ataritt' => 'atari-',
-# 'macintosh' => 'powermac-',
-# 'macintosh_old' => 'mac-',
-# 'pc105' => '',
-# 'sun4' => 'sun4-',
-# 'sun5' => 'sun5-',
-# );
+ensuredir $dir;
-my %model_prefix = (
- 'amiga' => '',
- 'ataritt' => '',
- 'macintosh' => '',
- 'macintosh_old' => '',
- 'pc105' => '',
- 'sun4' => '',
- 'sun5' => '',
-);
-
-my %keycodes = (
- 'amiga' => 'amiga(de)',
- 'ataritt' => 'ataritt(de)',
- 'macintosh' => 'xfree86',
- 'macintosh_old' => 'macintosh',
- 'pc105' => 'xfree86',
- 'sun4' => 'sun(type4_euro)',
- 'sun5' => 'sun(type5_euro)',
- 'abnt2' => 'xfree86(abnt2)',
-);
-
-my $nonlatin = ' am ara ben bg by deva ge gr guj guru il ir iku kan
- lao mk mm mal ori ru scc syr tel th tj tam ua ';
+printf STDERR "Compiling keymaps for %s...\n", $model;
-sub compile_keymap {
- my ($encoding, $model, $layout, $variant) = @_;
-# my $encoding_suffix = ($encoding eq '' ? '' : ".$encoding");
- my $encoding_suffix = '';
- my $acm = ($encoding eq 'UTF-8' ? '' : "-charmap $encoding");
- my $encoding_dir = (($encoding eq 'UTF-8')
- ? ${keymapsdir}
- : "${keymapsdir}/$encoding");
- my $model_dir = (defined $model_dir{$model}
- ? "${encoding_dir}/$model_dir{$model}"
- : "${encoding_dir}/other");
- $model_dir =~ s/\/$//;
- ensuredir $keymapsdir;
- ensuredir $encoding_dir;
- ensuredir $model_dir;
- my $model_prefix = (defined $model_prefix {$model}
- ? $model_prefix {$model}
- : "$model-");
+for my $layout (values %KeyboardNames::layouts) {
+ next if ($layout eq 'nec/jp');
+ next if ($layout eq 'nec_vndr/jp');
my $actual_layout = (($layout eq 'sr')
? 'yu,sr'
: (($nonlatin =~ / $layout /)
? "en_US,$layout"
: $layout));
- my $name = $layout;
- $name =~ s/-/_/g;
- $name =~ s/\///g;
- if ($variant) {
- my $variantname = $variant;
- $variantname =~ s/-/_/g;
- $variantname =~ s/\///g;
- my $filename = ("$model_dir/$model_prefix"
- ."$name-$variantname$encoding_suffix.kmap");
- print " $filename\n";
+ if (! -f "$dir/$model-$layout") {
+ execute ("./ckbcomp -compact -I. -Ickb -rules xorg -model $model"
+ ." -layout $actual_layout >$dir/$model-$layout")
+ and warning "$0: ckbcomp failed\n" if (! -f "$dir/$model-$layout");
+ }
+ if (-f "$dir/$model-$layout") {
+ read_temp_kmap $layout;
+ }
+ for my $variant (values %{$KeyboardNames::variants{$layout}}) {
my $actual_variant = (($actual_layout =~ /,/)
? ",$variant"
: $variant);
- execute ("./ckbcomp -I. -I${ckbdir} $acm -rules xorg -model $model"
- ." -layout $actual_layout -variant $actual_variant"
- ." >$filename")
- and warning "$0: ckbcomp failed\n" if (! -f $filename);
- $generated{"$encoding*$model*$actual_layout*$variant"} = "$filename";
- } else {
- my $filename = ("$model_dir/$model_prefix"
- ."$name$encoding_suffix.kmap");
- print " $filename\n";
- execute ("./ckbcomp -I. -I${ckbdir} $acm -rules xorg -model $model"
- ." -layout $actual_layout >$filename")
- and warning "$0: ckbcomp failed\n" if (! -f $filename);
- $generated{"$encoding*$model*$actual_layout"} = "$filename";
+ if (! -f "$dir/$model-$layout:$variant") {
+ execute ("./ckbcomp -compact -I. -Ickb -rules xorg -model $model"
+ ." -layout $actual_layout -variant $actual_variant"
+ ." >$dir/$model-$layout:$variant")
+ and warning "$0: ckbcomp failed\n" if (! -f "$dir/$model-$layout:$variant");
+ }
+ if (-f "$dir/$model-$layout:$variant") {
+ read_temp_kmap "$layout:$variant";
+ }
}
}
-print "Compiling keymaps:\n";
-ensuredir "${keymapsdir}";
-for my $encoding ('UTF-8', keys %legacy_charmaps) {
- $encoding eq 'UTF-8' or next;
- my @layouts = ($encoding eq 'UTF-8'
- ? values %KeyboardNames::layouts
- : @{$legacy_charmaps{$encoding}});
- for my $model (qw/amiga ataritt macintosh_old pc105 sun4 sun5/) {
- for my $layout (@layouts) {
- next if ($layout eq 'nec/jp');
- next if ($layout eq 'nec_vndr/jp');
- for my $variant ('', values %{$KeyboardNames::variants{$layout}}) {
-# $variant eq '' or next;
- compile_keymap $encoding, $model, $layout, $variant;
+sub subtraction {
+ my $kmap1 = $keymaps{$_[0]};
+ my $kmap2 = $keymaps{$_[1]};
+ my $result = 0;
+ for my $k (0 .. $#{$kmap1}-1) {
+ if (defined $kmap1->[$k]) {
+ if (! defined $kmap2->[$k] || $kmap1->[$k] ne $kmap2->[$k]) {
+ $result++;
}
}
}
+ return $result;
}
-for my $encoding ('UTF-8', 'ISO-8859-1') {
- $encoding eq 'UTF-8' or next;
- for my $variant ('', 'nodeadkeys') {
- $variant eq '' or next;
- compile_keymap $encoding, 'abnt2', 'br', $variant;
+printf STDERR "Computing differential matrix for %s...\n", $model;
+
+my %kmaps;
+my %matrice;
+my %reduce;
+
+my $k;
+my $k1;
+my $k2;
+
+for $k (keys %keymaps) {
+ $kmaps{$k} = 1;
+}
+
+for $k1 (keys %kmaps) {
+ for $k2 (keys %kmaps) {
+ $matrice{$k1}{$k2} = subtraction($k1, $k2);
}
}
-my %options = (
- 'grp:switch' => [ 'ralt' ],
- 'grp:lswitch' => [ 'lalt' ],
- 'grp:win_switch' => [ 'rwin', 'lwin' ],
- 'grp:lwin_switch' => [ 'rwin' ],
- 'grp:rwin_switch' => [ 'lwin' ],
- 'grp:toggle' => [ 'ralt' ],
- 'grp:shifts_toggle' => [ 'lshift', 'rshift' ],
- 'grp:ctrls_toggle' => [ 'lctrl', 'rctrl' ],
- 'grp:alts_toggle' => [ 'ralt', 'lalt' ],
- 'grp:ctrl_shift_toggle' => [ 'lshift', 'rshift', 'lctrl', 'rctrl' ],
- 'grp:caps_toggle' => [ 'caps' ],
- 'grp:shift_caps_toggle' => [ 'caps' ],
- 'grp:ctrl_alt_toggle' => [ 'lalt', 'ralt', 'lctrl', 'rctrl' ],
- 'grp:alt_shift_toggle' => [ 'lalt', 'ralt', 'lshift', 'rshift' ],
- 'grp:menu_toggle' => [ 'menu' ],
- 'grp:lwin_toggle' => [ 'lwin' ],
- 'grp:rwin_toggle' => [ 'rwin' ],
- 'grp:lshift_toggle' => [ 'lshift' ],
- 'grp:rshift_toggle' => [ 'rshift' ],
- 'grp:lctrl_toggle' => [ 'lctrl' ],
- 'grp:rctrl_toggle' => [ 'rctrl' ],
- 'grp:lalt_toggle' => [ 'lalt' ],
- 'lv3:switch' => [ 'rctrl' ],
- 'lv3:menu_switch' => [ 'menu' ],
- 'lv3:win_switch' => [ 'lwin', 'rwin' ],
- 'lv3:lwin_switch' => [ 'lwin' ],
- 'lv3:rwin_switch' => [ 'rwin' ],
- 'lv3:ralt_switch' => [ 'ralt' ],
- 'lv3:alt_switch' => [ 'lalt', 'ralt' ],
- 'ctrl:nocaps' => [ 'caps', 'lctrl' ],
- 'ctrl:swapcaps' => [ 'caps', 'lctrl' ],
- 'compose:ralt' => [ 'ralt' ],
- 'compose:rwin' => [ 'rwin' ],
- 'compose:menu' => [ 'menu' ],
- 'compose:caps' => [ 'caps' ],
- 'compose:rctrl' => [ 'rctrl' ],
- 'eurosign:e' => [ 'empty' ],
- 'eurosign:5' => [ 'empty' ],
- 'eurosign:2' => [ 'empty' ],
- );
+printf STDERR "Reducing the keymaps for %s...\n", $model;
-for my $model (qw/amiga ataritt macintosh_old pc105 sun4 sun5/) {
- my $model_dir = (defined $model_dir {$model}
- ? "${keymapsdir}/". $model_dir {$model} .'/include'
- : "${keymapsdir}/other/include");
- ensuredir $model_dir;
- my $model_prefix = (defined $model_prefix {$model}
- ? $model_prefix {$model}
- : "$model-");
- my $keycodes = (defined $keycodes {$model}
- ? $keycodes {$model}
- : 'xfree86');
- for my $option (keys %options) {
- my $layout = '';
- for my $mod (@{$options{$option}}) {
- $layout = $layout . "+stdmodifiers($mod)";
+while (keys %kmaps) {
+ my $mink1 = '';
+ my $mink2 = '';
+ my $minsub = 10000000;
+ for $k1 (keys %kmaps, '') {
+ for $k2 (keys %kmaps) {
+ next if ($k1 eq $k2);
+ if ($k1 eq '') {
+ if ($mink1 eq '') {
+ $mink1 = $k2;
+ }
+ } elsif ($matrice{$k1}{$k2} < $minsub) {
+ $mink1 = $k1;
+ $mink2 = $k2;
+ $minsub = $matrice{$k1}{$k2};
+ }
}
- $layout =~ s/^\+//;
- if ($option =~ /grp:(.*)/) {
- $layout = $layout . "+group($1)";
- } elsif ($option =~ /ctrl:(.*)/) {
- $layout = $layout . "+ctrl($1)";
- } elsif ($option =~ /lv3:(.*)/) {
- $layout = $layout . "+level3($1)";
- } elsif ($option =~ /compose:(.*)/) {
- $layout = $layout . "+compose($1)";
- } elsif ($option =~ /eurosign:(.*)/) {
- $layout = $layout . "+eurosign($1)";
- }
-
- my $filename = "$model_dir/$model_prefix$option.inc";
- $filename =~ s/:/-/g;
- print " $filename\n";
-
- execute ("./ckbcomp -I. -I${ckbdir} -keycodes '$keycodes' -symbols '$layout' "
- .">'$filename'")
- and warning "$0: ckbcomp failed\n" if (! -f $filename);
}
+ $reduce{$mink1} = $mink2;
+ delete $kmaps{$mink1};
}
-print "done.\n";
+printf STDERR "Dumping the encoded keymaps for %s...\n", $model;
-# open GENERATED, '>keymaps.dir' or die "$0: keymaps.dir: $!\n";
-# for my $specification (sort keys %generated) {
-# my $file = $generated{$specification};
-# $file =~ s/^keymaps\///;
-# print GENERATED "$specification\t$file\n";
-# }
-# close GENERATED;
-
-# open NAMES, '>names.list' or die "$0: names.list: $!\n";
-# for my $model (keys %KeyboardNames::models) {
-# my $name = $KeyboardNames::models{$model};
-# print NAMES "model*$name*$model\n"
-# }
-# for my $layout (keys %KeyboardNames::layouts) {
-# my $name = $KeyboardNames::layouts{$layout};
-# print NAMES "layout*$name*$layout\n";
-# for my $variant (keys %{$KeyboardNames::variants{$name}}) {
-# my $variantname = $KeyboardNames::variants{$name}{$variant};
-# print NAMES "variant*$name*$variantname*$variant\n";
-# }
-# }
-# close NAMES;
+for $k1 (keys %reduce) {
+ my $kmap1 = $keymaps{$k1};
+ $k2 = $reduce{$k1};
+ if ($k2 ne '') {
+ my $kmap2 = $keymaps{$k2};
+ printf "%s::#include %s\n", $k1, $k2;
+ for my $k (0 .. $#{$kmap1}-1) {
+ if (defined $kmap1->[$k]) {
+ if (! defined $kmap2->[$k] || $kmap1->[$k] ne $kmap2->[$k]) {
+ printf "%s::%s", $k1, $kmap1->[$k];
+ }
+ }
+ }
+ } else {
+ for my $k (0 .. $#{$kmap1}-1) {
+ if (defined $kmap1->[$k]) {
+ printf "%s::%s", $k1, $kmap1->[$k];
+ }
+ }
+ }
+}
More information about the Pkg-kbd-commit
mailing list