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 (INLUDING, 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 ipgm=$( f_index_menusel_keyword $BSDCFG_LIBE/$APP_DIR/INDEX "$pgm" )
42 [ $? -eq $SUCCESS -a "$ipgm" ] && 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.
81 local hline="$hline_choose_a_keyboard_map"
82 local prompt="$msg_keymap_menu_text"
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 size=$( eval f_dialog_menu_size \
115 \"\$DIALOG_BACKTITLE\" \
121 dialog_menu=$( eval $DIALOG \
122 --clear --title \"\$DIALOG_TITLE\" \
123 --backtitle \"\$DIALOG_BACKTITLE\" \
124 --hline \"\$hline\" \
125 --ok-label \"\$msg_ok\" \
126 --cancel-label \"\$msg_cancel\" \
127 --menu \"\$prompt\" $size \
129 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
132 setvar DIALOG_MENU_$$ "$dialog_menu"
136 ############################################################ MAIN
138 # Incorporate rc-file if it exists
139 [ -f "$HOME/.bsdconfigrc" ] && f_include "$HOME/.bsdconfigrc"
142 # Process command-line arguments
144 while getopts dD:hSX flag; do
146 h|\?) f_usage $BSDCFG_LIBE/$APP_DIR/USAGE "PROGRAM_NAME" "$pgm";;
149 shift $(( $OPTIND - 1 ))
154 f_dialog_title "$msg_system_console_keymap"
155 f_dialog_backtitle "${ipgm:+bsdconfig }$pgm"
159 # Launch application main menu
164 mtag=$( f_dialog_menutag )
166 [ $retval -eq 0 ] || f_die
169 # Reverse the users choice into the variable name
172 mtag="${mtag# }" # remove single leading-space if-present
173 for name in $KEYMAP_NAMES; do
174 if [ "$( eval echo \"\$msg_$name\" )" = "$mtag" ]; then
180 [ "$keymap_name" ] || continue
182 case "$keymap_name" in
184 f_sysrc_set keymap "be.iso" || f_die
187 f_sysrc_set keymap "br275.cp850" || f_die
190 f_sysrc_set keymap "br275.iso" || f_die
193 f_sysrc_set keymap "br275.iso.acc" || f_die
196 f_sysrc_set keymap "bg.bds.ctrlcaps" || f_die
199 f_sysrc_set keymap "bg.phonetic.ctrlcaps" || f_die
201 central_european_iso)
202 f_sysrc_set keymap "ce.iso2" || f_die
205 f_sysrc_set keymap "hr.iso" || f_die
208 f_sysrc_set keymap "cs.latin2.qwertz" || f_die
211 f_sysrc_set keymap "danish.cp865" || f_die
214 f_sysrc_set keymap "danish.iso" || f_die
217 f_sysrc_set keymap "estonian.cp850" || f_die
220 f_sysrc_set keymap "estonian.iso" || f_die
223 f_sysrc_set keymap "estonian.iso15" || f_die
226 f_sysrc_set keymap "finnish.cp850" || f_die
229 f_sysrc_set keymap "finnish.iso" || f_die
232 f_sysrc_set keymap "fr.iso" || f_die
235 f_sysrc_set keymap "fr.iso.acc" || f_die
238 f_sysrc_set keymap "fr.macbook.acc" || f_die
241 f_sysrc_set keymap "german.cp850" || f_die
244 f_sysrc_set keymap "german.iso" || f_die
247 f_sysrc_set keymap "gr.us101.acc" || f_die
250 f_sysrc_set keymap "el.iso07" || f_die
253 f_sysrc_set keymap "gr.elot.acc" || f_die
256 f_sysrc_set keymap "hu.iso2.101keys" || f_die
259 f_sysrc_set keymap "hu.iso2.102keys" || f_die
262 f_sysrc_set keymap "icelandic.iso" || f_die
265 f_sysrc_set keymap "icelandic.iso.acc" || f_die
268 f_sysrc_set keymap "it.iso" || f_die
271 f_sysrc_set keymap "jp.106" || f_die
274 f_sysrc_set keymap "latinamerican" || f_die
276 latin_american_accent)
277 f_sysrc_set keymap "latinamerican.iso.acc" || f_die
280 f_sysrc_set keymap "norwegian.iso" || f_die
283 f_sysrc_set keymap "pl_PL.ISO8859-2" || f_die
286 f_sysrc_set keymap "pt.iso" || f_die
289 f_sysrc_set keymap "pt.iso.acc" || f_die
292 f_sysrc_set keymap "ru.koi8-r" || f_die
295 f_sysrc_set keymap "sk.iso2" || f_die
298 f_sysrc_set keymap "si.iso" || f_die
301 f_sysrc_set keymap "spanish.iso" || f_die
304 f_sysrc_set keymap "spanish.iso.acc" || f_die
307 f_sysrc_set keymap "swedish.cp850" || f_die
310 f_sysrc_set keymap "swedish.iso" || f_die
313 f_sysrc_set keymap "swissfrench.cp850" || f_die
316 f_sysrc_set keymap "swissfrench.iso" || f_die
318 swiss_french_iso_accent)
319 f_sysrc_set keymap "swissfrench.iso.acc" || f_die
322 f_sysrc_set keymap "swissgerman.cp850" || f_die
325 f_sysrc_set keymap "swissgerman.iso" || f_die
327 swiss_german_iso_accent)
328 f_sysrc_set keymap "swissgerman.iso.acc" || f_die
331 f_sysrc_set keymap "uk.cp850" || f_die
334 f_sysrc_set keymap "uk.iso" || f_die
337 f_sysrc_set keymap "ua.koi8-u" || f_die
339 ukrainian_koi8_u_koi8_r)
340 f_sysrc_set keymap "ua.koi8-u.shift.alt" || f_die
343 f_sysrc_set keymap "us.pc-ctrl" || f_die
346 f_sysrc_set keymap "us.dvorak" || f_die
349 f_sysrc_set keymap "us.dvorakl" || f_die
352 f_sysrc_set keymap "us.dvorakr" || f_die
355 f_sysrc_set keymap "us.emacs" || f_die
358 f_sysrc_set keymap "us.iso" || f_die
361 f_sysrc_set keymap "us.unix" || f_die
368 ################################################################################
370 ################################################################################