Whole document tree
    

Whole document tree

Setting up international keyboard in X Window System with Xmodmap and XKB

2. Setting up international keyboard in X Window System with Xmodmap and XKB

2.1. Quick start

2.1.1. Xmodmap

Make your own .Xmodmap file according to information in this file.

Write the following to your .bash_profile in your home directory:

export LANG=language

where "language" is the language you want to use. The languages can be found in the file locale.alias in /usr/X11R6/lib/X11/locale. Note: some programs, like Mozilla, won't care about these user's locale settings. Run "exit" command on the console and log in again for bash to read the statement from its .bash_profile.

Install fonts (best are ISO8859-2 Type1 fonts for Eastern Europe, Czech or Slovak), put them in your font path in the /etc/X11/XF86Config file (on some newer systems this is not necessary). Start X Server. Run the command "xmodmap /.Xmodmap" from an X terminal window to force the system to read the .Xmodmap file.

2.1.2. XKB

Provided you have your fonts installed, just open the X Terminal window and issue a command: setxkbmap kb, where "kb" is the keyboard layout you want to use, for example: setxkbmap si

for the Slovenian language

setxkbmap de

for the German language

All the language names you may use are located in /usr/X11R6/lib/X11/xkb/symbols directory.

If you are using KDE, open the KDE Start button, click on Preferences, Personalization, Country & Language and choose ISO8859-2 charset. Note that this may be slightly different depending on the Linux distribution.

Switch the keyboard (my xmodmap definition uses Scroll Lock for switching, other xmodmap files use Right Alt) and enjoy.

You may alternatively edit the /etc/X11/Xf86Config file as explained in the Danish Howto, or issue this command in an X terminal window for the Slovak keyboard:

setxkbmap -model pc102 -symbols 'czsk(us_sk_qwertz)' setxkbmap cs -option grp:shift_toggle

In RedHat 7.2 and Mandrake 8.1, it is enough to run the following setxkbmap command from an X Terminal Window (assuming you have correct fonts installed): setxkbmap sk setxkbmap si setxkbmap de

qwerty or qwertz means that the letter z Z and y Y are swapped.

To see a variety of language maps (symbols), look in the file symbols.dir in /usr/X11R6/lib/X11/xkb directory.

Some X Window managers override .Xmodmap setting. If .Xmodmap isn't read by X automatically after starting the X Window System, a good way is to force the system to read it from your root (home) directory. You will do this by issuing the following command from an X terminal window:

xmodmap /.Xmodmap

After I installed the Slovak keyboard in KDE with Xmodmap file that used the standard definitions for ISO8859-2 keycode entities (lcaron, scaron, etc.), I couldn't write in Slovak or Czech, so I made few changes to the Xmodmap file explained later in this file. After applying these changes, no other changes were necessary.

2.2. How to do it - this experimental or nonstandard solution is not necessary for newer versions of XFree86. Skip this if not interested

Put the following in your .bash_profile:

export LANG=language

OR

OR for csh shell

setenv LANG=langauge

and have the standard Xmodmap file in your home directory. If you ask me where you may obtain such "standard" Xmodmap files, go to GNOME ../share directory. The file /usr/X11R6/lib/X11/locale/locale.alias contains the aliases for langauges, so look there in order to find out what is ca_ES or br_FR (the exact syntax for your language to use - you cannot write "croatia" but you must write "croatian", not "Croatian"; this is very important, as Unix is case sensitive).

Now you must install the pertinent language fonts and put path in XF86Config file to these fonts. If you want to internationalize your keyboard, use the standard Xmodmap definitions first and use right alt to switch between keyboards (if you use GNOME Xmodmap files). If it does not work, do the following:

a) Copy the "Compose" file from: /usr/X11R6/lib/X11/locale/iso8859-2 to: /usr/X11R6/lib/X11/locale/iso8859-1 directory (yes, iso8859-1, not iso8859-2). Back up the original "Compose" file if you want

b) Put the included .Xmodmap file to your root directory (Slovak language, or make your own .Xmodmap file, or choose from the ones listed here).

c) Install ISO8859-2 fonts (or other pertinent fonts).

You may try to issue the command:

xset q

to see which fonts are in your path.

If you want to add fonts in your path from the X Window System, issue the command:

xset fp+ /usr/fonts_path

xset fp rehash

d) Disable every "Scroll Lock" uncommented line in your XF86Config, because our .Xmodmap file for the Slovak language uses the Scroll Lock to switch between keyboards.

e) Put the appropriate fontpath for your newly installed fonts in the XF86Config file, if necessary (Mandrake 7.2 and other OS's may not require this). The Xmodmap solution may be applied to all X keyboards of your choice.

First, I must say that in my solution (in older XFree86 versions), different mapping is used for Xmodmap keycodes for some ISO8859-2 keycode entities. ISO8859-2 definitions (keycode entities) like lcaron, zcaron actually do not work. This means that the ISO8859-1 definitions must be used instead and they will either give you what they say they are (aacute [], eacute [], etc.), or they will not give you what they say they are (using ISO8859-2 fonts, putting "threequarters" in your .Xmodmap file will not give you "3/4" but "z" with a caron, a reversed ^ above it). For example, "mu" will give lcaron, "oslash" rcaron, etc.

However, other key definitions, for example, adieresis (a with two dots above it), uacute (u with a slash above it), as well as dead_diaeresis do not require a substitution of other definitions and work pretty well, as they're defined everywhere (a dead key is a key you press, hold it, yet nothing happens, but after pressing another key you will get a special letter).

The original "Compose" file in ../iso8859-1 directory can be fully utilized for English, Slovak or Czech keyboard layouts (Polish, Hungarian, Slovenian, Croatian) in some older XFree86 distributions, but there is only one problem - dead keys do not work. That's why you have to copy the "Compose" file from the iso8859-2 directory to iso8859-1 directory, or alternatively, you can edit the "Compose" file in iso8859-1 directory.

You can leave the Keyboard section in your XF86Config file without much change. Put (if it's not already there) the following in the "Keyboard" section:

Section "Keyboard"

Protocol "Standard"

XkbRules "xfree86"

XkbModel "pc101"

XkbLayout "us"

Force the system to read the xmodmap map by issuing the command: "xmodmap /.Xmodmap". Alternatively, you can have 60 .Xmodmap files like .Xmo1, .Xmo2, .Xmo3, .Xmo4, etc., and you may force the system to read them (xmodmap /.Xmo1). The dot means it is a hidden file and it is not necessary. You may also have xmo1, xmo2, or xmo3 Xmodmap files.

StarOffice 6.0 handles well conversion to win1250 and vice versa, so you can transport documents to a M$ platform. In my Mandrake 8.0, StarOffice 6.0 was internationalized immediately after using my standard Xmodmap solution. All the fonts worked. However, with StarOffice 5.2 this is not the case. In StarOffice 5.2, you must add X fonts to StarOffice's fonts directory. Here is a script that will do it for you. Cut it, name it "so52", make it executable (chmod +x so52), copy it to the StarOffice5.2/share/xp3 directory and execute it there.

-------------------------------cut_here-----------------------------------

#!/bin/sh

# Put path to your StarOffice here

STAR_OFFICE_ROOT=/mnt/StarOffice5.2

FONTS_DIR=/usr/X11R6/lib/X11/fonts/ISO8859-2/Type1

# -----------------------------------------------------------------------

# Don't edit the script here

# -----------------------------------------------------------------------

XP3_DIR=$STAR_OFFICE_ROOT/share/xp3

if [ -e $XP3_DIR/psstd.fonts.il2 ]; then

echo "Changes were already done!"

echo "If there's a problem, delete the file"

echo " $XP3_DIR/psstd.fonts.il2"

exit 1

fi

if [ -e $FONTS_DIR/afm ]; then

AFM_DIR=$FONTS_DIR/afm

else

AFM_DIR=$FONTS_DIR

fi

# Link AFM files.

ln -sf $AFM_DIR/*.[aA][fF][mM] $XP3_DIR/fontmetrics/afm

# Link PFB files.

ln -sf $FONTS_DIR/*.[pP][fF][bB] $XP3_DIR/pssoftfonts

grep "\.pf" $FONTS_DIR/fonts.dir \

| sed -e 's/\.pfb /, /g' -e 's/-0-0-0-0-/-%d-%d-%d-%d-/g' \

> $XP3_DIR/psstd.fonts.il2

cat $XP3_DIR/psstd.fonts.il2 >> $XP3_DIR/psstd.fonts

------------------------------------cut_here-----------------------------

StarOffice 5.2 fully recognizes Word97 documents even written in other languages, but a converter from iso8859-2 to win1250 encoding is necessary in order to transport ISO8859-2 documents to M$ platform. For html documents this is not necessary.

StarOffice 5.2 can be thus used by professional translators

2.3. Xmodmap theory and standard Xmodmap solution

If you want to edit and make your own .Xmodmap keyboard layout definitions, I'll explain one line of the .Xmodmap file to make clear what you should do.

This explanation can be used for all keycodes. For example, the line:

keycode 0x11 = 8 asterisk aacute 8

(note: keycode 0x11 is derived from the "xkeycaps" utility; you can also use the X Window "xev" utility to explore keyboard puzzles.)

says that the first pair, the default one, (number "8" and "asterisk") will display number "8" when you press keycode 0x11 ("8"), will display asterisk when a "shift" key is pressed. After pressing the Scroll Lock, there's another definition: ISO_NEXT_GROUP, which means that when you press the default "8" key, no "8" will be displayed, but aacute (""); when you press the "shift" key, number "8" will be displayed. So if you change "aacute" and "8", anything you put instead of "aacute" and "8" will be displayed, for example:

keycode 0x11 = 8 asterisk semicolon colon

will give you "semicolon" and "colon" in your 0x11 keycode after pressing the Scroll Lock.

The ISO_NEXT_GROUP is defined by another line. If this line is not defined, you will be able to use only two definitions ("8" and "asterisk") - look at my .Xmodmap file. If you delete the ISO_NEXT_GROUP (the next pair of definitions on the right), you will have only one group of keyboard definitions ("8" and "asterisk"). Be careful when editing the .Xmodmap file. You mustn't delete definitions that enable utilization of the Scroll Lock unless you know what you are doing (or you map the second keyboard by right Alt). These are the lines such as:

keycode 0x4e = ISO_Next_Group

add mod5 = ISO_Next_Group,

etc. You must also keep in mind that Unixes are case sensitive. If you want to find out more about keycodes, install the package "xkeycaps" or use "xev".

2.4. Experimental .Xmodmap sample file for the Slovak language typewriter layout

_______________________cut_here_________________________

keycode 0x09 = Escape

keycode 0x43 = F1 F11 F1 Multi_key

keycode 0x44 = F2 F12 F2 F12

keycode 0x45 = F3 F13 F3 F13 idiaeresis

keycode 0x46 = F4 F14 F4 F14 mu yen

keycode 0x47 = F5 F15 F5 F15 guillemotright guillemotleft

keycode 0x48 = F6 F16 F6 F16 ograve

keycode 0x49 = F7 F17 F7 dead_abovedot oacute

keycode 0x4A = F8 F18 F8 dead_breve acute

keycode 0x4B = F9 F19 F9 dead_cedilla ugrave

keycode 0x4C = F10 F20 F10 dead_ogonek

keycode 0x5F = F11 F21 dead_acute dead_caron

keycode 0x60 = F12 F22 dead_abovering dead_diaeresis

keycode 0x6F = Print Execute dead_iota

keycode 0x4E = ISO_Next_Group

keycode 0x6E = Pause

keycode 0x31 = grave asciitilde semicolon dead_diaeresis

keycode 0x0A = 1 exclam plus 1

keycode 0x0B = 2 at mu 2

keycode 0x0C = 3 numbersign onesuperior 3

keycode 0x0D = 4 dollar egrave 4

keycode 0x0E = 5 percent 0x0bb 5

keycode 0x0F = 6 asciicircum threequarters 6

keycode 0x10 = 7 ampersand yacute 7

keycode 0x11 = 8 asterisk aacute 8

keycode 0x12 = 9 parenleft iacute 9

keycode 0x13 = 0 parenright eacute 0

keycode 0x14 = minus underscore equal percent

keycode 0x15 = equal plus dead_acute dead_caron

keycode 0x33 = backslash bar ograve parenright

keycode 0x16 = BackSpace

keycode 0x6A = Insert

keycode 0x61 = Home

keycode 0x63 = Prior

keycode 0x4D = Num_Lock Pointer_EnableKeys

keycode 0x70 = KP_Divide slash

keycode 0x3F = KP_Multiply asterisk

keycode 0x52 = KP_Subtract minus

keycode 0x17 = Tab ISO_Left_Tab

keycode 0x18 = q Q

keycode 0x19 = w W

keycode 0x1A = e E

keycode 0x1B = r R

keycode 0x1C = t T

keycode 0x1D = y Y z Z

keycode 0x1E = u U

keycode 0x1F = i I

keycode 0x20 = o O

keycode 0x21 = p P

keycode 0x22 = bracketleft braceleft acute slash

keycode 0x23 = bracketright braceright diaeresis parenleft

keycode 0x24 = Return

keycode 0x6B = Delete

keycode 0x67 = End

keycode 0x69 = Next

keycode 0x4F = KP_Home 7 KP_Home

keycode 0x50 = KP_Up 8

keycode 0x51 = KP_Prior 9

keycode 0x56 = KP_Add plus

keycode 0x42 = Caps_Lock

keycode 0x26 = a A

keycode 0x27 = s S

keycode 0x28 = d D

keycode 0x29 = f F

keycode 0x2A = g G

keycode 0x2B = h H

keycode 0x2C = j J

keycode 0x2D = k K

keycode 0x2E = l L

keycode 0x2F = semicolon colon ocircumflex quotedbl

keycode 0x30 = apostrophe quotedbl section exclam

keycode 0x53 = KP_Left 4

keycode 0x54 = KP_Begin 5

keycode 0x55 = KP_Right 6

keycode 0x32 = Shift_L ISO_Next_Group

keycode 0x34 = z Z y Y

keycode 0x35 = x X

keycode 0x36 = c C

keycode 0x37 = v V

keycode 0x38 = b B

keycode 0x39 = n N

keycode 0x3A = m M

keycode 0x3B = comma less comma question

keycode 0x3C = period greater period colon

keycode 0x3D = slash question minus underscore

keycode 0x3E = Shift_R

keycode 0x62 = Up

keycode 0x57 = KP_End 1

keycode 0x58 = KP_Down 2

keycode 0x59 = KP_Next 3

keycode 0x6C = KP_Enter Return

keycode 0x25 = Control_L ISO_Next_Group

!keycode 0x40 = Alt_L Meta_L

keycode 0x40 = Meta_L Alt_L

keycode 0x41 = space

keycode 0x71 = Alt_R Meta_R

keycode 0x6D = Control_R

keycode 0x64 = Left

keycode 0x68 = Down

keycode 0x66 = Right

keycode 0x5A = KP_Insert 0

keycode 0x5B = KP_Delete period

!keysym Alt_L = Meta_L

!keysym F12 = Multi_key

clear Shift

!clear Lock

clear Control

clear Mod1

clear Mod2

clear Mod3

clear Mod4

clear Mod5

add Shift = Shift_L Shift_R

add Control = Control_L Control_R

!add Mod1 = Alt_L Alt_R

add Mod1 = Meta_L Alt_R

add Mod2 = Num_Lock

add Mod5 = ISO_Next_Group

!add Mod1 =

!add Mod2 = Alt_R Alt_L Mode_switch

keycode 0x73 = ISO_Next_Group

keycode 0x74 = dead_acute dead_diaeresis

keycode 0x75 = dead_caron dead_abovering

_____________________________cut_here_____________________________

You may find almost any xmodmap file in the GNOME directory in (SuSE) /opt/gnome/share/xmodmap (with standard ISO8859-1,2 and other definitions). To switch between the keyboards, use right Alt.

2.5. Character sets

The purpose of the following info is to help you build any .Xmodmap keyboard layout with ISO8859-2 or other fonts. The ISO8859-2 Character Set file is included here for you to know which names are used for pertinent keys. You should not bother about the numbers, but notice how keys are named. Much of this information is useful to build a keyboard with ISO8859-1 characters only, or a combination of East European characters and Western characters. If you're going to use other languages than the Central European or Western European ones, find a pertinent table for your ISO*** character set on Internet. The gdkkeysyms.h file, that contains all the crazy names for keycode entities including hexcodes, is in (older versions of RedHat) /usr/include/gdk/ directory. If no gdkkeysyms.h file is on your sustem, see the file /usr/X11R6/include/X11/keysymdef.h, or try to look in /lib/perl5/site_perl/5.6.0/i386-linux/GTK/keysyms.pm (it also contains names of keycode entities including hex codes). If you have a newer version of PERL, the "5.6.0" may differ. The similar should apply to other systems (FreeBSD), as all these use PERL.

2.6. ISO-8859-2 (ISO Latin2) character set

Xmodmap entity Visually

----------------------------------------------------------------------

space

exclam !

quotedbl "

numbersign #

dollar $

percent

ampersand &

quoteright '

parenleft (

parenright )

asterisk *

plus +

comma ,

hyphen -

period .

slash /

zero 0

one 1

two 2

three 3

four 4

five 5

six 6

seven 7

eight 8

nine 9

colon :

semicolon ;

less < <

equal =

greater > >

question ?

at @

A A

B B

C C

D D

E E

F F

G G

H H

I I

J J

K K

L L

M M

N N

O O

P P

Q Q

R R

S S

T T

U U

V V

W W

X X

Y Y

Z Z

bracketleft [

backslash \

bracketright ]

asciicircum ^

underscore _

quoteleft `

a a

b b

c c

d d

e e

f f

g g

h h

i i

j j

k k

l l

m m

n n

o o

p p

q q

r r

s s

t t

u u

v v

w w

x x

y y

z z

braceleft {

bar |

braceright }

tilde

space

Aogonek

breve

Lslash

currency

Lcaron

Sacute

section

dieresis

Scaron

Scedilla

Tcaron

Zacute

hyphen

Zcaron

Zdotaccent

degree

aogonek

ogonek

lslash

acute

lcaron

sacute

caron

cedilla

scaron

scedilla

tcaron

zacute

hungarumlaut

zcaron

zdotaccent

Racute

Aacute

Acircumflex

Abreve

Adieresis

Lacute

Cacute

Ccedilla

Ccaron

Eacute

Eogonek

Edieresis

Ecaron

Iacute

Icircumflex

Dcaron

Eth

Nacute

Ncaron

Oacute

Ocircumflex

Ohungarumlaut

Odieresis

multiply

Rcaron

Uring

Uacute

hungarumlaut

Udieresis

Yacute

Tcedilla

germandbls

racute

aacute

acircumflex

abreve

adieresis

lacute

cacute

ccedilla

ccaron

eacute

eogonek

edieresis

ecaron

iacute

icircumflex

dcaron

dbar

nacute

ncaron

oacute

ocircumflex

ohungarumlaut

odieresis

divide

rcaron

uring

uacute

uhungarumlaut

udieresis

yacute

tcedilla

dotaccent

----------------------------------------------------------------------

First, if you are using older systems, try to see if standard definitions will give you (after installing pertinent fonts and building Xmodmap with keyboard definitions for X) what they say they are. If they will not give you what they say they are (some keycodes will be unfunctional), then put to your bash_profile the "export LANG=language" statement and if you are still unsuccessful, you must make a substitution. Definitions which will not give you what they say they are can be traced by their visual shape in Western Latin 1 encoding. If you are a Czech, for example, you may issue a command:

setxkbmap -model pc102 -symbols 'czsk(us_cz_qwertz)' setxkbmap cs -option grp:shift_toggle

and see what will give you an X terminal window (press both Shift keys or press alt and hold it to see the other keyboard layout). This means that by pressing a letter "3" you will get a real "onesuperior" key. It is good that X terminal window does not make use of ISO8859-2 fonts now, so you will see what you must use instead of scaron (scaron = onesuperior). By putting "onesuperior" in an .Xmodmap file you will get a REAL "scaron", but obviously, only with use of ISO8859-2 fonts (with use of ISO8859-1 fonts, you will get a REAL "onesuperior").

Thus, the X Terminal window will show you fonts like micron, onesuperior, threequarters, and so on. You will see what you must substitute. But if you don't know what "?" is called in the ISO terminology, find and download an appropriate character set table for ISO8859-1, or look in gdkkeysyms.h file, /lib/perl5/site_perl/5.6.0/i386-linux/GTK/keysyms.pm file, or ../ISO8859-1/Compose file. Alternatively, you may experiment with all codes defined in /usr/X11R6/lib/X11/locale/ISO8859-1/Compose file. You must use the ISO8859-1 entities when the system refuses to display the ISO8859-2 entities correctly.

The following symbols on your right is what I found out through my research. This is just an example. When you use a "Pound" definition in the Xmodmap file, the X Window System will display you a Lslash instead (in relation to using iso8859-2 fonts, of course). When you choose some easy KDE text editor, select iso8859-2 fonts charset from the fonts menu. NOTE: vowel *acute (uacute, eacute, etc.) signs require no substitution, therefore I omitted iacute, aacute, etc., here.

ISO8859-1 entity will give you the: ISO8859-2 entity

in our nonstandard or experimental Xmodmap keycode definition

egrave ccaron

ugrave uring

agrave racute

ecircumflex "c" with something at the bottom of it

ucircumflex Lslash "Pound" in Xmodmap gives you Lslash.

Lcaron Writing "yen" will give us Lcaron

Scaron copyright (will give us Scaron)

Tcaron guillemotleft (will give us Tcaron)

Zcaron registered

lcaron mu

scaron onesuperior

tcaron guillemotright

zcaron threequarters

Cacute AE

Eogonek find out yourself

Edieresis Edieresis

ecaron igrave

onequarter zacute

questiondown z with a ring above it

Dcaron find out yourself

Ooblique Rcaron

thorn t with something at the bottom of it

Sterling Lstroke

yen Lcaron

copyright Scaron

brokenbar Sacute

macron Z with something above it

paragraph sacute

periodcentered caron

masculine s with something at the bottom of it

onequarter zacute

ecircumflex d with a line above it

ETH Dstroke

Ntilde Nacute

Otilde O with two dots above it

registered Zcaron

Nacute Ograve

nacute ograve

Ocircumflex Ocircumflex

ccaron egrave

nacute ntilde ------------------------------------------------------------------------

sect1>ISO* specifications

2.7. The standard ISO8859-2 definitions in the Xmodmap file

The example of a Standard .Xmodmap file. Use this file if X Server correctly displays lcaron, scaron, etc., in newer versions of XFree86.

! This is an `xmodmap' input file for PC 101 key #2 (Linux/FreeBSD/XFree86; US/sk)

! keyboards created by XKeyCaps, modified by Juraj Sipos on 8/17/1999.

! XKeyCaps 2.38 is Copyright (c) 1997 Jamie Zawinski (jwz@netscape.com).

! http://people.netscape.com/jwz/xkeycaps/ This is an .Xmodmap solution for

! Slovak keyboard in FreeBSD. You must have ISO-8859-2 fonts installed with a

! pointer in /etc/XF86Config, for example,

! FontPath "/usr/X11R6/lib/X11/fonts/ISO8859-2/Type1". The section "Keyboard"

! in XF86Config must contain at least the following line. You don't have to

! specify any special XkbLayout.

! Section "Keyboard"

! Protocol "Standard"

! XkbRules "xfree86"

! XkbModel "pc101"

! XkbLayout "us"!

! The Slovak/English keyboard is switched to by Scroll Lock

! This file makes the following changes:

!

! The "F1" key generates F1 and F11

! The "F2" key generates F2 and F12

! The "F3" key generates F3 and F13

! The "F4" key generates F4 and F14

! The "F5" key generates F5 and F15

! The "F6" key generates F6 and F16

! The "F7" key generates F7, F17, and dead_circumflex

! The "F8" key generates F8, F18, and dead_doubleacute

! The "F9" key generates F9, F19, and dead_cedilla

! The "F10" key generates F10, F20, and dead_ogonek

! The "F11" key generates F11, F21, dead_diaeresis, and dead_circumflex

! The "F12" key generates F12, F22, dead_abovering, and dead_doubleacute

! The "Print Screen" key generates Print and Execute

! The "Scroll Lock" key generates ISO_Next_Group, and the Mod5 modifier

! The "`" key generates what you see + semicolon and dead diaeresis

! The "! 1" key generates 1, exclam, plus, 1 (the last one is with shift)

! The "@ 2" key generates 2, at, lcaron, and 2

! The "# 3" key generates 3, numbersign, scaron, and 3

! The "$ 4" key generates 4, dollar, ccaron, and 4

! The "% 5" key generates 5, percent, tcaron, and 5

! The "^ 6" key generates 6, asciicircum, zcaron, and 6

! The "& 7" key generates 7, ampersand, yacute, and 7

! The "* 8" key generates 8, asterisk, aacute, and 8

! The "( 9" key generates 9, parenleft, iacute, and 9

! The ") 0" key generates 0, parenright, eacute, and 0

! The "+ =" key generates equal, plus, dead_acute, and dead_caron

! The "Num Lock" key generates Num_Lock and Pointer_EnableKeys, and the Mod2 modifier

! The "Tab" key generates Tab and ISO_Left_Tab

! The "Q" key generates q and Q

! The "W" key generates w and W

! The "E" key generates e and E

! The "R" key generates r and R

! The "T" key generates t and T

! The "Y" key generates y and Y

! The "U" key generates u and U

! The "I" key generates i and I

! The "O" key generates o and O

! The "P" key generates p and P

! The "7 Home" key generates KP_Home and KP_7

! The "8 UpArrow" key generates KP_Up and KP_8

! The "9 Pg Up" key generates KP_Prior and KP_9

! The "Caps Lock" key generates Caps_Lock, and has no modifiers

! The "A" key generates a and A

! The "S" key generates s and S

! The "D" key generates d and D

! The "G" key generates g and G

! The "H" key generates h and H

! The "J" key generates j and J

! The "K" key generates k and K

! The "L" key generates l and L

! The "4 LeftArrow" key generates KP_Left and KP_4

! The "5" key generates KP_Begin and KP_5

! The "6 RightArrow" key generates KP_Right and KP_6

! The "Z" key generates z and Z

! The "X" key generates x and X

! The "C" key generates c and C

! The "V" key generates v and V

! The "B" key generates b and B

! The "N" key generates n and N

! The "M" key generates m and M

! The "1 End" key generates KP_End and KP_1

! The "2 DownArrow" key generates KP_Down and KP_2

! The "3 Pg Dn" key generates KP_Next and KP_3

! The "0 Ins" key generates KP_Insert and KP_0

! The ". Del" key generates KP_Delete and KP_Decimal

!#define XK_dead_semivoiced_sound 0xFE5F

!dead_iota, dead_voiced_sound, dead_belowdot, dead_tilde, dead_macron

keycode 0x09 = Escape

keycode 0x43 = F1 F11 F1 Multi_key

keycode 0x44 = F2 F12 F2 F12

keycode 0x45 = F3 F13 F3 F13 idiaeresis

keycode 0x46 = F4 F14 F4 F14 mu yen

keycode 0x47 = F5 F15 F5 F15 guillemotright guillemotleft

keycode 0x48 = F6 F16 F6 F16 ograve

keycode 0x49 = F7 F17 F7 dead_abovedot oacute

keycode 0x4A = F8 F18 F8 dead_breve uacute

keycode 0x4B = F9 F19 F9 dead_cedilla ugrave

keycode 0x4C = F10 F20 F10 dead_ogonek

keycode 0x5F = F11 F21 dead_acute dead_caron

keycode 0x60 = F12 F22 dead_abovering dead_diaeresis

!keycode 0x6F = Print Execute dead_doubleacute dead_circumflex

keycode 0x6F = Print Execute dead_iota

keycode 0x4E = ISO_Next_Group

keycode 0x6E = Pause

keycode 0x31 = grave asciitilde semicolon dead_diaeresis

keycode 0x0A = 1 exclam plus 1

keycode 0x0B = 2 at lcaron 2

keycode 0x0C = 3 numbersign scaron 3

keycode 0x0D = 4 dollar ccaron 4

keycode 0x0E = 5 percent tcaron 5

keycode 0x0F = 6 asciicircum zcaron 6

keycode 0x10 = 7 ampersand yacute 7

keycode 0x11 = 8 asterisk aacute 8

keycode 0x12 = 9 parenleft iacute 9

keycode 0x13 = 0 parenright eacute 0

keycode 0x14 = minus underscore equal percent

keycode 0x15 = equal plus dead_acute dead_caron

keycode 0x33 = backslash bar ncaron parenright

keycode 0x16 = BackSpace

keycode 0x6A = Insert

keycode 0x61 = Home

keycode 0x63 = Prior

keycode 0x4D = Num_Lock Pointer_EnableKeys

keycode 0x70 = KP_Divide slash

keycode 0x3F = KP_Multiply asterisk

keycode 0x52 = KP_Subtract minus

keycode 0x17 = Tab ISO_Left_Tab

keycode 0x18 = q Q

keycode 0x19 = w W

keycode 0x1A = e E

keycode 0x1B = r R

keycode 0x1C = t T

keycode 0x1D = y Y z Z

keycode 0x1E = u U

keycode 0x1F = i I

keycode 0x20 = o O

keycode 0x21 = p P

keycode 0x22 = bracketleft braceleft uacute slash

keycode 0x23 = bracketright braceright adiaeresis parenleft

keycode 0x24 = Return

keycode 0x6B = Delete

keycode 0x67 = End

keycode 0x69 = Next

keycode 0x4F = KP_Home 7 KP_Home

keycode 0x50 = KP_Up 8

keycode 0x51 = KP_Prior 9

keycode 0x56 = KP_Add plus

keycode 0x42 = Caps_Lock

keycode 0x26 = a A

keycode 0x27 = s S

keycode 0x28 = d D

keycode 0x29 = f F

keycode 0x2A = g G

keycode 0x2B = h H

keycode 0x2C = j J

keycode 0x2D = k K

keycode 0x2E = l L

keycode 0x2F = semicolon colon ocircumflex quotedbl

keycode 0x30 = apostrophe quotedbl section exclam

keycode 0x53 = KP_Left 4

keycode 0x54 = KP_Begin 5

keycode 0x55 = KP_Right 6

keycode 0x32 = Shift_L ISO_Next_Group

keycode 0x34 = z Z y Y

keycode 0x35 = x X

keycode 0x36 = c C

keycode 0x37 = v V

keycode 0x38 = b B

keycode 0x39 = n N

keycode 0x3A = m M

keycode 0x3B = comma less comma question

keycode 0x3C = period greater period colon

keycode 0x3D = slash question minus underscore

keycode 0x3E = Shift_R

keycode 0x62 = Up

keycode 0x57 = KP_End 1

keycode 0x58 = KP_Down 2

keycode 0x59 = KP_Next 3

keycode 0x6C = KP_Enter Return

keycode 0x25 = Control_L ISO_Next_Group

!keycode 0x40 = Alt_L Meta_L

keycode 0x40 = Meta_L Alt_L

keycode 0x41 = space

keycode 0x71 = Alt_R Meta_R

keycode 0x6D = Control_R

keycode 0x64 = Left

keycode 0x68 = Down

keycode 0x66 = Right

keycode 0x5A = KP_Insert 0

keycode 0x5B = KP_Delete period

!keysym Alt_L = Meta_L

!keysym F12 = Multi_key

clear Shift

!clear Lock

clear Control

clear Mod1

clear Mod2

clear Mod3

clear Mod4

clear Mod5

add Shift = Shift_L Shift_R

add Control = Control_L Control_R

!add Mod1 = Alt_L Alt_R

add Mod1 = Meta_L Alt_R

add Mod2 = Num_Lock

add Mod5 = ISO_Next_Group

!add Mod1 =

!add Mod2 = Alt_R Alt_L Mode_switch

keycode 0x73 = ISO_Next_Group

keycode 0x74 = dead_acute dead_diaeresis

keycode 0x75 = dead_caron dead_abovering