Прокунсультируйте кто-нибудь по udevrules.
предпосылки: при игре с помощью геймпада, монитор вырубается — уходит в спящий режим. нагуглил решение — маленькая утилита из aur — joystickwake. только ее нужно запускать в фоне перед запуском игры, а потом вырубать (можно не вырубать, но борьба за ресурсы, все дела).
задача — выполнять скрипт при подключении геймпада, а при отключении выполнять еще один.
пытаюсь освоить udevrules, а тут еще и подвернулся повод)
что делаю:
 
[ 3558.815661] usb 1-4: new full-speed USB device number 20 using xhci_hcd
[ 3558.960747] usb 1-4: New USB device found, idVendor=045e, idProduct=02ea, bcdDevice= 3.01
[ 3558.960753] usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 3558.960757] usb 1-4: Product: Controller
[ 3558.960760] usb 1-4: Manufacturer: Microsoft
[ 3558.960763] usb 1-4: SerialNumber: 3033363030303431393237383334
[ 3558.962538] input: Microsoft X-Box One S pad as /devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.0/input/input37
методом «от противного» узнаю, что мой гемпад коннектится как /dev/input/js1
 
looking at device '/devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.0/input/input28/js1': 
KERNEL==«js1» 
SUBSYSTEM==«input» 
DRIVER=="" 
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.0/input/input28': 
KERNELS==«input28» 
SUBSYSTEMS==«input» 
DRIVERS=="" 
ATTRS{name}==«Microsoft X-Box One S pad» 
ATTRS{uniq}=="" 
ATTRS{properties}==«0» 
ATTRS{phys}==«usb-0000:00:14.0-4/input0» 
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.0': 
KERNELS==«1-4:1.0» 
SUBSYSTEMS==«usb» 
DRIVERS==«xpad» 
ATTRS{authorized}==«1» 
ATTRS{bAlternateSetting}==" 0" 
ATTRS{bInterfaceNumber}==«00» 
ATTRS{bNumEndpoints}==«02» 
ATTRS{bInterfaceProtocol}==«d0» 
ATTRS{bInterfaceSubClass}==«47» 
ATTRS{bInterfaceClass}==«ff» 
ATTRS{supports_autosuspend}==«0» 
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-4': 
KERNELS==«1-4» 
SUBSYSTEMS==«usb» 
DRIVERS==«usb» 
ATTRS{maxchild}==«0» 
ATTRS{serial}==«3033363030303431393237383334» 
ATTRS{urbnum}==«16» 
ATTRS{bcdDevice}==«0301» 
ATTRS{bNumConfigurations}==«1» 
ATTRS{bMaxPower}==«500mA» 
ATTRS{bNumInterfaces}==" 3" 
ATTRS{bDeviceProtocol}==«d0» 
ATTRS{avoid_reset_quirk}==«0» 
ATTRS{bmAttributes}==«a0» 
ATTRS{version}==" 2.00" 
ATTRS{product}==«Controller» 
ATTRS{quirks}==«0x0» 
ATTRS{bConfigurationValue}==«1» 
ATTRS{removable}==«removable» 
ATTRS{devpath}==«4» 
ATTRS{rx_lanes}==«1» 
ATTRS{ltm_capable}==«no» 
ATTRS{devnum}==«11» 
ATTRS{bMaxPacketSize0}==«64» 
ATTRS{idProduct}==«02ea» 
ATTRS{manufacturer}==«Microsoft» 
ATTRS{bDeviceSubClass}==«47» 
ATTRS{configuration}=="" 
ATTRS{tx_lanes}==«1» 
ATTRS{devspec}=="(null)" 
ATTRS{bDeviceClass}==«ff» 
ATTRS{busnum}==«1» 
ATTRS{speed}==«12» 
ATTRS{authorized}==«1» 
ATTRS{idVendor}==«045e» 
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1': 
KERNELS==«usb1» 
SUBSYSTEMS==«usb» 
DRIVERS==«usb» 
ATTRS{configuration}=="" 
ATTRS{idVendor}==«1d6b» 
ATTRS{bMaxPacketSize0}==«64» 
ATTRS{speed}==«480» 
ATTRS{bNumInterfaces}==" 1" 
ATTRS{maxchild}==«16» 
ATTRS{version}==" 2.00" 
ATTRS{bmAttributes}==«e0» 
ATTRS{authorized}==«1» 
ATTRS{bConfigurationValue}==«1» 
ATTRS{devnum}==«1» 
ATTRS{authorized_default}==«1» 
ATTRS{devspec}=="(null)" 
ATTRS{bNumConfigurations}==«1» 
ATTRS{bDeviceSubClass}==«00» 
ATTRS{bMaxPower}==«0mA» 
ATTRS{bDeviceProtocol}==«01» 
ATTRS{rx_lanes}==«1» 
ATTRS{idProduct}==«0002» 
ATTRS{interface_authorized_default}==«1» 
ATTRS{vendor}==«0x8086» 
ATTRS{local_cpulist}==«0-7» 
ATTRS{device}==«0xa12f» 
ATTRS{d3cold_allowed}==«1» 
ATTRS{broken_parity_status}==«0» 
looking at parent device '/devices/pci0000:00': 
KERNELS==«pci0000:00» 
SUBSYSTEMS=="" 
DRIVERS=="" 
создаю: 
 
SUBSYSTEM==«input», ATTRS{idVendor}==«045e», ATTRS{idProduct}==«02ea», ACTION==«add», RUN+="/etc/udev/scripts/joy.sh"
перезапускаю правила:
sudo udevadm control --reload-rules
проверяю — не работает.
скрипт из консоли запускается. если что, вот его пример:
 
#!/bin/bash
joystickwake && notify-send «Xbox gamepad connected» -t 1000
короче, победа.
решил отказаться от всяких joystickwake и использовать топорный метод xset. конечный вариант правила:
 
ACTION=="add" \
, KERNEL=="js1" \
, ATTRS{name}=="Microsoft X-Box One S pad" \
, RUN+="/bin/bash /etc/udev/scripts/joyadd.sh"
ACTION=="remove" \
, KERNEL=="js1" \
, ATTRS{name}=="Microsoft X-Box One S pad" \
, RUN+="/bin/bash /etc/udev/scripts/joyrem.sh"
# Wireless gamepad
ACTION=="add" \
, KERNEL=="input[0-9]*" \
, ATTRS{name}=="Xbox Wireless Controller" \
, RUN+="/bin/bash /etc/udev/scripts/joyadd.sh (BT)"
ACTION=="remove" \
, ATTRS{name}=="Xbox Wireless Controller" \
, RUN+="/bin/bash /etc/udev/scripts/joyrem.sh (BT)"
конечный вариант скриптов:
 
#!/bin/bash
TIME='-t 1000'
STAT=$1
DISPLAY=":0"
XAUTHORITY=/run/user/1000/Xauthority
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
export DISPLAY XAUTHORITY DBUS_SESSION_BUS_ADDRESS
xset -dpms
xset s off
su led -c "notify-send  'System Message' 'Xbox Gamepad $STAT connected' $TIME"
 
#!/bin/env bash
TIME='-t 1000'
STAT=$1
DISPLAY=":0"
XAUTHORITY=/run/user/1000/Xauthority
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
export DISPLAY XAUTHORITY DBUS_SESSION_BUS_ADDRESS
xset +dpms
xset s on
su led -c "notify-send  'Sytem Message' 'Xbox Gamepad $STAT disconnected' $TIME"
но, при отключении bluetooth ивент срабатывает дважды. не особо критично, но…