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