Files
omarchy-pkgs/pkgbuilds/edge/dell-xps-touchpad-haptics/dell-xps-touchpad-haptics.install
T
Jacob Mink 8f45850b7d Package Dell XPS touchpad haptics (#86)
* feature: Add Dell haptic touchpad control, update default intensity

* fix: polish Dell haptic touchpad package

Use an MIT license file for the packaged scripts and prefer the active loginctl user in the install hook so the initial intensity setup targets the live desktop session instead of an arbitrary regular account.

* fix: clean up Dell haptic touchpad package metadata

Drop the bundled license file and align the package metadata so the package contents still build cleanly after the maintainer update.

* fix: correct Dell haptic touchpad package URL

Point the package metadata at the canonical omarchy-pkgs repository so users see the source location maintained under the omacom-io project.

* feature: package Dell XPS haptics as standalone service

* fix: tighten Dell haptics package setup
2026-05-07 17:16:22 +02:00

249 lines
5.9 KiB
Plaintext

_service_name="dell-xps-touchpad-haptics.service"
_default_level="high"
_env_path="/etc/dell-xps-touchpad-haptics.env"
_legacy_env_path="/etc/omarchy-dell-haptic-touchpad.env"
_legacy_override_dir="/etc/systemd/system/dell-xps-haptic-touchpad.service.d"
_existing_home() {
local line value
[[ -f $_env_path ]] || 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%%=*} == "DELL_XPS_TOUCHPAD_HAPTICS_HOME" ]]; then
value=${line#*=}
value=${value#${value%%[![:space:]]*}}
value=${value%${value##*[![:space:]]}}
printf '%s\n' "$value"
return 0
fi
done < "$_env_path"
}
_resolve_target_user() {
if [[ -n ${OMARCHY_HAPTIC_USER:-} && ${OMARCHY_HAPTIC_USER} != "root" ]]; then
printf '%s\n' "$OMARCHY_HAPTIC_USER"
return 0
fi
if [[ -n ${SUDO_USER:-} && ${SUDO_USER} != "root" ]]; then
printf '%s\n' "$SUDO_USER"
return 0
fi
if command -v logname >/dev/null 2>&1; then
local login_name
login_name=$(logname 2>/dev/null || true)
if [[ -n $login_name && $login_name != "root" ]]; then
printf '%s\n' "$login_name"
return 0
fi
fi
if command -v loginctl >/dev/null 2>&1; then
local active_user
active_user=$(loginctl list-users --no-legend 2>/dev/null | awk '$2 != "root" && $4 == "active" { print $2; exit }')
if [[ -n $active_user ]]; then
printf '%s\n' "$active_user"
return 0
fi
fi
getent passwd | awk -F: '$3 >= 1000 && $1 != "nobody" && $7 !~ /(nologin|false)$/ { print $1; exit }'
}
_user_home() {
getent passwd "$1" | cut -d: -f6
}
_debug_value() {
local line value
[[ -f $_env_path ]] || 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%%=*} == "DELL_XPS_TOUCHPAD_HAPTICS_DEBUG" ]]; then
value=${line#*=}
value=${value#${value%%[![:space:]]*}}
value=${value%${value##*[![:space:]]}}
printf '%s\n' "$value"
return 0
fi
done < "$_env_path"
}
_write_env_file() {
local home=$1
local debug_value=$2
local tmpfile
tmpfile=$(mktemp)
printf 'DELL_XPS_TOUCHPAD_HAPTICS_HOME=%s\n' "$home" >"$tmpfile"
if [[ -n $debug_value ]]; then
printf 'DELL_XPS_TOUCHPAD_HAPTICS_DEBUG=%s\n' "$debug_value" >>"$tmpfile"
fi
install -D -m 644 "$tmpfile" "$_env_path"
rm -f "$tmpfile"
}
_systemd_runtime_available() {
[[ -d /run/systemd/system ]]
}
_udev_runtime_available() {
[[ -S /run/udev/control ]]
}
_service_unit_present() {
[[ -f /usr/lib/systemd/system/$_service_name ]]
}
_reload_runtime_state() {
if _systemd_runtime_available && ! systemctl daemon-reload; then
echo ":: Failed to reload the systemd manager for ${_service_name}." >&2
return 1
fi
if _udev_runtime_available && ! udevadm control --reload-rules; then
echo ":: Failed to reload udev rules for ${_service_name}." >&2
return 1
fi
}
_ensure_user_config() {
local user=$1
local home=$2
local config_dir="$home/.config/omarchy"
local config_path="$config_dir/dell-haptic.conf"
if [[ ! -f $config_path ]] && ! env HOME="$home" USER="$user" LOGNAME="$user" \
/usr/bin/dell-xps-touchpad-haptics set "$_default_level"; then
echo ":: Failed to create ${config_path} for user '$user'." >&2
return 1
fi
if [[ -f $config_path ]]; then
chown "$user:$user" "$home/.config" 2>/dev/null || true
chown "$user:$user" "$config_dir" 2>/dev/null || true
chown "$user:$user" "$config_path" 2>/dev/null || true
fi
return 0
}
_reset_trackpad() {
if command -v omarchy-restart-trackpad >/dev/null 2>&1; then
omarchy-restart-trackpad 2>/dev/null || true
fi
}
_cleanup_legacy_state() {
rm -f "$_legacy_env_path" "$_legacy_override_dir/override.conf"
rmdir "$_legacy_override_dir" 2>/dev/null || true
}
_enable_service() {
if ! systemctl enable "$_service_name" >/dev/null; then
echo ":: Failed to enable ${_service_name}." >&2
return 1
fi
}
_start_service_if_possible() {
if ! _systemd_runtime_available; then
echo ":: ${_service_name} enabled; it will start on next boot."
return 0
fi
if ! systemctl restart "$_service_name" >/dev/null; then
echo ":: Failed to start ${_service_name}." >&2
return 1
fi
}
_configure_package() {
local user=""
local home=""
local debug_value
local config_path=""
_cleanup_legacy_state
if ! _service_unit_present; then
echo ":: Required unit file for ${_service_name} was not installed." >&2
return 1
fi
if ! _reload_runtime_state; then
return 1
fi
user=$(_resolve_target_user)
if [[ -n $user ]]; then
home=$(_user_home "$user")
fi
if [[ -z $home || ! -d $home ]]; then
home=$(_existing_home)
fi
if [[ -z $home || ! -d $home ]]; then
echo ":: Could not determine a usable home directory for ${_service_name}." >&2
echo ":: Reinstall the package after logging in as your desktop user to finish setup." >&2
return 1
fi
debug_value=$(_debug_value)
_write_env_file "$home" "$debug_value"
if [[ -n $user ]]; then
if ! _ensure_user_config "$user" "$home"; then
return 1
fi
else
config_path="$home/.config/omarchy/dell-haptic.conf"
if [[ ! -f $config_path ]]; then
echo ":: Could not seed ${config_path} because no desktop user could be identified." >&2
return 1
fi
fi
if ! _enable_service; then
return 1
fi
_reset_trackpad
if ! _start_service_if_possible; then
return 1
fi
return 0
}
post_install() {
_configure_package
}
post_upgrade() {
_configure_package
}
pre_remove() {
systemctl disable "$_service_name" 2>/dev/null || true
systemctl stop "$_service_name" 2>/dev/null || true
}
post_remove() {
rm -f "$_env_path"
_reload_runtime_state || true
}