summaryrefslogtreecommitdiff
path: root/linux/bin/uiae
blob: 8f834705de9b272bbf6805fc21e4db9669c0ff04 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#!/bin/sh
# 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 [ "foo`echo -e bar`" = "foobar" ];then
  # GNU echo
  ECHO_e="echo -e"
else
  # POSIX echo
  ECHO_e="echo"
fi

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_e "${red}Keine Konfigurationsdatei für NEO gefunden. Das Verwenden der Standardwerte kann fehlschlagen!${normal}" >&2
fi


# Default values
STD_X_VARIANTE=${STD_X_VARIANTE:-xkbmap}
STD_XKBMAP=${STD_XKBMAP:-de}
STD_XKBVARIANT=${STD_XKBVARIANT:-nodeadkeys}
STD_XMODMAP=${STD_XMODMAP:-""}
STD_CONSOLE_KEYMAP="${STD_CONSOLE_KEYMAP:-de-latin1-nodeadkeys}"
NUM_LOCK_STATUS=${NUM_LOCK_STATUS:-on}

help() {
cat <<HELP
Aufruf: $0 [-q] [Standard-X-Variante]
Aktiviert die Standard-Tastaturbelegung.

  NEO-X-Variante	als Standard-X-Variante kann verwendet werden:
				xkmbap		in den meisten Fällen richtig (Standardeinstellung)
				xmodmap		nur sinnvoll, wenn eine eigene Xmodmap als Standardbelegung 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
	$ECHO_e "${red}Die Belegung konnte nicht geändert werden.${normal}" >&2
	exit 1
}

set_xmodmap() {
	if [ -f "$@" ]; then
		xmodmap "$@" || die "Fehler beim Laden der Xmodmap $@." >&2
	else
		die "Die Xmodmap-Datei ${orange}$@${red} gibt es nicht." >&2
	fi
}

set_xkbmap() {
	setxkbmap "$@" || die "Die xkbmap ${orange}$@${red} wurde nicht gefunden." >&2
}

set_keymap() {
	if [ "${EUID}" = 0 ]; then
		loadkeys "$@" || die "Fehler beim Laden der Keymap ${orange}$@${red}." >&2
	else
		sudo loadkeys "$@" || die "Fehler bei der Verwendung von ${orange}sudo${red}, um die Belegung zu ändern." >&2
	fi
}


while [ ! -z "$1" ]; do
	case $1 in
		-h | --help )
			help
			;;
		-q | --quiet )
			quiet=1
			;;
		* )
			STD_X_VARIANTE=${1-$STD_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
	set_keymap "${STD_CONSOLE_KEYMAP}"

	if [ "${NUM_LOCK_STATUS}" = "on" ]; then
		setleds -num || $ECHO_e "${orange}Fehler beim setzen des Status von NumLock.${normal}" >&2
	else
		setleds +num || $ECHO_e "${orange}Fehler beim setzen des Status von NumLock.${normal}" >&2
	fi

else
	for modifier in 51 94; do
		xset r ${modifier} || $ECHO_e "${orange}Fehler beim Wiederherstellen von Autorepeat beim Modifier ${modifier}.${normal}" >&2
	done
	for deadkey in 21 35 49; do
		xset r ${deadkey} || $ECHO_e "${orange}Fehler beim Wiederherstellen von Autorepead bei der toten Taste ${deakey}.${normal}" >&2
	done


	case "${STD_X_VARIANTE}" in
		xkbmap)
			[ $quiet ] || echo "Die Standardbelegung wird geladen…"
			set_xkbmap "${STD_XKBMAP}" "${STD_XKBVARIANT}"
			;;
		xmodmap)
			if [ "${STD_XMODMAP}" ]; then
				[ $quiet ] || echo "Die Standard-Xmodmap wird geladen…"
				set_xmodmap "${STD_XMODMAP}"
			else
				$ECHO_e "${red}Es wurde keine Standard-Xmodmap definiert.${normal}" >&2
				die "In der Regel ist ${green}uiae${red} ohne weitere Angaben erfolgreich."
			fi
			;;
		*)
			die "${orange}${STD_X_VARIANTE}${red} ist eine unbekannte X-Variante der NEO-Belegung."
			;;
	esac

	if [ "${NUM_LOCK_STATUS}" = "on" ]; then
		numlockx on || $ECHO_e "${orange}Fehler beim setzen des Status von NumLock.${normal}" >&2
	else
		numlockx off || $ECHO_e "${orange}Fehler beim setzen des Status von NumLock.${normal}" >&2
	fi
fi

if [ ! "$quiet" ]; then
	echo
	echo "Die Tastaturbelegung wurde auf die Standardbelegung geändert."
	$ECHO_e "Durch ${green}asdf${normal} kehrt man wieder zur NEO-Belegung zurück."
fi