#!/bin/bash # Copyright 2008 Bernd Steinhauser <berniyh@exherbo.org> # 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 <<HELP Aufruf: $0 [-q] [NEO-X-Variante] Aktiviert die NEO-Tastaturbelegung. NEO-X-Variante als NEO-X-Variante kann verwendet werden: xkmbap i.d.R. wenn Rootrechte vorhanden sind xmodmap i.d.R. wenn NEO nur für einen Benutzer verwendet werden soll alternative sollte geladen werden, wenn das Laden der Xmodmap fehl schlägt xprog falls ältere X-Programme (wie xedit oder xfig) verwendet werden evdev falls der evdev-Treiber verwendet wird Das Skript erkennt, falls sich der Benutzer nur auf einer Textkonsole befindet und ändert auch dort die Belegung (hierfür sind allerdings Rootrechte erforderlich!) -q, --quiet gibt – abgesehen von Fehlern – keine Meldungen aus NEO-Tastaturbelegung Homepage: http://neo-layout.org/ HELP exit 0 } die() { echo -e "${red}$@${normal}" >&2 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 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 else die "Der Befehl ${orange}loadkeys${red} wurde nicht gefunden, die Belegung kann nicht verändert werden." 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