aboutsummaryrefslogblamecommitdiffstats
path: root/xorg-server/setkeys
blob: 5837607d6da7e6d678383f35505fcd5f7cb795b9 (plain) (tree)

























































































































































                                                                                                                         
#!/bin/dash

load_layout () {
	if test -f "${XDG_RUNTIME_DIR}/.setkeys_layout"; then
		cat "${XDG_RUNTIME_DIR}/.setkeys_layout"
	fi
}

save_layout () {
	printf '%s\n' "$1" > "${XDG_RUNTIME_DIR}/.setkeys_layout"
}

if test "$1" = "greek"; then
	layout=gr
elif test "$1" = "swedish"; then
	layout=se
elif test "$1" = "english"; then
	layout=en_US
elif test "$1" = "toggle"; then
	layout="$(load_layout)"
	if test "$layout" = se; then
		layout=gr
	else
		layout=se
	fi
elif test $# = 0; then
	layout="$(load_layout)"
else
	layout="$1"
fi
if test -z "$layout"; then
	layout=se
fi
save_layout "$layout"

setxkbmap \
	-rules evdev \
	-model pc105 \
	-layout "$layout" \
	-variant '' \
	-option '' \
	-option terminate:ctrl_alt_bksp,compose:rwin,keypad:future \
	-types complete \
	-compat complete \
	-synch

{
	# Assign LeftCtrl to CapsLock
	printf '%s\n' 'keycode 66 = Control_L Control_L Control_L Control_L'

	# Assign LeftHyper to LeftCtrl
	printf '%s\n' 'keycode 37 = Hyper_L Hyper_L Hyper_L Hyper_L'

	# Assign remove layout switch from LeftShift
	printf '%s\n' 'keycode 50 = Shift_L Shift_L Shift_L Shift_L'

	if test -z "${NO_UNICOMP}"; then
		# Unicomp's newer versions of New Model M swapped AltGr and RSuper
		# making it a torture device for even someone with as big hands as mine
		if cat /sys/class/input/*/name | grep Unicomp > /dev/null; then
			# Assign Compose to AltGr
			printf '%s\n' 'keycode 108 = Multi_key Multi_key Multi_key Multi_key'

			# Assign AltGr to RightSuper
			printf '%s\n' 'keycode 134 = ISO_Level3_Shift ISO_Level3_Shift ISO_Level3_Shift ISO_Level3_Shift'
		fi
	fi

	cat <<EOF
clear Shift
clear Lock
clear Control
clear mod1
clear Mod2
clear Mod3
clear Mod4
clear Mod5
add Shift = Shift_L Shift_R
add Control = Control_L Control_R
add Mod1 = Alt_L Meta_L
add Mod2 = Num_Lock
add Mod3 = Hyper_L
add Mod4 = Super_L
add Mod5 = ISO_Level3_Shift
EOF
} | xmodmap -

if cat /sys/class/input/*/name | grep Unicomp > /dev/null; then
	# Turn off numlock LED
	input="$(grep Unicomp /sys/class/input/*/name | sed 's|^/sys/class/input/\(.*\)/name:.*$|\1|g' | sed 1q)"
	if ! echo 0 | sponge "/sys/class/leds/${input}::numlock/brightness" 2>/dev/null; then
		if isfg; then
		# TODO do at boot
			asroot chown ${USER}:${USER} "/sys/class/leds/${input}::numlock/brightness"
			echo 0 | sponge "/sys/class/leds/${input}::numlock/brightness"
		fi
	fi
fi

# Esc          = 9
# F1…F10       = 67…76
# F11…F12      = 95…96
# §            = 49
# 1…9          = 10…18
# 0+´          = 19…21
# Backspace    = 22
# Tab          = 23
# qwertyuiopå¨ = 24…35
# Enter        = 36
# CapsLock     = 66
# asdfghjklöä  = 38…48
# '            = 51
# LeftShift    = 50
# <            = 94
# zxcvbnm,.-   = 52…61
# RightShift   = 62
# LeftCtrl     = 37
# LeftSuper    = 133
# Alt          = 64
# Space        = 65
# AltGr        = 108
# RightSuper   = 134
# Menu         = 135
# RightCtrl    = 105
# SysReq       = 107
# ScrlLock     = 78
# Break        = 127
# Insert       = 118
# Home         = 110
# PageUp       = 112
# Delete       = 119
# End          = 115
# PageDown     = 117
# Up           = 111
# Left         = 113
# Down         = 116
# Right        = 114
# NumLock      = 77
# Num/         = 106
# Num*         = 63
# Num-         = 82
# Num7         = 79
# Num8         = 80
# Num9         = 81
# Num+         = 86
# Num4         = 83
# Num5         = 84
# Num6         = 85
# Num1         = 87
# Num2         = 88
# Num3         = 89
# NumEnter     = 104
# Num0         = 90
# Num,         = 91