aboutsummaryrefslogtreecommitdiff
path: root/bsdconfig/console/keymap
diff options
context:
space:
mode:
Diffstat (limited to 'bsdconfig/console/keymap')
-rwxr-xr-xbsdconfig/console/keymap338
1 files changed, 338 insertions, 0 deletions
diff --git a/bsdconfig/console/keymap b/bsdconfig/console/keymap
new file mode 100755
index 000000000000..28c0500cf8ac
--- /dev/null
+++ b/bsdconfig/console/keymap
@@ -0,0 +1,338 @@
+#!/bin/sh
+#-
+# Copyright (c) 2012-2013 Devin Teske
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+############################################################ INCLUDES
+
+BSDCFG_SHARE="/usr/share/bsdconfig"
+. $BSDCFG_SHARE/common.subr || exit 1
+f_dprintf "%s: loading includes..." "$0"
+f_include $BSDCFG_SHARE/dialog.subr
+f_include $BSDCFG_SHARE/mustberoot.subr
+f_include $BSDCFG_SHARE/sysrc.subr
+
+BSDCFG_LIBE="/usr/libexec/bsdconfig" APP_DIR="080.console"
+f_include_lang $BSDCFG_LIBE/$APP_DIR/include/messages.subr
+
+f_index_menusel_keyword $BSDCFG_LIBE/$APP_DIR/INDEX "$pgm" ipgm &&
+ pgm="${ipgm:-$pgm}"
+
+############################################################ CONFIGURATION
+
+#
+# List of keymap names
+#
+KEYMAP_NAMES="
+ belgian brazil_cp850 brazil_iso
+ brazil_iso_accent bulgarian_bds bulgarian_phonetic
+ central_european_iso croatian_iso czech_iso_accent
+ danish_cp865 danish_iso estonian_cp850
+ estonian_iso estonian_iso_15 finnish_cp850
+ finnish_iso french_iso french_iso_accent
+ french_iso_macbook german_cp850 german_iso
+ greek_101 greek_104 greek_elot
+ hungarian_101 hungarian_102 icelandic
+ icelandic_accent italian japanese_106
+ latin_american latin_american_accent norway_iso
+ polish_iso portuguese portuguese_accent
+ russia_koi8_r slovak slovenian
+ spanish spanish_accent swedish_cp850
+ swedish_iso swiss_french_cp850 swiss_french_iso
+ swiss_french_iso_accent swiss_german_cp850 swiss_german_iso
+ swiss_german_iso_accent uk_cp850 uk_iso
+ ukrainian_koi8_u ukrainian_koi8_u_koi8_r usa_capslock_ctrl
+ usa_dvorak usa_dvorak_left usa_dvorak_right
+ usa_emacs usa_iso usa_unix
+" # END-QUOTE
+
+############################################################ FUNCTIONS
+
+# dialog_menu_main
+#
+# Display the dialog(1)-based application main menu.
+#
+dialog_menu_main()
+{
+ local prompt="$msg_keymap_menu_text"
+ local menu_list defaultitem= # Calculated below
+ local hline="$hline_choose_a_keyboard_map"
+
+ #
+ # Export variables for awk(1) ENVIRON visibility
+ #
+ local name
+ for name in $KEYMAP_NAMES; do
+ export msg_$name msg_${name}_desc
+ done
+
+ #
+ # Generate a sorted list of keymaps. If the first letter of the keymap
+ # name is unique (case-insensitive) then it is used as the tag to allow
+ # the user to jump to that entry.
+ #
+ menu_list=$(
+ for name in $KEYMAP_NAMES; do
+ eval echo \"\$msg_$name\" msg_$name
+ done | sort | awk 'BEGIN { prefix = "" }
+ {
+ cur_prefix = tolower(substr(ENVIRON[$NF], 1, 1))
+ printf "'\''"
+ if ( prefix != cur_prefix )
+ prefix = cur_prefix
+ else
+ printf " "
+ printf "%s'\'' '\''%s'\''\n",
+ ENVIRON[$NF], ENVIRON[$NF"_desc"]
+ }'
+ )
+
+ local height width rows
+ eval f_dialog_menu_size height width rows \
+ \"\$DIALOG_TITLE\" \
+ \"\$DIALOG_BACKTITLE\" \
+ \"\$prompt\" \
+ \"\$hline\" \
+ $menu_list
+
+ case "$( f_sysrc_get keymap )" in
+ be.iso) defaultitem="$msg_belgian" ;;
+ br275.cp850) defaultitem="$msg_brazil_cp850" ;;
+ br275.iso) defaultitem="$msg_brazil_iso" ;;
+ br275.iso.acc) defaultitem="$msg_brazil_iso_accent" ;;
+ bg.bds.ctrlcaps) defaultitem="$msg_bulgarian_bds" ;;
+ bg.phonetic.ctrlcaps) defaultitem="$msg_bulgarian_phonetic" ;;
+ ce.iso2) defaultitem="$msg_central_european_iso" ;;
+ hr.iso) defaultitem="$msg_croatian_iso" ;;
+ cs.latin2.qwertz) defaultitem="$msg_czech_iso_accent" ;;
+ danish.cp865) defaultitem="$msg_danish_cp865" ;;
+ danish.iso) defaultitem="$msg_danish_iso" ;;
+ estonian.cp850) defaultitem="$msg_estonian_cp850" ;;
+ estonian.iso) defaultitem="$msg_estonian_iso" ;;
+ estonian.iso15) defaultitem="$msg_estonian_iso_15" ;;
+ finnish.cp850) defaultitem="$msg_finnish_cp850" ;;
+ finnish.iso) defaultitem="$msg_finnish_iso" ;;
+ fr.iso) defaultitem="$msg_french_iso" ;;
+ fr.iso.acc) defaultitem="$msg_french_iso_accent" ;;
+ fr.macbook.acc) defaultitem="$msg_french_iso_macbook" ;;
+ german.cp850) defaultitem="$msg_german_cp850" ;;
+ german.iso) defaultitem="$msg_german_iso" ;;
+ gr.us101.acc) defaultitem="$msg_greek_101" ;;
+ el.iso07) defaultitem="$msg_greek_104" ;;
+ gr.elot.acc) defaultitem="$msg_greek_elot" ;;
+ hu.iso2.101keys) defaultitem="$msg_hungarian_101" ;;
+ hu.iso2.102keys) defaultitem="$msg_hungarian_102" ;;
+ icelandic.iso) defaultitem="$msg_icelandic" ;;
+ icelandic.iso.acc) defaultitem="$msg_icelandic_accent" ;;
+ it.iso) defaultitem="$msg_italian" ;;
+ jp.106) defaultitem="$msg_japanese_106" ;;
+ latinamerican) defaultitem="$msg_latin_american" ;;
+ latinamerican.iso.acc) defaultitem="$msg_latin_american_accent" ;;
+ norwegian.iso) defaultitem="$msg_norway_iso" ;;
+ pl_PL.ISO8859-2) defaultitem="$msg_polish_iso" ;;
+ pt.iso) defaultitem="$msg_portuguese" ;;
+ pt.iso.acc) defaultitem="$msg_portuguese_accent" ;;
+ ru.koi8-r) defaultitem="$msg_russia_koi8_r" ;;
+ sk.iso2) defaultitem="$msg_slovak" ;;
+ si.iso) defaultitem="$msg_slovenian" ;;
+ spanish.iso) defaultitem="$msg_spanish" ;;
+ spanish.iso.acc) defaultitem="$msg_spanish_accent" ;;
+ swedish.cp850) defaultitem="$msg_swedish_cp850" ;;
+ swedish.iso) defaultitem="$msg_swedish_iso" ;;
+ swissfrench.cp850) defaultitem="$msg_swiss_french_cp850" ;;
+ swissfrench.iso) defaultitem="$msg_swiss_french_iso" ;;
+ swissfrench.iso.acc) defaultitem="$msg_swiss_french_iso_accent" ;;
+ swissgerman.cp850) defaultitem="$msg_swiss_german_cp850" ;;
+ swissgerman.iso) defaultitem="$msg_swiss_german_iso" ;;
+ swissgerman.iso.acc) defaultitem="$msg_swiss_german_iso_accent" ;;
+ uk.cp850) defaultitem="$msg_uk_cp850" ;;
+ uk.iso) defaultitem="$msg_uk_iso" ;;
+ ua.koi8-u) defaultitem="$msg_ukrainian_koi8_u" ;;
+ ua.koi8-u.shift.alt) defaultitem="$msg_ukrainian_koi8_u_koi8_r" ;;
+ us.ctrl) defaultitem="$msg_usa_capslock_ctrl" ;;
+ us.pc-ctrl) defaultitem="$msg_usa_capslock_ctrl" ;;
+ us.dvorak) defaultitem="$msg_usa_dvorak" ;;
+ us.dvorakl) defaultitem="$msg_usa_dvorak_left" ;;
+ us.dvorakr) defaultitem="$msg_usa_dvorak_right" ;;
+ us.emacs) defaultitem="$msg_usa_emacs" ;;
+ us.iso) defaultitem="$msg_usa_iso" ;;
+ us.unix) defaultitem="$msg_usa_unix" ;;
+ esac
+
+ # The defaultitem may have to be indented to match the menu_list
+ if [ "$defaultitem" ]; then
+ ( eval set -- $menu_list
+ while [ $# -gt 0 ]; do
+ [ "$defaultitem" = "$1" ] && break
+ [ " $defaultitem" = "$1" ] && exit 0
+ shift 2 # tag/item
+ done
+ exit 1 # No modification needed
+ ) && defaultitem=" $defaultitem"
+ fi
+
+ local menu_choice
+ menu_choice=$( eval $DIALOG \
+ --title \"\$DIALOG_TITLE\" \
+ --backtitle \"\$DIALOG_BACKTITLE\" \
+ --hline \"\$hline\" \
+ --ok-label \"\$msg_ok\" \
+ --cancel-label \"\$msg_cancel\" \
+ --default-item \"\$defaultitem\" \
+ --menu \"\$prompt\" \
+ $height $width $rows \
+ $menu_list \
+ 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
+ )
+ local retval=$?
+ f_dialog_menutag_store -s "$menu_choice"
+ return $retval
+}
+
+############################################################ MAIN
+
+# Incorporate rc-file if it exists
+[ -f "$HOME/.bsdconfigrc" ] && f_include "$HOME/.bsdconfigrc"
+
+#
+# Process command-line arguments
+#
+while getopts h$GETOPTS_STDARGS flag; do
+ case "$flag" in
+ h|\?) f_usage $BSDCFG_LIBE/$APP_DIR/USAGE "PROGRAM_NAME" "$pgm" ;;
+ esac
+done
+shift $(( $OPTIND - 1 ))
+
+#
+# Initialize
+#
+f_dialog_title "$msg_system_console_keymap"
+f_dialog_backtitle "${ipgm:+bsdconfig }$pgm"
+f_mustberoot_init
+
+#
+# Launch application main menu
+#
+while :; do
+ dialog_menu_main || f_die
+ f_dialog_menutag_fetch mtag
+
+ #
+ # Reverse the users choice into the variable name
+ #
+ keymap_name=
+ mtag="${mtag# }" # remove single leading-space if-present
+ for name in $KEYMAP_NAMES; do
+ debug= f_getvar msg_$name msg
+ [ "$msg" = "$mtag" ] && keymap_name="$name" break
+ done
+
+ [ "$keymap_name" ] || continue
+
+ keymap_to_set=
+ case "$keymap_name" in
+ belgian) keymap_to_set="be.iso" ;;
+ brazil_cp850) keymap_to_set="br275.cp850" ;;
+ brazil_iso) keymap_to_set="br275.iso" ;;
+ brazil_iso_accent) keymap_to_set="br275.iso.acc" ;;
+ bulgarian_bds) keymap_to_set="bg.bds.ctrlcaps" ;;
+ bulgarian_phonetic) keymap_to_set="bg.phonetic.ctrlcaps" ;;
+ central_european_iso) keymap_to_set="ce.iso2" ;;
+ croatian_iso) keymap_to_set="hr.iso" ;;
+ czech_iso_accent) keymap_to_set="cs.latin2.qwertz" ;;
+ danish_cp865) keymap_to_set="danish.cp865" ;;
+ danish_iso) keymap_to_set="danish.iso" ;;
+ estonian_cp850) keymap_to_set="estonian.cp850" ;;
+ estonian_iso) keymap_to_set="estonian.iso" ;;
+ estonian_iso_15) keymap_to_set="estonian.iso15" ;;
+ finnish_cp850) keymap_to_set="finnish.cp850" ;;
+ finnish_iso) keymap_to_set="finnish.iso" ;;
+ french_iso) keymap_to_set="fr.iso" ;;
+ french_iso_accent) keymap_to_set="fr.iso.acc" ;;
+ french_iso_macbook) keymap_to_set="fr.macbook.acc" ;;
+ german_cp850) keymap_to_set="german.cp850" ;;
+ german_iso) keymap_to_set="german.iso" ;;
+ greek_101) keymap_to_set="gr.us101.acc" ;;
+ greek_104) keymap_to_set="el.iso07" ;;
+ greek_elot) keymap_to_set="gr.elot.acc" ;;
+ hungarian_101) keymap_to_set="hu.iso2.101keys" ;;
+ hungarian_102) keymap_to_set="hu.iso2.102keys" ;;
+ icelandic) keymap_to_set="icelandic.iso" ;;
+ icelandic_accent) keymap_to_set="icelandic.iso.acc" ;;
+ italian) keymap_to_set="it.iso" ;;
+ japanese_106) keymap_to_set="jp.106" ;;
+ latin_american) keymap_to_set="latinamerican" ;;
+ latin_american_accent) keymap_to_set="latinamerican.iso.acc" ;;
+ norway_iso) keymap_to_set="norwegian.iso" ;;
+ polish_iso) keymap_to_set="pl_PL.ISO8859-2" ;;
+ portuguese) keymap_to_set="pt.iso" ;;
+ portuguese_accent) keymap_to_set="pt.iso.acc" ;;
+ russia_koi8_r) keymap_to_set="ru.koi8-r" ;;
+ slovak) keymap_to_set="sk.iso2" ;;
+ slovenian) keymap_to_set="si.iso" ;;
+ spanish) keymap_to_set="spanish.iso" ;;
+ spanish_accent) keymap_to_set="spanish.iso.acc" ;;
+ swedish_cp850) keymap_to_set="swedish.cp850" ;;
+ swedish_iso) keymap_to_set="swedish.iso" ;;
+ swiss_french_cp850) keymap_to_set="swissfrench.cp850" ;;
+ swiss_french_iso) keymap_to_set="swissfrench.iso" ;;
+ swiss_french_iso_accent) keymap_to_set="swissfrench.iso.acc" ;;
+ swiss_german_cp850) keymap_to_set="swissgerman.cp850" ;;
+ swiss_german_iso) keymap_to_set="swissgerman.iso" ;;
+ swiss_german_iso_accent) keymap_to_set="swissgerman.iso.acc" ;;
+ uk_cp850) keymap_to_set="uk.cp850" ;;
+ uk_iso) keymap_to_set="uk.iso" ;;
+ ukrainian_koi8_u) keymap_to_set="ua.koi8-u" ;;
+ ukrainian_koi8_u_koi8_r) keymap_to_set="ua.koi8-u.shift.alt" ;;
+ usa_capslock_ctrl)
+ case "$( sysctl -n kern.vty )" in
+ vt) keymap_to_set="us.ctrl" ;;
+ *) keymap_to_set="us.pc-ctrl" ;;
+ esac
+ ;;
+ usa_dvorak) keymap_to_set="us.dvorak" ;;
+ usa_dvorak_left) keymap_to_set="us.dvorakl" ;;
+ usa_dvorak_right) keymap_to_set="us.dvorakr" ;;
+ usa_emacs) keymap_to_set="us.emacs" ;;
+ usa_iso) keymap_to_set="us.iso" ;;
+ usa_unix) keymap_to_set="us.unix" ;;
+ esac
+
+ if [ "$keymap_to_set" ]; then
+ f_eval_catch "$0" f_sysrc_set \
+ 'f_sysrc_set keymap "%s"' "$keymap_to_set" || f_die
+ break
+ else
+ f_die 1 "$msg_unknown_keymap"
+ fi
+done
+
+exit $SUCCESS
+
+################################################################################
+# END
+################################################################################