|
|
d1f6b6 |
#!/bin/bash
|
|
|
d1f6b6 |
|
|
|
d1f6b6 |
set -e
|
|
|
d1f6b6 |
|
|
|
d1f6b6 |
# command to run a screen keyboard
|
|
|
d1f6b6 |
KEYBOARD="coolkbd"
|
|
|
d1f6b6 |
# arguments for the screen keyboard
|
|
|
d1f6b6 |
KEYBOARD_ARGS="/dev/input/event1"
|
|
|
d1f6b6 |
# name of an input device to configure (from xinput)
|
|
|
d1f6b6 |
INPUTDEV="Elan Touchscreen"
|
|
|
d1f6b6 |
|
|
|
d1f6b6 |
|
|
|
d1f6b6 |
# name of a transformation matrix property of the device
|
|
|
d1f6b6 |
MATRIX_PROP="Coordinate Transformation Matrix"
|
|
|
d1f6b6 |
# name of a dead edges sizes property of the device
|
|
|
d1f6b6 |
# by this property you can disable keyboard area from taps
|
|
|
d1f6b6 |
# use it if the screen keyboard handle touches by it self directly from a device
|
|
|
d1f6b6 |
# just comment out this if you don't need this feature
|
|
|
d1f6b6 |
EDGE_PROP="Trackpad Edge Sizes"
|
|
|
d1f6b6 |
# height of a dead zone area at the bottom of the screen
|
|
|
d1f6b6 |
# integer value - count of percents of the screen height
|
|
|
d1f6b6 |
KEYAREA=20
|
|
|
d1f6b6 |
|
|
|
d1f6b6 |
|
|
|
d1f6b6 |
|
|
|
d1f6b6 |
function usage() {
|
|
|
d1f6b6 |
echo ""
|
|
|
d1f6b6 |
echo "Usage ./rotate.sh [command] ..."
|
|
|
d1f6b6 |
echo " available commands:"
|
|
|
d1f6b6 |
echo " kbon - open screen keyboard"
|
|
|
d1f6b6 |
echo " kboff - close screen keyboard"
|
|
|
d1f6b6 |
echo " kbtoggle - toggle screen keyboard"
|
|
|
d1f6b6 |
echo " normal,left,inverted,right"
|
|
|
d1f6b6 |
echo " - comma separated looped sequence of orientations"
|
|
|
d1f6b6 |
echo " screen will be turned to the next state relative to current"
|
|
|
d1f6b6 |
echo " if only one item is in sequence"
|
|
|
56e5ee |
echo " then screen will be turned into it"
|
|
|
56e5ee |
echo " if current state is not present in the sequence"
|
|
|
56e5ee |
echo " then the first sequence item will be chosen"
|
|
|
56e5ee |
echo " without args script will just configure the input device for the current orientation"
|
|
|
d1f6b6 |
echo ""
|
|
|
d1f6b6 |
}
|
|
|
d1f6b6 |
|
|
|
d1f6b6 |
|
|
|
d1f6b6 |
|
|
|
d1f6b6 |
# function gets a next item from the looped sequence
|
|
|
d1f6b6 |
# example: next normal,left,inverted,right left
|
|
|
d1f6b6 |
# will be echoed: inverted
|
|
|
d1f6b6 |
function next() {
|
|
|
d1f6b6 |
local res="$(echo "$1" | tr -s , '\n' | grep -i -x -A 1 "$2" | tail +2)"
|
|
|
d1f6b6 |
if [ -z "$res" ]; then
|
|
|
d1f6b6 |
res="$(echo "$1" | tr -s , '\n' | head -1)"
|
|
|
d1f6b6 |
fi
|
|
|
d1f6b6 |
echo "$res"
|
|
|
d1f6b6 |
}
|
|
|
d1f6b6 |
|
|
|
d1f6b6 |
|
|
|
d1f6b6 |
# always returns a valid name of the rotation (bad values will replaced with 'normal')
|
|
|
d1f6b6 |
function fix_rotation_name() {
|
|
|
d1f6b6 |
case "$1" in
|
|
|
d1f6b6 |
right | inverted | left) echo "$1";;
|
|
|
d1f6b6 |
*) echo "normal";;
|
|
|
d1f6b6 |
esac
|
|
|
d1f6b6 |
}
|
|
|
d1f6b6 |
|
|
|
d1f6b6 |
|
|
|
d1f6b6 |
# check if the first arg is a comma separated sequence of valid rotation names
|
|
|
d1f6b6 |
function is_rotation_sequence() {
|
|
|
d1f6b6 |
local s="$(echo "$1" | tr -s , ' ')"
|
|
|
d1f6b6 |
local x=
|
|
|
d1f6b6 |
for x in $s; do
|
|
|
d1f6b6 |
[ "$x" == "$(fix_rotation_name "$x")" ]
|
|
|
d1f6b6 |
done
|
|
|
d1f6b6 |
}
|
|
|
d1f6b6 |
|
|
|
d1f6b6 |
|
|
|
d1f6b6 |
# show the current screen rotation
|
|
|
d1f6b6 |
function current_rotation() {
|
|
|
d1f6b6 |
fix_rotation_name "$(xrandr --screen 0 --current --query | head -2 | tail -1 | cut -d' ' -f5)"
|
|
|
d1f6b6 |
}
|
|
|
d1f6b6 |
|
|
|
d1f6b6 |
|
|
|
d1f6b6 |
# turn screen to chosen rotation
|
|
|
d1f6b6 |
# possible values: normal, left, inverted and right
|
|
|
d1f6b6 |
function rotate_screen() {
|
|
|
d1f6b6 |
xrandr -o "$1"
|
|
|
d1f6b6 |
}
|
|
|
d1f6b6 |
|
|
|
d1f6b6 |
|
|
|
d1f6b6 |
# keyboard functions
|
|
|
d1f6b6 |
function is_keyboard_run() {
|
|
|
d1f6b6 |
[ -n "$KEYBOARD" ]
|
|
|
d1f6b6 |
pidof "$KEYBOARD" > /dev/null
|
|
|
d1f6b6 |
}
|
|
|
d1f6b6 |
function run_keyboard() {
|
|
|
d1f6b6 |
if ! is_keyboard_run; then
|
|
|
d1f6b6 |
nohup $KEYBOARD $KEYBOARD_ARGS &> /dev/null &
|
|
|
d1f6b6 |
fi
|
|
|
d1f6b6 |
}
|
|
|
d1f6b6 |
function stop_keyboard() {
|
|
|
d1f6b6 |
[ -z "$KEYBOARD" ] || killall -q "$KEYBOARD" || true
|
|
|
d1f6b6 |
}
|
|
|
d1f6b6 |
function toggle_keyboard() {
|
|
|
d1f6b6 |
[ -n "$KEYBOARD" ] || return
|
|
|
d1f6b6 |
if is_keyboard_run; then stop_keyboard; else run_keyboard; fi
|
|
|
d1f6b6 |
}
|
|
|
d1f6b6 |
|
|
|
d1f6b6 |
|
|
|
d1f6b6 |
# configure the input device for a specified rotation
|
|
|
d1f6b6 |
function configure_input() {
|
|
|
d1f6b6 |
local rot="$(current_rotation)"
|
|
|
d1f6b6 |
local matrix=
|
|
|
d1f6b6 |
local edges=
|
|
|
d1f6b6 |
local area=0
|
|
|
d1f6b6 |
if is_keyboard_run; then area="$KEYAREA"; fi
|
|
|
d1f6b6 |
|
|
|
d1f6b6 |
echo "configure the input device for orientation: $rot"
|
|
|
d1f6b6 |
case "$rot" in
|
|
|
d1f6b6 |
left)
|
|
|
d1f6b6 |
matrix="0 -1 1 1 0 0 0 0 1"
|
|
|
d1f6b6 |
edges="0 0 0 $area"
|
|
|
d1f6b6 |
;;
|
|
|
d1f6b6 |
right)
|
|
|
d1f6b6 |
matrix="0 1 0 -1 0 1 0 0 1"
|
|
|
d1f6b6 |
edges="0 0 $area 0"
|
|
|
d1f6b6 |
;;
|
|
|
d1f6b6 |
inverted)
|
|
|
d1f6b6 |
matrix="-1 0 1 0 -1 1 0 0 1"
|
|
|
d1f6b6 |
edges="$area 0 0 0"
|
|
|
d1f6b6 |
;;
|
|
|
d1f6b6 |
*)
|
|
|
d1f6b6 |
matrix="1 0 0 0 1 0 0 0 1"
|
|
|
d1f6b6 |
edges="0 $area 0 0"
|
|
|
d1f6b6 |
;;
|
|
|
d1f6b6 |
esac
|
|
|
d1f6b6 |
|
|
|
d1f6b6 |
[ -z "$INPUTDEV" ] || [ -z "$MATRIX_PROP" ] || \
|
|
|
d1f6b6 |
xinput --set-prop "$INPUTDEV" "$MATRIX_PROP" $matrix
|
|
|
d1f6b6 |
[ -z "$INPUTDEV" ] || [ -z "$EDGE_PROP" ] || [ -z "$KEYAREA" ] || \
|
|
|
d1f6b6 |
xinput --set-prop "$INPUTDEV" "$EDGE_PROP" $edges
|
|
|
d1f6b6 |
}
|
|
|
d1f6b6 |
|
|
|
d1f6b6 |
|
|
|
d1f6b6 |
|
|
|
d1f6b6 |
# parse arguments
|
|
|
d1f6b6 |
SHOW_USAGE=
|
|
|
1cf142 |
CHANGED=
|
|
|
d1f6b6 |
while [ "$#" != "0" ]; do
|
|
|
1cf142 |
IS_CMD=1
|
|
|
d1f6b6 |
if [ "$1" = "kbon" ]; then
|
|
|
d1f6b6 |
echo "open screen keyboard"
|
|
|
d1f6b6 |
run_keyboard
|
|
|
d1f6b6 |
elif [ "$1" = "kboff" ]; then
|
|
|
d1f6b6 |
echo "close screen keyboard"
|
|
|
d1f6b6 |
stop_keyboard
|
|
|
d1f6b6 |
elif [ "$1" = "kbtoggle" ]; then
|
|
|
d1f6b6 |
echo "toggle screen keyboard"
|
|
|
d1f6b6 |
toggle_keyboard
|
|
|
d1f6b6 |
elif is_rotation_sequence "$1"; then
|
|
|
d1f6b6 |
ROT="$(current_rotation)"
|
|
|
d1f6b6 |
ROT="$(next "$1" "$ROT")"
|
|
|
d1f6b6 |
echo "turn screen to: $ROT"
|
|
|
d1f6b6 |
rotate_screen "$ROT"
|
|
|
d1f6b6 |
else
|
|
|
d1f6b6 |
echo "unknown command: $1"
|
|
|
1cf142 |
IS_CMD=
|
|
|
d1f6b6 |
fi
|
|
|
1cf142 |
|
|
|
1cf142 |
if [ -n "$IS_CMD" ]; then CHANGED=1; else SHOW_USAGE=1; fi
|
|
|
d1f6b6 |
shift
|
|
|
d1f6b6 |
done
|
|
|
d1f6b6 |
|
|
|
d1f6b6 |
[ -z "$SHOW_USAGE" ] || usage
|
|
|
1cf142 |
( [ -n "$SHOW_USAGE" ] && [ -z "$CHANGED" ] ) || configure_input
|
|
|
d1f6b6 |
|