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