Warum funktioniert xsetwacom nicht mit udev?

8

Ich habe ein Skript erstellt, um mein Wacom Bamboo-Tablet um 180 Grad zu drehen. Es funktioniert gut, wenn ich es als ich selbst (Benutzer) oder als Root ausführe, aber wenn ich von udev(dh wenn ich das Tablet an einen usbPort anschließe) gestartet werde, funktioniert es nicht.

Udev-Regeln :

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

Wacom-Skript /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

Ergebnis in /tmp/red-wacom.log :

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

(Beachten Sie, dass der Fehler im Protokoll bedeutet, dass die udev-Regel selbst nicht das Problem ist.)

Ich habe versucht, ein sleepim Skript festzulegen, vielleicht braucht es ein paar ms. Das hilft aber nicht.

  • Warum funktioniert dieses Skript nicht, wenn es direkt von aufgerufen wird udev?
    • Wie behebe ich das?
  • Kann ich ein Skript von udeveinem bestimmten Benutzer aus aufrufen ? (zB Synchronisierung /homemit externem Sicherungslaufwerk - / home / ist nur für den Benutzer sichtbar)
Redsandro
quelle

Antworten:

3

Es gibt eine ziemlich einfache Problemumgehung. Sie können Ihrer xorg.conf(oder einer Datei in xorg.conf.d, wie ich es getan habe) so etwas hinzufügen :

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

Auf der Manpage wacom (4) finden Sie Details zu allen Optionen, die Sie einstellen können.

(Theoretisch können Sie MatchProductdas Touchpad, den Stift, den Radiergummi usw. individuell konfigurieren. Als ich das vor einiger Zeit versuchte, verursachte Xorg einen Segfault. Dasselbe gilt, wenn ich versuchte, sie zu schweben. Aber Sie tun keine davon ... und vielleicht ist der Fehler jetzt behoben.)

derobert
quelle
Wow, nach so vielen Googeln bin ich nie darauf gestoßen. Ich habe Ihre Antwort positiv bewertet. Ich werde es ausprobieren, wenn ich bei der Arbeit bin. Gibt es einen bestimmten Grund dafür 55? Ich verwende immer die Idee, dass "unzählige Einträge zuletzt verarbeitet werden, daher ist es am besten, Zahlen für benutzerdefinierte Einträge zu überspringen."
Redsandro
@Redsandro /usr/share/X11/xorg.conf.d/50-wacom.confist 50 auf meinem System, also habe ich 55 ausgewählt, um danach zu kommen. Ich bin mir nicht sicher, ob das überhaupt wichtig ist.
Derobert
Diese Antwort enthält nützliche Informationen, beantwortet jedoch nicht die ursprüngliche Frage. Was ist, wenn Sie Ihr USB Wacom-Gerät nach dem Start des X-Servers anschließen?
Lqueryvg
1
@Lqueryvg InputClass gilt für Hotplugged-Geräte, daher sollte es auch funktionieren.
Derobert
@derobert, danke für die Antwort. Ich wusste nicht, dass InputClass auch für Hotplug funktioniert. Ich habe einige Schaltflächenereignisse, die ich mit xsetwacom zuordne, und ich möchte sie auslösen, wenn ich mein Tablet nach dem Start von X per Hotplug stecke. Ich werde es versuchen. Vielen Dank !
Lqueryvg
2

Wenn Sie das Gerät anschließen:

  1. Linux erkennt das Gerät und erstellt einen Geräteeintrag basierend auf udev-Regeln.
  2. Der X-Server erkennt das Gerät.

Sie können nicht xsetwacomvor Stufe 2 ausgeführt werden. Ihr Skript schlägt fehl, da Sie es in Stufe 1 ausführen , wenn X das Gerät noch nicht kennt.

Sie können einige Einstellungen mit vornehmen gnome-settings-daemon. Ich glaube, es wird über D-Bus über das neue Gerät benachrichtigt , aber ich weiß nicht, wie das D-Bus-Ereignis aussieht. Versuchen Sie, den Bus mit auszuspionieren dbus-monitor.

Gilles 'SO - hör auf böse zu sein'
quelle
Ich habe Ihre Antwort für die Details positiv bewertet, bin mir jedoch aus folgendem Grund nicht sicher, ob dies richtig ist: Ich habe versucht, sie sleepinnerhalb von Sekunden zu verwenden. Beim Anschließen funktioniert das Tablet nach weniger als einer Sekunde. Wenn die Befehle ausgeführt werden, wird das Gerät bereits erkannt und von verwendet X. Aber es funktioniert immer noch nicht?
Redsandro
2

Es funktioniert, wenn Sie zwei Dateien erstellen, wobei ein Wrapper-Skript von udev aufgerufen wird, das wiederum das eigentliche Konfigurationsskript im Hintergrund aufruft. Das Konfigurationsskript muss für kurze Zeit in den Ruhezustand versetzt werden, damit X11 Zeit hat, seine Arbeit zu erledigen. Hier ist das Setup, das ich benutze:

Von udev aufgerufenes Wrapper-Skript (/usr/local/bin/setupwacom.sh):

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

Konfigurationsskript, das vom Wrapper-Skript aufgerufen wird (/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
quelle
2

Keine der Antworten hier funktionierte für mich, und die Optionen, die ich festlegen wollte, konnten nicht angegeben werden in 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.

Am Ende musste ich das Skript mit einem systemd-Dienst starten, der durch eine udev-Regel ausgelöst wurde:

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

Hersteller- und Modell-ID werden lsusbbei angeschlossenem Gerät ausgeführt.

So laden Sie udev-Regeln neu:

$ udevadm control --reload-rules
$ udevadm trigger

Das TAG+="systemd"ermöglicht andere systemd Dienste (System oder Benutzer) auf dem Gerät (Register es als Geräteeinheit, siehe abhängen man systemd.device). Um den Namen der Geräteeinheit zu finden, führen Sie udevadm monitordas Tablet aus und schließen Sie es an. Ich bekomme

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

Um zu überprüfen, ob systemd es aufnimmt, tun Sie es

$ 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

Die Geräteeinheit ist also sys-devices-pci0000:00-0000:00:1d.0-usb2-2\x2d1-2\x2d1.3.deviceund kann in der systemd-Serviceeinheit verwendet werden

 $ 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

Es gibt eine Geräteeinheit pro USB-Port.

Aktivieren und laden Sie das Gerät anschließend mit systemctl --user enable wacom.serviceund neu systemctl --user daemon-reload.

Das Skript muss noch etwas schlafen, damit xsetwacom das Gerät findet und $DISPLAYund setzt $XAUTHORITY. Type=oneshotfunktioniert einwandfrei beim Anschließen, wird jedoch nicht ausgeführt, wenn das Gerät beim Booten des Computers bereits angeschlossen war. Aus diesem Grund musste ich einen Benutzerdienst anstelle eines Systemdienstes verwenden, und das Gerät hat auch einen WantedBy=default.target. Das Problem mit oneshot ist, dass es startx blockiert hat. Type=forkingund Restart=noweist systemd an, nicht auf das Beenden des gegabelten Prozesses des Skripts zu warten, damit das Skript im Hintergrund schlafen und auf den Start von Xorg warten kann.

$ 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
quelle
Ich weiß nicht, warum dies in Ihrem Szenario nicht der Fall war, aber ich musste zumindest das \xto \\xin der Servicedatei umgehen. Meine WantedBy's sahen am Ende so aus: WantedBy=sys-devices-pci0000\:00-0000\:00\:14.0-usb1-1\\x2d4.deviceund jetzt werden sie ausgelöst ... bevor sie es nicht taten.
Jan
1

Die Problemumgehung von derobert ist nicht für alle Situationen geeignet (wenn Sie die xorg.conf nicht verwenden können).

Der vorgeschlagene Wrap und die sleepLösung von Adrian funktionieren für mich irgendwie nicht (Ubuntu 16.04).

Wenn Sie dies oben in Ihrem xsetwacom-Skript hinzufügen:

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

Sie können der Ausgabe entnehmen, dass das xsetwacom-Skript noch ausgeführt wird, bevor xinputdas wacom erkannt wird. Egal wie lange du schläfst.

Was ich vorschlage , ist hier eine andere Lösung / Abhilfe das kleine Programm bei denen ist einfacher als die Lösung von spelufo (was ich nicht ausprobiert) , sondern erfordert nur die Installation atProgramm. ( sudo apt install atfür Debian-Benutzer).

Ändern Sie nun Ihr Wrapper-Skript (Adrians Antwort) wie folgt:

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

atwird normalerweise verwendet, um einen Befehl einmal zu planen. Sie können beispielsweise eine Stunde im Voraus planen at now +1 hours -f yourscript.sh. Da Sie jedoch nur Minuten / Stunden / Tage / Wochen hinzufügen können, habe ich diese nowohne Zusatz verwendet, sondern mich auf den Schlaf im xsetwacom-Skript verlassen.

Sebastian
quelle
Konnte das gleiche Problem mit Adrians Vorschlag und dies behoben es für mich auf 16.04 Ubuntu. Ich verblüffe mich, wie es angefangen hat, at nowohne Gabelung zu arbeiten. Irgendein Grund dafür? Tatsächlich benötigt es mit der atMethode nicht einmal das Wrapper-Skript. Sie können es direkt hinzufügen als .., RUN+="/usr/bin/at now -f script-path":)
Gaurav