Re: [Neo] Idee für die *schnelle* individuelle Belegung

2011-03-31 Diskussionsfäden Navid Zamani

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.


[Neo] Idee für die *schnelle* individuelle Belegung

2011-03-30 Diskussionsfäden Navid Zamani

Hallo,

ich hab mir grad folgendes ausgedacht: Die Remap-Taste:
  1. Remap-Taste drücken (eine obskure, wie Alt-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.

Unter Linux dürfte das ein leichtes sein, das mit einem kleinen 
Shell-Script zu lösen, da KCharSelect eine rudimentäre 
D-BUS-Schnittstelle besitzt, die man über qdbus benutzen kann, und 
kdialog das Anzeigen von Meldungen ermöglicht. Einfach das Script auf 
eine Taste mappen, und nachdem es das Zeichen von KCharSelect und die 
Taste (z.B. mit xev) bekommen hat, xmodmap ausführen, und die 
Einstellung in eine X-Konfigurationsdatei im Home-Verzeichnis speichern.


Bei vielen Änderungen sollte es auch drin sein, daraus mithilfe der 
NEO-Layoutgenerierungs-Scripts ein ganz eigenes Layout zu generieren, so 
dass die vielen xmodmaps wegfallen könnten.


Ich hab eh keine Ahnung wie das unter so krüppelig-limitierten Systemen 
wie Windows geschehen soll. ;) (Oder hat sich das mit PowerShell jetzt 
verbessert?)


Wenn ich was Zeit hab, und/oder ich wieder mal gerne ein ungewöhnliches 
Zeichen eingeben würde, werd ich das evtl. mal implementieren.
Jeder ist natürlich frei, das auch vor mit zu tun, da er evtl. auch 
seehr lange auf mich warten könnte. ;)


Aber jetzt ist die Idee schonmal draussen. :)

Navid