127 lines
2.6 KiB
Bash
Executable File
127 lines
2.6 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
set -euo pipefail
|
|
|
|
CONFIG_PATH="$HOME/.config/omarchy/dell-haptic.conf"
|
|
DEFAULT_INTENSITY=100
|
|
LOW_INTENSITY=10
|
|
MID_INTENSITY=50
|
|
HIGH_INTENSITY=100
|
|
SERVICE_NAME="dell-xps-touchpad-haptics.service"
|
|
|
|
usage() {
|
|
printf 'Usage: %s get | set <low|mid|high>\n' "$(basename -- "$0")"
|
|
}
|
|
|
|
clamp_intensity() {
|
|
local value=$1
|
|
|
|
if ! [[ $value =~ ^[0-9]+$ ]]; then
|
|
printf '%s\n' "$DEFAULT_INTENSITY"
|
|
return 0
|
|
fi
|
|
|
|
if (( value < 0 )); then
|
|
printf '0\n'
|
|
elif (( value > 100 )); then
|
|
printf '100\n'
|
|
else
|
|
printf '%s\n' "$value"
|
|
fi
|
|
}
|
|
|
|
read_intensity() {
|
|
local line=""
|
|
local value=""
|
|
|
|
[[ -f $CONFIG_PATH ]] || {
|
|
printf '%s\n' "$DEFAULT_INTENSITY"
|
|
return 0
|
|
}
|
|
|
|
while IFS= read -r line; do
|
|
line=${line#${line%%[![:space:]]*}}
|
|
line=${line%${line##*[![:space:]]}}
|
|
[[ -z $line || ${line:0:1} == "#" || $line != *=* ]] && continue
|
|
|
|
if [[ ${line%%=*} == "INTENSITY" ]]; then
|
|
value=${line#*=}
|
|
value=${value#${value%%[![:space:]]*}}
|
|
value=${value%${value##*[![:space:]]}}
|
|
clamp_intensity "$value"
|
|
return 0
|
|
fi
|
|
done < "$CONFIG_PATH"
|
|
|
|
printf '%s\n' "$DEFAULT_INTENSITY"
|
|
}
|
|
|
|
level_for_intensity() {
|
|
local intensity=$1
|
|
|
|
if (( intensity <= 30 )); then
|
|
printf 'low\n'
|
|
elif (( intensity < 75 )); then
|
|
printf 'mid\n'
|
|
else
|
|
printf 'high\n'
|
|
fi
|
|
}
|
|
|
|
intensity_for_level() {
|
|
case "$1" in
|
|
low) printf '%s\n' "$LOW_INTENSITY" ;;
|
|
mid | medium) printf '%s\n' "$MID_INTENSITY" ;;
|
|
high) printf '%s\n' "$HIGH_INTENSITY" ;;
|
|
*)
|
|
echo "Haptic level must be one of: low, mid, high." >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
}
|
|
|
|
write_config() {
|
|
local intensity=$1
|
|
|
|
install -d -m 755 "$(dirname -- "$CONFIG_PATH")"
|
|
printf '# Dell XPS touchpad haptic intensity.\n# Presets: low=10, mid=50, high=100.\nINTENSITY=%s\n' "$intensity" >"$CONFIG_PATH"
|
|
}
|
|
|
|
service_active() {
|
|
systemctl is-active --quiet "$SERVICE_NAME" 2>/dev/null
|
|
}
|
|
|
|
case "${1:-}" in
|
|
get)
|
|
if (( $# != 1 )); then
|
|
usage >&2
|
|
exit 1
|
|
fi
|
|
|
|
level_for_intensity "$(read_intensity)"
|
|
;;
|
|
set)
|
|
if (( $# != 2 )); then
|
|
usage >&2
|
|
exit 1
|
|
fi
|
|
|
|
previous_level=$(level_for_intensity "$(read_intensity)")
|
|
intensity=$(intensity_for_level "$2")
|
|
write_config "$intensity"
|
|
|
|
if service_active; then
|
|
printf 'Set Dell XPS touchpad haptics from %s to %s. The running service will apply and verify the new gain in the journal shortly.\n' "$previous_level" "$(level_for_intensity "$intensity")"
|
|
else
|
|
printf 'Set Dell XPS touchpad haptics from %s to %s. Start %s to apply it.\n' "$previous_level" "$(level_for_intensity "$intensity")" "$SERVICE_NAME"
|
|
fi
|
|
;;
|
|
--help | -h)
|
|
usage
|
|
;;
|
|
*)
|
|
usage >&2
|
|
exit 1
|
|
;;
|
|
esac
|