nix-files/hosts/modules/gui/sxmo/hooks/sxmo_hook_inputhandler.sh

145 lines
4.6 KiB
Bash
Executable File

#!/usr/bin/env nix-shell
#!nix-shell -i bash -p coreutils -p playerctl -p pulseaudio
# input map considerations
# - using compound actions causes delays.
# e.g. if volup->volup is a distinct action from volup, then single-volup action is forced to wait the maximum button delay.
# - actions which are to be responsive should therefore have a dedicated key.
# - a dedicated "kill" combo is important for unresponsive fullscreen apps, because appmenu doesn't show in those
# - although better may be to force appmenu to show over FS apps
# - bonsai mappings are static, so buttons can't benefit from non-compounding unless they're mapped accordingly for all lock states
# - this limitation could be removed, but with work
#
# example of a design which considers these things:
# - when unlocked:
# - volup toggle -> app menu
# - voldown press -> keyboard
# - voldown hold -> terminal
# - power x2 -> screenoff
# - hold power -> kill app
# - when locked:
# - volup tap -> volume up
# - volup hold -> media seek forward
# - voldown tap -> volume down
# - voldown hold -> media seek backward
# - power x1 -> screen on
# - power x2 -> play/pause media
# some trickiness allows for media controls in unlocked mode:
# - volup tap -> enter media mode
# - i.e. in this state, vol tap/hold is mapped to volume/seek
# - if, after entering media mode, no more taps occur, then we trigger the default app-menu action
# limitations/downsides:
# - power mappings means phone is artificially slow to unlock.
# - media controls when unlocked have quirks:
# - mashing voldown to decrease the volume will leave you with a toggled keyboard.
# - seeking backward isn't possible except by first tapping volup.
# increments to use for volume adjustment
VOL_INCR=5
# replicating the naming from upstream sxmo_hook_inputhandler.sh...
ACTION="$1"
STATE=$(cat "$SXMO_STATE")
noop() {
true
}
handle_with() {
echo "sxmo_hook_inputhandler.sh: STATE=$STATE ACTION=$ACTION: handle_with: $@"
"$@"
exit 0
}
# state is one of:
# - "unlock" => normal operation; display on and touchscreen on
# - "screenoff" => display off and touchscreen off
# - "lock" => display on but touchscreen disabled
# - "proximity{lock,unlock}" => intended for when in a phone call
if [ "$STATE" = "unlock" ]; then
case "$ACTION" in
# powerbutton_one: intentional default to no-op
# powerbutton_two: intentional default to screenoff
"powerhold")
# power thrice: kill active window
handle_with sxmo_killwindow.sh
;;
"volup_tap_1")
# swallow: this could be the start to a media control (multi taps / holds),
# or it could be just a single tap -> release, handled next/below
handle_with noop
;;
"volup_1")
# volume up once: app-specific menu w/ fallback to SXMO system menu
handle_with sxmo_appmenu.sh
;;
"voldown_start")
# volume down once: toggle keyboard
handle_with sxmo_keyboard.sh toggle
;;
"voldown_hold_2")
# hold voldown to launch terminal
# note we already triggered the keyboard; that's fine: usually keyboard + terminal go together :)
# voldown_hold_1 frequently triggers during short taps meant only to reveal the keyboard,
# so prefer a longer hold duration
handle_with sxmo_terminal.sh
;;
"voldown_tap_1")
# swallow, to prevent keyboard from also triggering media controls
handle_with noop
;;
voldown_hold_*)
# swallow, to prevent terminal from also triggering media controls
handle_with noop
;;
esac
fi
if [ "$STATE" = "screenoff" ]; then
case "$ACTION" in
"powerbutton_two")
# power twice => toggle media player
handle_with playerctl play-pause
;;
"powerhold")
# power toggle during deep sleep often gets misread as power hold, so treat same
handle_with sxmo_state.sh set unlock
;;
esac
fi
# default actions
case "$ACTION" in
"powerbutton_one")
# power once => unlock
handle_with sxmo_state.sh set unlock
;;
"powerbutton_two")
# power twice => screenoff
handle_with sxmo_state.sh set screenoff
;;
# powerbutton_three: intentional no-op because overloading the kill-window handler is risky
volup_tap*|modal_volup_tap*)
handle_with pactl set-sink-volume @DEFAULT_SINK@ +"$VOL_INCR%"
;;
voldown_tap*|modal_voldown_tap*)
handle_with pactl set-sink-volume @DEFAULT_SINK@ -"$VOL_INCR%"
;;
volup_hold*|modal_volup_hold*)
handle_with playerctl position 30+
;;
voldown_hold*|modal_voldown_hold*)
handle_with playerctl position 10-
;;
esac
handle_with noop