You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							209 lines
						
					
					
						
							4.3 KiB
						
					
					
				
			
		
		
	
	
							209 lines
						
					
					
						
							4.3 KiB
						
					
					
				| #!/bin/sh | |
|  | |
| # Control the input devices | |
| # Depends: xinput, setxkbmap | |
|  | |
| help() { | |
| 	B=$(tput bold) | |
| 	U=$(tput smul) | |
| 	N=$(tput sgr0) | |
|  | |
| 	cat << EOF | |
| ${B}NAME${N} | |
| 	inputctl - control the input devices | |
|  | |
| ${B}SYNOPSIS${N} | |
| 	${B}inputctl${N} ${U}OPTION${N} [${U}ARG${N}] | |
|  | |
| ${B}OPTIONS${N} | |
| 	${B}-h${N}	Display usage message and exit. | |
|  | |
| 	${B}-d${N} ${U}STATE${N} | |
| 		Set touchpad state, possible values: toggle, on/off, 1/0. | |
|  | |
| 	${B}-k${N} ${U}STATE${N} | |
| 		Set keyboard state, possible values: toggle, on/off, 1/0. | |
|  | |
| 	${B}-s${N} ${U}STATE${N} | |
| 		Set touchscreen state, possible values: toggle, on/off, 1/0. | |
|  | |
| 	${B}-t${N} ${U}STATE${N} | |
| 		Set tablet state, possible values: ccw/normal/reset | |
| EOF | |
| } | |
|  | |
| setxkbmap -option caps:swapescape | |
|  | |
| # Exit if no option is provided | |
| [ "$#" -eq 0 ] && help && exit 1 | |
|  | |
| # Set required X variables | |
| export DISPLAY=:0 | |
| export XAUTHORITY="$XDG_DATA_HOME/xorg/Xauthority" | |
|  | |
| # Option handling | |
| SCRIPT="$(basename "$0")" | |
| while getopts ':h?d:k:s:t:' opt; do | |
| 	case $opt in | |
| 		h) | |
| 			help | |
| 			exit 0 | |
| 			;; | |
| 		d) | |
| 			OPTION="d" | |
| 			ARG="$OPTARG" | |
| 			DEV="SYNA3602:00 0911:5288 Touchpad" | |
| 			;; | |
| 		k) | |
| 			OPTION="k" | |
| 			ARG="$OPTARG" | |
| 			;; | |
| 		s) | |
| 			OPTION="s" | |
| 			ARG="$OPTARG" | |
| 			DEV="pointer:04F3200A:00 04F3:2373" | |
| 			;; | |
| 		t) | |
| 			OPTION="t" | |
| 			ARG="$OPTARG" | |
| 			DEV="HUION Huion Tablet_HS64 Pen stylus" | |
| 			;; | |
| 		:) | |
| 			echo "$SCRIPT: option requires an argument '$OPTARG'" | |
| 			echo "Try '$SCRIPT -h' for more information." | |
| 			exit 1 | |
| 			;; | |
| 		\?) | |
| 			echo "$SCRIPT: invalid option '$OPTARG'" | |
| 			echo "Try '$SCRIPT -h' for more information." | |
| 			exit 1 | |
| 			;; | |
| 	esac | |
| done | |
|  | |
| # Enable mathematics in POSIX shell | |
| calc() { awk "BEGIN{print $*}"; } | |
|  | |
| toggle_device() { | |
| 	STATUS=$(xinput --list-props "$2" | awk '/Device Enabled/ { print $4 }') | |
| 	[ "$STATUS" -eq 1 ] && xinput --disable "$2" || xinput --enable "$2" | |
| } | |
|  | |
| device() { | |
| 	case "$1" in | |
| 		1 | on) | |
| 			xinput --enable "$2" | |
| 			;; | |
| 		0 | off) | |
| 			xinput --disable "$2" | |
| 			;; | |
| 		t*) | |
| 			toggle_device "$2" | |
| 			;; | |
| 		*) | |
| 			echo "$SCRIPT: invalid argument '$1'" | |
| 			echo "Try '$SCRIPT -h' for more information." | |
| 			exit 1 | |
| 			;; | |
| 	esac | |
| } | |
|  | |
| keyboard() { | |
| 	[ -z "$1" ] && return 1 | |
|  | |
| 	if [ "$1" = "toggle" ]; then | |
| 		if setxkbmap -query | grep -q options; then | |
| 			keyboard "off" | |
| 		else | |
| 			keyboard "on" | |
| 		fi | |
|  | |
| 	elif [ "$1" = "on" ]; then | |
| 		# Swap caps lock with escape | |
| 		setxkbmap -option caps:swapescape | |
|  | |
| 		# Swap left crtl with left alt | |
| 		# setxkbmap -option ctrl:swap_lalt_lctl | |
|  | |
| 		# Set touchpad toggle keyboard symbol | |
| 		# xmodmap -e "keycode 93 = XF86iTouch" | |
|  | |
| 	elif [ "$1" = "off" ]; then | |
| 		# Clear all key mappings | |
| 		setxkbmap -option '' | |
| 	fi | |
| } | |
|  | |
| tablet() { | |
| 	case "$1" in | |
| 		ccw | normal) | |
| 			;; | |
| 		reset) | |
| 			xsetwacom set "$2" ResetArea | |
| 			xsetwacom set "$2" Rotate none | |
| 			xsetwacom set "$2" MapToOutput "desktop" | |
| 			exit 0 | |
| 			;; | |
| 		*) | |
| 			echo "$SCRIPT: invalid argument '$1'" | |
| 			echo "Try '$SCRIPT -h' for more information." | |
| 			exit 1 | |
| 			;; | |
| 	esac | |
|  | |
| 	screenDimensions=$(xrandr -q | grep primary | awk '{ print substr($4, 0, index($4, "+") - 1) }') | |
| 	screenWidth=$(echo "$screenDimensions" | cut -d 'x' -f 1) | |
| 	screenHeight=$(echo "$screenDimensions" | cut -d 'x' -f 2) | |
|  | |
| 	inputctl -t reset | |
|  | |
| 	tabletDimensions=$(xsetwacom get "$2" Area) | |
| 	tabletWidth=$(echo "$tabletDimensions" | cut -d ' ' -f 3) | |
| 	tabletHeight=$(echo "$tabletDimensions" | cut -d ' ' -f 4) | |
|  | |
| 	case "$1" in | |
| 	ccw) | |
| 		calculatedWidth=$(calc "$tabletHeight * $screenHeight / $screenWidth") | |
| 		offsetWidth=$(calc "($tabletWidth - $calculatedWidth) / 2" | cut -d '.' -f 1) | |
| 		calculatedWidth=$(calc "$calculatedWidth + $offsetWidth" | cut -d '.' -f 1) | |
|  | |
| 		xsetwacom set "$2" Area "$offsetWidth" 0 "$calculatedWidth" "$tabletHeight" | |
| 		xsetwacom set "$2" Rotate ccw | |
| 		;; | |
| 	normal) | |
| 		calculatedHeight=$(calc "$tabletWidth * $screenHeight / $screenWidth" | cut -d '.' -f 1) | |
| 		offsetHeight=$(calc "($tabletHeight - $calculatedHeight) / 2" | cut -d '.' -f 1) | |
|  | |
| 		xsetwacom set "$2" Area 0 "$offsetHeight" "$tabletWidth" "$calculatedHeight" | |
| 		;; | |
| 	esac | |
|  | |
| 	xsetwacom set "$2" MapToOutput "${screenWidth}x${screenHeight}+0+0" | |
| } | |
|  | |
| # Option execution | |
| # if [ "$DEV" = "Keyboard" ]; then | |
| # 	keyboard "$ARG" | |
| # else | |
| case "$OPTION" in | |
| 	d | s) | |
| 		device "$ARG" "$DEV" | |
| 		;; | |
| 	k) | |
| 		keyboard "$ARG" | |
| 		;; | |
| 	t) | |
| 		tablet "$ARG" "$DEV" | |
| 		;; | |
| esac | |
|  | |
| # Useful input diagnostics packages: | |
| # - xinput | |
| # - xev | |
| # - evtest | |
| # | |
| # - setxkbmap -query | |
| # - xmodmap -pke | |
|  | |
| # https://superuser.com/questions/437053/firefox-doesnt-recognize-my-alt-keys-anymore | |
| # https://www.x.org/releases/X11R7.7/doc/xorg-docs/input/XKB-Config.html
 | |
| 
 |