Slovenska razporeditev tipk v konzoli NetBSD

V besedilu si bomo ogledali več načinov, kako lahko v konzoli NetBSD nastavimo razpored slovenske tipkovnice.

Note to English speaking readers: this howto addresses setup of Slovenian keyboard at the NetBSD console. It is redistributable under the terms of GFDL licence.

Opozorilo

uredi

Avtor ne prevzema nobene odgovornosti zaradi škode, do katere bi utegnilo priti ob uporabi teh napotkov! Obenem ta navodila nikakor ne morejo nadomestiti uporabniškega priročnika (http://www.netbsd.org/guide/en/index.html) in ostale dokumentacije, ki je del projekta NetBSD. Priporočamo, da si pred posegi preberete v omenjeni dokumentaciji, kaj pravzaprav počnete.

Testni sistem

uredi

Avtor je navedene napotke preizkusil na različici NetBSD 2.0 za arhitekturo amd64. Delovati bi morala na vseh različicah od 2.0 dalje in na vseh arhitekturah, ki podpirajo wscons. Deluje na slovenski tipkovnici s 102 tipkama.

Objavljene rešitve

uredi

Obstaja več načinov rešitve problema in sem jih predložil razvijalcem v obliki dveh Problem reportov: 29615 in 29648. Martin Husemann je oboje označil z "I'll handle it" in verjetno že pozabil nanju. Če ima kdo kakšne zveze pri razvijalcih, ga naprošam, da jih malo pocuka in vpraša, kako je s tem. Na zelo podoben način kot pri prvem PR sem rešil problem slovenske tipkovnice tudi pri OpenBSD (kot vemo, gre za "derivat" NetBSD) in rešitev poslal ravno še pravočasno, da so jo vključili v izdajo 3.5, ki je izšla maja 2004.

Pa pričnimo

uredi

Sedaj pa končno k stvari. Problem se da rešiti na več načinov. Lahko si jo vgradite v samo jedro, lahko pa jo izvedete na "userland" nivoju (podobno imata rešeno tudi Linux in FreeBSD). V prvem primeru si boste morali prenesti izvorno kodo jedra (za 2.0) in ukaza wsconsctl, ki ga dobite v paketu z drugimi ukazi iz /sbin (za 2.0). Pri drugem načinu boste potrebovali le ukaze iz /sbin ali pa niti tega ne. Karkoli že boste "dol povlekli", predpostavili bomo, da ste razpakirali relativno glede na imenik /usr/src.

Podpora slovenske tipkovnice v jedru

uredi

Popraviti je potrebno dve datoteki: /usr/src/sys/dev/pckbport/wskbdmap_mfii.c in /usr/src/sys/dev/wscons/wsksymdef.h. V wsksymdef.h moramo najprej definirati vzhodnoevropske (iz ISO8859-2) znake, ki so dosegljivi s tipkovnico.

#define KS_L2_Lstroke 0x0141 
#define KS_L2_lstroke 0x0142 
#define KS_L2_Cacute 0x0106 
#define KS_L2_cacute 0x0107 
#define KS_L2_Ccaron 0x010c 
#define KS_L2_ccaron 0x010d 
#define KS_L2_Scaron 0x0160 
#define KS_L2_scaron 0x0161 
#define KS_L2_Zcaron 0x017d 
#define KS_L2_zcaron 0x017e 
#define KS_L2_Dstroke 0x0110 
#define KS_L2_dstroke 0x0111 
#define KS_L2_caron 0x02c7 
#define KS_L2_breve 0x02d8 
#define KS_L2_ogonek 0x02db 
#define KS_L2_dotabove 0x02d9 
#define KS_L2_dblacute 0x02dd

Definirati moramo tudi kodo slovenske tipkovnice, ki jo pravzaprav sestavljata dva zaporedna zloga. Prvi naj ima prvo naslednjo prosto vrednost (v našem primeru 0x14), drugi pa nič. Dopišemo torej

#define KB_SI 0x1400

Nato moramo še določiti, da bomo od zunaj tako definirano razporeditev tipk klicali s "si". Poiščemo torej mesto, kjer je definiran (s predprocesorskim ukazom #define) makro KB_ENCTAB, za zadnjo že obstoječo defincijo (v našem primeru belgijsko) dopišemo "povratno poševnico" (\) in v naslednjo vrstico dodamo:

{ KB_SI, "si" }

Sedaj odpremo še wskbdmap_mfii.c in dopišemo neke vrste definicijsko tabelo, kjer določimo, kateri znak "počiva" na kateri tipki:

static const keysym_t pckbd_keydesc_si[] = { 
/* pos normal shift altgr */ 
KC(2), KS_1, KS_exclam, KS_asciitilde, 
KC(3), KS_2, KS_quotedbl, KS_L2_caron, 
KC(4), KS_3, KS_numbersign, KS_asciicircum, 
KC(5), KS_4, KS_dollar, KS_L2_breve, 
KC(6), KS_5, KS_percent, KS_degree, 
KC(7), KS_6, KS_ampersand, KS_L2_ogonek, 
KC(8), KS_7, KS_slash, KS_grave, 
KC(9), KS_8, KS_parenleft, KS_L2_dotabove, 
KC(10), KS_9, KS_parenright, KS_acute, 
KC(11), KS_0, KS_equal, KS_L2_dblacute, 
KC(12), KS_apostrophe, KS_question, KS_diaeresis, 
KC(13), KS_plus, KS_asterisk, KS_cedilla, 
KC(16), KS_q, KS_Q, KS_backslash, 
KC(17), KS_w, KS_W, KS_bar, 
KC(21), KS_z, KS_Z, 
KC(26), KS_L2_scaron, KS_L2_Scaron, KS_division, 
KC(27), KS_L2_dstroke, KS_L2_Dstroke, KS_multiply, 
KC(33), KS_f, KS_F, KS_bracketleft, 
KC(34), KS_g, KS_G, KS_bracketright, 
KC(37), KS_k, KS_K, KS_L2_lstroke, 
KC(38), KS_l, KS_L, KS_L2_Lstroke, 
KC(39), KS_L2_ccaron, KS_L2_Ccaron, 
KC(40), KS_L2_cacute, KS_L2_Cacute, KS_ssharp, 
KC(41), KS_cedilla, KS_diaeresis, 
KC(43), KS_L2_zcaron, KS_L2_Zcaron, KS_currency, 
KC(44), KS_y, KS_Y, 
KC(47), KS_v, KS_V, KS_at, 
KC(48), KS_b, KS_B, KS_braceleft, 
KC(49), KS_n, KS_N, KS_braceright, 
KC(50), KS_m, KS_M, KS_section, 
KC(51), KS_comma, KS_semicolon, 
KC(52), KS_period, KS_colon, 
KC(53), KS_minus, KS_underscore, 
KC(86), KS_less, KS_greater, 
KC(184), KS_Mode_switch, KS_Multi_key, 
};

Nato še določimo, da je zgornja tabela izpeljana iz ameriške razporeditve (da so torej nedefinirane tipke enake kot pri ameriški tipkovnici). Tako poiščemo definicijo polja const struct wscons_keydesc pckbd_keydesctab[] in na koncu dopišemo še:

KBD_MAP(KB_SI, KB_US, pckbd_keydesc_si),

Tako, jedro je popravljeno. Če želite, ga po navodilih iz priročnika nastavite, nato pa ga prevedite in namestite na pravo mesto.

Ukaz /sbin/wsconsctl še ne "ve" za vse te spremebe, zato ga bo treba znova prevesti. Popravljeni wsksymdef.h najprej skopiramo v imenik /usr/include/dev/wscons, nato se prestavimo v /usr/src/sbin/wsconstl ter ga prevedemo in namestimo na že znan način, torej z

make 
make install

Da se bo slovenski razpored tipk zmeraj naložil ob zagonu, moramo na koncu le še odpreti datoteko /etc/wscons.conf, vanjo vnesti vrstico

encoding si

po možnosti zakomentirati druge vrstice, ki se pričnejo z encoding ali mapfile in ob naslednjem zagonu bi slovenska tipkovnica morala delovati.

Userland podpora

uredi

Userland podpora problem razporeda tipk rešuje na podoben način kot Linux ali FreeBSD in ne zahteva popravljanja ter ponovnega prevajanja jedra. Dovolj je, da spremembe ustrezno opišemo v neki nastavitveni datoteki. Predpostavili bomo, da se imenuje /usr/share/wscons/keymaps/pckbd.si in jo bomo v nadaljnjem besedilu nadomestili kar z "makrom" DATOTEKA.

Tudi pri userland podpori imamo na voljo težjo in lažjo možnost. Oglejmo si najprej težjo, ki zahteva ponovno prevajanje ukaza /sbin/wsconsctl, zato pa bodo vsi naši nesrečni šumniki zagotovo pravilno kodirani.

Najprej vtipkajte v DATOTEKO naslednje:

keycode 2=1 exclam asciitilde 
keycode 3=2 quotedbl L2_caron 
keycode 4=3 numbersign asciicircum 
keycode 5=4 dollar L2_breve 
keycode 6=5 percent degree 
keycode 7=6 ampersand L2_ogonek 
keycode 8=7 slash grave 
keycode 9=8 parenleft L2_dotabove 
keycode 10=9 parenright acute 
keycode 11=0 equal L2_dblacute 
keycode 12=apostrophe question diaeresis 
keycode 13=plus asterisk cedilla 
keycode 16=q Q backslash 
keycode 17=w W bar 
keycode 21=z Z 
keycode 26=L2_scaron L2_Scaron division 
keycode 27=L2_dstroke L2_Dstroke multiply 
keycode 33=f F bracketleft 
keycode 34=g G bracketright 
keycode 37=k K L2_lstroke 
keycode 38=l L L2_Lstroke 
keycode 39=L2_ccaron L2_Ccaron 
keycode 40=L2_cacute L2_Cacute ssharp 
keycode 41=cedilla diaeresis 
keycode 43=L2_zcaron L2_Zcaron currency 
keycode 44=y Y 
keycode 47=v V at 
keycode 48=b B braceleft 
keycode 49=n N braceright 
keycode 50=m M section 
keycode 51=comma semicolon 
keycode 52=period colon 
keycode 53=minus underscore 
keycode 86=less greater 
keycode 184=Mode_switch Multi_key

Sedaj moramo definirati makre, ki se pričnejo z L2, da jih bo wsconsctl prepoznal. Če še niste, si prenesite izvorno kodo ukazov iz /sbin za 2.0. Odprite /usr/src/sys/dev/wscons/wsksymdef.h. Če želite, da bodo šumniki kodirani po standardu Unicode, dodajte vanjo naslednje vrstice:

#define KS_L2_Lstroke 0x0141 
#define KS_L2_lstroke 0x0142 
#define KS_L2_Cacute 0x0106 
#define KS_L2_cacute 0x0107 
#define KS_L2_Ccaron 0x010c 
#define KS_L2_ccaron 0x010d 
#define KS_L2_Scaron 0x0160 
#define KS_L2_scaron 0x0161 
#define KS_L2_Zcaron 0x017d 
#define KS_L2_zcaron 0x017e 
#define KS_L2_Dstroke 0x0110 
#define KS_L2_dstroke 0x0111 
#define KS_L2_caron 0x02c7 
#define KS_L2_breve 0x02d8 
#define KS_L2_ogonek 0x02db 
#define KS_L2_dotabove 0x02d9 
#define KS_L2_dblacute 0x02dd

Če pa imate šumnike raje kodirane po osembitnem standardu ISO-8859-2, pa namesto tega vstavite naslednje vrstice:

#define KS_L2_Lstroke 0xa3 
#define KS_L2_lstroke 0xb3 
#define KS_L2_Cacute 0xc6 
#define KS_L2_cacute 0xe6 
#define KS_L2_Ccaron 0xc8 
#define KS_L2_ccaron 0xe8 
#define KS_L2_Scaron 0xa9 
#define KS_L2_scaron 0xb9 
#define KS_L2_Zcaron 0xae 
#define KS_L2_zcaron 0xbe 
#define KS_L2_Dstroke 0xd0 
#define KS_L2_dstroke 0xf0 
#define KS_L2_caron 0xb7 
#define KS_L2_breve 0xa2 
#define KS_L2_ogonek 0xb2 
#define KS_L2_dotabove 0xff 
#define KS_L2_dblacute 0xbd

Datoteko wsksymdef.h shranite in jo skopirajte v /usr/include/dev/wscons. Nato znova prevedite /sbin/wsconsctl:

cd sbin/wsconsctl 
make 
make install

Sedaj odprite /etc/wscons.conf, zakomentirajte vse vrstice, ki se pričnejo z encoding (če obstajajo) in dodajte vrstico:

mapfile /usr/share/wscons/keymaps/pckbd.si

(ali karkoli je že DATOTEKA). Vse morebitne druge vrstice, ki se prično z mapfile, naj bodo zakomentirane. Sedaj lahko znova zaženete računalnik.

Resnici na ljubo boste šumnike potrebovali kvečjemu kje pod sistemom XWindow, kjer so razporedi tipk rešeni na drugačen način, v konzoli pa boste največkrat potrebovali le tipke y, z, {, } [, ], -, \, | idr., ki se uporabljajo pri delu z lupino, na pravih mestih. V tem primeru lahko uporabite lažjo možnost, kjer ne bo potrebno "packati" po sistemskih ukazih. DATOTEKO sestavimo tako, da makre, ki se pričneko z L2, nadomestimo s tistimi, ki imajo v ISO88591 enake kode kot šumniki s s slovenske tipkovnice v ISO8859-2. Drugače povedano, DATOTEKA /usr/share/wscons/keymaps/pckbd.si naj bo takšna:

keycode 2=1 exclam asciitilde 
keycode 3=2 quotedbl periodcentered 
keycode 4=3 numbersign asciicircum 
keycode 5=4 dollar cent 
keycode 6=5 percent degree 
keycode 7=6 ampersand twosuperior 
keycode 8=7 slash grave 
keycode 9=8 parenleft ydiaeresis 
keycode 10=9 parenright acute 
keycode 11=0 equal onehalf 
keycode 12=apostrophe question diaeresis 
keycode 13=plus asterisk cedilla 
keycode 16=q Q backslash 
keycode 17=w W bar 
keycode 21=z Z 
keycode 26=onesuperior copyright division 
keycode 27=eth ETH multiply 
keycode 33=f F bracketleft 
keycode 34=g G bracketright 
keycode 37=k K threesuperior 
keycode 38=l L sterling 
keycode 39=egrave Egrave 
keycode 40=ae AE ssharp 
keycode 41=cedilla diaeresis 
keycode 43=threequarters registered currency 
keycode 44=y Y 
keycode 47=v V at 
keycode 48=b B braceleft 
keycode 49=n N braceright 
keycode 50=m M section 
keycode 51=comma semicolon 
keycode 52=period colon 
keycode 53=minus underscore 
keycode 86=less greater 
keycode 184=Mode_switch Multi_key

Tudi tokrat morate v /etc/wscons.conf zakomentirati morebitne vrstice, ki se pričnejo z encoding, dodati mapfile usr/share/wscons/keymaps/pckbd.si zakomentirati morebitne ostale vrstice, ki se pričnejo z mapfile, shraniti datoteko ter ponovno zagnati sistem.