xref: /freebsd/usr.sbin/bsdinstall/scripts/keymap (revision 133e25d3b7ea5c9fcf2c4ca85fa2b419dc4ec424)
12118f387SNathan Whitehorn#!/bin/sh
22118f387SNathan Whitehorn#-
32118f387SNathan Whitehorn# Copyright (c) 2011 Nathan Whitehorn
4*133e25d3SDevin Teske# Copyright (c) 2013 Devin Teske
52118f387SNathan Whitehorn# All rights reserved.
62118f387SNathan Whitehorn#
72118f387SNathan Whitehorn# Redistribution and use in source and binary forms, with or without
82118f387SNathan Whitehorn# modification, are permitted provided that the following conditions
92118f387SNathan Whitehorn# are met:
102118f387SNathan Whitehorn# 1. Redistributions of source code must retain the above copyright
112118f387SNathan Whitehorn#    notice, this list of conditions and the following disclaimer.
122118f387SNathan Whitehorn# 2. Redistributions in binary form must reproduce the above copyright
132118f387SNathan Whitehorn#    notice, this list of conditions and the following disclaimer in the
142118f387SNathan Whitehorn#    documentation and/or other materials provided with the distribution.
152118f387SNathan Whitehorn#
162118f387SNathan Whitehorn# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
172118f387SNathan Whitehorn# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
182118f387SNathan Whitehorn# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
192118f387SNathan Whitehorn# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
202118f387SNathan Whitehorn# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
212118f387SNathan Whitehorn# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
222118f387SNathan Whitehorn# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
232118f387SNathan Whitehorn# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
242118f387SNathan Whitehorn# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
252118f387SNathan Whitehorn# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
262118f387SNathan Whitehorn# SUCH DAMAGE.
272118f387SNathan Whitehorn#
282118f387SNathan Whitehorn# $FreeBSD$
29*133e25d3SDevin Teske#
30*133e25d3SDevin Teske############################################################ INCLUDES
312118f387SNathan Whitehorn
32*133e25d3SDevin TeskeBSDCFG_SHARE="/usr/share/bsdconfig"
33*133e25d3SDevin Teske. $BSDCFG_SHARE/common.subr || exit 1
34*133e25d3SDevin Teskef_dprintf "%s: loading includes..." "$0"
35*133e25d3SDevin Teskef_include $BSDCFG_SHARE/dialog.subr
36*133e25d3SDevin Teskef_include $BSDCFG_SHARE/keymap.subr
37*133e25d3SDevin Teskef_include $BSDCFG_SHARE/sysrc.subr
38*133e25d3SDevin Teske
39*133e25d3SDevin Teske############################################################ CONFIGURATION
40*133e25d3SDevin Teske
41*133e25d3SDevin Teske#
42*133e25d3SDevin Teske# Default file to store keymap selection in
43*133e25d3SDevin Teske#
44*133e25d3SDevin Teske: ${KEYMAPFILE:=$BSDINSTALL_TMPETC/rc.conf.keymap}
45*133e25d3SDevin Teske
46*133e25d3SDevin Teske#
47*133e25d3SDevin Teske# Default path to keymap INDEX containing descriptions
48*133e25d3SDevin Teske#
49*133e25d3SDevin Teske: ${MAPDESCFILE:=/usr/share/syscons/keymaps/INDEX.keymaps}
50*133e25d3SDevin Teske
51*133e25d3SDevin Teske############################################################ GLOBALS
52*133e25d3SDevin Teske
53*133e25d3SDevin Teske#
54*133e25d3SDevin Teske# Strings that should be moved to an i18n file and loaded with f_include_lang()
55*133e25d3SDevin Teske#
56*133e25d3SDevin Teskehline_arrows_tab_enter="Press arrows, TAB or ENTER"
57*133e25d3SDevin Teskemsg_continue_with_keymap="Continue with %s keymap"
58*133e25d3SDevin Teskemsg_default="default"
59*133e25d3SDevin Teskemsg_error="Error"
60*133e25d3SDevin Teskemsg_freebsd_installer="FreeBSD Installer"
61*133e25d3SDevin Teskemsg_keymap_menu_text="The system console driver for FreeBSD defaults to standard \"US\"\nkeyboard map. Other keymaps can be chosen below."
62*133e25d3SDevin Teskemsg_keymap_selection="Keymap Selection"
63*133e25d3SDevin Teskemsg_ok="OK"
64*133e25d3SDevin Teskemsg_select="Select"
65*133e25d3SDevin Teskemsg_test_keymap="Test %s keymap"
66*133e25d3SDevin Teskemsg_test_the_currently_selected_keymap="Test the currently selected keymap"
67*133e25d3SDevin Teskemsg_test_the_keymap_by_typing="Test the keymap by typing letters, numbers, and symbols. Characters\nshould match labels on the keyboard keys. Press Enter to stop testing."
68*133e25d3SDevin Teske
69*133e25d3SDevin Teske############################################################ FUNCTIONS
70*133e25d3SDevin Teske
71*133e25d3SDevin Teske# dialog_keymap_test $keymap
72*133e25d3SDevin Teske#
73*133e25d3SDevin Teske# Activate $keymap and display an input box (without cancel button) for the
74*133e25d3SDevin Teske# user to test keyboard input and return. Always returns success.
75*133e25d3SDevin Teske#
76*133e25d3SDevin Teskedialog_keymap_test()
77*133e25d3SDevin Teske{
78*133e25d3SDevin Teske	local keym="$1"
79*133e25d3SDevin Teske	local title= # Calculated below
80*133e25d3SDevin Teske	local btitle= # Calculated below
81*133e25d3SDevin Teske	local prompt="$msg_test_the_keymap_by_typing"
82*133e25d3SDevin Teske	local hline=
83*133e25d3SDevin Teske
84*133e25d3SDevin Teske	# Attempt to activate the keymap
85*133e25d3SDevin Teske	if [ "$keym" ]; then
86*133e25d3SDevin Teske		local err
87*133e25d3SDevin Teske		err=$( f_keymap_kbdcontrol "$keym" 2>&1 > /dev/null )
88*133e25d3SDevin Teske		if [ "$err" ]; then
89*133e25d3SDevin Teske			f_dialog_title "$msg_error"
90*133e25d3SDevin Teske			f_dialog_msgbox "$err"
91*133e25d3SDevin Teske			f_dialog_title_restore
92*133e25d3SDevin Teske			return $FAILURE
932118f387SNathan Whitehorn		fi
94*133e25d3SDevin Teske	fi
95*133e25d3SDevin Teske
96*133e25d3SDevin Teske	f_dialog_title "$( printf "$msg_test_keymap" "${keym:-$msg_default}" )"
97*133e25d3SDevin Teske	title="$DIALOG_TITLE"
98*133e25d3SDevin Teske	btitle="$DIALOG_BACKTITLE"
99*133e25d3SDevin Teske	f_dialog_title_restore
100*133e25d3SDevin Teske
101*133e25d3SDevin Teske	local height width
102*133e25d3SDevin Teske	f_dialog_inputbox_size height width \
103*133e25d3SDevin Teske		"$title" "$btitle" "$prompt" "" "$hline"
104*133e25d3SDevin Teske
105*133e25d3SDevin Teske	$DIALOG \
106*133e25d3SDevin Teske		--title "$title"      \
107*133e25d3SDevin Teske		--backtitle "$btitle" \
108*133e25d3SDevin Teske		--hline "$hline"      \
109*133e25d3SDevin Teske		--ok-label "$msg_ok"  \
110*133e25d3SDevin Teske		--no-cancel           \
111*133e25d3SDevin Teske		--inputbox "$prompt"  \
112*133e25d3SDevin Teske		$height $width        \
113*133e25d3SDevin Teske		2>/dev/null >&$DIALOG_TERMINAL_PASSTHRU_FD
114*133e25d3SDevin Teske
115*133e25d3SDevin Teske	return $DIALOG_OK
116*133e25d3SDevin Teske}
117*133e25d3SDevin Teske
118*133e25d3SDevin Teske############################################################ MAIN
119*133e25d3SDevin Teske
120*133e25d3SDevin Teske#
121*133e25d3SDevin Teske# Initialize
122*133e25d3SDevin Teske#
123*133e25d3SDevin Teskef_dialog_title "$msg_keymap_selection"
124*133e25d3SDevin Teskef_dialog_backtitle "$msg_freebsd_installer"
125*133e25d3SDevin Teske
126*133e25d3SDevin Teske#
127*133e25d3SDevin Teske# Die immediately if we can't dump the current keyboard map
128*133e25d3SDevin Teske#
129*133e25d3SDevin Teske#error=$( kbdcontrol -d 2>&1 > /dev/null ) || f_die $FAILURE "%s" "$error"
130*133e25d3SDevin Teske
131*133e25d3SDevin Teske# Capture Ctrl-C for clean-up
132*133e25d3SDevin Tesketrap 'rm -f $KEYMAPFILE; exit $FAILURE' SIGINT
133*133e25d3SDevin Teske
134*133e25d3SDevin Teske# Get a value from rc.conf(5) as initial value (if not being scripted)
135*133e25d3SDevin Teskef_getvar $VAR_KEYMAP keymap
136*133e25d3SDevin Teskeif [ ! "$keymap" ]; then
137*133e25d3SDevin Teske	keymap=$( f_sysrc_get keymap )
138*133e25d3SDevin Teske	case "$keymap" in [Nn][Oo]) keymap="";; esac
139*133e25d3SDevin Teskefi
140*133e25d3SDevin Teske
141*133e25d3SDevin Teske#
142*133e25d3SDevin Teske# Loop until the user has finalized their selection (by clicking the
143*133e25d3SDevin Teske# [relabeled] Cancel button).
144*133e25d3SDevin Teske#
145*133e25d3SDevin Teskewidth=67 first_pass=1 back_from_testing=
146*133e25d3SDevin Teske[ "$USE_XDIALOG" ] && width=70
147*133e25d3SDevin Teskeprompt="$msg_keymap_menu_text"
148*133e25d3SDevin Teskehline="$hline_arrows_tab_enter"
149*133e25d3SDevin Teskewhile :; do
150*133e25d3SDevin Teske	#
151*133e25d3SDevin Teske	# Re/Build list of keymaps
152*133e25d3SDevin Teske	#
153*133e25d3SDevin Teske	cont_msg=$( printf "$msg_continue_with_keymap" \
154*133e25d3SDevin Teske	                   "${keymap:-$msg_default}" )
155*133e25d3SDevin Teske	test_msg=$( printf "$msg_test_keymap" "${keymap:-$msg_default}" )
156*133e25d3SDevin Teske	menu_list="
157*133e25d3SDevin Teske		'>>> $cont_msg' '' '$msg_continue_with_current_keymap'
158*133e25d3SDevin Teske		'->- $test_msg' '' '$msg_test_the_currently_selected_keymap'
159*133e25d3SDevin Teske	" # END-QUOTE
160*133e25d3SDevin Teske	if [ "$first_pass" ]; then
161*133e25d3SDevin Teske		defaultitem=
162*133e25d3SDevin Teske		first_pass=
163*133e25d3SDevin Teske	else
164*133e25d3SDevin Teske		defaultitem="->- $test_msg"
165*133e25d3SDevin Teske	fi
166*133e25d3SDevin Teske	for k in $KEYMAPS; do
167*133e25d3SDevin Teske		keymap_$k get keym keym
168*133e25d3SDevin Teske		keymap_$k get desc desc
169*133e25d3SDevin Teske		radio=" "
170*133e25d3SDevin Teske		if [ "$keym" = "$keymap" ]; then
171*133e25d3SDevin Teske			radio="*"
172*133e25d3SDevin Teske			if [ "$back_from_testing" ]; then
173*133e25d3SDevin Teske				defaultitem="(*) $desc"
174*133e25d3SDevin Teske				back_from_testing=
175*133e25d3SDevin Teske			fi
176*133e25d3SDevin Teske		fi
177*133e25d3SDevin Teske		f_shell_escape "$desc" desc
178*133e25d3SDevin Teske		menu_list="$menu_list
179*133e25d3SDevin Teske			'($radio) $desc' '' '$keym: $desc'
180*133e25d3SDevin Teske		" # END-QUOTE
181*133e25d3SDevin Teske	done
182*133e25d3SDevin Teske	back_from_testing=
183*133e25d3SDevin Teske
184*133e25d3SDevin Teske	#
185*133e25d3SDevin Teske	# Display keymap configuration menu
186*133e25d3SDevin Teske	#
187*133e25d3SDevin Teske	eval f_dialog_menu_with_help_size height \"\" rows \
188*133e25d3SDevin Teske		\"\$DIALOG_TITLE\"     \
189*133e25d3SDevin Teske		\"\$DIALOG_BACKTITLE\" \
190*133e25d3SDevin Teske		\"\$prompt\"           \
191*133e25d3SDevin Teske		\"\$hline\"            \
192*133e25d3SDevin Teske		$menu_list
193*133e25d3SDevin Teske	menu_choice=$( eval $DIALOG \
194*133e25d3SDevin Teske		--title \"\$DIALOG_TITLE\"         \
195*133e25d3SDevin Teske		--backtitle \"\$DIALOG_BACKTITLE\" \
196*133e25d3SDevin Teske		--hline \"\$hline\"                \
197*133e25d3SDevin Teske		--keep-tite                        \
198*133e25d3SDevin Teske		--item-help                        \
199*133e25d3SDevin Teske		--ok-label \"\$msg_select\"        \
200*133e25d3SDevin Teske		--cancel-label \"\$msg_cancel\"    \
201*133e25d3SDevin Teske		--default-item \"\$defaultitem\"   \
202*133e25d3SDevin Teske		--menu \"\$prompt\"                \
203*133e25d3SDevin Teske		$height $width $rows               \
204*133e25d3SDevin Teske		$menu_list                         \
205*133e25d3SDevin Teske		2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
206*133e25d3SDevin Teske	) || {
207*133e25d3SDevin Teske		f_quietly rm -f "$KEYMAPFILE"
208*133e25d3SDevin Teske		exit $FAILURE # Exit with an error so bsdinstall restarts
209*133e25d3SDevin Teske	}
210*133e25d3SDevin Teske	f_dialog_data_sanitize menu_choice
211*133e25d3SDevin Teske
212*133e25d3SDevin Teske	case "$menu_choice" in
213*133e25d3SDevin Teske	">>> "*) # Continue with keymap
214*133e25d3SDevin Teske		break ;;
215*133e25d3SDevin Teske	"->-"*) # Test keymap
216*133e25d3SDevin Teske		dialog_keymap_test "$keymap"
217*133e25d3SDevin Teske		back_from_testing=1
218*133e25d3SDevin Teske		continue ;;
219*133e25d3SDevin Teske	esac
220*133e25d3SDevin Teske
221*133e25d3SDevin Teske	# Turn the user's choice into a number
222*133e25d3SDevin Teske	n=$( eval f_dialog_menutag2index_with_help \
223*133e25d3SDevin Teske		\"\$menu_choice\" $menu_list )
224*133e25d3SDevin Teske
225*133e25d3SDevin Teske	# Turn that number ithe name of the keymap struct
226*133e25d3SDevin Teske	k=$( set -- $KEYMAPS; eval echo \"\${$(( $n - 2))}\" )
227*133e25d3SDevin Teske
228*133e25d3SDevin Teske	# Get actual keymap setting while we update $keymap and $KEYMAPFILE
229*133e25d3SDevin Teske	keymap_$k get keym keymap
230*133e25d3SDevin Teske	echo "keymap=\"$keymap\"" > "$KEYMAPFILE"
231*133e25d3SDevin Teskedone
232*133e25d3SDevin Teske
233*133e25d3SDevin Teskef_quietly f_keymap_kbdcontrol "$keymap"
234*133e25d3SDevin Teske
235*133e25d3SDevin Teske################################################################################
236*133e25d3SDevin Teske# END
237*133e25d3SDevin Teske################################################################################
238