#!/bin/sh # Copyright 2008 Bernd Steinhauser # Copyright 2008 Benjamin Kellermann # Copyright 2008 Pascal Hauck # Copyright 2008 Erik Streb del Toro # Distributed under the terms of the GNU General Public License v3 # colour definitions normal="\033[0m" red="\033[31m" orange="\033[33m" green="\033[32m" if [ "foo`echo -e bar`" = "foobar" ];then # GNU echo ECHO_e="echo -e" else # POSIX echo ECHO_e="echo" fi # Default values NEO_XKBMAP=${NEO_XKBMAP:-de} NEO_XKBVARIANT=${NEO_XKBVARIANT:-neo} NEO_XMODMAP=${NEO_XMODMAP:-$HOME/neo/neo_de.xmodmap} NEO_XMODMAP_XPROG=${NEO_XMODMAP_XPROG:-$HOME/neo/neo_de_x-prog.xmodmap} NEO_XMODMAP_ALTERNATIVE=${NEO_XMODMAP_ALTERNATIVE:-$HOME/neo/neo_de_alternative.xmodmap} NEO_CONSOLE_KEYMAP=${NEO_CONSOLE_KEYMAP:-$HOME/neo/neo.map} KEYSYMDEF=${KEYSYMDEF:-/usr/include/X11/keysymdef.h} die() { $ECHO_e "${red}$@${normal}" >&2 $ECHO_e "${red}Die Belegung konnte nicht auf NEO geändert werden.${normal}" >&2 exit 1 } die2() { set_xkbmap de die "Fehler beim Laden der Xmodmap $@." } numlock_manually() { $ECHO_e "${orange}Fehler beim setzen des Status von NumLock.${normal}" >&2 $ECHO_e "${orange}Sehr wahrscheinlich ist das Programm ›numlockx‹ nicht installiert.${normal}" >&2 $ECHO_e "${orange}Installieren Sie es, um diese Meldung zukünftig zu vermeiden.${normal}" >&2 $ECHO_e "Bitte jetzt ${orange}NumLock${normal} von Hand auf ${orange}$1${normal} schalten und ${orange}Enter${normal} drücken um fortzufahren…" >&2 read enter } set_xmodmap() { if [ -f "$@" ]; then set_xkbmap lv xmodmap "$@" || die2 $@ else die "Die Xmodmap-Datei ${orange}$@${red} gibt es nicht." fi } set_xkbmap() { setxkbmap "$@" || die "Die xkbmap ${orange}$@${red} wurde nicht gefunden." } set_keymap() { if [ -f "$@" ]; then if [ "${EUID}" = 0 ]; then loadkeys "$@" || die "Fehler beim Laden der Keymap ${orange}$@${red}." else echo echo "Um die NEO-Belegung zu aktivieren muss das Root-Passwort eingegeben werden." sudo loadkeys "$@" || die "Fehler bei der Verwendung von ${orange}sudo${red}, um die Belegung zu ändern." fi else die "Die keymap-Datei ${orange}$@${red} gibt es nicht." fi } help() { cat <&2 fi while [ ! -z "$1" ]; do case $1 in -h | --help ) help ;; -q | --quiet ) quiet=1 ;; * ) NEO_X_VARIANTE=${1-$NEO_X_VARIANTE} shift $# ;; esac shift done if [ -n "$SSH_CONNECTION" ]; then die "In einer ssh-session kann die Belegung nicht geändert werden." fi if [ -z ${DISPLAY} ]; then setleds +num || numlock_manually an set_keymap "${NEO_CONSOLE_KEYMAP}" # schalte versehentlich angeschaltetes CapsLock aus # keymap hat nur shiftlock => man kommt nicht mehr raus… setleds -caps else # versuche in letzter Sekunde versehentliches CapsLock anschalten zu verhindern # xmodmap hat nur shiftlock => man kommt nicht mehr raus… xmodmap -e "clear Lock" numlockx off || numlock_manually aus for modifier in 51 94; do xset -r ${modifier} || $ECHO_e "${orange}Fehler beim Ausschalten von Autorepeat beim Modifier ${modifier}.${normal}" >&2 done for deadkey in 21 35 49; do xset -r ${deadkey} || $ECHO_e "${orange}Fehler beim Ausschalten von Autorepead bei der toten Taste ${deakey}.${normal}" >&2 done if [ -z $NEO_X_VARIANTE ]; then if [ -f $NEO_XMODMAP ]; then NEO_X_VARIANTE=xmodmap else NEO_X_VARIANTE=xkbmap fi fi case "${NEO_X_VARIANTE}" in xkbmap) [ $quiet ] || echo "Die xkbmap wird geladen…" set_xkbmap "${NEO_XKBMAP}" "${NEO_XKBVARIANT}" ;; xmodmap) if [ ! true ]; then # hier wurde früher überprüft, ob die keysymdef.h vorhanden und aktuell ist. Diese Datei ist jedoch in aktuellen Standardinstallationen nicht mehr vorhanden. # ehemals: if [ ! -f ${KEYSYMDEF} ] || [ `grep -c 'dead_dasia' ${KEYSYMDEF}` -eq 0 ]; then $ECHO_e "${red}Das System scheint älter zu sein, weiche auf neo_de_alternative aus.${normal}" NEO_XMODMAP=${NEO_XMODMAP_ALTERNATIVE} fi [ $quiet ] || echo "Das Laden der Xmodmap kann einige Sekunden dauern…" set_xmodmap "${NEO_XMODMAP}" ;; xprog) [ $quiet ] || echo "Das Laden der Xmodmap (Variante für X-Programme) kann einige Sekunden dauern…" set_xmodmap "${NEO_XMODMAP_XPROG}" ;; alternative) [ $quiet ] || echo "Das Laden der alternativen Xmodmap kann einige Sekunden dauern…" set_xmodmap "${NEO_XMODMAP_ALTERNATIVE}" ;; *) die "${NEO_X_VARIANTE} ist eine unbekannte X-Variante der NEO-Belegung." ;; esac fi if [ ! "$quiet" ]; then echo echo "Die Tastaturbelegung wurde auf NEO geändert." $ECHO_e "Mit ${green}neo${normal} und ${green}num${normal} erhält man ein Bild der NEO-Belegung." $ECHO_e "Durch ${green}uiae${normal} kehrt man wieder zur Standardbelegung zurück." fi