Blame pmos/rotate.sh

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