#!/bin/bash # 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 # colours in the Bash normal="\033[0m" red="\033[31m" orange="\033[33m" green="\033[32m" if [ -f "${NEO_CONFIG}" ]; then . "${NEO_CONFIG}" || die "Fehler beim Verwenden der Konfigurationsdatei ${NEO_CONFIG}" elif [ -f "${HOME}"/.neorc ]; then . "${HOME}"/.neorc || die "Fehler beim Verwenden der Konfigurationsdatei ${HOME}/.neorc" elif [ -f /etc/neo.conf ]; then . /etc/neo.conf || die "Fehler beim Verwenden der Konfigurationsdatei /etc/neo.conf" else echo "${red}Keine Konfigurationsdatei für NEO gefunden. Das Verwenden der Standardwerte kann fehlschlagen!${normal}" fi # Default paths PATH_XMODMAP=${PATH_XMODMAP:-/usr/bin/xmodmap} PATH_SETXKBMAP=${PATH_SETXKBMAP:-/usr/bin/setxkbmap} PATH_LOADKEYS=${PATH_LOADKEYS:-/usr/bin/loadkeys} PATH_SUDO=${PATH_SUDO:-/usr/bin/sudo} PATH_SETLEDS=${PATH_SETLEDS:-/usr/bin/setleds} PATH_NUMLOCKX=${PATH_NUMLOCKX:-/usr/bin/numlockx} PATH_XSET=${PATH_XSET:-/usr/bin/xset} # 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_XMODMAP_EVDEV=${NEO_XMODMAP_EVDEV:-$HOME/neo/neo_de_evdev.xmodmap} NEO_CONSOLE_KEYMAP=${NEO_CONSOLE_KEYMAP:-$HOME/neo/neo.map} help() { cat <&2 echo -e "${red}Die Belegung konnte nicht auf NEO geändert werden.${normal}" exit 1 } die2() { set_xkbmap de die "Fehler beim Laden der Xmodmap $@." } numlock_manually() { echo -e "$1" >&2 echo -e "Bitte jetzt ${orange}NumLock${normal} von Hand auf ${orange}$2${normal} schalten und ${orange}Enter${normal} drücken um fortzufahren…" >&2 read enter } set_xmodmap() { if [ -e "${PATH_XMODMAP}" ]; then if [ -f "$@" ]; then set_xkbmap lv "${PATH_XMODMAP}" "$@" || die2 $@ else die "Die Xmodmap-Datei $@ gibt es nicht." fi else die "Der Befehl ${orange}xmodmap${red} wurde nicht gefunden, die Belegung kann nicht verändert werden." fi } set_xkbmap() { if [ -e "${PATH_SETXKBMAP}" ]; then "${PATH_SETXKBMAP}" "$@" || die "Die xkbmap $@ wurde nicht gefunden." else die "Der Befehl ${orange}setxkbmap${red} wurde nicht gefunden, die Belegung kann nicht verändert werden." fi } set_keymap() { if [ ! -e "${PATH_LOADKEYS}" ]; then echo -e "${orange}Der Befehl ${red}loadkeys${orange} wurde nicht im angegebenen Verzeichnis gefunden, versuche es ohne explizite Angabe.${normal}" PATH_LOADKEYS=loadkeys fi if [ -f "$@" ]; then if [ "${EUID}" = 0 ]; then "${PATH_LOADKEYS}" "$@" || die "Fehler beim Laden der Keymap ${orange}$@${red}." elif [ -e "${PATH_SUDO}" ]; then "${PATH_SUDO}" "${PATH_LOADKEYS}" "$@" || die "Fehler bei der Verwendung von ${orange}sudo${red}, um die Belegung zu ändern." else die "Die Belegung auf der Textkonsole kann nur mir Rootrechten geändert werden." fi else die "Die keymap-Datei ${orange}$@${red} gibt es nicht." 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 if [ -e "${PATH_SETLEDS}" ]; then "${PATH_SETLEDS}" +num || numlock_manually "Fehler beim setzen des Status von NumLock." an else numlock_manually "Der Befehl ${red}setleds${normal} wurde nicht gefunden. Darum kann der Status von NumLock nicht automatisch geändert werden." an fi set_keymap "${NEO_CONSOLE_KEYMAP}" else if [ -e "${PATH_NUMLOCKX}" ]; then "${PATH_NUMLOCKX}" off || numlock_manually "Fehler beim setzen des Status von NumLock." aus else numlock_manually "Der Befehl ${red}numlockx${normal} wurde nicht gefunden. Darum kann der Status von NumLock nicht automatisch geändert werden." aus fi if [ -e "${PATH_XSET}" ]; then for modifier in 51 94; do "${PATH_XSET}" -r ${modifier} || echo "Fehler beim Ausschalten von Autorepeat beim Modifier ${modifier}." >&2 done for deadkey in 21 35 49; do "${PATH_XSET}" -r ${deadkey} || echo "Fehler beim Ausschalten von Autorepead bei der toten Taste ${deakey}." >&2 done else echo "Der Befehl ${red}xset${normal} wurde nicht gefunden. Der Status von autorepeat kann für Modifier und tote Tasten nicht geändert werden." >&2 fi case "${NEO_X_VARIANTE}" in xkbmap) [ $quiet ] || echo "Die xkbmap wird geladen…" set_xkbmap "${NEO_XKBMAP}" "${NEO_XKBVARIANT}" ;; xmodmap) [ $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}" ;; evdev) [ $quiet ] || echo "Das Laden der Xmodmap (evdev-Variante) kann einige Sekunden dauern…" set_xmodmap "${NEO_XMODMAP_EVDEV}" ;; *) 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