1218799Snwhitehorn#!/bin/sh 2218799Snwhitehorn#- 3218799Snwhitehorn# Copyright (c) 2011 Nathan Whitehorn 4263956Sdteske# Copyright (c) 2013 Devin Teske 5218799Snwhitehorn# All rights reserved. 6218799Snwhitehorn# 7218799Snwhitehorn# Redistribution and use in source and binary forms, with or without 8218799Snwhitehorn# modification, are permitted provided that the following conditions 9218799Snwhitehorn# are met: 10218799Snwhitehorn# 1. Redistributions of source code must retain the above copyright 11218799Snwhitehorn# notice, this list of conditions and the following disclaimer. 12218799Snwhitehorn# 2. Redistributions in binary form must reproduce the above copyright 13218799Snwhitehorn# notice, this list of conditions and the following disclaimer in the 14218799Snwhitehorn# documentation and/or other materials provided with the distribution. 15218799Snwhitehorn# 16218799Snwhitehorn# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17218799Snwhitehorn# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18218799Snwhitehorn# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19218799Snwhitehorn# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20218799Snwhitehorn# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21218799Snwhitehorn# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22218799Snwhitehorn# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23218799Snwhitehorn# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24218799Snwhitehorn# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25218799Snwhitehorn# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26218799Snwhitehorn# SUCH DAMAGE. 27218799Snwhitehorn# 28218799Snwhitehorn# $FreeBSD$ 29263956Sdteske# 30263956Sdteske############################################################ INCLUDES 31263956Sdteske 32263956SdteskeBSDCFG_SHARE="/usr/share/bsdconfig" 33263956Sdteske. $BSDCFG_SHARE/common.subr || exit 1 34263956Sdteskef_dprintf "%s: loading includes..." "$0" 35263956Sdteskef_include $BSDCFG_SHARE/dialog.subr 36263956Sdteskef_include $BSDCFG_SHARE/keymap.subr 37263956Sdteskef_include $BSDCFG_SHARE/sysrc.subr 38218799Snwhitehorn 39263956Sdteske############################################################ CONFIGURATION 40263956Sdteske 41263956Sdteske# 42263956Sdteske# Default file to store keymap selection in 43263956Sdteske# 44263956Sdteske: ${KEYMAPFILE:=$BSDINSTALL_TMPETC/rc.conf.keymap} 45263956Sdteske 46263956Sdteske# 47263956Sdteske# Default path to keymap INDEX containing descriptions 48263956Sdteske# 49263956Sdteske: ${MAPDESCFILE:=/usr/share/syscons/keymaps/INDEX.keymaps} 50263956Sdteske 51263956Sdteske############################################################ GLOBALS 52263956Sdteske 53263956Sdteske# 54263956Sdteske# Strings that should be moved to an i18n file and loaded with f_include_lang() 55263956Sdteske# 56263956Sdteskehline_arrows_tab_enter="Press arrows, TAB or ENTER" 57263956Sdteskemsg_continue_with_keymap="Continue with %s keymap" 58263956Sdteskemsg_default="default" 59263956Sdteskemsg_error="Error" 60263956Sdteskemsg_freebsd_installer="FreeBSD Installer" 61263956Sdteskemsg_keymap_menu_text="The system console driver for FreeBSD defaults to standard \"US\"\nkeyboard map. Other keymaps can be chosen below." 62263956Sdteskemsg_keymap_selection="Keymap Selection" 63263956Sdteskemsg_ok="OK" 64263956Sdteskemsg_select="Select" 65263956Sdteskemsg_test_keymap="Test %s keymap" 66263956Sdteskemsg_test_the_currently_selected_keymap="Test the currently selected keymap" 67263956Sdteskemsg_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." 68263956Sdteske 69263956Sdteske############################################################ FUNCTIONS 70263956Sdteske 71263956Sdteske# dialog_keymap_test $keymap 72263956Sdteske# 73263956Sdteske# Activate $keymap and display an input box (without cancel button) for the 74263956Sdteske# user to test keyboard input and return. Always returns success. 75263956Sdteske# 76263956Sdteskedialog_keymap_test() 77263956Sdteske{ 78263956Sdteske local keym="$1" 79263956Sdteske local title= # Calculated below 80263956Sdteske local btitle= # Calculated below 81263956Sdteske local prompt="$msg_test_the_keymap_by_typing" 82263956Sdteske local hline= 83263956Sdteske 84263956Sdteske # Attempt to activate the keymap 85263956Sdteske if [ "$keym" ]; then 86263956Sdteske local err 87263956Sdteske err=$( f_keymap_kbdcontrol "$keym" 2>&1 > /dev/null ) 88263956Sdteske if [ "$err" ]; then 89263956Sdteske f_dialog_title "$msg_error" 90263956Sdteske f_dialog_msgbox "$err" 91263956Sdteske f_dialog_title_restore 92263956Sdteske return $FAILURE 93263956Sdteske fi 94263956Sdteske fi 95263956Sdteske 96263956Sdteske f_dialog_title "$( printf "$msg_test_keymap" "${keym:-$msg_default}" )" 97263956Sdteske title="$DIALOG_TITLE" 98263956Sdteske btitle="$DIALOG_BACKTITLE" 99263956Sdteske f_dialog_title_restore 100263956Sdteske 101263956Sdteske local height width 102263956Sdteske f_dialog_inputbox_size height width \ 103263956Sdteske "$title" "$btitle" "$prompt" "" "$hline" 104263956Sdteske 105263956Sdteske $DIALOG \ 106263956Sdteske --title "$title" \ 107263956Sdteske --backtitle "$btitle" \ 108263956Sdteske --hline "$hline" \ 109263956Sdteske --ok-label "$msg_ok" \ 110263956Sdteske --no-cancel \ 111263956Sdteske --inputbox "$prompt" \ 112263956Sdteske $height $width \ 113263956Sdteske 2>/dev/null >&$DIALOG_TERMINAL_PASSTHRU_FD 114263956Sdteske 115263956Sdteske return $DIALOG_OK 116263956Sdteske} 117263956Sdteske 118263956Sdteske############################################################ MAIN 119263956Sdteske 120263956Sdteske# 121263956Sdteske# Initialize 122263956Sdteske# 123263956Sdteskef_dialog_title "$msg_keymap_selection" 124263956Sdteskef_dialog_backtitle "$msg_freebsd_installer" 125263956Sdteske 126263956Sdteske# 127263956Sdteske# Die immediately if we can't dump the current keyboard map 128263956Sdteske# 129263956Sdteske#error=$( kbdcontrol -d 2>&1 > /dev/null ) || f_die $FAILURE "%s" "$error" 130263956Sdteske 131263956Sdteske# Capture Ctrl-C for clean-up 132263956Sdtesketrap 'rm -f $KEYMAPFILE; exit $FAILURE' SIGINT 133263956Sdteske 134263956Sdteske# Get a value from rc.conf(5) as initial value (if not being scripted) 135263956Sdteskef_getvar $VAR_KEYMAP keymap 136263956Sdteskeif [ ! "$keymap" ]; then 137263956Sdteske keymap=$( f_sysrc_get keymap ) 138263956Sdteske case "$keymap" in [Nn][Oo]) keymap="";; esac 139218799Snwhitehornfi 140263956Sdteske 141263956Sdteske# 142263956Sdteske# Loop until the user has finalized their selection (by clicking the 143263956Sdteske# [relabeled] Cancel button). 144263956Sdteske# 145263956Sdteskewidth=67 first_pass=1 back_from_testing= 146263956Sdteske[ "$USE_XDIALOG" ] && width=70 147263956Sdteskeprompt="$msg_keymap_menu_text" 148263956Sdteskehline="$hline_arrows_tab_enter" 149263956Sdteskewhile :; do 150263956Sdteske # 151263956Sdteske # Re/Build list of keymaps 152263956Sdteske # 153263956Sdteske cont_msg=$( printf "$msg_continue_with_keymap" \ 154263956Sdteske "${keymap:-$msg_default}" ) 155263956Sdteske test_msg=$( printf "$msg_test_keymap" "${keymap:-$msg_default}" ) 156263956Sdteske menu_list=" 157263956Sdteske '>>> $cont_msg' '' '$msg_continue_with_current_keymap' 158263956Sdteske '->- $test_msg' '' '$msg_test_the_currently_selected_keymap' 159263956Sdteske " # END-QUOTE 160263956Sdteske if [ "$first_pass" ]; then 161263956Sdteske defaultitem= 162263956Sdteske first_pass= 163263956Sdteske else 164263956Sdteske defaultitem="->- $test_msg" 165263956Sdteske fi 166263956Sdteske for k in $KEYMAPS; do 167263956Sdteske keymap_$k get keym keym 168263956Sdteske keymap_$k get desc desc 169263956Sdteske radio=" " 170263956Sdteske if [ "$keym" = "$keymap" ]; then 171263956Sdteske radio="*" 172263956Sdteske if [ "$back_from_testing" ]; then 173263956Sdteske defaultitem="(*) $desc" 174263956Sdteske back_from_testing= 175263956Sdteske fi 176263956Sdteske fi 177263956Sdteske f_shell_escape "$desc" desc 178263956Sdteske menu_list="$menu_list 179263956Sdteske '($radio) $desc' '' '$keym: $desc' 180263956Sdteske " # END-QUOTE 181263956Sdteske done 182263956Sdteske back_from_testing= 183263956Sdteske 184263956Sdteske # 185263956Sdteske # Display keymap configuration menu 186263956Sdteske # 187263956Sdteske eval f_dialog_menu_with_help_size height \"\" rows \ 188263956Sdteske \"\$DIALOG_TITLE\" \ 189263956Sdteske \"\$DIALOG_BACKTITLE\" \ 190263956Sdteske \"\$prompt\" \ 191263956Sdteske \"\$hline\" \ 192263956Sdteske $menu_list 193263956Sdteske menu_choice=$( eval $DIALOG \ 194263956Sdteske --title \"\$DIALOG_TITLE\" \ 195263956Sdteske --backtitle \"\$DIALOG_BACKTITLE\" \ 196263956Sdteske --hline \"\$hline\" \ 197263956Sdteske --keep-tite \ 198263956Sdteske --item-help \ 199263956Sdteske --ok-label \"\$msg_select\" \ 200263956Sdteske --cancel-label \"\$msg_cancel\" \ 201263956Sdteske --default-item \"\$defaultitem\" \ 202263956Sdteske --menu \"\$prompt\" \ 203263956Sdteske $height $width $rows \ 204263956Sdteske $menu_list \ 205263956Sdteske 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD 206263956Sdteske ) || { 207263956Sdteske f_quietly rm -f "$KEYMAPFILE" 208263956Sdteske exit $FAILURE # Exit with an error so bsdinstall restarts 209263956Sdteske } 210263956Sdteske f_dialog_data_sanitize menu_choice 211263956Sdteske 212263956Sdteske case "$menu_choice" in 213263956Sdteske ">>> "*) # Continue with keymap 214263956Sdteske break ;; 215263956Sdteske "->-"*) # Test keymap 216263956Sdteske dialog_keymap_test "$keymap" 217263956Sdteske back_from_testing=1 218263956Sdteske continue ;; 219263956Sdteske esac 220263956Sdteske 221263956Sdteske # Turn the user's choice into a number 222263956Sdteske n=$( eval f_dialog_menutag2index_with_help \ 223263956Sdteske \"\$menu_choice\" $menu_list ) 224263956Sdteske 225263956Sdteske # Turn that number ithe name of the keymap struct 226263956Sdteske k=$( set -- $KEYMAPS; eval echo \"\${$(( $n - 2))}\" ) 227263956Sdteske 228263956Sdteske # Get actual keymap setting while we update $keymap and $KEYMAPFILE 229263956Sdteske keymap_$k get keym keymap 230263956Sdteske echo "keymap=\"$keymap\"" > "$KEYMAPFILE" 231263956Sdteskedone 232263956Sdteske 233263956Sdteskef_quietly f_keymap_kbdcontrol "$keymap" 234263956Sdteske 235263956Sdteske################################################################################ 236263956Sdteske# END 237263956Sdteske################################################################################ 238