Het begon met een simpele vraag: ‘Miek, kun je zorgen dat e accent
karakters enzo het gaan doen onder X?’
Dit is voor ons project bij het
Octrooi Centrum Nederland waar we een
Open Source Desktop aan het implementeren zijn. Nu zijn er nog wat andere
zaken die eea wat meer ingewikkeld maken:
- we gebruiken thin clients en dus XDMCP;
- de omgeving is XFCE. Geen GNOME of KDE vanwege
de snelheid en hun geheugen gebruik;
- De xfce-keyboard-switcher die we hier hebben (4.4) crasht tijdens het gebruik;
- Ik heb een voorkeur om het via de commandline te kunnen scripten.
Theorie
Het gaat wat ver om de gehele theorie achter de toetsenbord settings
in X uit te leggen, zelf begrijp ik het ook niet voor 100%. Maar in X
heb je:
- een toetsenbord model: model
- een layout: layout; op welke toetsen horen welke karakters
- een variant: variant; dode toetsen (= alt+e, geeft e accent)
Al deze zaken kun je in GNOME, KDE en ook XFCE zetten via een grafische
client. Maar deze tools kunnen onverwacht stuk gaan zodra je XDMCP gaat
gebruiken. De lowlevel tool zou setxkbmap moeten zijn.
Hoe het zou moeten werken?
Via de commandline zou het volgende iets moeten doen:
% setxkbmap
Met een lokaal draaiende X server gaat het waarschijnlijk goed. Draai je
XDMCP (thin clients) dan kom je hier niet mee weg. De behulpzame melding
die je krijg als het niet werkt is:
% setxkbmap
Error loading new keyboard description
En dat was het dan. Het volgende zou dan moeten wel werken:
% setxkbmap -print | xkbcomp - $DISPLAY
Dit werkt inderdaad, er zijn geen errors, maar het heeft ook weinig
effect…
Omdat dit toch op een of andere manier zou moeten gaan werken, ben ik eens
naar gnome-control-center gaan kijken, ondanks dat we werken met
XFCE. Als je gnome-control-center start en dan twee keer naar keyboard
settings gaat dan wordt de gnome-settings-daemon gestart en verrek,
setxkbmap print de juiste info en mijn toetsenbord werkt.
Helaas
¨verziekt” gnome-settings-daemon de achtergrond van XFCE waardoor
de desktop icons niet meer zichtbaar zijn. Dus dit is geen permanente
oplossing.
Maar nu is dus de vraag:
Waarom werkt het niet met setxkbmap en wel via gnome-control-center?
Na diep graven in de sources van gnome-settings-daemon,
gnome-control-center en libxklavier bleek dat libxklavier
een eigen interface heeft naar de keyboard settings van X. Als je
libxklavier compileert wordt er in de tests/ directory een 2-tal
tooltjes gemaakt: test_config en test_monitor. Waarvan test_config
er veelbelovend uit ziet:
Usage: test_config (-g)|(-s -m <model> -l <layouts> -o <options>)
|(-h)|(-ws)|(-wb)(-d <debugLevel>)
Options:
-al - list all available layouts and variants
-am - list all available models
-ao - list all available options groups and options
-ac - list all available ISO country codes
-ag - list all available ISO language codes
-g - Dump the current config, load original system settings and revert back
-s - Set the configuration given my -m -l -o options. Similar to setxkbmap
-ws - Write the binary XKB config file (libxklavier.xkm)
-wb - Write the source XKB config file (libxklavier.xkb)
-d - Set the debug level (by default, 0)
-h - Show this help
Dit lijkt wel heel veel op wat setxkbmap kan… En ja hoor:
Print de huidige instellingen:
% setxkbmap -print
xkb_keymap {
xkb_keycodes { include "xfree86+aliases(qwerty)" };
xkb_types { include "complete" };
xkb_compat { include "complete" };
xkb_symbols { include "pc+us" };
xkb_geometry { include "pc(pc105)" };
};
Nu nieuwe gegevens inladen met behulp van test_config. We zetten
(-s) het toetsenbord op 105 tekens (-m pc105) en
gebruiken de nl layout (-l nl):
% ./libxklavier-3.9/tests/test_config -s -m pc105 -l nl
Checken:
setxkbmap -print
xkb_keymap {
xkb_keycodes { include "xfree86+aliases(qwerty)" };
xkb_types { include "complete" };
xkb_compat { include "complete" };
xkb_symbols { include "pc+nl" };
xkb_geometry { include "pc(pc105)" };
};
Werkt! :-) Geen foutmelding en het toetsenbord werkt ook echt.
Waarom dit wel werkt en setxkbmap niet is mij een raadsel. Maar
goed, ik kan het instellen.
Nu nog de losse eindjes opruimen en eventueel een klein shell
scriptje maken met zenity zodat
de eindgebruikers hiermee aan de slag kunnen.