Author: dteske
Date: Fri Oct 11 18:21:05 2013
New Revision: 256325
URL: http://svnweb.freebsd.org/changeset/base/256325

Log:
  Add keymap.subr for presenting custom keymap dialogs (with X11 support).
  
  Approved by:  re (glebius)

Added:
  head/usr.sbin/bsdconfig/share/keymap.subr   (contents, props changed)
Modified:
  head/usr.sbin/bsdconfig/include/messages.subr
  head/usr.sbin/bsdconfig/share/Makefile
  head/usr.sbin/bsdconfig/share/variable.subr

Modified: head/usr.sbin/bsdconfig/include/messages.subr
==============================================================================
--- head/usr.sbin/bsdconfig/include/messages.subr       Fri Oct 11 18:19:08 
2013        (r256324)
+++ head/usr.sbin/bsdconfig/include/messages.subr       Fri Oct 11 18:21:05 
2013        (r256325)
@@ -201,6 +201,7 @@ msg_lithuania="Lithuania"
 msg_loading_of_dependent_package_failed="Loading of dependent package %s 
failed"
 msg_located_index_now_reading_package_data_from_it="Located INDEX, now reading 
package data from it..."
 msg_logging_in_to_user_at_host="Logging in to %s@%s.."
+msg_looking_for_keymap_files="Looking for keymap files..."
 msg_looking_up_host="Looking up host %s"
 msg_mail_desc="Electronic mail packages and utilities."
 msg_main_menu="Main Menu"

Modified: head/usr.sbin/bsdconfig/share/Makefile
==============================================================================
--- head/usr.sbin/bsdconfig/share/Makefile      Fri Oct 11 18:19:08 2013        
(r256324)
+++ head/usr.sbin/bsdconfig/share/Makefile      Fri Oct 11 18:21:05 2013        
(r256325)
@@ -5,8 +5,9 @@ NO_OBJ=
 SUBDIR=        media packages
 
 FILESDIR=      ${SHAREDIR}/bsdconfig
-FILES=         common.subr device.subr dialog.subr mustberoot.subr \
-               script.subr strings.subr struct.subr sysrc.subr variable.subr
+FILES=         common.subr device.subr dialog.subr keymap.subr \
+               mustberoot.subr script.subr strings.subr struct.subr \
+               sysrc.subr variable.subr
 
 beforeinstall:
        mkdir -p ${DESTDIR}${FILESDIR}

Added: head/usr.sbin/bsdconfig/share/keymap.subr
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/usr.sbin/bsdconfig/share/keymap.subr   Fri Oct 11 18:21:05 2013        
(r256325)
@@ -0,0 +1,262 @@
+if [ ! "$_KEYMAP_SUBR" ]; then _KEYMAP_SUBR=1
+#
+# Copyright (c) 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..." keymap.subr
+f_include $BSDCFG_SHARE/struct.subr
+
+############################################################ CONFIGURATION
+
+#
+# Defaults taken from usr.sbin/kbdmap/kbdmap.h
+#
+: ${DEFAULT_LANG:=en}
+: ${DEFAULT_KEYMAP_DIR:=/usr/share/syscons/keymaps}
+
+############################################################ GLOBALS
+
+KEYMAPS=
+
+# A "keymap" from kbdmap's point of view
+f_struct_define KEYMAP \
+       desc \
+       keym \
+       mark
+
+#
+# Default behavior is to call f_keymap_get_all() automatically when loaded.
+#
+: ${KEYMAP_SELF_SCAN_ALL=1}
+
+############################################################ FUNCTIONS
+
+# f_keymap_register $name $desc $keym $mark
+#
+# Register a keymap. A `structure' (see struct.subr) is created with the name
+# keymap_$name (so make sure $name contains only alpha-numeric characters or
+# the underscore, `_'). The remaining arguments after $name correspond to the
+# propertise of the `KEYMAP' structure-type (defined above).
+#
+# If not already registered, the keymap is then appended to the KEYMAPS
+# environment variable, a space-separated list of all registered keymaps.
+#
+f_keymap_register()
+{
+       local name="$1" desc="$2" keym="$3" mark="$4"
+
+       f_struct_new KEYMAP "keymap_$name" || return $FAILURE
+       keymap_$name set desc "$desc"
+       keymap_$name set keym "$keym"
+       keymap_$name set mark "$mark"
+
+       # Scan our global register to see if needs ammending
+       local k found=
+       for k in $KEYMAPS; do
+               [ "$k" = "$name" ] || continue
+               found=1 && break
+       done
+       [ "$found" ] || KEYMAPS="$KEYMAPS $name"
+
+       return $SUCCESS
+}
+
+# f_keymap_checkfile $keymap
+#
+# Check that $keymap is a readable kbdmap(5) file. Returns success if $keymap
+# is a file, is readable, and exists in $DEFAULT_KEYMAP_DIR; otherwise failure.
+# If debugging is enabled, an appropriate debug error message is printed if
+# $keymap is not available.
+#
+f_keymap_checkfile()
+{
+       local keym="$1"
+       
+       # Fixup keymap if it doesn't already contain at least one `/'
+       [ "${keym#*/}" = "$keym" ] && keym="$DEFAULT_KEYMAP_DIR/$keym"
+
+       # Short-cuts
+       [ -f "$keym" -a -r "$keym" ] && return $SUCCESS
+       f_debugging || return $FAILURE
+
+       # Print an appropriate debug error message
+       if [ ! -e "$keym" ]; then
+               f_dprintf "%s: No such file or directory" "$keym"
+       elif [ ! -f "$keym" ]; then
+               f_dprintf "%s: Not a file!" "$keym"
+       elif [ ! -r "$keym" ]; then
+               f_dprintf "%s: Permission denied" "$keym"
+       fi
+
+       return $FAILURE
+}
+
+# f_keymap_get_all
+#
+# Get all keymap information for kbdmap(5) entries both in the database and
+# loosely existing in $DEFAULT_KEYMAP_DIR.
+#
+f_keymap_get_all()
+{
+       local fname=f_keymap_get_all
+       local lang="${LC_ALL:-${LC_CTYPE:-${LANG:-$DEFAULT_LANG}}}"
+       [ "$lang" = "C" ] && lang="$DEFAULT_LANG"
+
+       f_dprintf "%s: Looking for keymap files..." $fname
+       f_dialog_info "$msg_looking_for_keymap_files"
+       f_dprintf "DEFAULT_LANG=[%s]" "$DEFAULT_LANG"
+
+       eval "$( awk -F: -v lang="$lang" -v lang_default="$DEFAULT_LANG" '
+               BEGIN {
+                       # en_US.ISO8859-1 -> en_..\.ISO8859-1
+                       dialect = lang
+                       if (length(dialect) >= 6 &&
+                           substr(dialect, 3, 1) == "_")
+                               dialect = substr(dialect, 1, 3) ".." \
+                                         substr(dialect, 6)
+                       printf "f_dprintf \"dialect=[%%s]\" \"%s\";\n", dialect
+
+                       # en_US.ISO8859-1 -> en
+                       lang_abk = lang
+                       if (length(lang_abk) >= 3 &&
+                           substr(lang_abk, 3, 1) == "_")
+                               lang_abk = substr(lang_abk, 1, 2)
+                       printf "f_dprintf \"lang_abk=[%%s]\" \"%s\";\n",
+                              lang_abk
+               }
+               function find_token(buffer, token)
+               {
+                       if (split(buffer, tokens, /,/) == 0) return 0
+                       found = 0
+                       for (t in tokens)
+                               if (token == tokens[t]) { found = 1; break }
+                       return found
+               }
+               function add_keymap(desc,mark,keym)
+               {
+                       marks[keym] = mark
+                       name = keym
+                       gsub(/[^[:alnum:]_]/, "_", name)
+                       gsub(/'\''/, "'\''\\'\'''\''", desc);
+                       printf "f_keymap_checkfile %s && " \
+                              "f_keymap_register %s '\'%s\'' %s %u\n",
+                              keym, name, desc, keym, mark
+               }
+               !/^[[:space:]]*(#|$)/ {
+                       sub(/^[[:space:]]*/, "", $0)
+                       keym = $1
+                       if (keym ~ /^(MENU|FONT)$/) next
+                       lg = ($2 == "" ? lang_default : $2)
+
+                       # Match the entry and store the type of match we made
+                       # as the mark value (so that if we make a better match
+                       # later on with a higher mark, it overwrites previous)
+
+                       mark = marks[keym];
+                       if (find_token(lg, lang))
+                               add_keymap($3, 4, keym) # Best match
+                       else if (mark <= 3 && find_token(lg, dialect))
+                               add_keymap($3, 3, keym)
+                       else if (mark <= 2 && find_token(lg, lang_abk))
+                               add_keymap($3, 2, keym)
+                       else if (mark <= 1 && find_token(lg, lang_default))
+                               add_keymap($3, 1, keym)
+                       else if (mark <= 0)
+                               add_keymap($3, 0, keym)
+               }
+       ' "$DEFAULT_KEYMAP_DIR/INDEX.${DEFAULT_KEYMAP_DIR##*/}" )"
+
+
+       #
+       # Look for keymaps not in database
+       #
+       local direntry keym name
+       set +f # glob
+       for direntry in "$DEFAULT_KEYMAP_DIR"/*; do
+               [ "${direntry##*.}" = ".kbd" ] || continue
+               keym="${direntry##*/}"
+               f_str2varname "$keym" name
+               f_struct keymap_$name && continue
+               f_keymap_checkfile "$keym" &&
+                       f_keymap_register $name "${keym%.*}" "$keym" 0
+               f_dprintf "%s: not in kbdmap(5) database" "$keym"
+       done
+
+       #
+       # Sort the items by their descriptions
+       #
+       f_dprintf "%s: Sorting keymap entries by description..." $fname
+       KEYMAPS=$(
+               for k in $KEYMAPS; do
+                       echo -n "$k "
+                       # NOTE: Translate '8x8' to '8x08' before sending to
+                       # sort(1) so that things work out as we might expect.
+                       debug= keymap_$k get desc | sed -e 's/8x8/8x08/g'
+               done | sort -k2 | awk '{
+                       printf "%s%s", (started ? " " : ""), $1; started = 1
+               }'
+       )
+
+       return $SUCCESS
+}
+
+# f_keymap_kbdcontrol $keymap
+#
+# Install keyboard map file from $keymap.
+#
+f_keymap_kbdcontrol()
+{
+       local keymap="$1"
+
+       [ "$keymap" ] || return $SUCCESS
+
+       # Fixup keymap if it doesn't already contain at least one `/'
+       [ "${keymap#*/}" = "$keymap" ] && keymap="$DEFAULT_KEYMAP_DIR/$keymap"
+
+       [ "$USE_XDIALOG" ] || kbdcontrol -l "$keymap"
+}
+
+############################################################ MAIN
+
+#
+# Scan for keymaps unless requeted otherwise
+#
+f_dprintf "%s: KEYMAP_SELF_SCAN_ALL=[%s]" keymap.subr "$KEYMAP_SELF_SCAN_ALL"
+case "$KEYMAP_SELF_SCAN_ALL" in
+""|0|[Nn][Oo]|[Oo][Ff][Ff]|[Ff][Aa][Ll][Ss][Ee]) : do nothing ;;
+*) f_keymap_get_all
+esac
+
+f_dprintf "%s: Found %u keymap file(s)." keymap.subr \
+          "$( set -- $KEYMAPS; echo $# )"
+
+f_dprintf "%s: Successfully loaded." keymap.subr
+
+fi # ! $_KEYMAP_SUBR

Modified: head/usr.sbin/bsdconfig/share/variable.subr
==============================================================================
--- head/usr.sbin/bsdconfig/share/variable.subr Fri Oct 11 18:19:08 2013        
(r256324)
+++ head/usr.sbin/bsdconfig/share/variable.subr Fri Oct 11 18:21:05 2013        
(r256325)
@@ -240,6 +240,7 @@ f_variable_new VAR_IFCONFIG         ifconfig_
 f_variable_new VAR_IPADDR              ipaddr
 f_variable_new VAR_IPV6ADDR            ipv6addr
 f_variable_new VAR_IPV6_ENABLE         ipv6_activate_all_interfaces
+f_variable_new VAR_KEYMAP              keymap
 f_variable_new VAR_MEDIA_TIMEOUT       MEDIA_TIMEOUT
 f_variable_new VAR_MEDIA_TYPE          mediaType
 f_variable_new VAR_NAMESERVER          nameserver
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to