Consolidates the operator-USB work into main now that the AMD ASUS hardware-evidence collection is closed and Codex is parked. Brings the live-session hardware lane (XInput/libinput touchpad guard, internal audio + resolver bootstrap, hw-report with gated public upload, operator-USB branding) and the config-only XFCE panel polish (Pass 1 + Pass 2: branded Whisker PNG, xkb text mode, panel 40px, systray square-icons). Conflict: doc/LLM-PROVIDER-HARNESS.md was evolved on both sides. Resolved as a union with no content lost — the xfce-side harness/provider/fabric restructure is the base, and main's two unique blocks (Verifying Key Cleanup flow, the 2D Platform x Harness matrix + populate/add procedures) are preserved. The doc owner may later dedupe the overlap between the two 1D matrices and the 2D matrix. Verification debt stays explicit and open (not closed by this merge): XFCE visual-polish confirmation and the next rebuilt-image hardware retest, per doc/XFCE-PANEL-BUGS-HANDOFF.md and PLAN-OPERATOR-USB-NEXT.md. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
95 lines
3.5 KiB
Bash
95 lines
3.5 KiB
Bash
#!/bin/sh
|
|
# Clawdie operator USB X11 touchpad guard.
|
|
#
|
|
# Some XFCE/XInput setups can leave the built-in ASUS pointer pair disabled
|
|
# even though Xorg/libinput attached it correctly. On the affected Ryzen ASUS
|
|
# laptop the internal HID-over-I2C device shows up as both "... TouchPad" and
|
|
# sibling "... Mouse". Run as the live user inside the X session and
|
|
# re-enable the affected internal devices after xfsettingsd has had a chance
|
|
# to apply user settings.
|
|
|
|
LOG="${HOME:-/tmp}/.clawdie-touchpad-guard.log"
|
|
|
|
log() {
|
|
printf '%s %s\n' "$(date -u '+%Y-%m-%dT%H:%M:%SZ')" "$*" >>"$LOG" 2>/dev/null || true
|
|
}
|
|
|
|
prop_id() {
|
|
_needle="$1"
|
|
awk -F '[()]' -v needle="$_needle" 'index($0, needle) { print $2; exit }'
|
|
}
|
|
|
|
set_prop_values() {
|
|
_id="$1"
|
|
_prop="$2"
|
|
shift 2
|
|
[ -n "$_prop" ] || return 0
|
|
xinput set-prop "$_id" "$_prop" "$@" >/dev/null 2>&1 || true
|
|
}
|
|
|
|
set_send_events_enabled() {
|
|
_id="$1"
|
|
_props="$2"
|
|
_prop="$(printf '%s\n' "$_props" | prop_id 'libinput Send Events Mode Enabled (')"
|
|
[ -n "$_prop" ] || return 0
|
|
|
|
# libinput exposes "disabled" modes here; all-zero means "send events".
|
|
# The tuple width varies, so try the common shapes in descending order.
|
|
xinput set-prop "$_id" "$_prop" 0 0 0 >/dev/null 2>&1 \
|
|
|| xinput set-prop "$_id" "$_prop" 0 0 >/dev/null 2>&1 \
|
|
|| xinput set-prop "$_id" "$_prop" 0 >/dev/null 2>&1 \
|
|
|| true
|
|
}
|
|
|
|
is_target_pointer_device() {
|
|
_name="$1"
|
|
_props="$2"
|
|
|
|
printf '%s\n' "$_props" | grep -qi 'touchpad' && return 0
|
|
case "$_name" in
|
|
ASUE*TouchPad|ASUE*Mouse)
|
|
return 0
|
|
;;
|
|
esac
|
|
return 1
|
|
}
|
|
|
|
enable_internal_pointers_once() {
|
|
if ! command -v xinput >/dev/null 2>&1; then
|
|
log "xinput missing; cannot check built-in pointers"
|
|
return 0
|
|
fi
|
|
|
|
_found=0
|
|
for _id in $(xinput list --id-only 2>/dev/null); do
|
|
_props="$(xinput list-props "$_id" 2>/dev/null || true)"
|
|
_name="$(printf '%s\n' "$_props" | sed -n "s/^Device '\(.*\)':/\1/p" | head -n 1)"
|
|
[ -n "$_name" ] || _name="id=$_id"
|
|
is_target_pointer_device "$_name" "$_props" || continue
|
|
_found=1
|
|
|
|
xinput enable "$_id" >/dev/null 2>&1 || true
|
|
_tap_prop="$(printf '%s\n' "$_props" | prop_id 'libinput Tapping Enabled (')"
|
|
set_prop_values "$_id" "$_tap_prop" 1
|
|
_dwt_prop="$(printf '%s\n' "$_props" | prop_id 'libinput Disable While Typing Enabled (')"
|
|
set_prop_values "$_id" "$_dwt_prop" 0
|
|
set_send_events_enabled "$_id" "$_props"
|
|
|
|
_updated_props="$(xinput list-props "$_id" 2>/dev/null || true)"
|
|
_enabled="$(printf '%s\n' "$_updated_props" | awk -F: '/Device Enabled/ { gsub(/^[[:space:]]+|[[:space:]]+$/, "", $2); print $2; exit }')"
|
|
_send_events="$(printf '%s\n' "$_updated_props" | awk -F: '/libinput Send Events Mode Enabled/ { gsub(/^[[:space:]]+|[[:space:]]+$/, "", $2); print $2; exit }')"
|
|
_dwt_state="$(printf '%s\n' "$_updated_props" | awk -F: '/libinput Disable While Typing Enabled/ { gsub(/^[[:space:]]+|[[:space:]]+$/, "", $2); print $2; exit }')"
|
|
log "pointer ${_name}: Device Enabled=${_enabled:-unknown} SendEvents=${_send_events:-unknown} DWT=${_dwt_state:-unknown} tapping_prop=${_tap_prop:-none}"
|
|
done
|
|
|
|
if [ "$_found" -eq 0 ]; then
|
|
log "no target internal ASUS pointer device found"
|
|
fi
|
|
}
|
|
|
|
# Run multiple times because xfsettingsd and saved-session restoration can
|
|
# apply pointer settings after the session wrapper starts.
|
|
for _delay in 1 5 15 30; do
|
|
sleep "$_delay"
|
|
enable_internal_pointers_once
|
|
done
|