Mengapa xsetwacom tidak berfungsi dari udev?

8

Saya membuat skrip untuk memutar tablet Wacom Bamboo 180 derajat. Ini berfungsi dengan baik ketika saya menjalankannya sebagai saya sendiri (pengguna) atau root, tetapi ketika mulai dari udev(yaitu ketika menghubungkan tablet ke usbport) itu tidak akan berfungsi.

Aturan Udev :

SUBSYSTEMS=="usb", ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00d1", ATTRS{manufacturer}=="Wacom Co.,Ltd.", RUN+="/usr/local/bin/red-wacom-bamboo.sh"

Script Wacom /usr/local/bin/red-wacom-bamboo.sh :

#!/usr/bin/env bash

exec > /tmp/red-wacom.log
exec 2>&1

# I had to do this otherwise xsetwacom would say:
# "Failed to open Display ."
# Is there a way to do this without using my username?
export XAUTHORITY=/home/redsandro/.Xauthority
export DISPLAY=:0

/usr/bin/xsetwacom set "Wacom Bamboo 2FG 4x5 Pen stylus" Rotate half
/usr/bin/xsetwacom set "Wacom Bamboo 2FG 4x5 Finger touch" Rotate half

Hasil dalam /tmp/red-wacom.log :

Cannot find device 'Wacom Bamboo 2FG 4x5 Pen stylus'.
Cannot find device 'Wacom Bamboo 2FG 4x5 Finger touch'.

(Perhatikan bahwa kesalahan dalam log berarti aturan udev itu sendiri bukan masalahnya.)

Saya mencoba pengaturan sleepdalam skrip, mungkin perlu beberapa ms. Tapi itu tidak membantu.

  • Mengapa skrip ini tidak berfungsi saat dipanggil langsung dari udev?
    • Bagaimana cara saya memperbaikinya?
  • Bisakah saya memanggil skrip udevsebagai pengguna tertentu? (mis. sinkronisasi /homeke drive cadangan eksternal - / home / hanya dapat dilihat oleh penggunanya)
Redsandro
sumber

Jawaban:

3

Ada solusi yang cukup mudah, Anda dapat menambahkan sesuatu seperti ini ke xorg.conf(atau file dalam xorg.conf.d, seperti yang telah saya lakukan):

anthony@Watt:/etc/X11/xorg.conf.d$ cat 55-local-wacom.conf 
Section "InputClass"
       Identifier "Wacom Left Handed"
       MatchDriver "wacom"
       Option "Rotate" "half"
EndSection

Periksa halaman wacom (4) untuk perincian semua opsi yang dapat Anda atur.

(Secara teori, Anda dapat menggunakannya MatchProductuntuk mengonfigurasi touchpad, pena, penghapus, dll., Tetapi ketika saya mencobanya beberapa waktu yang lalu, itu menyebabkan Xorg melakukan segfault. Sama jika saya mencoba untuk mengapung mereka. Tetapi Anda tidak melakukan apa pun itu ... dan mungkin bug sudah diperbaiki sekarang.)

derobert
sumber
Wow, setelah begitu banyak googling saya tidak pernah menemukan ini. Saya membatalkan jawaban Anda. Saya akan mencobanya ketika saya sedang bekerja. Adakah alasan spesifik 55? Saya selalu menggunakan gagasan bahwa "entri tanpa nomor diproses terakhir, jadi yang terbaik untuk melewati angka untuk entri khusus."
Redsandro
@Redsandro /usr/share/X11/xorg.conf.d/50-wacom.conf50 di sistem saya, jadi saya memilih 55 untuk datang setelah itu. Tidak yakin itu penting.
derobert
Jawaban ini memberikan informasi yang bermanfaat tetapi tidak menjawab pertanyaan awal. Bagaimana jika Anda mencolokkan perangkat USB Wacom Anda setelah X server dimulai?
Lqueryvg
1
@Lqueryvg InputClass berlaku untuk perangkat yang dicolokkan, sehingga harus bekerja juga.
derobert
@derobert, terima kasih telah merespons. Saya tidak menyadari InputClass bekerja untuk hotplug juga. Saya memiliki beberapa acara tombol yang saya petakan menggunakan xsetwacom dan saya ingin memicu mereka jika saya hotplug tablet saya setelah X telah dimulai. Saya akan mencoba ini. Terima kasih!
Lqueryvg
2

Ketika Anda mencolokkan perangkat:

  1. Linux mendeteksi perangkat dan membuat entri perangkat berdasarkan aturan udev.
  2. Server X mendeteksi perangkat.

Anda tidak dapat menjalankan xsetwacomsebelum tahap 2. Skrip Anda gagal karena Anda menjalankannya pada tahap 1, ketika X belum tahu perangkat.

Anda dapat mengatur beberapa pengaturan dengan gnome-settings-daemon. Saya percaya ini mendapat notifikasi perangkat baru melalui D-Bus , tapi saya tidak tahu seperti apa acara D-Bus. Cobalah memata-matai bus dengan dbus-monitor.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Saya mengubah jawaban Anda untuk detailnya, tetapi saya tidak yakin ini benar karena alasan berikut: Saya mencoba menggunakan sleepdengan banyak detik. Saat mencolokkan, tablet bekerja setelah kurang dari satu detik, sehingga pada saat perintah dijalankan, perangkat sudah terdeteksi dan sedang digunakan oleh X. Tapi tetap tidak berhasil?
Redsandro
2

Ini berfungsi jika Anda membuat dua file, satu skrip pembungkus dipanggil oleh udev, yang kemudian memanggil skrip konfigurasi aktual di latar belakang. Skrip konfigurasi perlu tidur sebentar, sehingga X11 memiliki waktu untuk melakukan tugasnya. Inilah pengaturan yang saya gunakan:

Script wrapper dipanggil oleh udev (/usr/local/bin/setupwacom.sh):

#!/usr/bin/env bash
/usr/local/bin/setupwacom-post-X11.sh &

Skrip konfigurasi dipanggil oleh skrip wrapper (/usr/local/bin/setupwacom-post-X11.sh):

#!/usr/bin/env bash
sleep 2
export XAUTHORITY=/home/adrian/.Xauthority
export DISPLAY=:0
# Put your xsetwacom commands here, for example: 
xsetwacom --set "Wacom Intuos S Pad pad" Button 1 "key +ctrl +shift e"
Adrian
sumber
2

Tidak ada jawaban di sini yang berfungsi untuk saya, dan opsi yang ingin saya tetapkan tidak dapat ditentukan dalam xorg.conf:

$ xsetwacom -x get 'Wacom Intuos PT S Pad pad' button 1 
Button: Actions are not supported by xorg.conf. Try shell format (-s) instead.

Saya akhirnya harus memulai skrip dengan layanan systemd yang dipicu oleh aturan udev:

$ cat /etc/udev/rules.d/99-wacom.rules
SUBSYSTEM=="usb", ENV{ID_VENDOR_ID}=="056a", ENV{ID_MODEL_ID}=="0302", TAG+="systemd"

Vendor dan id model dapat ditemukan berjalan lsusbdengan perangkat terhubung.

Untuk memuat ulang aturan udev:

$ udevadm control --reload-rules
$ udevadm trigger

The TAG+="systemd"memungkinkan layanan systemd lainnya (sistem atau pengguna) tergantung pada perangkat (register sebagai unit perangkat, lihat man systemd.device). Untuk menemukan nama unit perangkat dijalankan udevadm monitordan sambungkan ke tablet. saya mendapat

UDEV  [2918.098423] add      /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3 (usb)
...

Untuk memeriksa apakah systemd mengambilnya, lakukan

$ systemctl status /sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/
● sys-devices-pci0000:00-0000:00:1d.0-usb2-2\x2d1-2\x2d1.3.device - CTH-480 [Intuos Pen & Touch (S)]
   Loaded: loaded
   Active: active (plugged) since Mon 2016-06-20 11:14:20 UYT; 29min ago
   Device: /sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3

Jadi unit perangkat sys-devices-pci0000:00-0000:00:1d.0-usb2-2\x2d1-2\x2d1.3.device, dan dapat digunakan dalam unit layanan systemd

 $ cat .config/systemd/user/wacom.service    
[Service]
Type=forking
Restart=no
ExecStart=/path/to/wacom-pad-button-setup

[Install]
WantedBy=default.target
WantedBy=sys-devices-pci0000:00-0000:00:1d.0-usb2-2\x2d1-2\x2d1.1.device
WantedBy=sys-devices-pci0000:00-0000:00:1d.0-usb2-2\x2d1-2\x2d1.2.device
WantedBy=sys-devices-pci0000:00-0000:00:1d.0-usb2-2\x2d1-2\x2d1.3.device

Ada satu unit perangkat per port usb.

Kemudian aktifkan dan muat ulang unit dengan systemctl --user enable wacom.servicedan systemctl --user daemon-reload.

Script masih perlu sedikit tidur untuk xsetwacom untuk menemukan perangkat, dan untuk mengatur $DISPLAYdan $XAUTHORITY. Type=oneshotberfungsi dengan baik ketika mencolokkannya, tetapi itu tidak berjalan jika perangkat sudah terhubung saat mem-boot komputer. Itu sebabnya saya perlu menggunakan layanan pengguna daripada sistem, dan mengapa unit juga memilikinya WantedBy=default.target. Masalah dengan oneshot adalah ia memblokir startx. Type=forkingdan Restart=nomemberitahu systemd untuk tidak menunggu proses bercabang skrip untuk keluar, sehingga skrip kemudian dapat tidur di latar menunggu Xorg untuk memulai.

$ cat bin/wacom-pad-button-setup
#!/bin/rc
{
    sleep 2

    if (~ $DISPLAY ()) {
        DISPLAY=:0
        XAUTHORITY=/home/spelufo/.Xauthority
    }

    xsetwacom set 'Wacom Intuos PT S Pad pad' button 9 'button +3 -3'
    xsetwacom set 'Wacom Intuos PT S Pad pad' button 8 'button +4 -4'
    xsetwacom set 'Wacom Intuos PT S Pad pad' button 3 'button +1 -1'
    xsetwacom set 'Wacom Intuos PT S Pad pad' button 1 'button +2 -2'
} &
spelufo
sumber
Saya tidak tahu mengapa itu tidak terjadi dalam skenario Anda, tetapi saya harus melarikan diri setidaknya \xke \\xdalam file layanan. WantedBy saya terlihat seperti ini pada akhirnya: WantedBy=sys-devices-pci0000\:00-0000\:00\:14.0-usb1-1\\x2d4.devicedan sekarang mereka dipicu ... sebelum mereka tidak melakukannya.
Jan
1

Solusi oleh derobert tidak cocok untuk semua situasi (jika Anda tidak dapat menggunakan xorg.conf).

Bungkus dan sleepsolusi yang diusulkan oleh Adrian entah bagaimana tidak bekerja untuk saya (ubuntu 16.04).

Jika Anda menambahkan ini ke bagian atas skrip xsetwacom Anda:

exec > /tmp/debug-my-script.txt 2>&1
xinput --list

Anda dapat melihat dari output bahwa skrip xsetwacom masih dijalankan sebelum xinputmenyadari wacom. Tidak peduli berapa lama Anda tidur.

Apa yang saya usulkan di sini adalah solusi lain / solusi menggunakan program kecil di mana lebih sederhana daripada solusi dengan spelufo (yang saya tidak mencoba) tetapi hanya membutuhkan untuk menginstal atprogram tersebut. ( sudo apt install atuntuk pengguna debian).

Sekarang ubah skrip pembungkus Anda (jawaban Adrian) menjadi seperti ini:

#!/usr/bin/env bash
at now -f /usr/local/bin/setupwacom-post-X11.sh

atbiasanya digunakan untuk menjadwalkan perintah sekali, misalnya Anda dapat menjadwalkan satu jam sebelumnya at now +1 hours -f yourscript.sh. Tetapi karena Anda hanya dapat menambahkan menit / jam / hari / minggu saya menggunakan nowtanpa tambahan tetapi mengandalkan tidur di dalam skrip xsetwacom.

Sebastian
sumber
Menghadapi masalah yang sama dengan saran Adrian dan ini diperbaiki untuk saya di 16,04 Ubuntu. Saya membuat saya bingung bagaimana itu mulai bekerja at nowtanpa garpu. Ada alasan untuk itu? Sebenarnya dengan atmetode ini bahkan tidak memerlukan skrip wrapper. Anda dapat langsung menambahkannya sebagai .., RUN+="/usr/bin/at now -f script-path":)
Gaurav
Ini sangat gila karena saya bahkan tidak tidur di skrip dan berfungsi tanpa itu. Saya berharap saya tahu apa yang terjadi di latar belakang sehingga itu bekerja denganat
BozanicJosip