Manipulieren der X-Taste und des Zeigers in der Befehlszeile

20

Welche Befehlszeilentools gibt es, um X-Server-Grabs aufzulisten und zu verwalten? (Das ist Greifen wie bei Tasten- und Zeigergriffen, dh Beschränken der Verwendung einer bestimmten Taste oder Maustaste auf eine bestimmte Anwendung oder Einschränken des Mauszeigers, um in einem bestimmten Bildschirmbereich zu bleiben.) Ich suche nach einem hypothetischen xgrabDienstprogramm, das dies tun würde zeige Dinge wie

Key     0x00f00ba5  0x123   0
Button  0x00f00ba5  2       
Pointer 0x00abcdef  

was bedeutet , dass es einen Anruf war XGrabKey(display, 0x123, 0, 0x00f00ba5, ...)und so weiter mit XGrabButton, XGrabPointer, XGrabKeyboard, XGrabServer(wenn möglich). Das Anzeigeformat spielt keine Rolle. Ich möchte auf irgendeine Weise sehen, wer was packt, und möglicherweise auf irgendeine Weise, wie diese Zupacken widerrufen werden können (wenn es möglich ist, bin ich mir nicht sicher, ob die X11-API dies zulässt).

Gilles 'SO - hör auf böse zu sein'
quelle

Antworten:

21

Aktuelle Versionen von X (X.org-Server ≥ 1.11) unterstützen mehrere in diesem Commit eingeführte Debugging-Keys . Wenn diese ausgelöst werden, führen sie Aktionen aus, die sich auf Zupacken beziehen.

Standardmäßig ( zumindest in neueren Versionen ) sind diese deaktiviert (nicht in der Standard-Keymap enthalten).

Wenn Sie jedoch, xdotoolinstalliert, es ist möglich , sie zu rufen, indem Sie auf der Kommandozeile ausführen:

xdotool key NameOfKey

Wo NameOfKeyist der Keysym, den Sie aktivieren möchten? Verwenden Sie beispielsweise, um eine Liste der aktiven Bereiche im X-Server-Protokoll zu drucken xdotool key XF86LogGrabInfo.

Relevante Schlüsselwörter sind:

Beachten Sie, dass XF86LogGrabInfonur aktive Zupacken aufgelistet werden, keine passiven Zupacken wie das Zupacken einer Taste, die gerade nicht gedrückt wird. Wenn Sie Informationen zu einem passiven Zupacken erhalten möchten, müssen Sie das Zupacken aktivieren: Ausführen, xdotool key XF86LogGrabInfowährend die gewünschte Tastenkombination für Akkord oder Maustaste gedrückt wird. Mach etwas wie:

  1. Lauf sleep 1; xdotool key XF86LogGrabInfo
  2. Drücken Sie innerhalb von 1 Sekunde die Tastenkombination für den Akkord oder die Maustaste.
  3. Lassen Sie nach 1 Sekunde die Taste los.
  4. Überprüfen Sie die Informationen zu „Active Grab…“ im X-Server-Protokoll (häufig /var/log/Xorg.0.log).
Mechanische Schnecke
quelle
2
Wenn Sie jetzt Debian wheezy mit Xorg 1.12.4 testen, werden xdotool key XF86LogGrabInfonur zwei Einträge im X-Protokoll ausgelöst : "Alle derzeit aktiven Geräte-Grabs drucken:", unmittelbar gefolgt von "Liste der aktiven Geräte-Grabs beenden". Mein Fenstermanager greift jedoch nach einem Schlüsselbund. Haben Sie diese Arbeit für ergriffene Schlüssel gesehen?
Gilles 'SO- hör auf böse zu sein'
4
@Gilles - nein, wenn du es so ausführst, bekommst du keine Ausgabe ... Versuche es mit sleep 2; xdotool key "XF86LogGrabInfo"und drücke sofort eine Taste (z. B. die "Win" -Taste) sehr schnell, dann siehst du eine Ausgabe in Xorg.log. Oder xdotooldrücken Sie gleichzeitig die Tasten + XF86LogGrabInfo, wie hier
don_crissti
@don_crissti Ah, ich sehe, XF86LogGrabInfodruckt nur Informationen über eine Taste, die gerade gedrückt wird? Das schränkt seinen Nutzen ein. Ich möchte alle Zupacken auflisten - alle passiven Zupacken, wenn ich die Terminologie richtig verstehe.
Gilles 'SO - hör auf, böse zu sein'
Es gibt wahrscheinlich eine clevere Möglichkeit, dies mit einer ausführlichen Suche nach Tastenkombinationen zu kombinieren, hoffentlich ohne eine virtuelle Tastatur. Sicherlich außerhalb meines Wissens.
Adam Katz
Vielen Dank! Dies half mir herauszufinden, dass xfsettingsdmeine Win+ LVerknüpfung gestohlen wurde .
Mikel
8

Ich habe keine Ahnung, ob für die passiven Zupacken 1 einer einzelnen Taste oder eines einzelnen Knopfes noch Zupacken vorhanden sind, aber es gibt verschiedene Möglichkeiten, die aktiven Zupacken eines gesamten Tastatur- oder Mausgeräts aufzulisten.

  1. Ordnen Sie auf allen Plattformen, jedoch nur mit Xorg 1.11 und höher (oder einer älteren Version mit angewendetem Patch) Hotkeys zu, um die Grab-Daten wie in diesen Patch-Hinweisen beschrieben im Protokoll abzulegen .
  2. Verwenden Sie unter Solaris 11 (entweder Solaris 11 Express 2010.11 oder die aktuelle Solaris 11-Version) die Debugger-Skripts /usr/demo/Xserver/mdb/list_Xserver_devicegrab_client, wie in Informationen vom X-Server abrufen beschrieben . Es gibt hier auch einen für Server-Grabs, den die Xorg 1.11-Hotkeys derzeit nicht abdecken.

1 Unter http://tronche.com/gui/x/xlib/input/pointer-grabbing.html finden Sie Informationen zur Definition von aktiven und passiven Zügen.

alanc
quelle
4

Dies ist eine Ergänzung zu Mechanicals Antwort:

Die Einträge im Xorg-Protokoll können ziemlich unkenntlich sein. Ich habe ein Programm geschrieben, das sie analysiert und in einer für den Menschen nachvollziehbaren Form darstellt:

https://gist.github.com/CyberShadow/6412d11aea64144f8905cc0b8196f38e

Führen Sie zunächst den Befehl aus xdotool key XF86LogGrabInfo, wie in der Antwort von Mechanical Snail beschrieben. Führen Sie dann das oben verlinkte Programm aus. Wenn sich /var/log/Xorg.0.logIhre Xorg-Protokolldatei nicht in befindet , können Sie den Speicherort mithilfe der --xorg-logOption angeben . Siehe --helpfür weitere Einzelheiten.

Vladimir Panteleev
quelle
1
Der hier erwähnte Kern ist in der Sprache D programmiert. Um eine ausführbare Datei zu erhalten, kann man Pakete installieren gdc(GNU D-Compiler) und libx11-devdann ausführen gdc -o xorg-show-grabs xorg-show-grabs.d -lX11.
Stéphane Gourichon