# Linux Keystroke HOWTO

## Zenon Fortuna zenon@netcom.com
v2.0, kwiecień 1995
Wersja polska: Gwidon S. Naskrent naskrent@hoth.amu.edu.pl
v1.0, 29 X 1997

## 1. Co to jest Keystroke-HOWTO?

Dokument ten napisany został dla użytkowników którzy chcą przypisać specjalne czynności niektórym klawiszom na klawiaturze. Sugerowana metoda to użycie loadkeys(1) bądź zmiana `defkeymap.c` i zbudowanie na nowo jądra.

Tekst ten NIE omawia przemapowywania klawiszy klawiatury, np. Delete czy BackSpace. Co do informacji na temat przemapowywania klawiszy przeczytaj Backspace Mimi-HOWTO autorstwa Stevena Lee.

Metodę opisaną poniżej przetestowano na jądrze 1.2.1, zamieszczonym w dystrybucji 2.2 Slackware.

## 2. Historia zmian

4 IV 95 - wersja 2.0 Przystosowana do wersji jądra 1.2.1; -proste zmiany w sugerowanych modyfikacjach pliku "my_keytable.map" -zmodyfikowany przykład "key_macro" ze zrzutami ekranu przez /dev/vcs*

7 V 94 - wersja 1.0 Wersja wyjściowa Keystroke-HOWTO, oparta w działaniu na wersji jądra 1.0

## 3. Krótki opis

Wirtualny terminal Linuxa oraz sterowniki klawiatury przyjmują domyślny układ klawiatury taki jak zdefiniowany w pliku `/drivers/char/defkeymap. c` źródeł jądra. Dwunastu klawiszom funkcyjnym PC przydać można łańcuchy przypisane wykonywanym przez nie czynnościom. Po naciśnięciu któregoś z tych klawiszy, być może z dodanymi klawiszami Alt lub Ctrl, bieżący wirtualny terminal dodaje określony łańcuch do swoich buforów danych wejściowych i wyjściowych, emulując w efekcie wprowadzenie owego łańcucha tak jakby został wpisany z klawiatury.

Ustawieniem odpowiedniego łańcucha dla danego klawisza funkcyjnego możemy uprościć wykonywanie wybranych komend, na przykład wywołując skrypt powłoki `/usr/local/bin/key_macro`, który możemy utworzyć i modyfikować wedle własnego uznania.

3. Narzędzia do modyfikacji sterownika klawiatury.

Możemy użyć loadkeys(1), dumpkeys(1) oraz showkey(1):

- narzędzie loadkeys(1) pomaga załadować nowe ciągi znaków do buforów klawiatury jądra, lub przygotowuje nowy kod w C modyfikujący jądro,
- dumpkeys(1) powinno być używane dla wydostania bieżącego układu klawiatury do obejrzenia lub modyfikacji,
- showkey(1) może nam pomoć w otrzymaniu kodu klawisza określonego klawisza funkcyjnego.

Jeśli twój system linuxowy nie posiada tych narzędzi, możesz je zdobyć poprzez ftp jako pakiet `kbd-0.89.tar.gz` lub `kbd-0.90.tar.gz` z `sunsite.unc.edu:/pub/Linux/system/Keyboards`, lub `tsx-11.mit.edu:/pub/linux/sources/system` Powinieneś użyć GNUsowskiego `tar` aby wypakować potrzebne pliki.

## 4. Zmiana pliku układu klawiatury

Jądro Linuxa zawiera skompilowany kod defkeymap.c, który tworzony jest narzędziem loadkeys(1) z pliku defkeymap.map. Oba pliki umieszczone są w katalogu `src/linux/drivers/char`.

Potrzebujemy zmodyfikować plik `defkeymap.map`, tak więc zróbmy jego lokalną kopię przez

> `

>     # cp defkeymap.map my_keytable.map

> `

lub

> `

>     # dumpkeys > my_keytable.map

> `

Istnieje także duży zbiór różnych plików z układami klawiatury w katalogu `/usr/lib/kbd/keytables`, z których `defkeymap.map` może zostać użyty w twoim systemie w miejsce `src/linux/drivers/char/defkeymap.map`.

Poleca się metodę używającą dumpkeys(1), ponieważ zdarzyć się może iż twoje jądro było już modyfikowane lub utworzony dla ciebie z innym plikiem `defkeymap.map` niż ten który możesz znaleźć.

Przeczytajmy zawartość pliku `my_keytable.map`: znajduje się tam ponad 300 linii kodu, i możemy tam znaleźć trzy grupy deklaracji: pierwsza składa się z linii zawierających słowo "keycode", być może z dołączonymi dodatkowymi słowami w rodzaju "alt", "control", itd. Druga grupa składa się z linii ze słowem "string", trzecia z linii ze słowem "compose".

Więcej o składni tego pliku można przeczytać w keytables(5)

## 4.1 Przykład modyfikacji pliku układu klawiatury

Jako przykład przypisania makrołańcucha naciśnięciu klawisza funcyjnego, każmy Ctrl-F1 wywoływać nasz skrypt `/usr/local/bin/key_macro`.

Po pierwsze powinniśmy dowiedzieć się jaki jest kod klawisza funkcyjnego F1. Możemy narzędzia użyć showkey(1) i poznać kod naciskając F1.

Zamiast tego możemy poszukać ciągu "F1" w pliku `my_keytable.map` i znaleźć następującą linię:

> `

>             keycode  59 = F1

> `

Sugeruje to że kodem klawisza dla F1 jest 59. Linia ta określa również że po naciśnięciu F1 sterownik klawiatury powinien wysłać łańcuch oznaczony kodem "F1". Aby zobaczyć zawartość tego łańcucha, poszukać można wzoru "string F1" i znaleźć

> `

>             string F1 = "\033[[A"

> `

Oznacza to że po naciśnięciu klawisza F1 sterownik klawiatury wysyła "Esc [ [ A" (bez spacji).

Nie powinniśmy zmieniać tego łańcucha, ponieważ niektóre aplikacje polegają na nim jako na domyślnej czynności klawisza F1.

Możemy jednak zdefiniować nową czynność dla Ctrl-F1, założywszy że nie jest ona zarezerwowana przez jądro dla innych specjalnych czynności. Aby obejrzeć przypisania klawisza F1 razem z Ctrl, Shift i innymi trybami, możemy zaglądnąć do pliku my_keytable.map używając:

> `

>     # grep 59 my_keytable.map

> `

W przypadku gdy nie ma tam linii z "control keycode 59", możemy użyć Ctrl-F1 bez problemów (gdy istnieje linia z "shift control keycode 59 nadal wszystko jest ok).

Dodajmy następującą linię do pliku `my_keytable.map`:

> `

>     control keycode 59 = key_symbol

> `

gdzie "key_symbol" określać będzie czynność klawisza Ctrl-F1. Jądro 1.2.* pozwala na dynamiczną alokację łańcuchów, ale nazwa dla "key_symbol" musi zostać wybrana tylko z ustalonego zbioru nazw. Między innymi dozwolone są symbole F1-F246. Dla `my_keytable.map` w moim systemie nieużywane było F21, ale powinieneś obejrzeć swój plik i wybrać odpowiedni klawsym. Możemy więc dopisać linię:

> `

>          control keycode 59 = F21

> `

Teraz musimy zdefiniować zawartość F21, dodając linię

> `

>          string F21 = "/usr/local/bin/key_macro\n"

> `

Podsumowywując, uczyniliśmy dwie zmiany w stosunku do oryginalnego `my_keytable.map`: zadeklarowaliśmy nowy łańcuch F21 oraz to że Ctrl-F1 będzie wywoływać zawartość F21.

## 4.2 Czasowe zmiany w ustawieniach klawiatury

Zmieniwszy właściwie my_keytable.map możemy skopiować zmiany do sterownika klawiatury jądra używając narzędzia loadkeys(1):

> `

>     % loadkeys my_keytable.map

> `

Pozwolenie modyfikacji sterownika klawiatury jądra dawane jest każdemu kto posiada prawa odczytu urządzenia `/dev/console`.

Aby sprawdzić czy zamierzone zmiany zostały zainstalowane, możemy użyć narzędzia dumpkeys(1) by sprawdzić wartość F21, na przykład:

> `

>     % dumpkeys | grep F21

> `

Możemy zobaczyć:

> `

>     keycode 59 = F1         F11     Console_13      F21

>     string F21 = "/usr/local/bin/key_macro\012"

> `

co jest ok, bowiem "\012", lub LF, odpowiada \n

Teraz naciśnięcie Ctrl-F1 powinno wywołać skrypt `/usr/local/bin/key_macro`, tak jak zamierzaliśmy.

## 4.3 Zmiany na stałe

Zmiany w sterowniku klawiatury jądra narzucone loadkeys(1) trwają do następnego przeładowania systemu (albo następnego odwołania do loadkeys).

Możemy zmienić plik `/etc/rc.d/rc.local` aby wywołał loadkeys z naszym plikiem `my_keytable.map` jako argumentem. Zamiast tego zmodyfikować możemy `src/linux/drivers/char/defkeymap.c` i ponownie skompilować jądro z nowymi wartościami domyślnymi.

Nie powinniśmy zmieniać pliku `defkeymap.c` ręcznie, lecz raczej wygenerować go narzędziem loadkeys(1):

> `

>     # mv defkeymap.c defkeymap.c.ORIG
>     # loadkeys --mktable my_keytable.map > defkeymap.c

> `

Następnie powinniśmy wygenerować nowe jądro, zasadniczo zmieniając katalog na bazowy katalog źródeł jądra, i używając make(1).

W końcu, powinniśmy użyć lilo(1) aby zainstalować i załadować nasze nowe jądro.

## 5. Przykład skryptu key_macro

Szczególnie użytecznym skryptem dla prostych operacji związanych z naciskaniem klawiszy może być skrypt powłoki przygotowywujący, bądź drukujący, zrzut ekranu.

Przykład ten uległ zmianie od czasów wersji 1.0 Linuxa, z powodu zmian w jądrze, które nie udostępnia już wywołania systemowego ioctl(0,TIOCLINUX).

Aby przeczytać zrzuty ekranu wirtualnej konsoli należy wpierw przygotować parę plików urządzeń. Jako root możemy stworzyć co następuje:

> `

>     # mknod /dev/vcs1  c 7 1
>     # mknod /dev/vcs2  c 7 2
>     ...
>     # mknod /dev/vcs63 c 7 63

> `

Oczywiście wystarczy mieć tylko pliki `/dev/vcs*` odpowiednie dla wirtualnych konsoli których się używa.

Kod poniżej powinien być uważany za przykład możliwego pliku `/usr/local/bin/key_macro`:

> `

>     #!/bin/sh
>     #
>     # Oto przykład użytecznego skryptu key_macro
>     #

>     VT_NUMBER=`tty|cut -c9-`
>     FILE=/tmp/vt$VT_NUMBER.dump
>     cp /dev/vcs$VT_NUMBER $FILE
>     echo zrzut ekranu zachowany w $FILE
>     #
>     # Odkomentuj poniższą linię gdy chcesz by zrzut był drukowany
>     # lpr $FILE

> `

## 6. Uwagi

Nie ma praktycznego limitu sumy długości wszystkich łańcuchów które moglibyśmy chcieć załadować do sterownika klawiatury. Poprzedni stały bufor długości FUNC_BUFSIZE (ustawiony na 512 bajtów) został w Linuxie 1.2.* zastąpiony strategią dynamicznego przydzielania buforów w kawałkach po 512 bajtów każdy.

Najświeższą kopię Keystroke-HOWTO znaleźć można w

"ftp.netcom.com:/pub/ze/zenon/linux/howto" name="ftp.netcom.com:/pub/ze/zenon/linux/howto">

## 7. Dalsze pomysły?

W razie gdybyś znalazł coś wartego dodania do tego dokumentu, prześlij proszę swoje uwagi na adres "mailto:zenon@netcom.com" name= "`zenon@netcom.com`"> - dzięki (zf).