Files
bananarchy/overlay/rootfs/usr/bin/sxmo_rotate.sh
T

227 lines
4.9 KiB
Bash
Executable File

#!/bin/sh
# SPDX-License-Identifier: AGPL-3.0-only
# Copyright 2022 Sxmo Contributors
# include common definitions
# shellcheck source=scripts/core/sxmo_common.sh
. sxmo_common.sh
ROT_STATE_FILE="${XDG_RUNTIME_DIR:-/tmp}/sxmo.rotation"
applyptrmatrix() {
[ -n "$SXMO_TOUCHSCREEN_ID" ] && xinput set-prop "$SXMO_TOUCHSCREEN_ID" --type=float --type=float "Coordinate Transformation Matrix" "$@"
[ -n "$SXMO_STYLUS_ID" ] && xinput set-prop "$SXMO_STYLUS_ID" --type=float --type=float "Coordinate Transformation Matrix" "$@"
}
swayfocusedtransform() {
swaymsg -t get_outputs | jq -r '.[] | select(.focused == true) | .transform'
}
swayfocusedname() {
swaymsg -t get_outputs | jq -r '.[] | select(.focused == true) | .name'
}
riverfocusedname() {
river-bedload -print outputs | jq -r '.[] | select(.focused).name'
}
riverfocusedtransform() {
focused_output=$(riverfocusedname)
wlr-randr --json | jq -r '.[] | select(.name == "'"$focused_output"'").transform'
}
restart_sxmo_hook_lisgd() {
if [ ! -e "$XDG_CACHE_HOME"/sxmo/sxmo.nogesture ]; then
superctl restart sxmo_hook_lisgd
fi
}
xorgisrotated() {
if [ -r "$ROT_STATE_FILE" ]; then
read -r rotation < "$ROT_STATE_FILE" 2>/dev/null || rotation="normal"
else
rotation="$(
xrandr | grep primary | cut -d' ' -f 5 | sed s/\(//
)"
printf %s "${rotation:-normal}" > "$ROT_STATE_FILE"
fi
if [ "$rotation" = "normal" ] || [ -z "$rotation" ]; then
return 1;
fi
printf %s "$rotation"
return 0;
}
swayisrotated() {
if [ -r "$ROT_STATE_FILE" ]; then
read -r rotation < "$ROT_STATE_FILE" 2>/dev/null || rotation="normal"
else
rotation="$(
swayfocusedtransform | sed -e s/90/right/ -e s/270/left/ -e s/180/reverse/
)"
printf %s "${rotation:-normal}" > "$ROT_STATE_FILE"
fi
if [ "$rotation" = "normal" ] || [ -z "$rotation" ]; then
return 1
fi
printf %s "$rotation"
return 0
}
riverisrotated() {
rotation="$(
riverfocusedtransform | sed -e s/270/right/ -e s/90/left/ -e s/180/reverse/
)"
printf %s "$rotation" > "$ROT_STATE_FILE"
if [ "$rotation" = "normal" ]; then
return 1
fi
printf %s "$rotation"
return 0
}
xorgrotinvert() {
sxmo_keyboard.sh close
xrandr -o inverted
printf %s "reverse" > "$ROT_STATE_FILE"
applyptrmatrix -1 0 1 0 -1 1 0 0 1
restart_sxmo_hook_lisgd
sxmo_hook_rotate.sh invert
exit 0
}
swayrotinvert() {
swaymsg -- output "-" transform 180
printf %s "reverse" > "$ROT_STATE_FILE"
restart_sxmo_hook_lisgd
sxmo_hook_rotate.sh invert
exit 0
}
riverrotinvert() {
focused_output=$(river-bedload -print outputs | jq -r ".[] | select(.focused).name")
wlr-randr --output "$focused_output" --transform 180
printf %s "reverse" > "$ROT_STATE_FILE"
restart_sxmo_hook_lisgd
sxmo_hook_rotate.sh invert
exit 0
}
xorgrotnormal() {
sxmo_keyboard.sh close
xrandr -o normal
printf %s "normal" > "$ROT_STATE_FILE"
applyptrmatrix 0 0 0 0 0 0 0 0 0
restart_sxmo_hook_lisgd
sxmo_hook_rotate.sh normal
exit 0
}
swayrotnormal() {
swaymsg -- output "-" transform 0
printf %s "normal" > "$ROT_STATE_FILE"
restart_sxmo_hook_lisgd
sxmo_hook_rotate.sh normal
exit 0
}
riverrotnormal() {
focused_output=$(river-bedload -print outputs | jq -r ".[] | select(.focused).name")
wlr-randr --output "$focused_output" --transform normal
printf %s "normal" > "$ROT_STATE_FILE"
restart_sxmo_hook_lisgd
sxmo_hook_rotate.sh normal
exit 0
}
xorgrotright() {
sxmo_keyboard.sh close
xrandr -o right
printf %s "right" > "$ROT_STATE_FILE"
applyptrmatrix 0 1 0 -1 0 1 0 0 1
restart_sxmo_hook_lisgd
sxmo_hook_rotate.sh right
exit 0
}
swayrotright() {
swaymsg -- output "-" transform 90
printf %s "right" > "$ROT_STATE_FILE"
restart_sxmo_hook_lisgd
sxmo_hook_rotate.sh right
exit 0
}
riverrotright() {
focused_output=$(river-bedload -print outputs | jq -r ".[] | select(.focused).name")
wlr-randr --output "$focused_output" --transform 270
printf %s "right" > "$ROT_STATE_FILE"
restart_sxmo_hook_lisgd
sxmo_hook_rotate.sh right
exit 0
}
xorgrotleft() {
sxmo_keyboard.sh close
xrandr -o left
printf %s "left" > "$ROT_STATE_FILE"
applyptrmatrix 0 -1 1 1 0 0 0 0 1
restart_sxmo_hook_lisgd
sxmo_hook_rotate.sh left
exit 0
}
swayrotleft() {
swaymsg -- output "-" transform 270
printf %s "left" > "$ROT_STATE_FILE"
restart_sxmo_hook_lisgd
sxmo_hook_rotate.sh left
exit 0
}
riverrotleft() {
focused_output=$(river-bedload -print outputs | jq -r ".[] | select(.focused).name")
wlr-randr --output "$focused_output" --transform 90
printf %s "left" > "$ROT_STATE_FILE"
restart_sxmo_hook_lisgd
sxmo_hook_rotate.sh left
exit 0
}
isrotated() {
case "$SXMO_WM" in
sway)
"swayisrotated"
;;
river)
"riverisrotated"
;;
dwm|i3)
"xorgisrotated"
;;
esac
}
if [ -z "$1" ] || [ "rotate" = "$1" ]; then
if [ $# -ne 0 ]; then
shift
fi
if isrotated >/dev/null; then
set -- rotnormal "$@"
else
set -- rot"${SXMO_ROTATE_DIRECTION:-right}" "$@"
fi
fi
case "$SXMO_WM" in
sway)
"sway$1" "$@"
;;
river)
"river$1" "$@"
;;
dwm|i3)
"xorg$1" "$@"
;;
esac