Nach weiteren Tests habe ich das Problem auf diesen Codeabschnitt eingegrenzt:
setxkbmap -device $tartarus_id -print | sed 's/\(xkb_symbols.*\)"/\1+tartarus('$tartarus_profile')"/' | xkbcomp -I$HOME/xbindkeys\ profiles/xkb -i $tartarus_id -synch - $DISPLAY 2>/dev/null
Mein früheres Problem mit dem gebrochenen Pipe-Fehler war auf einen Tippfehler zurückzuführen, bei dem ich das Leerzeichen zwischen - und $ DISPLAY versehentlich gelöscht hatte. Daher funktioniert dieser Code jetzt im Hauptskript. Das Problem ist, dass dieser Codeabschnitt meine xbindkeys-Konfiguration vorübergehend durcheinander bringt und das neue Tastaturlayout erst wirksam wird, wenn sich xbindkeys wieder ausrichtet. Xbindkeys schafft es erst, sich selbst zu glätten, nachdem ich mit der Maustaste auf einen Rebound geklickt habe, aber mit dem ersten Klick ist immer etwas nicht in Ordnung. Ich weiß, dass dies der Code ist, der die Probleme verursacht, weil ich alles andere auskommentiert habe. Das Problem bleibt auch dann bestehen, wenn nur das xkb-Profil geändert wird.
UPDATE 1: Obwohl ich alles in meiner Macht Stehende unternommen hatte, um dies zu vermeiden, gab ich schließlich nach und nahm mir die Zeit, um herauszufinden, wie man Layouts zu xkb hinzufügt, indem ich diese Antwort so lese , dass ich sie jetzt anrufen kann
setxkbmap -device $tartarus_id -layout tartarus -variant $tartarus_profile
Dies hat eines meiner zwei verbleibenden Probleme gelöst: Mein Tartarus wird erfolgreich neu gebunden, sobald sich das aktive Fenster ändert. Meine Maus verhält sich immer noch bizarr.
Es ist seltsam. Das gesamte Problem mit dem "G7-Button, der den ersten Klick sendet" scheint gestoppt zu sein, aber "Tab" bildet sich beim ersten Klick in der Zwergenfestung immer noch auf meinen RMB- und G9-Button. Ich habe keine anderen Unregelmäßigkeiten bemerkt, aber ich habe noch nicht wirklich eine Reihe von Profilen hinzugefügt, um zu sehen, wie sich das weiter entwickelt. Was auch immer passiert, es scheint zu tun zu haben, dass die Tasten meiner Maus so konfiguriert sind, dass sie Tastenanschläge senden, die den Tasten entsprechen, die sich auf dem Tartarus geändert haben.
In jedem Fall funktioniert das Skript so gut, dass ich bereit bin, es tatsächlich zu verwenden. Wenn es nur der erste Klick einer bestimmten falschen Maustaste ist (und nicht jede Taste, die Sie mögen), kann ich damit leben; Wenn mein Mausproblem in der Zukunft behoben wird, ist das nur ein Bonus.
UPDATE 2: Während ich das seltsame Verhalten meiner Maus ausfindig machte, habe ich die Reihenfolge der Befehle geändert, so dass xbindkeys nicht ausgeführt wird, während setxkbmap Änderungen vornimmt. Ich habe auch versucht, beim Senden von Schlüsseln von xte zu xdotool zu wechseln und "+ Release" von den Problemschaltflächen in meinen xbindkeys-Konfigurationen zu entfernen. Das Verhalten ist seltener geworden, tritt jedoch gelegentlich auf.
Die Verwendung von xprop zum Abrufen der aktiven Fensterklasse brachte mir einige Probleme mit dem Vollbildvideo. Daher wechselte ich zu Xdotool, um den Namen des aktiven Fensters zu erhalten, der ehrlich viel besser lesbar ist und perfekt zu funktionieren scheint.
UPDATE 3: Die Prüfung auf Maus- und Tastenfeld-IDs wurde in die Hauptschleife verschoben und anhand der Frage, ob sie gefunden wurden, festgestellt, ob ihre Profile geändert werden sollen oder nicht. Als Ergebnis kann das Skript nun Mäuse und Tastaturen handhaben, die während des Laufens verbunden / getrennt werden.
UPDATE 4: Es stellte sich heraus, dass das merkwürdige Verhalten von xbindkeys überhaupt nicht behoben wurde. Um es kurz zu machen: Es ist ein Problem, da sowohl xte als auch xdotool ausgeflippt sind, wenn mehrere Tastaturen mit unterschiedlichen Layouts angeschlossen sind. Es wurde eine Problemumgehung für alle gefunden, die dieses Problem haben: Fügen Sie am Anfang jeder Makrozeile, die xdotool aufruft, den xdotool-Schlüssel Cancel && hinzu (ich gehe davon aus, dass dies auch für xte funktioniert, aber ich habe es nicht probiert). Zum Beispiel:
"xdotool key Return" b:10
wird
"xdotool key Cancel && xdotool key Return" b:10
Dies bewirkt, dass der erste Aufruf von xdotool (der normalerweise falsch ist) eine "tote" Taste sendet, während der zweite Aufruf Ihnen das gibt, was Sie eigentlich wollten.
Hier ist das aktuelle autoProfileSwitch-Skript für alle, die dies für ihre eigenen Maus- und Tastaturkombinationen versuchen möchten. Tun Sie mir einen Gefallen und befürworten Sie diese Frage, wenn Sie dieses Skript für nützlich halten:
#!/bin/bash # Set Mouse and Keypad Names # Edit These To Uniquely Identify Your Mouse and Keyboard in Xinput Output # Leading and Trailing Wildcard Characters Not Necessary For Partial Names mouse_name="YourMouseNameHere" keypad_name="YourKeypadNameHere" # Location of Xbindkeys Configuration Files xbindkeys_dir="$HOME/xbindkeys profiles" # Set Initialization Profiles # keypad_layout Is an XKB Symbols File # keypad_profile Is an XKB Symbols Definition within keypad_layout # mouse_profile Is an xinput set-button-map Button Map String # macro_profile Is an Xbindkeys Configuration File keypad_layout="tartarus" keypad_profile="default" mouse_profile="1 2 3 4 5 6 7 8 9 10 11 12 13" macro_profile=".xbindkeysrc" # Keep Track of Last Time Active Window Changed Last="" # Main Loop while true; do # Get Mouse and Keypad Xinput IDs mouse_id=$( xinput list | sed -n 's/.*'$mouse_name'.*id=\([0-9]*\).*pointer.*/\1/p' ) keypad_id=$( xinput list | sed -n 's/.*'$keypad_name'.*id=\([0-9]*\).*keyboard.*/\1/p' ) # Get Name of Active Window Name="$(xdotool getwindowfocus getwindowname)" # Execute if Currently Active Window is Different from the Last Time It Changed if [ "$Name" != "$Last" ] then # Set Profiles Based on Name of Currently Active Window case $Name in Dwarf\ Fortress) keypad_profile="dwarfFortress" mouse_profile="1 3 2 4 5 6 7 8 9 10 11 12 13" macro_profile="dwarfFortress";; *Firefox) keypad_profile="blankSlate" mouse_profile="1 2 3 4 5 6 7 8 9 10 11 12 13" macro_profile="firefox";; *) keypad_profile="default" mouse_profile="1 2 3 4 5 6 7 8 9 10 11 12 13" macro_profile=".xbindkeysrc";; esac # Kill Xbindkeys if pgrep -x "xbindkeys" 1>/dev/null then killall xbindkeys fi # Change Keypad Keymap to Appropriate Profile # Layout Is the Name of Your XKB Symbols File # Variant Is the Name of an xkb_symbols Section of the Layout File # Save Layout to /usr/share/X11/xkb/symbols/ # Modify /usr/share/X11/xkb/rules/evdev .../evdev.xml and .../evdev.lst to Include Your Layout # Run "sudo dpkg-reconfigure xkb-data" After Any Changes to xkb/ Directory # See https://askubuntu.com/a/483026 For More Info [ ! "$keypad_id" ] || setxkbmap -device $keypad_id -layout $keypad_layout -variant $keypad_profile # Restart Xbindkeys Using Appropriate Profile xbindkeys -f "$xbindkeys_dir"/$macro_profile # Set Mouse Profile # For When Your Device Appears More Than Once in Xinput [ ! "$mouse_id" ] || for i in $mouse_id; do xinput set-button-map $i $mouse_profile; done # This Is the Last Time The Active Window Changed Last="$Name" fi # Short Sleep to Minimize CPU Usage sleep .5 done