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 usb
port) 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 sleep
dalam 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
udev
sebagai pengguna tertentu? (mis. sinkronisasi/home
ke drive cadangan eksternal - / home / hanya dapat dilihat oleh penggunanya)
55
? Saya selalu menggunakan gagasan bahwa "entri tanpa nomor diproses terakhir, jadi yang terbaik untuk melewati angka untuk entri khusus."/usr/share/X11/xorg.conf.d/50-wacom.conf
50 di sistem saya, jadi saya memilih 55 untuk datang setelah itu. Tidak yakin itu penting.Ketika Anda mencolokkan perangkat:
Anda tidak dapat menjalankan
xsetwacom
sebelum 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 dengandbus-monitor
.sumber
sleep
dengan banyak detik. Saat mencolokkan, tablet bekerja setelah kurang dari satu detik, sehingga pada saat perintah dijalankan, perangkat sudah terdeteksi dan sedang digunakan olehX
. Tapi tetap tidak berhasil?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):
Skrip konfigurasi dipanggil oleh skrip wrapper (/usr/local/bin/setupwacom-post-X11.sh):
sumber
Tidak ada jawaban di sini yang berfungsi untuk saya, dan opsi yang ingin saya tetapkan tidak dapat ditentukan dalam
xorg.conf
:Saya akhirnya harus memulai skrip dengan layanan systemd yang dipicu oleh aturan udev:
Vendor dan id model dapat ditemukan berjalan
lsusb
dengan perangkat terhubung.Untuk memuat ulang aturan udev:
The
TAG+="systemd"
memungkinkan layanan systemd lainnya (sistem atau pengguna) tergantung pada perangkat (register sebagai unit perangkat, lihatman systemd.device
). Untuk menemukan nama unit perangkat dijalankanudevadm monitor
dan sambungkan ke tablet. saya mendapatUntuk memeriksa apakah systemd mengambilnya, lakukan
Jadi unit perangkat
sys-devices-pci0000:00-0000:00:1d.0-usb2-2\x2d1-2\x2d1.3.device
, dan dapat digunakan dalam unit layanan systemdAda satu unit perangkat per port usb.
Kemudian aktifkan dan muat ulang unit dengan
systemctl --user enable wacom.service
dansystemctl --user daemon-reload
.Script masih perlu sedikit tidur untuk xsetwacom untuk menemukan perangkat, dan untuk mengatur
$DISPLAY
dan$XAUTHORITY
.Type=oneshot
berfungsi 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 memilikinyaWantedBy=default.target
. Masalah dengan oneshot adalah ia memblokir startx.Type=forking
danRestart=no
memberitahu systemd untuk tidak menunggu proses bercabang skrip untuk keluar, sehingga skrip kemudian dapat tidur di latar menunggu Xorg untuk memulai.sumber
\x
ke\\x
dalam file layanan. WantedBy saya terlihat seperti ini pada akhirnya:WantedBy=sys-devices-pci0000\:00-0000\:00\:14.0-usb1-1\\x2d4.device
dan sekarang mereka dipicu ... sebelum mereka tidak melakukannya.Solusi oleh derobert tidak cocok untuk semua situasi (jika Anda tidak dapat menggunakan xorg.conf).
Bungkus dan
sleep
solusi yang diusulkan oleh Adrian entah bagaimana tidak bekerja untuk saya (ubuntu 16.04).Jika Anda menambahkan ini ke bagian atas skrip xsetwacom Anda:
Anda dapat melihat dari output bahwa skrip xsetwacom masih dijalankan sebelum
xinput
menyadari 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
at
program tersebut. (sudo apt install at
untuk pengguna debian).Sekarang ubah skrip pembungkus Anda (jawaban Adrian) menjadi seperti ini:
at
biasanya digunakan untuk menjadwalkan perintah sekali, misalnya Anda dapat menjadwalkan satu jam sebelumnyaat now +1 hours -f yourscript.sh
. Tetapi karena Anda hanya dapat menambahkan menit / jam / hari / minggu saya menggunakannow
tanpa tambahan tetapi mengandalkan tidur di dalam skrip xsetwacom.sumber
at now
tanpa garpu. Ada alasan untuk itu? Sebenarnya denganat
metode ini bahkan tidak memerlukan skrip wrapper. Anda dapat langsung menambahkannya sebagai.., RUN+="/usr/bin/at now -f script-path"
:)at