123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- set -e
- PROGRAM="${0##*/}"
- TMPDIR="${TMPDIR:-$HOME}"
- TMPFILE="${TMPDIR}/.${PROGRAM}.${RANDOM-0}$$"
- OUTPUT="${TMPFILE}.data"
- LOCKFILE=/var/lock/dragora-keymap.lockfile
- KEYMAPS="${KEYMAPS:-/usr/share/keymaps/i386}"
- chkstatus_or_exit()
- {
- status=$?
-
- rm -f -- "$TMPFILE" "$LOCKFILE"
- if test $status -ne 0
- then
- printf '%s\n' "" "Return status = $status" 1>&2
- exit 2;
- fi
- unset -v status
- }
- if test ! -d "$TMPDIR"
- then
- echo "${PROGRAM}: \`${TMPDIR}' is not a qualified temporary directory" 1>&2
- exit 1;
- fi
- if test ! -w "$TMPDIR"
- then
- echo "${PROGRAM}: \`${TMPDIR}' is not a writable temporary directory" 1>&2
- exit 1;
- fi
- if test ! -d "$KEYMAPS"
- then
- echo "${PROGRAM}: Directory \`${KEYMAPS}' for keyboard maps does not exist as such" 1>&2
- exit 1;
- fi
- trap 'chkstatus_or_exit' EXIT HUP INT QUIT ABRT TERM
- umask 077;
- if ( set -C ; echo ": $PROGRAM - locked" > $LOCKFILE ) 2> /dev/null
- then
- true
- else
- if test -e "$LOCKFILE"
- then
- echo "Only one instance of \`${PROGRAM}' is allowed." 1>&2
- exit 1;
- else
- echo "${PROGRAM}: \`${LOCKFILE}' lock failed." 1>&2
- exit 2;
- fi
- fi
- search="$(find "$KEYMAPS" \( -type l -o -type f \) -name '*.map*' -print | LC_ALL=C sort 2> /dev/tty)"
- if test -z "$search"
- then
- echo "No keyboard maps were found in \`${KEYMAPS}'." 1>&2
- exit 1;
- fi
- printf '%s\n' \
- 'dialog --colors \' \
- ' --backtitle "\\Zb${PROGRAM} - Keyboard map selection" \' \
- ' --title "MAIN MENU" --default-item "qwerty/us" --menu \' \
- '"Welcome to \\Z3${PROGRAM}\\Zn!\\n\\n\' \
- 'The following menu list is organized as keyboard \\n\' \
- '\"layout/language\". \\n\\n\' \
- 'Select a keyboard map for the console:" 20 56 6 \' \
- > "$OUTPUT"
- for item in $search
- do
- level="${item%/*}"
- level="${level##*/}"
- item="${item%.map*}"
- item="${item##*/}"
-
- case $level in
- include | fgGIod)
- continue
- ;;
- *)
- echo "\"${level}/$item\" \"\" \\" >> "$OUTPUT"
- ;;
- esac
- done
- unset -v item level search
- printf "2> \$TMPFILE\\n\\n" >> "$OUTPUT"
- . "$OUTPUT"
- echo "" >> "$TMPFILE";
- IFS= read -r REPLY < "$TMPFILE" || exit 2;
- layout="${REPLY%/*}"
- map="${REPLY##*/}"
- unset -v REPLY
- rm -f -- "$TMPFILE" "$OUTPUT"
- umask 022;
- loadkeys "${layout}/$map"
- while true
- do
- testkeys="$(
- dialog --colors \
- --no-mouse --no-cancel --no-ok \
- --backtitle "\\Zb${PROGRAM} - Keyboard map check" \
- --title "SELECTED KEYMAP: ${layout}/$map" \
- --inputbox \
- "Try the chosen keyboard map by typing something. Once satisfied\\n\
- type \\Zb\\Z71\\Zn (or \\Zb\\Z7y\\Zn) then hit \\Zb\\Z7ENTER\\Zn \
- to continue. To choose a different keyboard map, type \\Zb\\Z72\\Zn (or \
- \\Zb\\Z7n\\Zn) plus \\Zb\\Z7ENTER\\Zn." 10 68 2>&1 > /dev/tty
- )"
- case $testkeys in
- 1 | Y | y)
- break
- ;;
- 2 | N | n)
- rm -f -- "$LOCKFILE"
- exec "$0"
- ;;
- esac
- done
- unset -v testkeys
- dialog --colors \
- --backtitle "\\Zb${PROGRAM} - Configuration file" \
- --title "/etc/rc.conf" --yesno \
- "Would do you like to save this change for the next reboot?" 5 62
- echo ""
- echo "Setting 'RC_KEYMAP=${layout}/$map' on /etc/rc.conf ..."
- echo ",s/^\\(RC_KEYMAP\\)=.*/\\1=${layout}\\/${map}/"$'\nw' | \
- ed /etc/rc.conf && echo Done.
|