From 4ba103156d529af7ae4e34e6f429ede93858f68b Mon Sep 17 00:00:00 2001 From: "Jordan K. Hubbard" Date: Wed, 5 Apr 1995 08:09:25 +0000 Subject: [PATCH] Latest version of this package from Wolfram. Is now /etc/sysconfig aware, handles default settings and has a prototype translation file for people wishing to add extra languages (please!). Submitted by: Wolfram Schneider --- usr.sbin/kbdmap/ChangeLog | 78 ++++++++++ usr.sbin/kbdmap/Languages.phrases | 37 +++++ usr.sbin/kbdmap/TODO | 5 + usr.sbin/kbdmap/kbdmap.1 | 133 +++++++++++++++++ usr.sbin/kbdmap/kbdmap.pl | 235 +++++++++++++++++++++++------- usr.sbin/kbdmap/strip_pl.pl | 12 ++ 6 files changed, 446 insertions(+), 54 deletions(-) create mode 100644 usr.sbin/kbdmap/ChangeLog create mode 100644 usr.sbin/kbdmap/Languages.phrases create mode 100644 usr.sbin/kbdmap/TODO create mode 100644 usr.sbin/kbdmap/kbdmap.1 create mode 100644 usr.sbin/kbdmap/strip_pl.pl diff --git a/usr.sbin/kbdmap/ChangeLog b/usr.sbin/kbdmap/ChangeLog new file mode 100644 index 000000000000..3b5ba01d71c1 --- /dev/null +++ b/usr.sbin/kbdmap/ChangeLog @@ -0,0 +1,78 @@ +Mon Apr 3 21:13:52 1995 Wolfram Schneider + + * kbdmap.pl: + the all singing and dancing algorithm for language matching + support now states and fonts + + * INDEX.keymaps, INDEX.fonts: *** empty log message *** + + * Makefile: add INDEX.* + +Sun Apr 2 15:31:23 1995 Wolfram Schneider + + * kbdmap.pl: add comments + + * INDEX.keymaps, INDEX.fonts: FONT en cp437 + + * kbdmap.pl: readd x11 test + don't start always right font + +Sat Apr 1 18:26:51 1995 Wolfram Schneider + + * INDEX.keymaps: *** empty log message *** + + * kbdmap.pl: spaces, perl -cw + + * kbdmap.1, Languages.phrases: *** empty log message *** + + * Languages.phrases: don't miss french + + * INDEX.keymaps: add FONT + + * INDEX.fonts: *** empty log message *** + + * INDEX.fonts: add FONT + + * kbdmap.1: replace kbdfont with vidfont + add option -r + + * kbdmap.pl: load always right font + sort: 8x8 font is less than 8x14 + + * kbdmap.pl: langsupport for MENU and FONT + read current font from /etc/sysconfig + option -restore for loading default font from /etc/sysconfig + +Mon Mar 27 20:59:31 1995 Wolfram Schneider + + * kbdmap.pl: LC_CTYPE + use only first two characters of language + + * INDEX.keymaps, INDEX.fonts: add french + +Sat Mar 25 23:57:11 1995 Wolfram Schneider + + * INDEX.keymaps, INDEX.fonts, Makefile: *** empty log message *** + + * Makefile: Initial revision + + * kbdmap.1: *** empty log message *** + + * Languages.phrases: Initial revision + + * kbdmap.pl: comment die on X11 out + strip ending '.pl' or '.perl', which confuse the program name + sort languages for -show + LANG=C is a synonym for 'en' + + * kbdmap.1: *** empty log message *** + + * kbdmap.1, INDEX.fonts, INDEX.keymaps: Initial revision + + * kbdmap.pl: move menu title into database + strip country and font from LANG + Option -d for default langague/don't using LANG + Option -s: show currently supported languages + + * kbdmap.pl: Initial revision + diff --git a/usr.sbin/kbdmap/Languages.phrases b/usr.sbin/kbdmap/Languages.phrases new file mode 100644 index 000000000000..8bf79224bdc7 --- /dev/null +++ b/usr.sbin/kbdmap/Languages.phrases @@ -0,0 +1,37 @@ +# +# Please use only iso-latin character set, which available +# at console *and* X11 (IBM cp850 does not) +# +# missing: Norwegian, Russian, Danish, Swedish +# + +1. Chose your keyboard font + +2. Codepage + +3. English + +4. thin + +5. Multilingual Latin I + +6. Norwegian + +7. Russian + +8. West European + +9. Chose your keyboard language + +10. Danish + +11. French + +12. German + +13. Swedish + +14. United Kingdom + +15. United States of America + diff --git a/usr.sbin/kbdmap/TODO b/usr.sbin/kbdmap/TODO new file mode 100644 index 000000000000..0735569dac69 --- /dev/null +++ b/usr.sbin/kbdmap/TODO @@ -0,0 +1,5 @@ +o kbdmap.5 man page +o remember some hackers to translate Languages.phrases into + Norwegian, Russian, Danish, Swedish + +95/04/03 Wolfram diff --git a/usr.sbin/kbdmap/kbdmap.1 b/usr.sbin/kbdmap/kbdmap.1 new file mode 100644 index 000000000000..9ef452d84262 --- /dev/null +++ b/usr.sbin/kbdmap/kbdmap.1 @@ -0,0 +1,133 @@ +.\" +.\" Copyright (c) March 1995 Wolfram Schneider. All rights reserved. +.\" Alle Rechte vorbehalten. Es gilt das kontinentaleuropäische Urheberrecht. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by Wolfram Schneider +.\" 4. The name of the author may not be used to endorse or promote products +.\" derived from this software without specific prior written permission +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" + +.\" +.\" kbdmap/vidfont - front end for syscons +.\" +.\" E-Mail: Wolfram Schneider +.\" +.\" $Id: kbdmap.1,v 1.5 1995/04/01 17:07:26 w Exp $ +.\" + +.Dd Mar 25, 1995 +.Dt KBDMAP 1 +.Os +.Sh NAME +.Nm kbdmap , +.Nm vidfont +.Nd front end for syscons + +.Sh SYNOPSIS +.Nm kbdmap +.Op Fl d | Fl default +.Op Fl h | Fl help +.Op Fl l | Fl lang Ar language +.Op Fl r | Fl restore +.Op Fl s | Fl show +.Op Fl v | Fl verbose + +.Sh DESCRIPTION +.Nm kbdmap +allow easy setting of avaible keymaps. +.Nm vidfont +do it for fonts. +Both looking in a database for a description. Description is +in English (default) or any other language. + +.Sh OPTIONS +.Bl -tag -width Ds + +.It Fl d , Fl default +Use default language. Ignore $LANG. + +.It Fl h , Fl help +Print options and exit. + +.It Fl l , Fl lang Ar language +Use +.Ar language +for description and menu + +.It Fl s , Fl show +Show currently supported languages and exit. + +.It Fl r , Fl restore +Load default font from /etc/sysconfig + +.It Fl v , Fl verbose +More warnings. + +.Sh ENVIROMENT +.Bl -tag -width /etc/master.passwdxx -compact +.Pa LANG +Prefered language. + + +.Sh FILES +.Bl -tag -width /etc/master.passwd -compact +.Pa /usr/share/syscons/keymaps/INDEX.keymaps +Database for keymaps. + +.Pa /usr/share/syscons/fonts/INDEX.fonts +Database for fonts. + +.Pa /etc/sysconfig +Default font. + + +.Pa /usr/X11/lib/X11/locale/locale.alias +Describe common LANG values. + +.Sh BUGS +.\" .Nm kbdmap/vidfont +.\" does not know which font is in use. E.g. if the current font +.\" is iso-8859-1 and you choise lang 'ru' (for russian) +.\" you get funny latin1 characters and not russkij shrift. +.\" +.Nm vidcontrol +and +.Nm kbdcontrol +work only on a (virtual) console an not with X11. + +.Sh SEE ALSO +.Xr kbdcontrol 1 , +.Xr vidcontrol 1 , +.Xr sysconfig 8 , +.Xr dialog 1 . + +.Sh HISTORY +.Nm kbdmap/vidfont +command appeared in FreeBSD 2.1 + +.Sh AUTHOR +Wolfram Schneider +.Aq wosch@cs.tu-berlin.de , +Germany. diff --git a/usr.sbin/kbdmap/kbdmap.pl b/usr.sbin/kbdmap/kbdmap.pl index 8146da795b33..8736d610d27c 100644 --- a/usr.sbin/kbdmap/kbdmap.pl +++ b/usr.sbin/kbdmap/kbdmap.pl @@ -1,6 +1,7 @@ #!/usr/bin/perl # # Copyright (c) March 1995 Wolfram Schneider. All rights reserved. +# Alle Rechte vorbehalten. Es gilt das kontinentaleuropäische Urheberrecht. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions @@ -30,63 +31,120 @@ # # -# kbdmap/kbdfont - front end for syscons +# kbdmap/vidfont - front end for syscons # -# E-Mail: Wolfram Schneider +# E-Mail: Wolfram Schneider +# +# $Id: kbdmap.pl,v 1.10 1995/04/03 21:13:52 w Exp $ # -system("kbdcontrol -d >/dev/null"); -die "You are on a virtual console?\n" . - "This program does not work with X11\n" if $?; +# simple test if syscons works +$x11 = system("kbdcontrol -d >/dev/null"); +if ($x11) { + warn "You are not on a virtual console - " . + "expect certain strange side-effects\n"; + sleep 2; +} + +#die "You are on a virtual console?\n" . +# "This program does not work with X11\n" if $?; + sub variables_static { - $lang = $ENV{'LANG'}; # use standard enviroment variable $LANG - $lang = "en" unless $lang; - $lang_default = "en"; - $program = $0; $program =~ s|.*/||; + $lang_default = "en"; # set default language + $lang = $ENV{'LC_CTYPE'} || $ENV{'LANG'} || $lang_default; + $lang = &lang($lang); + $program = $0; $program =~ s|.*/||; $program =~ s/\.(pl|perl)$//; $keymapdir = "/usr/share/syscons/keymaps"; $fontdir = "/usr/share/syscons/fonts"; - $index = "INDEX"; # Keyboard language database - $verbose = 0; + $sysconfig = "/etc/sysconfig"; - # menu - $menu_map{en} = "Choise your keyboard language"; - $menu_map{de} = "Wähle Deine Tastaturbelegung"; - $menu_font{en} = "Choise your keyboard font"; - $menu_font{de} = "Wähle Deine Schrift"; + #$keymapdir = "./syscons/keymaps"; + #$fontdir = "./syscons/fonts"; + #$sysconfig = "./sysconfig"; - %keymap = ''; -} + # read current font from sysconfig + $font_default = "cp437-8x16.fnt"; + $font_current = &font_current($font_default); -sub variables_dynamic { - if ($program eq "kbdmap") { - $menu = $menu_map{$lang}; + if ($program eq "kbdmap") { $dir = $keymapdir; } else { - $menu = $menu_font{$lang}; $dir = $fontdir; } - $dialog = "/usr/bin/dialog \\ ---clear \\ ---title \"Keyboard Menu\" \\ ---menu \"$menu\" \\ --1 -1 8"; + @langsupport = ('MENU', 'FONT'); # lang depended variables + $show = 0; # show which languages currently supported + $index = "INDEX"; # Keyboard language database + $verbose = 0; + %keymap = ''; +} + +sub lang { + local($lang) = @_; + + #$lang =~ s/_.*//; # strip country and font + $lang =~ s/^(C)$/en/; # aliases + #$lang =~ s/^(..).*/$1/; # use only first to characters + + return $lang; +} + +sub font_current { + local($font) = @_; + local($font_current); + + open(F, "$sysconfig") || warn "$sysconfig: $!\n"; + + while() { + /^#/ && next; + if (/^\s*font[0-9]+x[0-9]+\s*=\s*(\S+)/) { + $font_current = $1 if $1 ne "NO"; + } + } + close F; + + return $font_current if $font_current; + return $font; +} + +sub vidcontrol { + local($font) = @_; + + return $x11 if $x11; # syscons test failed + + if ($font =~ /.*([0-9]+x[0-9]+)(\.fnt)?$/) { + warn "vidcontrol -f $1 $font\n" if $verbose; + return system("vidcontrol -f $1 $font"); + } else { + warn "Which font size? ``$font''\n"; + return 1; + } } sub menu_read { local($e,@a,$mark,$ext); - local($keym, $lg, $desc); + local($keym, $lg, $dialect, $desc); + local(@langlist) = $lang_default; + + $ext = $dir; $ext =~ s|.*/||; + # en_US.ISO8859-1 -> en_..\.ISO8859-1 + ($dialect = $lang) =~ s/^(..)_..(.+)$/$1_..$2/; + # en_US.ISO8859-1 -> en + ($lang_abk = $lang) =~ s/^(..)_.*$/$1/; - $ext = $dir; $ext =~ s|.*/||; # read index database open(I, "$dir/$index.$ext") || warn "$dir/$index.$ext: $!\n"; while() { - chop; + # skip blank lines and comments /^#/ && next; + s/^\s+//; + /^\w/ || next; + s/\s+$//; ($keym, $lg, $desc) = split(/:/); - if (! -r "$keym" && ! -r "$dir/$keym") { + if (! -r "$keym" && ! -r "$dir/$keym" && + !grep(/$keym/, @langsupport)) { warn "$keym not found!\n" if $verbose; next; } @@ -94,24 +152,64 @@ sub menu_read { # set empty language to default language $lg = $lang_default if $lg eq ""; - # ----> 1) your choise if exist - # --> 2) default language if exist and not 1) - # -> 3) unknown language if 1) and 2) not exist - if ($lg eq $lang) { - # found your favorite language :-) + # save language + if ($show) { + foreach $e (split(/,/, $lg)) { + push(@langlist, $e) if !grep($_ eq $e, @langlist); + } + } + + # 4) your choise if exist + # 3) long match e.g. en_GB.ISO8859-1 is equal to en_..\.ISO8859-1 + # 2) short match 'de' + # 1) default langlist 'en' + # 0) any language + # + # language may be a kommalist + # higher match overwrite lower + # last entry overwrite previous if exist twice in database + + # found your favorite language :-) + if ($lg =~ /^(.+,)?$lang(,.+)?$/) { + $keymap{$keym} = $desc; + $mark{$keym} = 4; + } elsif ($mark{$keym} <= 3 && $lg =~ /^(.+,)?$dialect(,.+)?$/) { + # dialect $keymap{$keym} = $desc; - } elsif (!$keymap{$keym}) { - # found a language, but not your - # set mark if unknown language - $mark{$keym} = 1 if ($lg ne $lang_default); + $mark{$keym} = 3; + } elsif ($mark{$keym} <= 2 && $lg =~ /^(.+,)?$lang_abk(,.+)?$/) { + # abrevation $keymap{$keym} = $desc; - } elsif ($lg eq $lang_default && $mark{$keym}) { - # overwrite unknown language with default language + $mark{$keym} = 2; + } elsif ($mark{$keym} <= 1 && $lg =~ /^(.+,)?$lang_default(,.+)?$/) { + # default $keymap{$keym} = $desc; + $mark{$keym} = 1; + } elsif ($mark{$keym} <= 0) { + # any + $keymap{$keym} = $desc; + $mark{$keym} = 0; } } close I; + if ($show) { + @langlist = sort(@langlist); + print "Currently supported languages: @langlist\n"; + exit(0); + } + + # remove variables from list + local($ee); + foreach $e (@langsupport) { + ($ee = $e) =~ y/A-Z/a-z/; + eval "\$$ee = \"$keymap{$e}\""; + #warn "$e \$$ee = \"$keymap{$e}\""; + delete $keymap{$e}; + } + #warn "$font $font_default $font_current\n"; + + # look for keymaps which are not in database opendir(D, "$dir") || warn "$dir: $!\n"; foreach $e (readdir(D)) { @@ -123,18 +221,42 @@ sub menu_read { } closedir D; - # sort menu + # sort menu, font 8x8 is less than 8x14 and 8x16 foreach $e (sort(keys %keymap)) { push(@a, "\"$keymap{$e}\" \"\""); } + # side effects to @a + grep(s/8x8/8x08/, @a); @a = sort @a; - @a; + grep(s/8x08/8x8/, @a); + return @a; } sub dialog { local(@argv) = @_; local($tmp) = "/tmp/_kbd_lang$$"; + $dialog = "/usr/bin/dialog \\ +--clear \\ +--title \"Keyboard Menu\" \\ +--menu \"$menu\" \\ +-1 -1 10"; + + ## *always* start right font, don't believe that your current font + ## is equal with default font in /etc/sysconfig + ## see also at end of this function + ## if ($font) { + + # start right font, assume that current font is equal + # to default font in /etc/sysconfig + # + # $font is the font which require the language $lang; e.g. + # russian *need* a koi8 font + # $font_current is the current font from /etc/sysconfig + if ($font && $font ne $font_current) { + &vidcontrol($font); + } + # start dialog system("$dialog @argv 2> $tmp"); @@ -143,11 +265,10 @@ sub dialog { foreach $e (keys %keymap) { if ($keymap{$e} eq $choise) { if ($program eq "kbdmap") { - system("kbdcontrol -l $dir/$e\n"); + system("kbdcontrol -l $dir/$e\n") unless $x11; print "keymap=$e", "\n"; } else { - $f = $e; $f =~ s/\.fnt$//; $f =~ s/.*-//; - system("vidcontrol -f $f $dir/$e\n"); + &vidcontrol("$dir/$e"); $_ = $e; if (/^.*\-(.*)\.fnt/) { $font=$1 @@ -157,6 +278,10 @@ sub dialog { last; } } + # } else { + } elsif ($font && $font ne $font_current) { + # cancel, restore old font + &vidcontrol($font_current); } unlink $tmp; exit($?); @@ -164,7 +289,8 @@ sub dialog { sub usage { warn <) { + s/(\s|^|;)#.*//; # comments + s/\s+$//; # leading spaces + s/^\s+//; # ending spaces + s/\s+/ /g; # double spaces + s/\s*([=\(\{\)\}])\s*/$1/g; # spaces around =(){} + print "$_\n" if $_; +}