VNC och tangentbordsmappning

Aaaaarrrrggghhh! Varför ska jag behöva grotta med varenda liten detalj för att få saker som är självklara att fungera så som de borde?

Ta bara ett sånt litet exempel som tangentbordslayout. Visst, det finns X antal tangentbordstyper med Y antal tangenter och Z antal tecken. Men det är inte raketforskning vi pratar om, och de flesta tangentbordslayouten är väl kända sen 70-talet kallt.

Varför ska det då vara så in i h-e svårt att få till svenska tangenter i Linux? Visst, kommandot ”loadkeys sv-latin1” laddar en ypperligt svensk tangentbordslayout som funkar via Telnet, terminal, etc. MEN försök bara att få våra kära AltGr kombinationer (t.ex. snabel-a som ju fås fram med AltGr+2) att funka i en VNC session så ska du få se på problem! Beroende på vilken VNC klient man har så får man olika resultat, alla dock helt fel 😦

Jag har vänt ut-och-in på Internet m.h.a. Google utan att hitta ett vettigt fungerande svar. NATURLIGTVIS så blir lösningen att man får grotta ner sig i ett antal mer eller mindre korrekta artiklar från nätet och i bästa Dr. Frankenstein anda koka ihop en egen soppa och hoppas att det funkar.

Såhär kan man sammanfatta mina erfarenheter hittills:

  1. OVMM (som ju används via browsern) har en egen Javabaserad VNC klient inbyggd, denna klarar *definitivt inte* av att skapa backslash, pipe, tilde eller snabel-a utan att man skapar en egen tangentbordsmappning
  2. Använder man RealVNC’s windowsklient så funkar *inga* AltGr kombinationer alls, oavsett vilken tangentbordslayout man skapar / laddar
  3. Ansluter man via Telnet så funkar allt klockrent

Jag kan alltså inte få till en vettig, helt 100% fungerande lösning om man vill ansluta sig till en terminal via VNC. Att skapa en egen tangentbordsmappning är iofs inte så svårt, men VARFÖR ska man ö.h.t. behöva hålla på med dessa basala saker som borde ha rätats ut för typ tio år sen?

Dessutom så löser det inte hela problemet eftersom den Javabaserade VNC klient som ligger med i OVMM av någon anledning lägger sig i saker, och helt enkelt ”äter upp” vissa tangentkombinationer för att istället utföra andra saker. Det var på detta sätt jag lärde mig att det finns något som heter ”QEMU Monitor” när jag ville skapa ett snabel-a och tryckte på AltGr och 2. Mindre lustigt är att kommer man väl dit så går det inte att ta sig därifrån även om det enligt dokumentationen bara ska vara att trycka på AltGr och 1, det enda sätt jag hittade var att skriva ”quit” varvid hela VM:et bootade om. Styggt! 😦

För att slippa ur detta h:e så stängde jag helt enkelt VNC kopplingen i OVMM och anslöt via RealVNC:s Windowsklient, väl där så kan man trycka på Ctrl, Alt och 1 samtidigt för att slippa ur QEMU Monitor. QEMU Monitor ska enligt alla dokument jag hittade vara avstängd per default i Xen numera p.g.a. att den är en säkerhetslucka iochmed att den som hittar dit kan typ byta media eller boota om VM:et. Men tydligen så är den fortfarande aktiv i OVM 😦

Nåja, för att skapa en ny tangentbordsmappning så är det enklast att utgå från en kopia av filen /lib/kbd/keymaps/i386/qwerty/sv-latin1.map.gz. Kopiera och packa upp denna fil:

# cp sv-latin1.map.gz sv-vnc.map.gz
# gzip -d sv-vnc.map.gz

Redigera den uppackade filen så att control alt kombinationerna beskrivs på egna rader istället för enbart som kolumner i filen. Min fil blev såhär (nya rader markerade, resten orörda):

charset ”iso-8859-1”
keymaps 0-2,4-6,8,12
include ”qwerty-layout”
include ”linux-with-alt-and-altgr”
plain keycode  83 = KP_Comma
strings as usual
keycode   1 = Escape
alt     keycode   1 = Meta_Escape
keycode   2 = one              exclam
alt     keycode   2 = Meta_one
keycode   3 = two              quotedbl         at
control keycode   3 = nul
alt     keycode   3 = Meta_two
control altgr keycode 3 = at
keycode   4 = three            numbersign       sterling
control keycode   4 = Escape
alt     keycode   4 = Meta_three
control altgr keycode 4 = sterling
keycode   5 = four             ccedilla
control keycode   5 = Control_backslash
alt     keycode   5 = Meta_four
altgr   keycode   5 = dollar
control altgr keycode 5 = dollar
keycode   6 = five             percent
control keycode   6 = Control_bracketright
alt     keycode   6 = Meta_five
keycode   7 = six              ampersand        notsign
control keycode   7 = Control_asciicircum
alt     keycode   7 = Meta_six
keycode   8 = seven            slash            braceleft
control keycode   8 = Control_underscore
alt     keycode   8 = Meta_seven
control altgr keycode 8 = braceleft
keycode   9 = eight            parenleft        bracketleft
control keycode   9 = Delete
alt     keycode   9 = Meta_eight
control altgr keycode 9 = bracketleft
keycode  10 = nine             parenright bracketright
alt     keycode  10 = Meta_nine
control altgr keycode 10 = bracketright
keycode  11 = zero             equal braceright
alt     keycode  11 = Meta_zero
control altgr keycode 11 = braceright
keycode  12 = plus       question         backslash
control keycode  12 = Control_underscore
alt     keycode  12 = Meta_minus
control altgr keycode 12 = backslash
keycode  13 = dead_acute  dead_grave
alt     keycode  13 = Meta_equal
keycode  14 = Delete
alt     keycode  14 = Meta_Delete
keycode  15 = Tab
alt     keycode  15 = Meta_Tab
keycode  26 = +aring          +Aring
control keycode  26 = Escape
alt     keycode  26 = Meta_bracketleft
keycode  27 = dead_diaeresis   asciicircum           asciitilde
control keycode  27 = Control_bracketright
alt     keycode  27 = Meta_bracketright
control altgr keycode 27 = asciitilde
keycode  28 = Return
alt     keycode  28 = Meta_Control_m
keycode  29 = Control
keycode  39 = +odiaeresis       +Odiaeresis
alt     keycode  39 = Meta_semicolon
keycode  40 = +adiaeresis       +Adiaeresis
control keycode  40 = Control_g
alt     keycode  40 = Meta_apostrophe
keycode  41 = section          degree onehalf
control keycode  41 = nul
alt     keycode  41 = Meta_grave
keycode  42 = Shift
keycode  43 = apostrophe       asterisk
control keycode  43 = Control_backslash
alt     keycode  43 = Meta_backslash
keycode  51 = comma            semicolon
alt     keycode  51 = Meta_comma
keycode  52 = period           colon
alt     keycode  52 = Meta_period
keycode  53 = minus            underscore
control keycode  53 = Delete
alt     keycode  53 = Meta_slash
shift control keycode 53 = Control_underscore
keycode  54 = Shift
keycode  56 = Alt
keycode  57 = space
control keycode  57 = nul
alt     keycode  57 = Meta_space
keycode  58 = Caps_Lock
keycode  86 = less             greater          bar
alt     keycode  86 = Meta_less
control altgr keycode 86 = bar
keycode  97 = Control

Sen är det bara att komprimera filen igen och att ladda den:

# gzip sv-vnc.map
# loadkeys sv-vnc

Tyvärr så funkar endast pipe och backslash, de andra som ligger på tangenterna 2-4 och 7-9 samt tilde ”äts” som sagts upp av OVMM:s Javabaserade VNC klient. Och RealVNC:s windowsklient vägrar ö.h.t. att befatta sig med AltGr oavsett hur fina tangentbordsmappningar man gör . 😦

Kommandot loadkeys har även en shell-mode där man kan on-the-fly modifiera tangenttryckningar, den kan fås att utföra en massa saker som man (inte) behöver. Eller så kan man mata den med vad man vill ska utföras vid tangenttryck:

# echo ‘ctrl alt keycode 12 = backslash’ | loadkeys

Detta ger en backslash vid samtidigt tryck på vänstra Ctrl, vänstra Alt och plustangenterna. Helt enkelt samma sak som AltGr och plustangenterna eftersom vänstra Alt och vänstra Ctrl mappas som AltGr 🙂

Vill man leka med tangenter och vilka dessa keycodes är så är kommandot showkey ganska kul:

# showkey

Låter man bli att trycka på en tangent i typ 10 sekunder så avslutas den automagiskt.

Nu är det lämpligt att VM:et laddar den nya mappningen automagiskt vid varje boot, och det är inte så svårt att fixa till, det är bara att ange detn nya mappningen i filen /etc/sysconfig/keyboard. Det räcker med att filen innehåller följande rader:

KEYBOARDTYPE=”pc”
KEYTABLE=”sv-vnc”

J:a, j:a, j:a skit att man ska behöva hålla på såhär! Efter mina 25 år i branschen så är jag tillbaka där allt började: en j:a massa grottande i obskyra konfigurationsfiler vid en blinkande prompt 😦

Ändra tangentbordslayout

För att få till ett svenskt tangentbordslayout:

loadkeys ”se-latin1”

Det funkar även i en Xen DomU 🙂