feat(hardware): hide dual-sensor webcam IR node (fixes dark image)
A built-in RGB+IR webcam (common on recent ThinkPads, e.g. the T14s AMD Gen 4) exposes its IR face-unlock sensor as a second, identically-named "Integrated Camera"; apps that pick it show a dark, 8-bit-greyscale image. nomarchy.hardware.camera.hideIrSensor disables that node on the V4L2 PipeWire path (WirePlumber monitor.v4l2.rules) so only the colour camera is offered, matched by card name (overridable irMatch). - libcamera is left untouched: an external camera you plug in is never affected, and surgical internal-only libcamera scoping isn't possible (its distinguishing props bind after the monitor rule runs). - Only the PipeWire node is hidden; the kernel /dev/video* stays open, so Howdy face-unlock still reads the IR sensor directly. - The installer's hardware-db.sh auto-detects a paired RGB+IR webcam from /sys/class/video4linux/*/name and bakes the toggle into system.nix; commented example added to the downstream template. Validated live on a T14s: collapses the four enumerated "Integrated Camera" entries to one colour source; the exact shipped regex disables the IR node (confirmed in the WirePlumber log) and leaves libcamera intact. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -184,6 +184,31 @@ nomarchy_detect_hw() {
|
||||
echo "DETAIL fingerprint reader detected → fprintd (PAM login/sudo opt-in)"
|
||||
fi
|
||||
|
||||
# Dual-sensor webcam (RGB + IR face-unlock). Such modules expose the IR
|
||||
# sensor as a SECOND, identically-named "Integrated Camera"; an app that
|
||||
# picks it shows a dark, 8-bit-greyscale image. When an IR-companion node
|
||||
# sits alongside a normal camera node, enable hiding the IR one from
|
||||
# PipeWire (the colour camera stays; the kernel /dev/video* is untouched, so
|
||||
# Howdy can still read the IR sensor directly). Read from /sys — no
|
||||
# v4l2-ctl needed in the installer env.
|
||||
local cam_name have_ir_cam=0 have_color_cam=0 vf
|
||||
local ir_re='Integrated I|IR Camera|Infrared'
|
||||
for vf in /sys/class/video4linux/video*/name; do
|
||||
[[ -e "$vf" ]] || continue
|
||||
cam_name=$(cat "$vf" 2>/dev/null)
|
||||
shopt -s nocasematch
|
||||
if [[ "$cam_name" =~ $ir_re ]]; then
|
||||
have_ir_cam=1
|
||||
elif [[ "$cam_name" =~ (Camera|Webcam) ]]; then
|
||||
have_color_cam=1
|
||||
fi
|
||||
shopt -u nocasematch
|
||||
done
|
||||
if [[ $have_ir_cam -eq 1 && $have_color_cam -eq 1 ]]; then
|
||||
echo "NOMARCHY hardware.camera.hideIrSensor=true"
|
||||
echo "DETAIL dual-sensor webcam (RGB+IR) → hide the IR node so apps get the colour camera"
|
||||
fi
|
||||
|
||||
# NPU (detect-only → a commented, experimental opt-in). Match the PCI
|
||||
# "Processing accelerators" class [1200] (or accelerator keywords) and
|
||||
# attribute by vendor — future-proof vs a per-device-ID list, so new gens
|
||||
|
||||
Reference in New Issue
Block a user