Ok, ich habe doch tatsächlich einen Prototypen hinbasteln können!
Das Ding kann sich zwar die xmodmaps noch nicht dauerhaft merken, ist
aber leicht gelöst und kommt beim nächsten Mal. Zudem gibt es noch ein
paar Probleme:
• Laufende „xev“s werden gekillt.
• Tasten(kombinationen), die noch nicht zugeordnet sind, können nicht
neu zugeordnet werden.
• Wenn sich /usr/include/X11/keysymdef.h woanders befindet, kann es den
Namen der Taste nicht finden. Dann benutzt es einfach den
Unicode-Code.
• Wenn für einen Tastencode mehrere Ebenen dem Zeichen zugeordnet sind,
werden diese alle ersetzt.
Und um zu laufen, braucht es folgende Tools:
xclip, kcharselect, kdialog, xev, grep, cut, sed, xmodmap, bash.
Ansonsten läuft es aber ganz nett. Auch wenn die tatsächliche
xmodmap-Ersetzung mir noch zu Spaghetti-Codeisch ist. ;) Das ist noch
verbesserbar.
Ich weiss nicht wie ihr das hier mit Anhängen haltet, also hänge ich das
Script einfach mal an. Viel Spaß beim ausprobieren! :)
Navid
#! /bin/bash
# BENÃTIGT: xclip, kcharselect, kdialog, xev, grep, cut, sed, xmodmap, bash.
Und /usr/include/X11/keysymdef.h.
# Remap-Taste für NEO:
# 1. remap-taste drücken (eine obskure, wie rollen/pause/o.ä.) â öffnet
unicode-tabelle mit zeichenauswahl
# 2. in unicode-tabelle zeichen auswählen, das gemappt werden soll â zeigt
âbitte taste drückenâ-meldung.
# 3. taste drücken die gemappt werden soll. (Erlaubt mod-tasten) â zeigt
âZeichen X auf Taste Y gemapptâ-meldung.
# Optional: Ebenen-Mapping / Modus-Umschaltung.
# Ereignis: Remap-Taste gedrückt
# Vorbereiten
ZEICHEN="" # Ausgewähltes Unicode-Zeichen
TASTE="" # Zeichencode der gedrückten Taste
MODS=""# Mod-Tasten
echo -n "" | xclip # Zwischenablage leegen
# Unicode-Tabelle mit Zeichenauswahl öffnen.
kcharselect &
CSPID=$!
kdialog --title "remap" --passivepopup "Bitte ein Zeichen
auswählen, und in die Zwischenablage kopieren." 5
# Auf kopieren des Zeichens warten, und in Variable speichern.
while [ "$ZEICHEN" == "" ]; do
#qdbus org.kde.kcharselect-$CSPID /kcharselect/MainWindow_1/actions/copy_clip
trigger
sleep 0.25
ZEICHEN=$( xclip -o )
done
# Zeichenauswahl schliessen.
kill $CSPID
# Tastendruck-Erkennung ausführen, und Taste in Variable speichern.
kdialog --title "remap" --passivepopup "Bitte die Taste drücken, die dem
Zeichen zugeordnet werden soll." 5
TASTE=$( xev | grep -A 2 --line-buffered KeyRelease | grep --line-buffered
keycode | ( read TASTE; echo -n "$TASTE"; killall xev ) ) # ZU TUN: Nur das
eigene xev beenden.
# Mods von Taste trennen.
MODS=$( echo "$TASTE" | cut -d ' ' -f 2 )
ALTES_ZEICHEN="$( echo "$TASTE" | cut -d ' ' -f 7 | sed 's/),//' )" # ZU TUN:
Was wenn der Taste(nkombination) kein Zeichen zugeordnet ist?
TASTE=$( echo "$TASTE" | cut -d ' ' -f 4 )
# Taste mithilfe von xmodmap neu zuordnen.
kdialog --title "remap" --passivepopup "Ordne Taste $TASTE mit Mod-Tasten $MODS
dem Zeichen â$ZEICHENâ zu."
ALTES_MAPPING=$(xmodmap -pke | grep "keycode *$TASTE")
echo "ALT: $ALTES_MAPPING"
ZEICHEN="$(printf '%04X' "'$ZEICHEN'")"
SYM="$( grep "0x$ZEICHEN" /usr/include/X11/keysymdef.h | cut -d ' ' -f 2 | sed
's/XK_//' )" # ZU TUN: Was, wenn sich die Datei woanders befindet? Oder ist sie
immer da?
[ "$SYM" != "" ] && ZEICHEN="$SYM" || ZEICHEN="U$ZEICHEN"
# NEUES_MAPPING=$( echo "$ALTES_MAPPING" | ersetzeSpalte (modsZuSpalte $MODS))
$TASTE )
NEUES_MAPPING=$( echo "$ALTES_MAPPING" | sed "s/$ALTES_ZEICHEN/$ZEICHEN/" ) #
ZU TUN: Was wenn mehrere Positionen mit dem alten Zeichen belegt sind?
echo "NEU: $NEUES_MAPPING"
xmodmap -e "$NEUES_MAPPING"
# ZU TUN: Einstellung dauerhaft speichern? (Merkt sich xmodmap was?)
kdialog --title "remap" --error "Die dauerhafte Speicherung der Zuordnung ist
noch nicht implementiert. Zudem gibt es ein paar weitere Probleme."
# Fertig.