12118f387SNathan Whitehorn#!/bin/sh 22118f387SNathan Whitehorn#- 32118f387SNathan Whitehorn# Copyright (c) 2011 Nathan Whitehorn 4*1a8cf17dSDevin Teske# Copyright (c) 2013-2015 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$ 29133e25d3SDevin Teske# 30133e25d3SDevin Teske############################################################ INCLUDES 312118f387SNathan Whitehorn 32133e25d3SDevin TeskeBSDCFG_SHARE="/usr/share/bsdconfig" 33133e25d3SDevin Teske. $BSDCFG_SHARE/common.subr || exit 1 34133e25d3SDevin Teskef_dprintf "%s: loading includes..." "$0" 35133e25d3SDevin Teskef_include $BSDCFG_SHARE/dialog.subr 36133e25d3SDevin Teskef_include $BSDCFG_SHARE/keymap.subr 37133e25d3SDevin Teskef_include $BSDCFG_SHARE/sysrc.subr 38133e25d3SDevin Teske 39133e25d3SDevin Teske############################################################ CONFIGURATION 40133e25d3SDevin Teske 41133e25d3SDevin Teske# 42133e25d3SDevin Teske# Default file to store keymap selection in 43133e25d3SDevin Teske# 44133e25d3SDevin Teske: ${KEYMAPFILE:=$BSDINSTALL_TMPETC/rc.conf.keymap} 45133e25d3SDevin Teske 46133e25d3SDevin Teske# 47133e25d3SDevin Teske# Default path to keymap INDEX containing descriptions 48133e25d3SDevin Teske# 49133e25d3SDevin Teske: ${MAPDESCFILE:=/usr/share/syscons/keymaps/INDEX.keymaps} 50133e25d3SDevin Teske 51133e25d3SDevin Teske############################################################ GLOBALS 52133e25d3SDevin Teske 53133e25d3SDevin Teske# 54133e25d3SDevin Teske# Strings that should be moved to an i18n file and loaded with f_include_lang() 55133e25d3SDevin Teske# 56133e25d3SDevin Teskehline_arrows_tab_enter="Press arrows, TAB or ENTER" 57133e25d3SDevin Teskemsg_continue_with_keymap="Continue with %s keymap" 58133e25d3SDevin Teskemsg_default="default" 59133e25d3SDevin Teskemsg_error="Error" 60133e25d3SDevin Teskemsg_freebsd_installer="FreeBSD Installer" 61133e25d3SDevin Teskemsg_keymap_menu_text="The system console driver for FreeBSD defaults to standard \"US\"\nkeyboard map. Other keymaps can be chosen below." 62133e25d3SDevin Teskemsg_keymap_selection="Keymap Selection" 63133e25d3SDevin Teskemsg_ok="OK" 64133e25d3SDevin Teskemsg_select="Select" 65133e25d3SDevin Teskemsg_test_keymap="Test %s keymap" 66133e25d3SDevin Teskemsg_test_the_currently_selected_keymap="Test the currently selected keymap" 67133e25d3SDevin 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." 68133e25d3SDevin Teske 69133e25d3SDevin Teske############################################################ FUNCTIONS 70133e25d3SDevin Teske 71133e25d3SDevin Teske# dialog_keymap_test $keymap 72133e25d3SDevin Teske# 73133e25d3SDevin Teske# Activate $keymap and display an input box (without cancel button) for the 74133e25d3SDevin Teske# user to test keyboard input and return. Always returns success. 75133e25d3SDevin Teske# 76133e25d3SDevin Teskedialog_keymap_test() 77133e25d3SDevin Teske{ 78133e25d3SDevin Teske local keym="$1" 79133e25d3SDevin Teske local title= # Calculated below 80133e25d3SDevin Teske local btitle= # Calculated below 81133e25d3SDevin Teske local prompt="$msg_test_the_keymap_by_typing" 82133e25d3SDevin Teske local hline= 83133e25d3SDevin Teske 84133e25d3SDevin Teske # Attempt to activate the keymap 85133e25d3SDevin Teske if [ "$keym" ]; then 86133e25d3SDevin Teske local err 87133e25d3SDevin Teske err=$( f_keymap_kbdcontrol "$keym" 2>&1 > /dev/null ) 88133e25d3SDevin Teske if [ "$err" ]; then 89133e25d3SDevin Teske f_dialog_title "$msg_error" 90133e25d3SDevin Teske f_dialog_msgbox "$err" 91133e25d3SDevin Teske f_dialog_title_restore 92133e25d3SDevin Teske return $FAILURE 932118f387SNathan Whitehorn fi 94133e25d3SDevin Teske fi 95133e25d3SDevin Teske 96133e25d3SDevin Teske f_dialog_title "$( printf "$msg_test_keymap" "${keym:-$msg_default}" )" 97133e25d3SDevin Teske title="$DIALOG_TITLE" 98133e25d3SDevin Teske btitle="$DIALOG_BACKTITLE" 99133e25d3SDevin Teske f_dialog_title_restore 100133e25d3SDevin Teske 101133e25d3SDevin Teske local height width 102133e25d3SDevin Teske f_dialog_inputbox_size height width \ 103133e25d3SDevin Teske "$title" "$btitle" "$prompt" "" "$hline" 104133e25d3SDevin Teske 105133e25d3SDevin Teske $DIALOG \ 106133e25d3SDevin Teske --title "$title" \ 107133e25d3SDevin Teske --backtitle "$btitle" \ 108133e25d3SDevin Teske --hline "$hline" \ 109133e25d3SDevin Teske --ok-label "$msg_ok" \ 110133e25d3SDevin Teske --no-cancel \ 111133e25d3SDevin Teske --inputbox "$prompt" \ 112133e25d3SDevin Teske $height $width \ 113133e25d3SDevin Teske 2>/dev/null >&$DIALOG_TERMINAL_PASSTHRU_FD 114133e25d3SDevin Teske 115133e25d3SDevin Teske return $DIALOG_OK 116133e25d3SDevin Teske} 117133e25d3SDevin Teske 118133e25d3SDevin Teske############################################################ MAIN 119133e25d3SDevin Teske 120133e25d3SDevin Teske# 121133e25d3SDevin Teske# Initialize 122133e25d3SDevin Teske# 123133e25d3SDevin Teskef_dialog_title "$msg_keymap_selection" 124133e25d3SDevin Teskef_dialog_backtitle "$msg_freebsd_installer" 125133e25d3SDevin Teske 126133e25d3SDevin Teske# 127133e25d3SDevin Teske# Die immediately if we can't dump the current keyboard map 128133e25d3SDevin Teske# 129133e25d3SDevin Teske#error=$( kbdcontrol -d 2>&1 > /dev/null ) || f_die $FAILURE "%s" "$error" 130133e25d3SDevin Teske 131133e25d3SDevin Teske# Capture Ctrl-C for clean-up 132133e25d3SDevin Tesketrap 'rm -f $KEYMAPFILE; exit $FAILURE' SIGINT 133133e25d3SDevin Teske 134133e25d3SDevin Teske# Get a value from rc.conf(5) as initial value (if not being scripted) 135133e25d3SDevin Teskef_getvar $VAR_KEYMAP keymap 136133e25d3SDevin Teskeif [ ! "$keymap" ]; then 137133e25d3SDevin Teske keymap=$( f_sysrc_get keymap ) 138133e25d3SDevin Teske case "$keymap" in [Nn][Oo]) keymap="";; esac 139133e25d3SDevin Teskefi 140133e25d3SDevin Teske 141133e25d3SDevin Teske# 142133e25d3SDevin Teske# Loop until the user has finalized their selection (by clicking the 143133e25d3SDevin Teske# [relabeled] Cancel button). 144133e25d3SDevin Teske# 145133e25d3SDevin Teskewidth=67 first_pass=1 back_from_testing= 146133e25d3SDevin Teske[ "$USE_XDIALOG" ] && width=70 147133e25d3SDevin Teskeprompt="$msg_keymap_menu_text" 148133e25d3SDevin Teskehline="$hline_arrows_tab_enter" 149133e25d3SDevin Teskewhile :; do 150133e25d3SDevin Teske # 151133e25d3SDevin Teske # Re/Build list of keymaps 152133e25d3SDevin Teske # 153133e25d3SDevin Teske cont_msg=$( printf "$msg_continue_with_keymap" \ 154133e25d3SDevin Teske "${keymap:-$msg_default}" ) 155133e25d3SDevin Teske test_msg=$( printf "$msg_test_keymap" "${keymap:-$msg_default}" ) 156133e25d3SDevin Teske menu_list=" 157133e25d3SDevin Teske '>>> $cont_msg' '' '$msg_continue_with_current_keymap' 158133e25d3SDevin Teske '->- $test_msg' '' '$msg_test_the_currently_selected_keymap' 159133e25d3SDevin Teske " # END-QUOTE 160133e25d3SDevin Teske if [ "$first_pass" ]; then 161133e25d3SDevin Teske defaultitem= 162133e25d3SDevin Teske first_pass= 163133e25d3SDevin Teske else 164133e25d3SDevin Teske defaultitem="->- $test_msg" 165133e25d3SDevin Teske fi 166133e25d3SDevin Teske for k in $KEYMAPS; do 167133e25d3SDevin Teske keymap_$k get keym keym 168133e25d3SDevin Teske keymap_$k get desc desc 169133e25d3SDevin Teske radio=" " 170133e25d3SDevin Teske if [ "$keym" = "$keymap" ]; then 171133e25d3SDevin Teske radio="*" 172133e25d3SDevin Teske if [ "$back_from_testing" ]; then 173133e25d3SDevin Teske defaultitem="(*) $desc" 174133e25d3SDevin Teske back_from_testing= 175133e25d3SDevin Teske fi 176133e25d3SDevin Teske fi 177133e25d3SDevin Teske f_shell_escape "$desc" desc 178133e25d3SDevin Teske menu_list="$menu_list 179133e25d3SDevin Teske '($radio) $desc' '' '$keym: $desc' 180133e25d3SDevin Teske " # END-QUOTE 181133e25d3SDevin Teske done 182133e25d3SDevin Teske back_from_testing= 183133e25d3SDevin Teske 184133e25d3SDevin Teske # 185133e25d3SDevin Teske # Display keymap configuration menu 186133e25d3SDevin Teske # 187133e25d3SDevin Teske eval f_dialog_menu_with_help_size height \"\" rows \ 188133e25d3SDevin Teske \"\$DIALOG_TITLE\" \ 189133e25d3SDevin Teske \"\$DIALOG_BACKTITLE\" \ 190133e25d3SDevin Teske \"\$prompt\" \ 191133e25d3SDevin Teske \"\$hline\" \ 192133e25d3SDevin Teske $menu_list 193133e25d3SDevin Teske menu_choice=$( eval $DIALOG \ 194133e25d3SDevin Teske --title \"\$DIALOG_TITLE\" \ 195133e25d3SDevin Teske --backtitle \"\$DIALOG_BACKTITLE\" \ 196133e25d3SDevin Teske --hline \"\$hline\" \ 197133e25d3SDevin Teske --keep-tite \ 198133e25d3SDevin Teske --item-help \ 199133e25d3SDevin Teske --ok-label \"\$msg_select\" \ 200133e25d3SDevin Teske --cancel-label \"\$msg_cancel\" \ 201133e25d3SDevin Teske --default-item \"\$defaultitem\" \ 202133e25d3SDevin Teske --menu \"\$prompt\" \ 203133e25d3SDevin Teske $height $width $rows \ 204133e25d3SDevin Teske $menu_list \ 205133e25d3SDevin Teske 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD 206133e25d3SDevin Teske ) || { 207133e25d3SDevin Teske f_quietly rm -f "$KEYMAPFILE" 208133e25d3SDevin Teske exit $FAILURE # Exit with an error so bsdinstall restarts 209133e25d3SDevin Teske } 210133e25d3SDevin Teske f_dialog_data_sanitize menu_choice 211133e25d3SDevin Teske 212133e25d3SDevin Teske case "$menu_choice" in 213133e25d3SDevin Teske ">>> "*) # Continue with keymap 214133e25d3SDevin Teske break ;; 215133e25d3SDevin Teske "->-"*) # Test keymap 216133e25d3SDevin Teske dialog_keymap_test "$keymap" 217133e25d3SDevin Teske back_from_testing=1 218133e25d3SDevin Teske continue ;; 219133e25d3SDevin Teske esac 220133e25d3SDevin Teske 221133e25d3SDevin Teske # Turn the user's choice into a number 222133e25d3SDevin Teske n=$( eval f_dialog_menutag2index_with_help \ 223133e25d3SDevin Teske \"\$menu_choice\" $menu_list ) 224133e25d3SDevin Teske 225133e25d3SDevin Teske # Turn that number ithe name of the keymap struct 226133e25d3SDevin Teske k=$( set -- $KEYMAPS; eval echo \"\${$(( $n - 2))}\" ) 227133e25d3SDevin Teske 228133e25d3SDevin Teske # Get actual keymap setting while we update $keymap and $KEYMAPFILE 229133e25d3SDevin Teske keymap_$k get keym keymap 230133e25d3SDevin Teske echo "keymap=\"$keymap\"" > "$KEYMAPFILE" 231133e25d3SDevin Teskedone 232133e25d3SDevin Teske 233133e25d3SDevin Teskef_quietly f_keymap_kbdcontrol "$keymap" 234*1a8cf17dSDevin Teskeexit $SUCCESS 235133e25d3SDevin Teske 236133e25d3SDevin Teske################################################################################ 237133e25d3SDevin Teske# END 238133e25d3SDevin Teske################################################################################ 239