[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