MC's journal

Confuflux in the YOLD 3177

Happy Hacking Keyboard och XKB

Som ni alla vet har jag två Happy Hacking Keyboard-tangentbord, ett original och ett Professional 2 med de alldeles fantastiska Topre-brytarna. Originalet används numera ganska sällan men jag sitter nästan alltid med Pro-varianten som också får följa med på resor även om jag varit rädd att det skall gå sönder. Topre-brytarna gör verkligen skillnad och layouten på HHKB är något jag uppskattar oerhört mycket.

Jag har nästan så länge jag använt X kört min egen tangentbordslayout på många olika fysiska tangentbord. Jag har hela den tiden använt xmodmap för att mappa om tangentbordslayouten. Några av mina layouter finns här:

https://hack.org/mc/files/

Observera att mappningarna är beroende av vilken X-server man kör och möjligen vad man ställt in tangentbordet på, om det nu går att anpassa, som till exempel HHKB-familjen.

Det har bitit mig några gånger under utvecklingen av min fönsterhanterare att jag kört en tangentbordslayout som varit långt från det som etablerats som de facto-standard. Till exempel hade det inte slagit mig att Mod2 brukade användas för Num Lock! Hade jag kommit ihåg det hade jag förstås inte valt den som modifier för att göra saker med fönstren!

När jag upptäckte det bytte jag förstås fort till att använda Mod4 som magisk modifier för mcwm:s fönsteroperationer. Mod4 är traditionellt bunden till Hyper och Hyper är i sin tur oftast bunden till Windows-tangenterna på ett modernt PC-tangentbord. Windows-tangenten passar ju bra för just fönsteroperationer.

Sedan jag ändrade fungerar alltså mcwm rätt OK på ett standardtangentbord utan att behöva mappa om det. Den stora majoriteten av användare mappar nog inte om sitt tangentbord överhuvudtaget och nöjer sig med att, på sin höjd, välja default för sitt språk.

Ett HHKB, emellertid, har förstås inga Windows-tangenter. Jag fortsatte alltså köra min egen xmodmap för HHKB där jag mappade den vänstra av de tangenter det står ”Alt” på (eller där det skulle ha stått Alt om det stod något alls på knapparna på mitt tangentbord) till att generera Mod4-modifiermasken.

Jag hade inte brytt mig om dipswitcharna på mitt HHKB särskilt mycket så de keycodes jag fick var de som ges per default. Jag kollade helt enkelt efter med xev vad som genererades och mappade om som jag ville ha det.

Jag har kommit på att det kanske är ett misstag att göra så, alldeles särskilt om jag skulle få för mig att trycka in mitt HHKB Pro 2 i en annan maskin någonstans och vill att det skall fungera åtminstone någorlunda som ett vanligt PC-tangentbord.

Jag har följaktligen just ställt om mitt tangentbord till 011010, som betyder ”Lite ext” som ger mig Windows-tangenter överhuvudtaget, ”Backspace” för att radera och att diamantangenterna skall ge Alt-tangenternas keycodes. Efter det bestämde jag för att göra en ny layout utifrån de keycodes som ges nu, men denna gång tänkte jag försöka använda XKB-utökningen.

Som ni säkert känner till har X inte mindre än två sätt att ändra tangentbordslayouter: det gamla core-protokollets sätt, som man normalt som användare kommer åt med kommandot xmodmap, och en utökning, kallad XKB (eller ibland XKEYBOARD), som man till exempel kommer åt med setxkbmap.

Det är nog bara gamla stötar som jag som fortfarande använder xmodmap, i alla fall om man använder en X-server som X.org eller XFree86. Jag har tidigare inte riktigt orkat sätta mig in i den något håriga XKB men igår ikväll gjorde jag ett första försök.

Resultatet ser hittills ut så här:

// For use with HHKB Pro 2 with SW 01 1010, that is Lite ext,
// Backspace on rubout and diamond gives Alt.
partial alphanumeric_keys modifier_keys
xkb_symbols "mc2" {
    include "latin(type2)"
    include "se(se)"

    key <AE04> { [ 4, dollar ] };
    key <BKSL> { [ apostrophe, asterisk, grave ] };
    key <TLDE> { [ less, greater ] };
    key <AD11> { [ aring, Aring, braceright, bracketright ] };
    key <AD12> { [ asciitilde, asciicircum, dead_diaeresis, dead_circumflex] };
    key <AC10> { [ odiaeresis, Odiaeresis, bar, backslash ] };
    key <AC11> { [ adiaeresis, Adiaeresis, braceleft, bracketleft ] };

    key <LWIN> { [ Hyper_L ] };
    key <LALT> { [ Meta_L ] };
    key <RALT> { [ Meta_R ] };
    key <RWIN> { [ ISO_Level3_Shift ] };

    modifier_map Mod1 { Meta_L, Meta_R };
    modifier_map Mod4 { Hyper_L };
    modifier_map Mod5 { ISO_Level3_Shift };
};

Det där tryckte jag in i, i mitt fall, /usr/local/share/X11/xkb/symbols/se och gjorde sedan:

% setxkbmap -v 100 -geometry "hhk(win2)" se mc2

Det verkar fungera. Frågar jag X-servern hur layouten ser ut med xkbprint får jag detta som svar:

hhkb-layout-small.png
Figure 1: Bild av layouten på mitt HHKB.

Jag har ännu inte listat ut hur jag får det där i en egen konfigurationsfil skild från systemets men det kan väl inte vara svårt?

En annan sak som är smått irriterande är att för att generera Control-] måste jag nu trycka Control-AltGr-Shift-å i stället för, som förr, bara Control-å! Det har jag inte löst ännu. Tips är välkomna.


Written by MC using Emacs and friends.