
                              Wine Documentation                               
Prev                      Chapter 4. Configuring Wine                      Next
-------------------------------------------------------------------------------

Keyboard

Written by Ove Kven <ovek@winehq.com>

(Extracted from wine/documentation/keyboard)

Wine now needs to know about your keyboard layout. This requirement comes from
a need from many apps to have the correct scancodes available, since they read
these directly, instead of just taking the characters returned by the X server.
This means that Wine now needs to have a mapping from X keys to the scancodes
these applications expect.

On startup, Wine will try to recognize the active X layout by seeing if it
matches any of the defined tables. If it does, everything is alright. If not,
you need to define it.

To do this, open the file windows/x11drv/keyboard.c and take a look at the
existing tables. Make a backup copy of it, especially if you don't use CVS.

What you really would need to do, is find out which scancode each key needs to
generate. Find it in the main_key_scan table, which looks like this:
static const int main_key_scan[MAIN_LEN] =                                        
{                                                                                 
/* this is my (102-key) keyboard layout, sorry if it doesn't quite match yours */ 
   0x29,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,              
   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,                   
   0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x2B,                   
   0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,                             
   0x56 /* the 102nd key (actually to the right of l-shift) */                    
};                                                                                
                                                                                  

Next, assign each scancode the characters imprinted on the keycaps. This was
done (sort of) for the US 101-key keyboard, which you can find near the top in
keyboard.c. It also shows that if there is no 102nd key, you can skip that.

However, for most international 102-key keyboards, we have done it easy for
you. The scancode layout for these already pretty much matches the physical
layout in the main_key_scan, so all you need to do is to go through all the
keys that generate characters on your main keyboard (except spacebar), and
stuff those into an appropriate table. The only exception is that the 102nd
key, which is usually to the left of the first key of the last line (usually Z
), must be placed on a separate line after the last line.

For example, my Norwegian keyboard looks like this
  !  "  #    %  &  /  (  )  =  ?  `  Back-                                   
|  1  2@ 3 4$ 5  6  7{ 8[ 9] 0} +  \ space                                   
                                                                               
Tab Q  W  E  R  T  Y  U  I  O  P    ^                                         
                                     ~                                        
                                        Enter                                  
Caps A  S  D  F  G  H  J  K  L      *                                        
Lock                                  '                                        
                                                                               
Sh- > Z  X  C  V  B  N  M  ;  :  _  Shift                                      
ift <                      ,  .  -                                             
                                                                               
Ctrl  Alt       Spacebar       AltGr  Ctrl                                     
                                                                               

Note the 102nd key, which is the <> key, to the left of Z. The character to the
right of the main character is the character generated by AltGr.

This keyboard is defined as follows:
static const char main_key_NO[MAIN_LEN][4] =                                   
{                                                                              
 "|","1!","2\"@","3#","4$","5%","6&","7/{","8([","9)]","0=}","+?","\\",    
 "qQ","wW","eE","rR","tT","yY","uU","iI","oO","pP","","^~",                 
 "aA","sS","dD","fF","gG","hH","jJ","kK","lL","","","'*",                  
 "zZ","xX","cC","vV","bB","nN","mM",",;",".:","-_",                            
 "<>"                                                                          
};                                                                             
                                                                               

Except that " and \ needs to be quoted with a backslash, and that the 102nd key
is on a separate line, it's pretty straightforward.

After you have written such a table, you need to add it to the main_key_tab[]
layout index table. This will look like this:
static struct {                                                                
 WORD lang, ansi_codepage, oem_codepage;                                       
 const char (*key)[MAIN_LEN][4];                                               
} main_key_tab[]={                                                             
...                                                                            
...                                                                            
 {MAKELANGID(LANG_NORWEGIAN,SUBLANG_DEFAULT),  1252, 865, &main_key_NO},       
...                                                                            
                                                                               

After you have added your table, recompile Wine and test that it works. If it
fails to detect your table, try running
wine --debugmsg +key,+keyboard >& key.log                                      
                                                                               

and look in the resulting key.log file to find the error messages it gives for
your layout.

Note that the LANG_* and SUBLANG_* definitions are in include/winnls.h, which
you might need to know to find out which numbers your language is assigned, and
find it in the debugmsg output. The numbers will be (SUBLANG * 0x400 + LANG),
so, for example the combination LANG_NORWEGIAN (0x14) and SUBLANG_DEFAULT (0x1)
will be (in hex) 14 + 1*400 = 414, so since I'm Norwegian, I could look for
0414 in the debugmsg output to find out why my keyboard won't detect.

Once it works, submit it to the Wine project. If you use CVS, you will just
have to do
cvs -z3 diff -u windows/x11drv/keyboard.c > layout.diff                        
                                                                               

from your main Wine directory, then submit layout.diff to <
wine-patches@winehq.com> along with a brief note of what it is.

If you don't use CVS, you need to do
diff -u the_backup_file_you_made windows/x11drv/keyboard.c > layout.diff       
                                                                               

and submit it as explained above.

If you did it right, it will be included in the next Wine release, and all the
troublesome applications (especially remote-control applications) and games
that use scancodes will be happily using your keyboard layout, and you won't
get those annoying fixme messages either.

Good luck.
-------------------------------------------------------------------------------
Prev                                  Home                                 Next
Dll Overrides                          Up                          Running Wine
