summaryrefslogtreecommitdiffstats
path: root/linux/bin/asdf
blob: 537fcd50cf4555c39688df7436f1cf1e54f16592 (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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
#!/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

#prevent CapsLock while ›asdf‹ is running
xmodmap -e "clear Lock" 2> /dev/null

# 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

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

  NEO-X-Variante: 
  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

Homepage: http://neo-layout.org/
HELP
exit 0
}

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 [ -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.\nDas Verwenden der Standardwerte kann fehlschlagen!${normal}" >&2
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_XMODMAP_EVDEV=${NEO_XMODMAP_EVDEV:-$HOME/neo/neo_de_evdev.xmodmap}
NEO_CONSOLE_KEYMAP=${NEO_CONSOLE_KEYMAP:-$HOME/neo/neo.map}

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}$1${normal}" >&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 [ -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
			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
}

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 "Fehler beim setzen des Status von NumLock." an
	setleds -caps
	set_keymap "${NEO_CONSOLE_KEYMAP}"
else
	numlockx off || numlock_manually "Fehler beim setzen des Status von NumLock." 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)
			[ $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