| 1 | #!/bin/bash |
|---|
| 2 | # Copyright 2008 Bernd Steinhauser <berniyh@exherbo.org> |
|---|
| 3 | # Copyright 2008 Benjamin Kellermann |
|---|
| 4 | # Copyright 2008 Pascal Hauck |
|---|
| 5 | # Copyright 2008 Erik Streb del Toro |
|---|
| 6 | # Distributed under the terms of the GNU General Public License v3 |
|---|
| 7 | |
|---|
| 8 | |
|---|
| 9 | # colours in the Bash |
|---|
| 10 | normal="\033[0m" |
|---|
| 11 | red="\033[31m" |
|---|
| 12 | green="\033[32m" |
|---|
| 13 | |
|---|
| 14 | if [ -f "${NEO_CONFIG}" ]; then |
|---|
| 15 | . "${NEO_CONFIG}" || die "Fehler beim Verwenden der Konfigurationsdatei ${NEO_CONFIG}" |
|---|
| 16 | elif [ -f "${HOME}"/.neorc ]; then |
|---|
| 17 | . "${HOME}"/.neorc || die "Fehler beim Verwenden der Konfigurationsdatei ${HOME}/.neorc" |
|---|
| 18 | elif [ -f /etc/neo.conf ]; then |
|---|
| 19 | . /etc/neo.conf || die "Fehler beim Verwenden der Konfigurationsdatei /etc/neo.conf" |
|---|
| 20 | else |
|---|
| 21 | echo "${red}Keine Konfigurationsdatei für NEO gefunden. Das Verwenden der Standardwerte kann fehlschlagen!${normal}" |
|---|
| 22 | fi |
|---|
| 23 | |
|---|
| 24 | # Default paths |
|---|
| 25 | PATH_XMODMAP=${PATH_XMODMAP:-/usr/bin/xmodmap} |
|---|
| 26 | PATH_SETXKBMAP=${PATH_SETXKBMAP:-/usr/bin/setxkbmap} |
|---|
| 27 | PATH_LOADKEYS=${PATH_LOADKEYS:-/usr/bin/loadkeys} |
|---|
| 28 | PATH_SUDO=${PATH_SUDO:-/usr/bin/sudo} |
|---|
| 29 | PATH_SETLEDS=${PATH_SETLEDS:-/usr/bin/setleds} |
|---|
| 30 | PATH_NUMLOCKX=${PATH_NUMLOCKX:-/usr/bin/numlockx} |
|---|
| 31 | PATH_XSET=${PATH_XSET:-/usr/bin/xset} |
|---|
| 32 | |
|---|
| 33 | # Default values |
|---|
| 34 | NEO_XKBMAP=${NEO_XKBMAP:-de} |
|---|
| 35 | NEO_XKBVARIANT=${NEO_XKBVARIANT:-neo} |
|---|
| 36 | NEO_XMODMAP=${NEO_XMODMAP:-$HOME/neo/neo_de.xmodmap} |
|---|
| 37 | NEO_XMODMAP_XPROG=${NEO_XMODMAP_XPROG:-$HOME/neo/neo_de_x-prog.xmodmap} |
|---|
| 38 | NEO_XMODMAP_ALTERNATIVE=${NEO_XMODMAP_ALTERNATIVE:-$HOME/neo/neo_de_alternative.xmodmap} |
|---|
| 39 | NEO_XMODMAP_EVDEV=${NEO_XMODMAP_EVDEV:-$HOME/neo/neo_de_evdev.xmodmap} |
|---|
| 40 | NEO_CONSOLE_KEYMAP=${NEO_CONSOLE_KEYMAP:-$HOME/neo/neo.map} |
|---|
| 41 | |
|---|
| 42 | help() { |
|---|
| 43 | cat <<HELP |
|---|
| 44 | Aufruf: $0 [-q] [NEO-X-Variante] |
|---|
| 45 | Aktiviert die NEO-Tastaturbelegung. |
|---|
| 46 | |
|---|
| 47 | NEO-X-Variante als NEO-X-Variante kann verwendet werden: |
|---|
| 48 | xkmbap i.d.R. wenn Rootrechte vorhanden sind |
|---|
| 49 | xmodmap i.d.R. wenn NEO nur für einen Benutzer verwendet werden soll |
|---|
| 50 | alternative sollte geladen werden, wenn das Laden der Xmodmap fehl schlägt |
|---|
| 51 | xprog falls ältere X-Programme (wie xedit oder xfig) verwendet werden |
|---|
| 52 | evdev falls der evdev-Treiber verwendet wird |
|---|
| 53 | |
|---|
| 54 | Das Skript erkennt, falls sich der Benutzer nur auf einer Textkonsole befindet und ändert |
|---|
| 55 | auch dort die Belegung (hierfür sind allerdings Rootrechte erforderlich!) |
|---|
| 56 | |
|---|
| 57 | -q, --quiet gibt – abgesehen von Fehlern – keine Meldungen aus |
|---|
| 58 | |
|---|
| 59 | NEO-Tastaturbelegung |
|---|
| 60 | Homepage: http://neo-layout.org/ |
|---|
| 61 | |
|---|
| 62 | HELP |
|---|
| 63 | exit 0 |
|---|
| 64 | } |
|---|
| 65 | |
|---|
| 66 | die() { |
|---|
| 67 | echo -e "${red}$@${normal}" >&2 |
|---|
| 68 | exit 1 |
|---|
| 69 | } |
|---|
| 70 | |
|---|
| 71 | die2() { |
|---|
| 72 | set_xkbmap de |
|---|
| 73 | die "Fehler beim Laden der Xmodmap $@." |
|---|
| 74 | } |
|---|
| 75 | |
|---|
| 76 | numlock_manually() { |
|---|
| 77 | echo "$1" >&2 |
|---|
| 78 | echo "Bitte jetzt NumLock von Hand auf $2 schalten und ›Enter‹ drücken um fortzufahren…" >&2 |
|---|
| 79 | read enter |
|---|
| 80 | } |
|---|
| 81 | |
|---|
| 82 | set_xmodmap() { |
|---|
| 83 | if [ -e "${PATH_XMODMAP}" ]; then |
|---|
| 84 | if [ -f "$@" ]; then |
|---|
| 85 | set_xkbmap lv |
|---|
| 86 | "${PATH_XMODMAP}" "$@" || die2 $@ |
|---|
| 87 | else |
|---|
| 88 | die "Die Xmodmap-Datei $@ gibt es nicht." |
|---|
| 89 | fi |
|---|
| 90 | else |
|---|
| 91 | die "Der Befehl ›xmodmap‹ wurde nicht gefunden, die Belegung kann nicht verändert werden." |
|---|
| 92 | fi |
|---|
| 93 | } |
|---|
| 94 | |
|---|
| 95 | set_xkbmap() { |
|---|
| 96 | if [ -e "${PATH_SETXKBMAP}" ]; then |
|---|
| 97 | "${PATH_SETXKBMAP}" "$@" || die "Die xkbmap $@ wurde nicht gefunden." |
|---|
| 98 | else |
|---|
| 99 | die "Der Befehl ›setxkbmap‹ wurde nicht gefunden, die Belegung kann nicht verändert werden." |
|---|
| 100 | fi |
|---|
| 101 | } |
|---|
| 102 | |
|---|
| 103 | set_keymap() { |
|---|
| 104 | if [ -e "${PATH_LOADKEYS}" ]; then |
|---|
| 105 | if [ -f "$@" ]; then |
|---|
| 106 | if [ "${EUID}" = 0 ]; then |
|---|
| 107 | "${PATH_LOADKEYS}" "$@" || die "Fehler beim Laden der Keymap $@." |
|---|
| 108 | elif [ -e "${PATH_SUDO}" ]; then |
|---|
| 109 | "${PATH_SUDO}" "${PATH_LOADKEYS}" "$@" || die "Fehler bei der Verwendung von ›sudo‹, um die Belegung zu ändern." |
|---|
| 110 | else |
|---|
| 111 | die "Die Belegung auf der Textkonsole kann nur mir Rootrechten geändert werden." |
|---|
| 112 | fi |
|---|
| 113 | else |
|---|
| 114 | die "Die keymap-Datei $@ gibt es nicht." |
|---|
| 115 | fi |
|---|
| 116 | else |
|---|
| 117 | die "Der Befehl ›loadkeys‹ wurde nicht gefunden, die Belegung kann nicht verändert werden." |
|---|
| 118 | fi |
|---|
| 119 | } |
|---|
| 120 | |
|---|
| 121 | |
|---|
| 122 | while [ ! -z "$1" ]; do |
|---|
| 123 | case $1 in |
|---|
| 124 | -h | --help ) |
|---|
| 125 | help |
|---|
| 126 | ;; |
|---|
| 127 | -q | --quiet ) |
|---|
| 128 | quiet=1 |
|---|
| 129 | ;; |
|---|
| 130 | * ) |
|---|
| 131 | NEO_X_VARIANTE=${1-$NEO_X_VARIANTE} |
|---|
| 132 | shift $# |
|---|
| 133 | ;; |
|---|
| 134 | esac |
|---|
| 135 | shift |
|---|
| 136 | done |
|---|
| 137 | |
|---|
| 138 | |
|---|
| 139 | if [ -n "$SSH_CONNECTION" ]; then |
|---|
| 140 | die "In einer ssh-session kann die Belegung nicht geändert werden." |
|---|
| 141 | fi |
|---|
| 142 | |
|---|
| 143 | if [ -z ${DISPLAY} ]; then |
|---|
| 144 | set_keymap "${NEO_CONSOLE_KEYMAP}" |
|---|
| 145 | |
|---|
| 146 | if [ -e "${PATH_SETLEDS}" ]; then |
|---|
| 147 | "${PATH_SETLEDS}" +num || numlock_manually "Fehler beim setzen des Status von NumLock." an |
|---|
| 148 | else |
|---|
| 149 | numlock_manually "Der Befehl ›setleds‹ wurde nicht gefunden. Darum kann der Status von NumLock nicht automatisch geändert werden." an |
|---|
| 150 | fi |
|---|
| 151 | else |
|---|
| 152 | if [ -e "${PATH_NUMLOCKX}" ]; then |
|---|
| 153 | "${PATH_NUMLOCKX}" off || numlock_manually "Fehler beim setzen des Status von NumLock." aus |
|---|
| 154 | else |
|---|
| 155 | numlock_manually "Der Befehl ›numlockx‹ wurde nicht gefunden. Darum kann der Status von NumLock nicht automatisch geändert werden." aus |
|---|
| 156 | fi |
|---|
| 157 | |
|---|
| 158 | if [ -e "${PATH_XSET}" ]; then |
|---|
| 159 | for modifier in 51 94; do |
|---|
| 160 | "${PATH_XSET}" -r ${modifier} || echo "Fehler beim Ausschalten von Autorepeat beim Modifier ${modifier}." >&2 |
|---|
| 161 | done |
|---|
| 162 | for deadkey in 21 35 49; do |
|---|
| 163 | "${PATH_XSET}" -r ${deadkey} || echo "Fehler beim Ausschalten von Autorepead bei der toten Taste ${deakey}." >&2 |
|---|
| 164 | done |
|---|
| 165 | else |
|---|
| 166 | echo "Der Befehl ›xset‹ wurde nicht gefunden. Der Status von autorepeat kann für Modifier und tote Tasten nicht geändert werden." >&2 |
|---|
| 167 | fi |
|---|
| 168 | |
|---|
| 169 | case "${NEO_X_VARIANTE}" in |
|---|
| 170 | xkbmap) |
|---|
| 171 | [ $quiet ] || echo "Die xkbmap wird geladen…" |
|---|
| 172 | set_xkbmap "${NEO_XKBMAP}" "${NEO_XKBVARIANT}" |
|---|
| 173 | ;; |
|---|
| 174 | xmodmap) |
|---|
| 175 | [ $quiet ] || echo "Das Laden der Xmodmap kann einige Sekunden dauern…" |
|---|
| 176 | set_xmodmap "${NEO_XMODMAP}" |
|---|
| 177 | ;; |
|---|
| 178 | xprog) |
|---|
| 179 | [ $quiet ] || echo "Das Laden der Xmodmap (Variante für X-Programme) kann einige Sekunden dauern…" |
|---|
| 180 | set_xmodmap "${NEO_XMODMAP_XPROG}" |
|---|
| 181 | ;; |
|---|
| 182 | alternative) |
|---|
| 183 | [ $quiet ] || echo "Das Laden der alternativen Xmodmap kann einige Sekunden dauern…" |
|---|
| 184 | set_xmodmap "${NEO_XMODMAP_ALTERNATIVE}" |
|---|
| 185 | ;; |
|---|
| 186 | evdev) |
|---|
| 187 | [ $quiet ] || echo "Das Laden der Xmodmap (evdev-Variante) kann einige Sekunden dauern…" |
|---|
| 188 | set_xmodmap "${NEO_XMODMAP_EVDEV}" |
|---|
| 189 | ;; |
|---|
| 190 | *) |
|---|
| 191 | die "${NEO_X_VARIANTE} ist eine unbekannte X-Variante der NEO-Belegung." |
|---|
| 192 | ;; |
|---|
| 193 | esac |
|---|
| 194 | fi |
|---|
| 195 | |
|---|
| 196 | if [ ! "$quiet" ]; then |
|---|
| 197 | echo |
|---|
| 198 | echo "Die Tastaturbelegung wurde auf NEO geändert." |
|---|
| 199 | echo -e "Mit ${green}neo${normal} und ${green}num${normal} erhält man ein Bild der NEO-Belegung." |
|---|
| 200 | echo -e "Durch ${green}uiae${normal} kehrt man wieder zur Standardbelegung zurück." |
|---|
| 201 | fi |
|---|