]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - usr.sbin/bsdconfig/console/keymap
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / usr.sbin / bsdconfig / console / keymap
1 #!/bin/sh
2 #-
3 # Copyright (c) 2012-2013 Devin Teske
4 # All rights reserved.
5 #
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
8 # are met:
9 # 1. Redistributions of source code must retain the above copyright
10 #    notice, this list of conditions and the following disclaimer.
11 # 2. Redistributions in binary form must reproduce the above copyright
12 #    notice, this list of conditions and the following disclaimer in the
13 #    documentation and/or other materials provided with the distribution.
14 #
15 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 # ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 # SUCH DAMAGE.
26 #
27 # $FreeBSD$
28 #
29 ############################################################ INCLUDES
30
31 BSDCFG_SHARE="/usr/share/bsdconfig"
32 . $BSDCFG_SHARE/common.subr || exit 1
33 f_dprintf "%s: loading includes..." "$0"
34 f_include $BSDCFG_SHARE/dialog.subr
35 f_include $BSDCFG_SHARE/mustberoot.subr
36 f_include $BSDCFG_SHARE/sysrc.subr
37
38 BSDCFG_LIBE="/usr/libexec/bsdconfig" APP_DIR="080.console"
39 f_include_lang $BSDCFG_LIBE/$APP_DIR/include/messages.subr
40
41 ipgm=$( f_index_menusel_keyword $BSDCFG_LIBE/$APP_DIR/INDEX "$pgm" )
42 [ $? -eq $SUCCESS -a "$ipgm" ] && pgm="$ipgm"
43
44 ############################################################ CONFIGURATION
45
46 #
47 # List of keymap names
48 #
49 KEYMAP_NAMES="
50         belgian                  brazil_cp850             brazil_iso
51         brazil_iso_accent        bulgarian_bds            bulgarian_phonetic
52         central_european_iso     croatian_iso             czech_iso_accent
53         danish_cp865             danish_iso               estonian_cp850
54         estonian_iso             estonian_iso_15          finnish_cp850
55         finnish_iso              french_iso               french_iso_accent
56         french_iso_macbook       german_cp850             german_iso
57         greek_101                greek_104                greek_elot
58         hungarian_101            hungarian_102            icelandic
59         icelandic_accent         italian                  japanese_106
60         latin_american           latin_american_accent    norway_iso
61         polish_iso               portuguese               portuguese_accent
62         russia_koi8_r            slovak                   slovenian
63         spanish                  spanish_accent           swedish_cp850
64         swedish_iso              swiss_french_cp850       swiss_french_iso
65         swiss_french_iso_accent  swiss_german_cp850       swiss_german_iso
66         swiss_german_iso_accent  uk_cp850                 uk_iso
67         ukrainian_koi8_u         ukrainian_koi8_u_koi8_r  usa_capslock_ctrl
68         usa_dvorak               usa_dvorak_left          usa_dvorak_right
69         usa_emacs                usa_iso                  usa_unix
70 " # END-QUOTE
71
72 ############################################################ FUNCTIONS
73
74 # dialog_menu_main
75 #
76 # Display the dialog(1)-based application main menu.
77 #
78 dialog_menu_main()
79 {
80         local prompt="$msg_keymap_menu_text"
81         local menu_list defaultitem= # Calculated below
82         local hline="$hline_choose_a_keyboard_map"
83
84         #
85         # Export variables for awk(1) ENVIRON visibility
86         #
87         local name
88         for name in $KEYMAP_NAMES; do
89                 export msg_$name msg_${name}_desc
90         done
91
92         #
93         # Generate a sorted list of keymaps. If the first letter of the keymap
94         # name is unique (case-insensitive) then it is used as the tag to allow
95         # the user to jump to that entry.
96         #
97         menu_list=$(
98                 for name in $KEYMAP_NAMES; do
99                         eval echo \"\$msg_$name\" msg_$name
100                 done | sort | awk 'BEGIN { prefix = "" }
101                 {
102                         cur_prefix = tolower(substr(ENVIRON[$NF], 1, 1))
103                         printf "'\''"
104                         if ( prefix != cur_prefix )
105                                 prefix = cur_prefix
106                         else
107                                 printf " "
108                         printf "%s'\'' '\''%s'\''\n",
109                                ENVIRON[$NF], ENVIRON[$NF"_desc"]
110                 }'
111         )
112
113         local height width rows
114         eval f_dialog_menu_size height width rows \
115                                 \"\$DIALOG_TITLE\"     \
116                                 \"\$DIALOG_BACKTITLE\" \
117                                 \"\$prompt\"           \
118                                 \"\$hline\"            \
119                                 $menu_list
120
121         case "$( f_sysrc_get keymap )" in
122         be.iso)                defaultitem="$msg_belgian"                 ;;
123         br275.cp850)           defaultitem="$msg_brazil_cp850"            ;;
124         br275.iso)             defaultitem="$msg_brazil_iso"              ;;
125         br275.iso.acc)         defaultitem="$msg_brazil_iso_accent"       ;;
126         bg.bds.ctrlcaps)       defaultitem="$msg_bulgarian_bds"           ;;
127         bg.phonetic.ctrlcaps)  defaultitem="$msg_bulgarian_phonetic"      ;;
128         ce.iso2)               defaultitem="$msg_central_european_iso"    ;;
129         hr.iso)                defaultitem="$msg_croatian_iso"            ;;
130         cs.latin2.qwertz)      defaultitem="$msg_czech_iso_accent"        ;;
131         danish.cp865)          defaultitem="$msg_danish_cp865"            ;;
132         danish.iso)            defaultitem="$msg_danish_iso"              ;;
133         estonian.cp850)        defaultitem="$msg_estonian_cp850"          ;;
134         estonian.iso)          defaultitem="$msg_estonian_iso"            ;;
135         estonian.iso15)        defaultitem="$msg_estonian_iso_15"         ;;
136         finnish.cp850)         defaultitem="$msg_finnish_cp850"           ;;
137         finnish.iso)           defaultitem="$msg_finnish_iso"             ;;
138         fr.iso)                defaultitem="$msg_french_iso"              ;;
139         fr.iso.acc)            defaultitem="$msg_french_iso_accent"       ;;
140         fr.macbook.acc)        defaultitem="$msg_french_iso_macbook"      ;;
141         german.cp850)          defaultitem="$msg_german_cp850"            ;;
142         german.iso)            defaultitem="$msg_german_iso"              ;;
143         gr.us101.acc)          defaultitem="$msg_greek_101"               ;;
144         el.iso07)              defaultitem="$msg_greek_104"               ;;
145         gr.elot.acc)           defaultitem="$msg_greek_elot"              ;;
146         hu.iso2.101keys)       defaultitem="$msg_hungarian_101"           ;;
147         hu.iso2.102keys)       defaultitem="$msg_hungarian_102"           ;;
148         icelandic.iso)         defaultitem="$msg_icelandic"               ;;
149         icelandic.iso.acc)     defaultitem="$msg_icelandic_accent"        ;;
150         it.iso)                defaultitem="$msg_italian"                 ;;
151         jp.106)                defaultitem="$msg_japanese_106"            ;;
152         latinamerican)         defaultitem="$msg_latin_american"          ;;
153         latinamerican.iso.acc) defaultitem="$msg_latin_american_accent"   ;;
154         norwegian.iso)         defaultitem="$msg_norway_iso"              ;;
155         pl_PL.ISO8859-2)       defaultitem="$msg_polish_iso"              ;;
156         pt.iso)                defaultitem="$msg_portuguese"              ;;
157         pt.iso.acc)            defaultitem="$msg_portuguese_accent"       ;;
158         ru.koi8-r)             defaultitem="$msg_russia_koi8_r"           ;;
159         sk.iso2)               defaultitem="$msg_slovak"                  ;;
160         si.iso)                defaultitem="$msg_slovenian"               ;;
161         spanish.iso)           defaultitem="$msg_spanish"                 ;;
162         spanish.iso.acc)       defaultitem="$msg_spanish_accent"          ;;
163         swedish.cp850)         defaultitem="$msg_swedish_cp850"           ;;
164         swedish.iso)           defaultitem="$msg_swedish_iso"             ;;
165         swissfrench.cp850)     defaultitem="$msg_swiss_french_cp850"      ;;
166         swissfrench.iso)       defaultitem="$msg_swiss_french_iso"        ;;
167         swissfrench.iso.acc)   defaultitem="$msg_swiss_french_iso_accent" ;;
168         swissgerman.cp850)     defaultitem="$msg_swiss_german_cp850"      ;;
169         swissgerman.iso)       defaultitem="$msg_swiss_german_iso"        ;;
170         swissgerman.iso.acc)   defaultitem="$msg_swiss_german_iso_accent" ;;
171         uk.cp850)              defaultitem="$msg_uk_cp850"                ;;
172         uk.iso)                defaultitem="$msg_uk_iso"                  ;;
173         ua.koi8-u)             defaultitem="$msg_ukrainian_koi8_u"        ;;
174         ua.koi8-u.shift.alt)   defaultitem="$msg_ukrainian_koi8_u_koi8_r" ;;
175         us.pc-ctrl)            defaultitem="$msg_usa_capslock_ctrl"       ;;
176         us.dvorak)             defaultitem="$msg_usa_dvorak"              ;;
177         us.dvorakl)            defaultitem="$msg_usa_dvorak_left"         ;;
178         us.dvorakr)            defaultitem="$msg_usa_dvorak_right"        ;;
179         us.emacs)              defaultitem="$msg_usa_emacs"               ;;
180         us.iso)                defaultitem="$msg_usa_iso"                 ;;
181         us.unix)               defaultitem="$msg_usa_unix"                ;;
182         esac
183
184         # The defaultitem may have to be indented to match the menu_list
185         if [ "$defaultitem" ]; then
186                 ( eval set -- $menu_list
187                   while [ $# -gt 0 ]; do
188                         [ "$defaultitem" = "$1" ] && break
189                         [ " $defaultitem" = "$1" ] && exit 0
190                         shift 2 # tag/item
191                   done
192                   exit 1 # No modification needed
193                 ) && defaultitem=" $defaultitem"
194         fi
195
196         local menu_choice
197         menu_choice=$( eval $DIALOG \
198                 --title \"\$DIALOG_TITLE\"         \
199                 --backtitle \"\$DIALOG_BACKTITLE\" \
200                 --hline \"\$hline\"                \
201                 --ok-label \"\$msg_ok\"            \
202                 --cancel-label \"\$msg_cancel\"    \
203                 --default-item \"\$defaultitem\"   \
204                 --menu \"\$prompt\"                \
205                 $height $width $rows               \
206                 $menu_list                         \
207                 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
208         )
209         local retval=$?
210         f_dialog_menutag_store -s "$menu_choice"
211         return $retval
212 }
213
214 ############################################################ MAIN
215
216 # Incorporate rc-file if it exists
217 [ -f "$HOME/.bsdconfigrc" ] && f_include "$HOME/.bsdconfigrc"
218
219 #
220 # Process command-line arguments
221 #
222 while getopts h$GETOPTS_STDARGS flag; do
223         case "$flag" in
224         h|\?) f_usage $BSDCFG_LIBE/$APP_DIR/USAGE "PROGRAM_NAME" "$pgm" ;;
225         esac
226 done
227 shift $(( $OPTIND - 1 ))
228
229 #
230 # Initialize
231 #
232 f_dialog_title "$msg_system_console_keymap"
233 f_dialog_backtitle "${ipgm:+bsdconfig }$pgm"
234 f_mustberoot_init
235
236 #
237 # Launch application main menu
238 #
239 while :; do
240         dialog_menu_main || f_die
241         f_dialog_menutag_fetch mtag
242
243         #
244         # Reverse the users choice into the variable name
245         #
246         keymap_name=
247         mtag="${mtag# }" # remove single leading-space if-present
248         for name in $KEYMAP_NAMES; do
249                 if [ "$( eval echo \"\$msg_$name\" )" = "$mtag" ]; then
250                         keymap_name="$name"
251                         break
252                 fi
253         done
254
255         [ "$keymap_name" ] || continue
256
257         keymap_to_set=
258         case "$keymap_name" in
259         belgian)                 keymap_to_set="be.iso"                ;;
260         brazil_cp850)            keymap_to_set="br275.cp850"           ;;
261         brazil_iso)              keymap_to_set="br275.iso"             ;;
262         brazil_iso_accent)       keymap_to_set="br275.iso.acc"         ;;
263         bulgarian_bds)           keymap_to_set="bg.bds.ctrlcaps"       ;;
264         bulgarian_phonetic)      keymap_to_set="bg.phonetic.ctrlcaps"  ;;
265         central_european_iso)    keymap_to_set="ce.iso2"               ;;
266         croatian_iso)            keymap_to_set="hr.iso"                ;;
267         czech_iso_accent)        keymap_to_set="cs.latin2.qwertz"      ;;
268         danish_cp865)            keymap_to_set="danish.cp865"          ;;
269         danish_iso)              keymap_to_set="danish.iso"            ;;
270         estonian_cp850)          keymap_to_set="estonian.cp850"        ;;
271         estonian_iso)            keymap_to_set="estonian.iso"          ;;
272         estonian_iso_15)         keymap_to_set="estonian.iso15"        ;;
273         finnish_cp850)           keymap_to_set="finnish.cp850"         ;;
274         finnish_iso)             keymap_to_set="finnish.iso"           ;;
275         french_iso)              keymap_to_set="fr.iso"                ;;
276         french_iso_accent)       keymap_to_set="fr.iso.acc"            ;;
277         french_iso_macbook)      keymap_to_set="fr.macbook.acc"        ;;
278         german_cp850)            keymap_to_set="german.cp850"          ;;
279         german_iso)              keymap_to_set="german.iso"            ;;
280         greek_101)               keymap_to_set="gr.us101.acc"          ;;
281         greek_104)               keymap_to_set="el.iso07"              ;;
282         greek_elot)              keymap_to_set="gr.elot.acc"           ;;
283         hungarian_101)           keymap_to_set="hu.iso2.101keys"       ;;
284         hungarian_102)           keymap_to_set="hu.iso2.102keys"       ;;
285         icelandic)               keymap_to_set="icelandic.iso"         ;;
286         icelandic_accent)        keymap_to_set="icelandic.iso.acc"     ;;
287         italian)                 keymap_to_set="it.iso"                ;;
288         japanese_106)            keymap_to_set="jp.106"                ;;
289         latin_american)          keymap_to_set="latinamerican"         ;;
290         latin_american_accent)   keymap_to_set="latinamerican.iso.acc" ;;
291         norway_iso)              keymap_to_set="norwegian.iso"         ;;
292         polish_iso)              keymap_to_set="pl_PL.ISO8859-2"       ;;
293         portuguese)              keymap_to_set="pt.iso"                ;;
294         portuguese_accent)       keymap_to_set="pt.iso.acc"            ;;
295         russia_koi8_r)           keymap_to_set="ru.koi8-r"             ;;
296         slovak)                  keymap_to_set="sk.iso2"               ;;
297         slovenian)               keymap_to_set="si.iso"                ;;
298         spanish)                 keymap_to_set="spanish.iso"           ;;
299         spanish_accent)          keymap_to_set="spanish.iso.acc"       ;;
300         swedish_cp850)           keymap_to_set="swedish.cp850"         ;;
301         swedish_iso)             keymap_to_set="swedish.iso"           ;;
302         swiss_french_cp850)      keymap_to_set="swissfrench.cp850"     ;;
303         swiss_french_iso)        keymap_to_set="swissfrench.iso"       ;;
304         swiss_french_iso_accent) keymap_to_set="swissfrench.iso.acc"   ;;
305         swiss_german_cp850)      keymap_to_set="swissgerman.cp850"     ;;
306         swiss_german_iso)        keymap_to_set="swissgerman.iso"       ;;
307         swiss_german_iso_accent) keymap_to_set="swissgerman.iso.acc"   ;;
308         uk_cp850)                keymap_to_set="uk.cp850"              ;;
309         uk_iso)                  keymap_to_set="uk.iso"                ;;
310         ukrainian_koi8_u)        keymap_to_set="ua.koi8-u"             ;;
311         ukrainian_koi8_u_koi8_r) keymap_to_set="ua.koi8-u.shift.alt"   ;;
312         usa_capslock_ctrl)       keymap_to_set="us.pc-ctrl"            ;;
313         usa_dvorak)              keymap_to_set="us.dvorak"             ;;
314         usa_dvorak_left)         keymap_to_set="us.dvorakl"            ;;
315         usa_dvorak_right)        keymap_to_set="us.dvorakr"            ;;
316         usa_emacs)               keymap_to_set="us.emacs"              ;;
317         usa_iso)                 keymap_to_set="us.iso"                ;;
318         usa_unix)                keymap_to_set="us.unix"               ;;
319         esac
320
321         if [ "$keymap_to_set" ]; then
322                 f_sysrc_set keymap "$keymap_to_set" || f_die
323                 break
324         else
325                 f_die 1 "$msg_unknown_keymap"
326         fi
327 done
328
329 exit $SUCCESS
330
331 ################################################################################
332 # END
333 ################################################################################