3 # Copyright (c) 2012-2013 Devin Teske
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
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.
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
29 ############################################################ INCLUDES
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
38 BSDCFG_LIBE="/usr/libexec/bsdconfig" APP_DIR="080.console"
39 f_include_lang $BSDCFG_LIBE/$APP_DIR/include/messages.subr
41 f_index_menusel_keyword $BSDCFG_LIBE/$APP_DIR/INDEX "$pgm" ipgm &&
44 ############################################################ CONFIGURATION
47 # List of 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
72 ############################################################ FUNCTIONS
76 # Display the dialog(1)-based application main menu.
80 local prompt="$msg_keymap_menu_text"
81 local menu_list defaultitem= # Calculated below
82 local hline="$hline_choose_a_keyboard_map"
85 # Export variables for awk(1) ENVIRON visibility
88 for name in $KEYMAP_NAMES; do
89 export msg_$name msg_${name}_desc
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.
98 for name in $KEYMAP_NAMES; do
99 eval echo \"\$msg_$name\" msg_$name
100 done | sort | awk 'BEGIN { prefix = "" }
102 cur_prefix = tolower(substr(ENVIRON[$NF], 1, 1))
104 if ( prefix != cur_prefix )
108 printf "%s'\'' '\''%s'\''\n",
109 ENVIRON[$NF], ENVIRON[$NF"_desc"]
113 local height width rows
114 eval f_dialog_menu_size height width rows \
116 \"\$DIALOG_BACKTITLE\" \
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.ctrl) defaultitem="$msg_usa_capslock_ctrl" ;;
176 us.pc-ctrl) defaultitem="$msg_usa_capslock_ctrl" ;;
177 us.dvorak) defaultitem="$msg_usa_dvorak" ;;
178 us.dvorakl) defaultitem="$msg_usa_dvorak_left" ;;
179 us.dvorakr) defaultitem="$msg_usa_dvorak_right" ;;
180 us.emacs) defaultitem="$msg_usa_emacs" ;;
181 us.iso) defaultitem="$msg_usa_iso" ;;
182 us.unix) defaultitem="$msg_usa_unix" ;;
185 # The defaultitem may have to be indented to match the menu_list
186 if [ "$defaultitem" ]; then
187 ( eval set -- $menu_list
188 while [ $# -gt 0 ]; do
189 [ "$defaultitem" = "$1" ] && break
190 [ " $defaultitem" = "$1" ] && exit 0
193 exit 1 # No modification needed
194 ) && defaultitem=" $defaultitem"
198 menu_choice=$( eval $DIALOG \
199 --title \"\$DIALOG_TITLE\" \
200 --backtitle \"\$DIALOG_BACKTITLE\" \
201 --hline \"\$hline\" \
202 --ok-label \"\$msg_ok\" \
203 --cancel-label \"\$msg_cancel\" \
204 --default-item \"\$defaultitem\" \
205 --menu \"\$prompt\" \
206 $height $width $rows \
208 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
211 f_dialog_menutag_store -s "$menu_choice"
215 ############################################################ MAIN
217 # Incorporate rc-file if it exists
218 [ -f "$HOME/.bsdconfigrc" ] && f_include "$HOME/.bsdconfigrc"
221 # Process command-line arguments
223 while getopts h$GETOPTS_STDARGS flag; do
225 h|\?) f_usage $BSDCFG_LIBE/$APP_DIR/USAGE "PROGRAM_NAME" "$pgm" ;;
228 shift $(( $OPTIND - 1 ))
233 f_dialog_title "$msg_system_console_keymap"
234 f_dialog_backtitle "${ipgm:+bsdconfig }$pgm"
238 # Launch application main menu
241 dialog_menu_main || f_die
242 f_dialog_menutag_fetch mtag
245 # Reverse the users choice into the variable name
248 mtag="${mtag# }" # remove single leading-space if-present
249 for name in $KEYMAP_NAMES; do
250 debug= f_getvar msg_$name msg
251 [ "$msg" = "$mtag" ] && keymap_name="$name" break
254 [ "$keymap_name" ] || continue
257 case "$keymap_name" in
258 belgian) keymap_to_set="be.iso" ;;
259 brazil_cp850) keymap_to_set="br275.cp850" ;;
260 brazil_iso) keymap_to_set="br275.iso" ;;
261 brazil_iso_accent) keymap_to_set="br275.iso.acc" ;;
262 bulgarian_bds) keymap_to_set="bg.bds.ctrlcaps" ;;
263 bulgarian_phonetic) keymap_to_set="bg.phonetic.ctrlcaps" ;;
264 central_european_iso) keymap_to_set="ce.iso2" ;;
265 croatian_iso) keymap_to_set="hr.iso" ;;
266 czech_iso_accent) keymap_to_set="cs.latin2.qwertz" ;;
267 danish_cp865) keymap_to_set="danish.cp865" ;;
268 danish_iso) keymap_to_set="danish.iso" ;;
269 estonian_cp850) keymap_to_set="estonian.cp850" ;;
270 estonian_iso) keymap_to_set="estonian.iso" ;;
271 estonian_iso_15) keymap_to_set="estonian.iso15" ;;
272 finnish_cp850) keymap_to_set="finnish.cp850" ;;
273 finnish_iso) keymap_to_set="finnish.iso" ;;
274 french_iso) keymap_to_set="fr.iso" ;;
275 french_iso_accent) keymap_to_set="fr.iso.acc" ;;
276 french_iso_macbook) keymap_to_set="fr.macbook.acc" ;;
277 german_cp850) keymap_to_set="german.cp850" ;;
278 german_iso) keymap_to_set="german.iso" ;;
279 greek_101) keymap_to_set="gr.us101.acc" ;;
280 greek_104) keymap_to_set="el.iso07" ;;
281 greek_elot) keymap_to_set="gr.elot.acc" ;;
282 hungarian_101) keymap_to_set="hu.iso2.101keys" ;;
283 hungarian_102) keymap_to_set="hu.iso2.102keys" ;;
284 icelandic) keymap_to_set="icelandic.iso" ;;
285 icelandic_accent) keymap_to_set="icelandic.iso.acc" ;;
286 italian) keymap_to_set="it.iso" ;;
287 japanese_106) keymap_to_set="jp.106" ;;
288 latin_american) keymap_to_set="latinamerican" ;;
289 latin_american_accent) keymap_to_set="latinamerican.iso.acc" ;;
290 norway_iso) keymap_to_set="norwegian.iso" ;;
291 polish_iso) keymap_to_set="pl_PL.ISO8859-2" ;;
292 portuguese) keymap_to_set="pt.iso" ;;
293 portuguese_accent) keymap_to_set="pt.iso.acc" ;;
294 russia_koi8_r) keymap_to_set="ru.koi8-r" ;;
295 slovak) keymap_to_set="sk.iso2" ;;
296 slovenian) keymap_to_set="si.iso" ;;
297 spanish) keymap_to_set="spanish.iso" ;;
298 spanish_accent) keymap_to_set="spanish.iso.acc" ;;
299 swedish_cp850) keymap_to_set="swedish.cp850" ;;
300 swedish_iso) keymap_to_set="swedish.iso" ;;
301 swiss_french_cp850) keymap_to_set="swissfrench.cp850" ;;
302 swiss_french_iso) keymap_to_set="swissfrench.iso" ;;
303 swiss_french_iso_accent) keymap_to_set="swissfrench.iso.acc" ;;
304 swiss_german_cp850) keymap_to_set="swissgerman.cp850" ;;
305 swiss_german_iso) keymap_to_set="swissgerman.iso" ;;
306 swiss_german_iso_accent) keymap_to_set="swissgerman.iso.acc" ;;
307 uk_cp850) keymap_to_set="uk.cp850" ;;
308 uk_iso) keymap_to_set="uk.iso" ;;
309 ukrainian_koi8_u) keymap_to_set="ua.koi8-u" ;;
310 ukrainian_koi8_u_koi8_r) keymap_to_set="ua.koi8-u.shift.alt" ;;
312 case "$( sysctl -n kern.vty )" in
313 vt) keymap_to_set="us.ctrl" ;;
314 *) keymap_to_set="us.pc-ctrl" ;;
317 usa_dvorak) keymap_to_set="us.dvorak" ;;
318 usa_dvorak_left) keymap_to_set="us.dvorakl" ;;
319 usa_dvorak_right) keymap_to_set="us.dvorakr" ;;
320 usa_emacs) keymap_to_set="us.emacs" ;;
321 usa_iso) keymap_to_set="us.iso" ;;
322 usa_unix) keymap_to_set="us.unix" ;;
325 if [ "$keymap_to_set" ]; then
326 f_eval_catch "$0" f_sysrc_set \
327 'f_sysrc_set keymap "%s"' "$keymap_to_set" || f_die
330 f_die 1 "$msg_unknown_keymap"
336 ################################################################################
338 ################################################################################