keymap revision 251904
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 (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
25# SUCH DAMAGE.
26#
27# $FreeBSD: head/usr.sbin/bsdconfig/console/keymap 251904 2013-06-18 07:33:45Z dteske $
28#
29############################################################ INCLUDES
30
31BSDCFG_SHARE="/usr/share/bsdconfig"
32. $BSDCFG_SHARE/common.subr || exit 1
33f_dprintf "%s: loading includes..." "$0"
34f_include $BSDCFG_SHARE/dialog.subr
35f_include $BSDCFG_SHARE/mustberoot.subr
36f_include $BSDCFG_SHARE/sysrc.subr
37
38BSDCFG_LIBE="/usr/libexec/bsdconfig" APP_DIR="080.console"
39f_include_lang $BSDCFG_LIBE/$APP_DIR/include/messages.subr
40
41ipgm=$( 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#
49KEYMAP_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#
78dialog_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#
222while getopts h$GETOPTS_STDARGS flag; do
223	case "$flag" in
224	h|\?) f_usage $BSDCFG_LIBE/$APP_DIR/USAGE "PROGRAM_NAME" "$pgm";;
225	esac
226done
227shift $(( $OPTIND - 1 ))
228
229#
230# Initialize
231#
232f_dialog_title "$msg_system_console_keymap"
233f_dialog_backtitle "${ipgm:+bsdconfig }$pgm"
234f_mustberoot_init
235
236#
237# Launch application main menu
238#
239while :; 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	case "$keymap_name" in
258	belgian)
259		f_sysrc_set keymap "be.iso" || f_die
260		break ;;
261	brazil_cp850)
262		f_sysrc_set keymap "br275.cp850" || f_die
263		break ;;
264	brazil_iso)
265		f_sysrc_set keymap "br275.iso" || f_die
266		break ;;
267	brazil_iso_accent)
268		f_sysrc_set keymap "br275.iso.acc" || f_die
269		break ;;
270	bulgarian_bds)
271		f_sysrc_set keymap "bg.bds.ctrlcaps" || f_die
272		break ;;
273	bulgarian_phonetic)
274		f_sysrc_set keymap "bg.phonetic.ctrlcaps" || f_die
275		break ;;
276	central_european_iso)
277		f_sysrc_set keymap "ce.iso2" || f_die
278		break ;;
279	croatian_iso)
280		f_sysrc_set keymap "hr.iso" || f_die
281		break ;;
282	czech_iso_accent)
283		f_sysrc_set keymap "cs.latin2.qwertz" || f_die
284		break ;;
285	danish_cp865)
286		f_sysrc_set keymap "danish.cp865" || f_die
287		break ;;
288	danish_iso)
289		f_sysrc_set keymap "danish.iso" || f_die
290		break ;;
291	estonian_cp850)
292		f_sysrc_set keymap "estonian.cp850" || f_die
293		break ;;
294	estonian_iso)
295		f_sysrc_set keymap "estonian.iso" || f_die
296		break ;;
297	estonian_iso_15)
298		f_sysrc_set keymap "estonian.iso15" || f_die
299		break ;;
300	finnish_cp850)
301		f_sysrc_set keymap "finnish.cp850" || f_die
302		break ;;
303	finnish_iso)
304		f_sysrc_set keymap "finnish.iso" || f_die
305		break ;;
306	french_iso)
307		f_sysrc_set keymap "fr.iso" || f_die
308		break ;;
309	french_iso_accent)
310		f_sysrc_set keymap "fr.iso.acc" || f_die
311		break ;;
312	french_iso_macbook)
313		f_sysrc_set keymap "fr.macbook.acc" || f_die
314		break ;;
315	german_cp850)
316		f_sysrc_set keymap "german.cp850" || f_die
317		break ;;
318	german_iso)
319		f_sysrc_set keymap "german.iso" || f_die
320		break ;;
321	greek_101)
322		f_sysrc_set keymap "gr.us101.acc" || f_die
323		break ;;
324	greek_104)
325		f_sysrc_set keymap "el.iso07" || f_die
326		break ;;
327	greek_elot)
328		f_sysrc_set keymap "gr.elot.acc" || f_die
329		break ;;
330	hungarian_101)
331		f_sysrc_set keymap "hu.iso2.101keys" || f_die
332		break ;;
333	hungarian_102)
334		f_sysrc_set keymap "hu.iso2.102keys" || f_die
335		break ;;
336	icelandic)
337		f_sysrc_set keymap "icelandic.iso" || f_die
338		break ;;
339	icelandic_accent)
340		f_sysrc_set keymap "icelandic.iso.acc" || f_die
341		break ;;
342	italian)
343		f_sysrc_set keymap "it.iso" || f_die
344		break ;;
345	japanese_106)
346		f_sysrc_set keymap "jp.106" || f_die
347		break ;;
348	latin_american)
349		f_sysrc_set keymap "latinamerican" || f_die
350		break ;;
351	latin_american_accent)
352		f_sysrc_set keymap "latinamerican.iso.acc" || f_die
353		break ;;
354	norway_iso)
355		f_sysrc_set keymap "norwegian.iso" || f_die
356		break ;;
357	polish_iso)
358		f_sysrc_set keymap "pl_PL.ISO8859-2" || f_die
359		break ;;
360	portuguese)
361		f_sysrc_set keymap "pt.iso" || f_die
362		break ;;
363	portuguese_accent)
364		f_sysrc_set keymap "pt.iso.acc" || f_die
365		break ;;
366	russia_koi8_r)
367		f_sysrc_set keymap "ru.koi8-r" || f_die
368		break ;;
369	slovak) 
370		f_sysrc_set keymap "sk.iso2" || f_die
371		break ;;
372	slovenian)
373		f_sysrc_set keymap "si.iso" || f_die
374		break ;;
375	spanish)
376		f_sysrc_set keymap "spanish.iso" || f_die
377		break ;;
378	spanish_accent)
379		f_sysrc_set keymap "spanish.iso.acc" || f_die
380		break ;;
381	swedish_cp850)
382		f_sysrc_set keymap "swedish.cp850" || f_die
383		break ;;
384	swedish_iso)
385		f_sysrc_set keymap "swedish.iso" || f_die
386		break ;;
387	swiss_french_cp850)
388		f_sysrc_set keymap "swissfrench.cp850" || f_die
389		break ;;
390	swiss_french_iso)
391		f_sysrc_set keymap "swissfrench.iso" || f_die
392		break ;;
393	swiss_french_iso_accent)
394		f_sysrc_set keymap "swissfrench.iso.acc" || f_die
395		break ;;
396	swiss_german_cp850)
397		f_sysrc_set keymap "swissgerman.cp850" || f_die
398		break ;;
399	swiss_german_iso)
400		f_sysrc_set keymap "swissgerman.iso" || f_die
401		break ;;
402	swiss_german_iso_accent)
403		f_sysrc_set keymap "swissgerman.iso.acc" || f_die
404		break ;;
405	uk_cp850)
406		f_sysrc_set keymap "uk.cp850" || f_die
407		break ;;
408	uk_iso)
409		f_sysrc_set keymap "uk.iso" || f_die
410		break ;;
411	ukrainian_koi8_u)
412		f_sysrc_set keymap "ua.koi8-u" || f_die
413		break ;;
414	ukrainian_koi8_u_koi8_r)
415		f_sysrc_set keymap "ua.koi8-u.shift.alt" || f_die
416		break ;;
417	usa_capslock_ctrl)
418		f_sysrc_set keymap "us.pc-ctrl" || f_die
419		break ;;
420	usa_dvorak)
421		f_sysrc_set keymap "us.dvorak" || f_die
422		break ;;
423	usa_dvorak_left)
424		f_sysrc_set keymap "us.dvorakl" || f_die
425		break ;;
426	usa_dvorak_right)
427		f_sysrc_set keymap "us.dvorakr" || f_die
428		break ;;
429	usa_emacs)
430		f_sysrc_set keymap "us.emacs" || f_die
431		break ;;
432	usa_iso)
433		f_sysrc_set keymap "us.iso" || f_die
434		break ;;
435	usa_unix)
436		f_sysrc_set keymap "us.unix" || f_die
437		break ;;
438	esac
439done
440
441exit $SUCCESS
442
443################################################################################
444# END
445################################################################################
446