VirtualBox

Changeset 2529 for trunk

Show
Ignore:
Timestamp:
05/08/07 10:47:31 (2 years ago)
Author:
vboxsync
Message:

Reactivated and updated the Wine keyboard code for VirtualBox on remote X11 displays

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk

    r2478 r2529  
    148148        src/VBoxFBDDRAW.cpp 
    149149 
    150 ifdef XKEYBOARD_NEW 
    151 VirtualBox_SOURCES.linux = \ 
    152         src/linux/XKeyboardNew.cpp 
    153 else 
    154150VirtualBox_SOURCES.linux = \ 
    155151        src/linux/XKeyboard.cpp \ 
    156         src/linux/keyboard.c 
    157 endif 
     152        src/linux/keyboard.c \ 
     153        src/linux/XKeyboardNew.cpp 
    158154 
    159155VirtualBox_SOURCES.darwin = \ 
  • trunk/src/VBox/Frontends/VirtualBox/include/XKeyboard.h

    r382 r2529  
    4444int getKeysymsPerKeycode(); 
    4545 
     46// initialize the X keyboard subsystem, safe for use on remote X servers 
     47bool initXKeyboardSafe(Display *dpy); 
     48// our custom keyboard handler, safe for use on remote X servers 
     49void handleXKeyEventSafe(Display *dpy, XEvent *event, WINEKEYBOARDINFO *wineKbdInfo); 
     50// returns the number of keysyms per keycode (only valid after initXKeyboard()), safe 
     51// for use on remote X servers 
     52int getKeysymsPerKeycodeSafe(); 
     53 
    4654 
    4755#endif // __XKeyboard_h__ 
  • trunk/src/VBox/Frontends/VirtualBox/src/linux/XKeyboard.cpp

    r382 r2529  
    5151 * within our environment. 
    5252 */ 
    53 bool initXKeyboard(Display *dpy) 
     53bool initXKeyboardSafe(Display *dpy) 
    5454{ 
    5555    // update the global display pointer 
     
    6363 * possible to undo the dreaded scancode to X11 conversion. Sigh! 
    6464 */ 
    65 void handleXKeyEvent(Display *dpy, XEvent *event, WINEKEYBOARDINFO *wineKbdInfo) 
     65void handleXKeyEventSafe(Display *dpy, XEvent *event, WINEKEYBOARDINFO *wineKbdInfo) 
    6666{ 
    6767    // update the global display pointer 
     
    7171} 
    7272 
    73 int getKeysymsPerKeycode() 
     73int getKeysymsPerKeycodeSafe() 
    7474{ 
    7575    return X11DRV_GetKeysymsPerKeycode(); 
  • trunk/src/VBox/Frontends/VirtualBox/src/linux/XKeyboardNew.cpp

    r1558 r2529  
    2424#include <XKeyboard.h> 
    2525#include <cstring> 
     26#include <cstdlib> 
    2627 
    2728#define LOG_GROUP LOG_GROUP_GUI 
     
    5354 
    5455static int keysyms_per_keycode;  /** Number of keyboard language layouts the host has */ 
     56static bool remote_display = false;  /** Are we displaying on a remote X server? */ 
    5557 
    5658/** 
    57  * Find out how many different language mappings there are for this keyboard.  This is needed 
     59 * Check whether we are running on a local or on a remote X server, and find out how many 
     60 * different language mappings there are for this keyboard.  This last is needed 
    5861 * so that Dmitry can press <hostkey>+Q while using his Cyrillic keyboard layout :) 
    5962 */ 
     
    6265    int min, max; 
    6366    KeySym *syms; 
     67 
     68    /* If we are displaying on a remote display then fall back to old Wine-based code. */ 
     69    if (DisplayString(dpy)[0] != ':') 
     70    { 
     71        remote_display = true; 
     72        Log(("initXKeyboard: remote display detected\n")); 
     73        return initXKeyboardSafe(dpy); 
     74    } 
     75    Log(("initXKeyboard: remote display not detected\n")); 
    6476    /* Find out how approximately how many keys there are on the keyboard, needed for the next 
    6577       call */ 
     
    7688 * Convert X11 keycodes back to scancodes. 
    7789 */ 
    78 void handleXKeyEvent(Display * /* dpy */, XEvent *event, WINEKEYBOARDINFO *wineKbdInfo) 
     90void handleXKeyEvent(Display * dpy, XEvent *event, WINEKEYBOARDINFO *wineKbdInfo) 
    7991{ 
    8092    unsigned int uKeyCode = event->xkey.keycode; 
     93 
     94    if (remote_display == true) 
     95    { 
     96        handleXKeyEventSafe(dpy, event, wineKbdInfo); 
     97        return; 
     98    } 
    8199    memset(reinterpret_cast<void *>(wineKbdInfo), 0, sizeof(WINEKEYBOARDINFO)); 
    82100    /* Basic scancodes are translated to keycodes by adding 8, so we just subtract again. */ 
     
    107125int getKeysymsPerKeycode() 
    108126{ 
     127    if (remote_display == true) 
     128        return getKeysymsPerKeycodeSafe(); 
    109129    return keysyms_per_keycode; 
    110130} 
  • trunk/src/VBox/Frontends/VirtualBox/src/linux/keyboard.c

    r382 r2529  
    2121 * You should have received a copy of the GNU Lesser General Public 
    2222 * License along with this library; if not, write to the Free Software 
    23  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
     23 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 
    2424 */ 
    25  
    26 // our master define to make this module usable outside wide 
     25// our master define to make this module usable outside wine 
     26 
    2727#define OUTOFWINE 
    2828 
     
    3030#include "keyboard_outofwine.h" 
    3131int use_xkb = 1; 
    32 #endif 
     32#endif // OUTOFWINE defined 
    3333 
    3434#ifndef OUTOFWINE 
    3535#include "config.h" 
    36 #endif 
     36#endif // OUTOFWINE not defined 
    3737 
    3838#include <X11/Xatom.h> 
     
    4141#include <X11/Xresource.h> 
    4242#include <X11/Xutil.h> 
    43 #ifdef HAVE_XKB 
     43#ifdef HAVE_X11_XKBLIB_H 
    4444#include <X11/XKBlib.h> 
    4545#endif 
     
    6060#include "win.h" 
    6161#include "x11drv.h" 
     62#include "wine/server.h" 
    6263#include "wine/unicode.h" 
    6364#include "wine/debug.h" 
     
    6566WINE_DEFAULT_DEBUG_CHANNEL(keyboard); 
    6667WINE_DECLARE_DEBUG_CHANNEL(key); 
    67 WINE_DECLARE_DEBUG_CHANNEL(dinput); 
    68 #endif // OUTOFWINE 
     68#endif // OUTOFWINE not defined 
     69 
     70typedef union 
     71
     72    struct 
     73    { 
     74#ifndef BITFIELDS_BIGENDIAN 
     75        unsigned long count : 16; 
     76#endif 
     77        unsigned long code : 8; 
     78        unsigned long extended : 1; 
     79        unsigned long unused : 2; 
     80        unsigned long win_internal : 2; 
     81        unsigned long context : 1; 
     82        unsigned long previous : 1; 
     83        unsigned long transition : 1; 
     84#ifdef BITFIELDS_BIGENDIAN 
     85        unsigned long count : 16; 
     86#endif 
     87    } lp1; 
     88    unsigned long lp2; 
     89} KEYLP; 
     90 
     91/* key state table bits: 
     92  0x80 -> key is pressed 
     93  0x40 -> key got pressed since last time 
     94  0x01 -> key is toggled 
     95*/ 
     96BYTE key_state_table[256]; 
     97 
     98static BYTE TrackSysKey = 0; /* determine whether ALT key up will cause a WM_SYSKEYUP 
     99                                or a WM_KEYUP message */ 
    69100 
    70101static int min_keycode, max_keycode, keysyms_per_keycode; 
    71102static WORD keyc2vkey[256], keyc2scan[256]; 
    72103 
    73 static LPBYTE pKeyStateTable; 
    74104static int NumLockMask, AltGrMask; /* mask in the XKeyEvent state */ 
    75105static int kcControl, kcAlt, kcShift, kcNumLock, kcCapsLock; /* keycodes */ 
     
    139169}; 
    140170 
     171static const WORD main_key_scan_qwerty_jp106[MAIN_LEN] = 
     172{ 
     173  /* this is my (106-key) keyboard layout, sorry if it doesn't quite match yours */ 
     174 /* 1    2    3    4    5    6    7    8    9    0    -    ^    \ */ 
     175   0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x29, 
     176 /* q    w    e    r    t    y    u    i    o    p    @    [ */ 
     177   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B, 
     178 /* a    s    d    f    g    h    j    k    l    ;    :    ] */ 
     179   0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x2B, 
     180 /* z    x    c    v    b    n    m    ,    .    / */ 
     181   0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35, 
     182   0x56 /* the 102nd key (actually to the right of l-shift) */ 
     183}; 
     184 
     185 
    141186static const WORD main_key_vkey_qwerty[MAIN_LEN] = 
    142187{ 
    143188/* NOTE: this layout must concur with the scan codes layout above */ 
    144    VK_OEM_3,VK_1,VK_2,VK_3,VK_4,VK_5,VK_6,VK_7,VK_8,VK_9,VK_0,VK_OEM_MINUS,VK_OEM_PLUS, 
    145    VK_Q,VK_W,VK_E,VK_R,VK_T,VK_Y,VK_U,VK_I,VK_O,VK_P,VK_OEM_4,VK_OEM_6, 
    146    VK_A,VK_S,VK_D,VK_F,VK_G,VK_H,VK_J,VK_K,VK_L,VK_OEM_1,VK_OEM_7,VK_OEM_5, 
    147    VK_Z,VK_X,VK_C,VK_V,VK_B,VK_N,VK_M,VK_OEM_COMMA,VK_OEM_PERIOD,VK_OEM_2, 
     189   VK_OEM_3,'1','2','3','4','5','6','7','8','9','0',VK_OEM_MINUS,VK_OEM_PLUS, 
     190   'Q','W','E','R','T','Y','U','I','O','P',VK_OEM_4,VK_OEM_6, 
     191   'A','S','D','F','G','H','J','K','L',VK_OEM_1,VK_OEM_7,VK_OEM_5, 
     192   'Z','X','C','V','B','N','M',VK_OEM_COMMA,VK_OEM_PERIOD,VK_OEM_2, 
    148193   VK_OEM_102 /* the 102nd key (actually to the right of l-shift) */ 
    149194}; 
    150195 
     196static const WORD main_key_vkey_qwerty_jp106[MAIN_LEN] = 
     197{ 
     198/* NOTE: this layout must concur with the scan codes layout above */ 
     199   '1','2','3','4','5','6','7','8','9','0',VK_OEM_MINUS,VK_OEM_PLUS,VK_OEM_3, 
     200   'Q','W','E','R','T','Y','U','I','O','P',VK_OEM_4,VK_OEM_6, 
     201   'A','S','D','F','G','H','J','K','L',VK_OEM_1,VK_OEM_7,VK_OEM_5, 
     202   'Z','X','C','V','B','N','M',VK_OEM_COMMA,VK_OEM_PERIOD,VK_OEM_2, 
     203   VK_OEM_102 /* the 102nd key (actually to the right of l-shift) */ 
     204}; 
     205 
    151206static const WORD main_key_vkey_qwerty_v2[MAIN_LEN] = 
    152207{ 
    153208/* NOTE: this layout must concur with the scan codes layout above */ 
    154    VK_OEM_5,VK_1,VK_2,VK_3,VK_4,VK_5,VK_6,VK_7,VK_8,VK_9,VK_0,VK_OEM_PLUS,VK_OEM_4, 
    155    VK_Q,VK_W,VK_E,VK_R,VK_T,VK_Y,VK_U,VK_I,VK_O,VK_P,VK_OEM_6,VK_OEM_1, 
    156    VK_A,VK_S,VK_D,VK_F,VK_G,VK_H,VK_J,VK_K,VK_L,VK_OEM_3,VK_OEM_7,VK_OEM_2, 
    157    VK_Z,VK_X,VK_C,VK_V,VK_B,VK_N,VK_M,VK_OEM_COMMA,VK_OEM_PERIOD,VK_OEM_MINUS, 
     209   VK_OEM_5,'1','2','3','4','5','6','7','8','9','0',VK_OEM_PLUS,VK_OEM_4, 
     210   'Q','W','E','R','T','Y','U','I','O','P',VK_OEM_6,VK_OEM_1, 
     211   'A','S','D','F','G','H','J','K','L',VK_OEM_3,VK_OEM_7,VK_OEM_2, 
     212   'Z','X','C','V','B','N','M',VK_OEM_COMMA,VK_OEM_PERIOD,VK_OEM_MINUS, 
    158213   VK_OEM_102 /* the 102nd key (actually to the right of l-shift) */ 
    159214}; 
     
    162217{ 
    163218/* NOTE: this layout must concur with the scan codes layout above */ 
    164    VK_OEM_3,VK_1,VK_2,VK_3,VK_4,VK_5,VK_6,VK_7,VK_8,VK_9,VK_0,VK_OEM_MINUS,VK_OEM_PLUS, 
    165    VK_Q,VK_W,VK_E,VK_R,VK_T,VK_Z,VK_U,VK_I,VK_O,VK_P,VK_OEM_4,VK_OEM_6, 
    166    VK_A,VK_S,VK_D,VK_F,VK_G,VK_H,VK_J,VK_K,VK_L,VK_OEM_1,VK_OEM_7,VK_OEM_5, 
    167    VK_Y,VK_X,VK_C,VK_V,VK_B,VK_N,VK_M,VK_OEM_COMMA,VK_OEM_PERIOD,VK_OEM_2, 
     219   VK_OEM_3,'1','2','3','4','5','6','7','8','9','0',VK_OEM_MINUS,VK_OEM_PLUS, 
     220   'Q','W','E','R','T','Z','U','I','O','P',VK_OEM_4,VK_OEM_6, 
     221   'A','S','D','F','G','H','J','K','L',VK_OEM_1,VK_OEM_7,VK_OEM_5, 
     222   'Y','X','C','V','B','N','M',VK_OEM_COMMA,VK_OEM_PERIOD,VK_OEM_2, 
    168223   VK_OEM_102 /* the 102nd key (actually to the right of l-shift) */ 
    169224}; 
     
    172227{ 
    173228/* NOTE: this layout must concur with the scan codes layout above */ 
    174    VK_OEM_3,VK_1,VK_2,VK_3,VK_4,VK_5,VK_6,VK_7,VK_8,VK_9,VK_0,VK_OEM_MINUS,VK_OEM_PLUS, 
    175    VK_Q,VK_W,VK_E,VK_R,VK_T,VK_Z,VK_U,VK_I,VK_O,VK_P,VK_OEM_4,VK_OEM_6, 
    176    VK_A,VK_S,VK_D,VK_F,VK_G,VK_H,VK_J,VK_K,VK_L,VK_OEM_1,VK_OEM_7,VK_OEM_5, 
    177    VK_OEM_102,VK_Y,VK_X,VK_C,VK_V,VK_B,VK_N,VK_M,VK_OEM_COMMA,VK_OEM_PERIOD,VK_OEM_2 
     229   VK_OEM_3,'1','2','3','4','5','6','7','8','9','0',VK_OEM_MINUS,VK_OEM_PLUS, 
     230   'Q','W','E','R','T','Z','U','I','O','P',VK_OEM_4,VK_OEM_6, 
     231   'A','S','D','F','G','H','J','K','L',VK_OEM_1,VK_OEM_7,VK_OEM_5, 
     232   VK_OEM_102,'Y','X','C','V','B','N','M',VK_OEM_COMMA,VK_OEM_PERIOD,VK_OEM_2 
    178233}; 
    179234 
     
    181236{ 
    182237/* NOTE: this layout must concur with the scan codes layout above */ 
    183    VK_OEM_3,VK_1,VK_2,VK_3,VK_4,VK_5,VK_6,VK_7,VK_8,VK_9,VK_0,VK_OEM_MINUS,VK_OEM_PLUS, 
    184    VK_Q,VK_W,VK_E,VK_R,VK_T,VK_Y,VK_U,VK_I,VK_O,VK_P,VK_OEM_4,VK_OEM_6, 
    185    VK_A,VK_S,VK_D,VK_F,VK_G,VK_H,VK_J,VK_K,VK_L,VK_OEM_1,VK_OEM_8,VK_OEM_5, 
    186    VK_OEM_7,VK_Z,VK_X,VK_C,VK_V,VK_B,VK_N,VK_M,VK_OEM_COMMA,VK_OEM_PERIOD,VK_OEM_2, 
     238   VK_OEM_3,'1','2','3','4','5','6','7','8','9','0',VK_OEM_MINUS,VK_OEM_PLUS, 
     239   'Q','W','E','R','T','Y','U','I','O','P',VK_OEM_4,VK_OEM_6, 
     240   'A','S','D','F','G','H','J','K','L',VK_OEM_1,VK_OEM_8,VK_OEM_5, 
     241   VK_OEM_7,'Z','X','C','V','B','N','M',VK_OEM_COMMA,VK_OEM_PERIOD,VK_OEM_2, 
    187242   VK_OEM_102, /* the 102nd key (actually to the right of l-shift) */ 
    188243}; 
     
    191246{ 
    192247/* NOTE: this layout must concur with the scan codes layout above */ 
    193    VK_OEM_7,VK_1,VK_2,VK_3,VK_4,VK_5,VK_6,VK_7,VK_8,VK_9,VK_0,VK_OEM_4,VK_OEM_PLUS, 
    194    VK_A,VK_Z,VK_E,VK_R,VK_T,VK_Y,VK_U,VK_I,VK_O,VK_P,VK_OEM_6,VK_OEM_1, 
    195    VK_Q,VK_S,VK_D,VK_F,VK_G,VK_H,VK_J,VK_K,VK_L,VK_M,VK_OEM_3,VK_OEM_5, 
    196    VK_W,VK_X,VK_C,VK_V,VK_B,VK_N,VK_OEM_COMMA,VK_OEM_PERIOD,VK_OEM_2,VK_OEM_8, 
     248   VK_OEM_7,'1','2','3','4','5','6','7','8','9','0',VK_OEM_4,VK_OEM_PLUS, 
     249   'A','Z','E','R','T','Y','U','I','O','P',VK_OEM_6,VK_OEM_1, 
     250   'Q','S','D','F','G','H','J','K','L','M',VK_OEM_3,VK_OEM_5, 
     251   'W','X','C','V','B','N',VK_OEM_COMMA,VK_OEM_PERIOD,VK_OEM_2,VK_OEM_8, 
    197252   VK_OEM_102 /* the 102nd key (actually to the right of l-shift) */ 
    198253}; 
     
    201256{ 
    202257/* NOTE: this layout must concur with the scan codes layout above */ 
    203    VK_OEM_3,VK_1,VK_2,VK_3,VK_4,VK_5,VK_6,VK_7,VK_8,VK_9,VK_0,VK_OEM_4,VK_OEM_6, 
    204    VK_OEM_7,VK_OEM_COMMA,VK_OEM_PERIOD,VK_P,VK_Y,VK_F,VK_G,VK_C,VK_R,VK_L,VK_OEM_2,VK_OEM_PLUS, 
    205    VK_A,VK_O,VK_E,VK_U,VK_I,VK_D,VK_H,VK_T,VK_N,VK_S,VK_OEM_MINUS,VK_OEM_5, 
    206    VK_OEM_1,VK_Q,VK_J,VK_K,VK_X,VK_B,VK_M,VK_W,VK_V,VK_Z
     258   VK_OEM_3,'1','2','3','4','5','6','7','8','9','0',VK_OEM_4,VK_OEM_6, 
     259   VK_OEM_7,VK_OEM_COMMA,VK_OEM_PERIOD,'P','Y','F','G','C','R','L',VK_OEM_2,VK_OEM_PLUS, 
     260   'A','O','E','U','I','D','H','T','N','S',VK_OEM_MINUS,VK_OEM_5, 
     261   VK_OEM_1,'Q','J','K','X','B','M','W','V','Z'
    207262   VK_OEM_102 /* the 102nd key (actually to the right of l-shift) */ 
    208263}; 
     
    270325}; 
    271326 
    272 /*** French keyboard layout (contributed by Eric Pouech) */ 
     327/*** French keyboard layout (setxkbmap fr) */ 
    273328static const char main_key_FR[MAIN_LEN][4] = 
    274329{ 
    275  "²","&1","é2~","\"3#","'4{","(5[","-6|","è7`","_8\\","ç9^±","à0@",")°]","=+}", 
    276  "aA","zZ","eE¿","rR","tT","yY","uU","iI","oO","pP","^š","$£€", 
    277  "qQ","sSß","dD","fF","gG","hH","jJ","kK","lL","mM","ù%","*µ", 
     330 "²","&1","é2","\"3","'4","(5","-6","è7","_8","ç9","à0",")°","=+", 
     331 "aA","zZ","eE","rR","tT","yY","uU","iI","oO","pP","^š","$£", 
     332 "qQ","sS","dD","fF","gG","hH","jJ","kK","lL","mM","ù%","*µ", 
    278333 "wW","xX","cC","vV","bB","nN",",?",";.",":/","!§", 
    279334 "<>" 
     
    290345}; 
    291346 
    292 /*** German keyboard layout (contributed by Ulrich Weigand) */ 
     347/*** German keyboard layout (setxkbmap de) */ 
    293348static const char main_key_DE[MAIN_LEN][4] = 
    294349{ 
    295  "^°","1!","2\"²","3§³","4$","5%","6&","7/{","8([","9)]","0=}","ß?\\","'`", 
    296  "qQ@","wW","eE€","rR","tT","zZ","uU","iI","oO","pP","üÜ","+*~", 
    297  "aA","sS","dD","fF","gG","hH","jJ","kK","lL","öÖ","äÄ","#Ž", 
    298  "yY","xX","cC","vV","bB","nN","mMµ",",;",".:","-_", 
     350 "^°","1!","2\"","3§","4$","5%","6&","7/","8(","9)","0=","ß?","Ž`", 
     351 "qQ","wW","eE","rR","tT","zZ","uU","iI","oO","pP","üÜ","+*", 
     352 "aA","sS","dD","fF","gG","hH","jJ","kK","lL","öÖ","äÄ","#'", 
     353 "yY","xX","cC","vV","bB","nN","mM",",;",".:","-_", 
    299354 "<>|" 
    300355}; 
     
    319374}; 
    320375 
    321 /*** Swiss German keyboard layout (contributed by Jonathan Naylor) */ 
     376/*** Swiss German keyboard layout (setxkbmap ch -variant de) */ 
    322377static const char main_key_SG[MAIN_LEN][4] = 
    323378{ 
    324  "§°","1+|","2\"@","3*#","4ç","5%","6&¬","7/Š","8(¢","9)","0=","'?Ž","^`~", 
    325  "qQ","wW","eE","rR","tT","zZ","uU","iI","oO","pP","üè[","š!]", 
    326  "aA","sS","dD","fF","gG","hH","jJ","kK","lL","öé","äà{","$£}", 
     379 "§°","1+","2\"","3*","4ç","5%","6&","7/","8(","9)","0=","'?","^`", 
     380 "qQ","wW","eE","rR","tT","zZ","uU","iI","oO","pP","üè","š!", 
     381 "aA","sS","dD","fF","gG","hH","jJ","kK","lL","öé","äà","$£", 
    327382 "yY","xX","cC","vV","bB","nN","mM",",;",".:","-_", 
    328  "<>\\
    329 }; 
    330  
    331 /*** Swiss French keyboard layout (contributed by Philippe Froidevaux) */ 
     383 "<>
     384}; 
     385 
     386/*** Swiss French keyboard layout (setxkbmap ch -variant fr) */ 
    332387static const char main_key_SF[MAIN_LEN][4] = 
    333388{ 
    334  "§°","1+|","2\"@","3*#","4ç","5%","6&¬","7/Š","8(¢","9)","0=","'?Ž","^`~", 
    335  "qQ","wW","eE","rR","tT","zZ","uU","iI","oO","pP","èü[","š!]", 
    336  "aA","sS","dD","fF","gG","hH","jJ","kK","lL","éö","àä{","$£}", 
     389 "§°","1+","2\"","3*","4ç","5%","6&","7/","8(","9)","0=","'?","^`", 
     390 "qQ","wW","eE","rR","tT","zZ","uU","iI","oO","pP","èü","š!", 
     391 "aA","sS","dD","fF","gG","hH","jJ","kK","lL","éö","àä","$£", 
    337392 "yY","xX","cC","vV","bB","nN","mM",",;",".:","-_", 
    338  "<>\\
     393 "<>
    339394}; 
    340395 
     
    369424}; 
    370425 
    371 /*** Estonian keyboard layout (contributed by Raul Metsma zombi82@hot.ee) */ 
     426/*** Estonian keyboard layout (setxkbmap ee) */ 
    372427static const char main_key_ET[MAIN_LEN][4] = 
    373428{ 
    374  "·~","1!","2\"@","3#£","4€$","5%","6&","7/{","8([","9)]","0=}","+?\\","Ž`", 
    375  "qQ","wW","eE","rR","tT","yY","uU","iI","oO","pP","üÜ","õÕ§", 
    376  "aA","sS","dD","fF","gG","hH","jJ","kK","lL","öÖ","äÄ","'*œ", 
     429 "·~","1!","2\"","3#","4€","5%","6&","7/","8(","9)","0=","+?","Ž`", 
     430 "qQ","wW","eE","rR","tT","yY","uU","iI","oO","pP","üÜ","õÕ", 
     431 "aA","sS","dD","fF","gG","hH","jJ","kK","lL","öÖ","äÄ","'*", 
    377432 "zZ","xX","cC","vV","bB","nN","mM",",;",".:","-_", 
    378  "<>|
    379 }; 
    380  
    381 /*** Canadian French keyboard layout */ 
     433 "<>
     434}; 
     435 
     436/*** Canadian French keyboard layout (setxkbmap ca_enhanced) */ 
    382437static const char main_key_CF[MAIN_LEN][4] = 
    383438{ 
     
    389444}; 
    390445 
     446/*** Canadian French keyboard layout (setxkbmap ca -variant fr) */ 
     447static const char main_key_CA_fr[MAIN_LEN][4] = 
     448{ 
     449 "#|","1!","2\"","3/","4$","5%","6?","7&","8*","9(","0)","-_","=+", 
     450 "qQ","wW","eE","rR","tT","yY","uU","iI","oO","pP","^^","žš", 
     451 "aA","sS","dD","fF","gG","hH","jJ","kK","lL",";:","``","<>", 
     452 "zZ","xX","cC","vV","bB","nN","mM",",'",".","éÉ", 
     453 "«»" 
     454}; 
     455 
     456/*** Canadian keyboard layout (setxkbmap ca) */ 
     457static const char main_key_CA[MAIN_LEN][4] = 
     458{ 
     459 "/\\","1!¹¡","2@²","3#³£","4$Œ€","5%œ","6?Ÿ","7&","8*","9(","0)","-_","=+", 
     460 "qQ","wW","eE","rR","tT","yY","uU","iI","oOøØ","pPþÞ","^šš","çÇ~", 
     461 "aAæÆ","sSß§","dDðÐ","fF","gG","hH","jJ","kK","lL",";:Ž","èÈ","àÀ", 
     462 "zZ","xX","cC¢©","vV","bB","nN","mMµº",",'",".\"·÷","éÉ", 
     463 "ùÙ" 
     464}; 
     465 
    391466/*** Portuguese keyboard layout (setxkbmap pt) */ 
    392467static const char main_key_PT[MAIN_LEN][4] = 
     
    509584}; 
    510585 
     586/*** Ukrainian keyboard layout KOI8-U by O. Nykyforchyn */ 
     587/***  (as it appears on most of keyboards sold today)   */ 
     588static const char main_key_UA_std[MAIN_LEN][4] = 
     589{ 
     590 "­œ","1!","2\"","3'","4;","5%","6:","7?","8*","9(","0)","-_","=+", 
     591 "Êê","Ãã","Õõ","Ëë","Åå","Îî","Çç","Ûû","Ýý","Úú","Èè","§·", 
     592 "Ææ","ж","×÷","Áá","Ðð","Òò","Ïï","Ìì","Ää","Öö","€Ž","\\/", 
     593 "Ññ","Þþ","Óó","Íí","Éé","Ôô","Øø","Ââ","Àà",".,", 
     594 "<>" /* the phantom key */ 
     595}; 
     596 
     597/*** Russian keyboard layout KOI8-R (pair to the previous) */ 
     598static const char main_key_RU_std[MAIN_LEN][4] = 
     599{ 
     600 "£³","1!","2\"","3'","4;","5%","6:","7?","8*","9(","0)","-_","=+", 
     601 "Êê","Ãã","Õõ","Ëë","Åå","Îî","Çç","Ûû","Ýý","Úú","Èè","ßÿ", 
     602 "Ææ","Ùù","×÷","Áá","Ðð","Òò","Ïï","Ìì","Ää","Öö","Üü","\\/", 
     603 "Ññ","Þþ","Óó","Íí","Éé","Ôô","Øø","Ââ","Àà",".,", 
     604 "<>" /* the phantom key */ 
     605}; 
     606 
    511607/*** Spanish keyboard layout (setxkbmap es) */ 
    512608static const char main_key_ES[MAIN_LEN][4] = 
     
    529625}; 
    530626 
    531 /*** Hungarian keyboard layout (contributed by Zoltán Kovács) */ 
     627/*** Hungarian keyboard layout (setxkbmap hu) */ 
    532628static const char main_key_HU[MAIN_LEN][4] = 
    533629{ 
    534  "0§","1'~","2\"·","3+^","4!¢","5%°","6/²","7=`","8(ÿ","9)Ž","öÖœ","üÜš","óÓž", 
    535  "qQ\\","wW|","eE","rR","tT","zZ","uU","iIÍ","oOø","pP","õÕ÷","úÚ×", 
    536  "aA","sSð","dDÐ","fF[","gG]","hH","jJí","kK³","lL£","éÉ$","áÁß","ûÛ€", 
    537  "yY>","xX#","cC&","vV@","bB{","nN}","mM",",?;",".:>","-_*", 
    538  "íÍ<
     630 "0§","1'","2\"","3+","4!","5%","6/","7=","8(","9)","öÖ","üÜ","óÓ", 
     631 "qQ","wW","eE","rR","tT","zZ","uU","iI","oO","pP","õÕ","úÚ", 
     632 "aA","sS","dD","fF","gG","hH","jJ","kK","lL","éÉ","áÁ","ûÛ", 
     633 "yY","xX","cC","vV","bB","nN","mM",",?",".:","-_", 
     634 "íÍ
    539635}; 
    540636 
     
    559655}; 
    560656 
     657/*** Serbian keyboard layout (setxkbmap sr) ***/ 
     658static const char main_key_SR[MAIN_LEN][4] = 
     659{ 
     660 "`~","1!","2\"","3#","4$","5%","6&","7/","8(","9)","0=","'?","+*", 
     661 "©¹","ªº","Åå","Òò","Ôô","Úú","Õõ","Éé","Ïï","Ðð","Ûû","[]", 
     662 "Áá","Óó","Ää","Ææ","Çç","Èè","šž","Ëë","Ìì","Þþ","«»","-_", 
     663 "¡±","¯¿","Ãã","×÷","Ââ","Îî","Íí",",;",".:","Öö", 
     664 "<>" /* the phantom key */ 
     665}; 
     666 
     667/*** Serbian keyboard layout (setxkbmap us,sr) ***/ 
     668static const char main_key_US_SR[MAIN_LEN][4] = 
     669{ 
     670 "`~","1!","2@2\"","3#","4$","5%","6^6&","7&7/","8*8(","9(9)","0)0=","-_'?","=++*", 
     671 "qQ©¹","wWªº","eEÅå","rRÒò","tTÔô","yYÚú","uUÕõ","iIÉé","oOÏï","pPÐð","[{Ûû","]}[]", 
     672 "aAÁá","sSÓó","dDÄä","fFÆæ","gGÇç","hHÈè","jJšž","kKËë","lLÌì",";:Þþ","'\"«»","\\|-_", 
     673 "zZ¡±","xX¯¿","cCÃã","vV×÷","bBÂâ","nNÎî","mMÍí",",<,;",".>.:","/?Öö", 
     674 "<>" /* the phantom key */ 
     675}; 
     676 
    561677/*** Croatian keyboard layout specific for me <jelly@srk.fer.hr> ***/ 
    562678static const char main_key_HR_jelly[MAIN_LEN][4] = 
     
    605721 "qQ","wW","eE","rR","tT","yY","uU","iI","oO","pP","Ž`","[{", 
    606722 "aA","sS","dD","fF","gG","hH","jJ","kK","lL","çÇ","~^","]}", 
    607  "zZ","xX","cC","vV","bB","nN","mM",",<",".>",";:","/?", 
    608  "\\|" 
     723 "\\|","zZ","xX","cC","vV","bB","nN","mM",",<",".>",";:","/?", 
    609724}; 
    610725 
     
    615730 "qQ","wW","eE","rR","tT","yY","uU","iI","oO","pP","4`","[{*", 
    616731 "aA","sS","dD","fF","gG","hH","jJ","kK","lL","gG","~^","]}:", 
    617  "zZ","xX","cC","vV","bB","nN","mM",",<",".>",";:","/?0", 
    618  "\\|" 
     732 "\\|","zZ","xX","cC","vV","bB","nN","mM",",<",".>",";:","/?0" 
    619733}; 
    620734 
     
    630744/*** Slovak keyboard layout (see cssk_ibm(sk_qwerty) in xkbsel) 
    631745  - dead_abovering replaced with degree - no symbol in iso8859-2 
    632   - brokenbar replaced with bar                 */ 
     746  - brokenbar replaced with bar                                        */ 
    633747static const char main_key_SK[MAIN_LEN][4] = 
    634748{ 
     
    690804}; 
    691805 
    692 /*** Lithuanian (Baltic) keyboard layout (pc/lt in XFree86 4.3.0, contributed by Nerijus Baliûnas) */ 
     806/*** Lithuanian keyboard layout (setxkbmap lt) */ 
    693807static const char main_key_LT_B[MAIN_LEN][4] = 
    694808{ 
     
    696810 "qQ","wW","eE","rR","tT","yY","uU","iI","oO","pP","[{","]}", 
    697811 "aA","sS","dD","fF","gG","hH","jJ","kK","lL",";:","'\"", 
    698  "zZ","xX","cC","vV","bB","nN","mM",",<",".>","/?" 
     812 "zZ","xX","cC","vV","bB","nN","mM",",<",".>","/?", 
     813 "ª¬" 
    699814}; 
    700815 
     
    706821"aAæ","sSß","dD","fF","gG","hH","jJ","kK","lL","þÞ","iÝ",",;`", 
    707822"zZ","xX","cC","vV","bB","nN","mM","öÖ","çÇ",".:" 
     823}; 
     824 
     825/*** Turkish keyboard layout (setxkbmap tr) */ 
     826static const char main_key_TR[MAIN_LEN][4] = 
     827{ 
     828"\"\\","1!","2'","3^","4+","5%","6&","7/","8(","9)","0=","*?","-_", 
     829"qQ","wW","eE","rR","tT","yY","uU","\xb9I","oO","pP","\xbb\xab","üÜ", 
     830"aA","sS","dD","fF","gG","hH","jJ","kK","lL","\xba\xaa","i\0",",;", 
     831"zZ","xX","cC","vV","bB","nN","mM","öÖ","çÇ",".:", 
     832"<>" 
     833}; 
     834 
     835/*** Turkish F keyboard layout (setxkbmap trf) */ 
     836static const char main_key_TR_F[MAIN_LEN][4] = 
     837{ 
     838"+*","1!","2\"","3^#","4$","5%","6&","7'","8(","9)","0=","/?","-_", 
     839"fF","gG","\xbb\xab","\xb9I","oO","dD","rR","nN","hH","pP","qQ","wW", 
     840"uU","i\0","eE","aA","üÜ","tT","kK","mM","lL","yY","\xba\xaa","xX", 
     841"jJ","öÖ","vV","cC","çÇ","zZ","sS","bB",".:",",;", 
     842"<>" 
    708843}; 
    709844 
     
    757892 "aA¿Ä","sSËŠ","dD¡¯","fFŽâ","gGà¬","hHéç","jJèë","kKÒÉ","lLÊÈ",";:Ç«","\'\"§.","\\|£¥", 
    758893 "zZŒ(","xX»)","cCá©","vVÍÎ","bBÚ","nN×ì","mM·?",",<Á²",".>ãÌ","/?œÆ" 
    759 }; 
     894};  
    760895 
    761896/*** VNC keyboard layout */ 
     
    769904static const WORD main_key_vkey_vnc[MAIN_LEN] = 
    770905{ 
    771    VK_1,VK_2,VK_3,VK_4,VK_5,VK_6,VK_7,VK_8,VK_9,VK_0,VK_OEM_MINUS,VK_OEM_PLUS,VK_OEM_4,VK_OEM_6,VK_OEM_1,VK_OEM_7,VK_OEM_3,VK_OEM_COMMA,VK_OEM_PERIOD,VK_OEM_2,VK_OEM_5, 
    772    VK_A,VK_B,VK_C,VK_D,VK_E,VK_F,VK_G,VK_H,VK_I,VK_J,VK_K,VK_L,VK_M,VK_N,VK_O,VK_P,VK_Q,VK_R,VK_S,VK_T,VK_U,VK_V,VK_W,VK_X,VK_Y,VK_Z
     906   '1','2','3','4','5','6','7','8','9','0',VK_OEM_MINUS,VK_OEM_PLUS,VK_OEM_4,VK_OEM_6,VK_OEM_1,VK_OEM_7,VK_OEM_3,VK_OEM_COMMA,VK_OEM_PERIOD,VK_OEM_2,VK_OEM_5, 
     907   'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'
    773908   VK_OEM_102 
    774909}; 
     
    818953 {0x040c, "French keyboard layout", &main_key_FR, &main_key_scan_qwerty, &main_key_vkey_azerty}, 
    819954 {0x0c0c, "Canadian French keyboard layout", &main_key_CF, &main_key_scan_qwerty, &main_key_vkey_qwerty}, 
     955 {0x0c0c, "Canadian French keyboard layout (CA_fr)", &main_key_CA_fr, &main_key_scan_qwerty, &main_key_vkey_qwerty}, 
     956 {0x0c0c, "Canadian keyboard layout", &main_key_CA, &main_key_scan_qwerty, &main_key_vkey_qwerty}, 
    820957 {0x080c, "Belgian keyboard layout", &main_key_BE, &main_key_scan_qwerty, &main_key_vkey_azerty}, 
    821958 {0x0816, "Portuguese keyboard layout", &main_key_PT, &main_key_scan_qwerty, &main_key_vkey_qwerty}, 
     
    832969 {0x0419, "Russian phonetic keyboard layout", &main_key_RU_phonetic, &main_key_scan_qwerty, &main_key_vkey_qwerty}, 
    833970 {0x0422, "Ukrainian keyboard layout KOI8-U", &main_key_UA, &main_key_scan_qwerty, &main_key_vkey_qwerty}, 
     971 {0x0422, "Ukrainian keyboard layout (standard)", &main_key_UA_std, &main_key_scan_qwerty, &main_key_vkey_qwerty}, 
     972 {0x0419, "Russian keyboard layout (standard)", &main_key_RU_std, &main_key_scan_qwerty, &main_key_vkey_qwerty}, 
    834973 {0x040a, "Spanish keyboard layout", &main_key_ES, &main_key_scan_qwerty, &main_key_vkey_qwerty}, 
    835974 {0x0410, "Italian keyboard layout", &main_key_IT, &main_key_scan_qwerty, &main_key_vkey_qwerty}, 
     
    838977 {0x0415, "Polish (programmer's) keyboard layout", &main_key_PL, &main_key_scan_qwerty, &main_key_vkey_qwerty}, 
    839978 {0x0424, "Slovenian keyboard layout", &main_key_SI, &main_key_scan_qwerty, &main_key_vkey_qwertz}, 
     979 {0x0c1a, "Serbian keyboard layout sr", &main_key_SR, &main_key_scan_qwerty, &main_key_vkey_qwerty}, /* LANG_SERBIAN,SUBLANG_SERBIAN_CYRILLIC */ 
     980 {0x0c1a, "Serbian keyboard layout us,sr", &main_key_US_SR, &main_key_scan_qwerty, &main_key_vkey_qwerty}, /* LANG_SERBIAN,SUBLANG_SERBIAN_CYRILLIC */ 
    840981 {0x041a, "Croatian keyboard layout", &main_key_HR, &main_key_scan_qwerty, &main_key_vkey_qwertz}, 
    841982 {0x041a, "Croatian keyboard layout (specific)", &main_key_HR_jelly, &main_key_scan_qwerty, &main_key_vkey_qwerty}, 
    842  {0xe0010411, "Japanese 106 keyboard layout", &main_key_JA_jp106, &main_key_scan_qwerty, &main_key_vkey_qwerty}, 
    843  {0xe0010411, "Japanese pc98x1 keyboard layout", &main_key_JA_pc98x1, &main_key_scan_qwerty, &main_key_vkey_qwerty}, 
     983 {0x0411, "Japanese 106 keyboard layout", &main_key_JA_jp106, &main_key_scan_qwerty_jp106, &main_key_vkey_qwerty_jp106}, 
     984 {0x0411, "Japanese pc98x1 keyboard layout", &main_key_JA_pc98x1, &main_key_scan_qwerty, &main_key_vkey_qwerty}, 
    844985 {0x041b, "Slovak keyboard layout", &main_key_SK, &main_key_scan_qwerty, &main_key_vkey_qwerty}, 
    845986 {0x041b, "Slovak and Czech keyboard layout without dead keys", &main_key_SK_prog, &main_key_scan_qwerty, &main_key_vkey_qwerty}, 
     
    850991 {0x0427, "Lithuanian (Baltic) keyboard layout", &main_key_LT_B, &main_key_scan_qwerty, &main_key_vkey_qwerty}, 
    851992 {0x041f, "Turkish keyboard layout", &main_key_TK, &main_key_scan_qwerty, &main_key_vkey_qwerty}, 
     993 {0x041f, "Turkish keyboard layout tr", &main_key_TR, &main_key_scan_qwerty, &main_key_vkey_qwerty}, 
     994 {0x041f, "Turkish keyboard layout trf", &main_key_TR_F, &main_key_scan_qwerty, &main_key_vkey_qwerty}, 
    852995 {0x040d, "Israelian keyboard layout", &main_key_IL, &main_key_scan_qwerty, &main_key_vkey_qwerty}, 
    853996 {0x040d, "Israelian phonetic keyboard layout", &main_key_IL_phonetic, &main_key_scan_qwerty, &main_key_vkey_qwerty}, 
     
    8911034    0, 0, 0, 0, 0, 0, 0, 0,                                     /* FF58 */ 
    8921035    /* misc keys */ 
    893     VK_SELECT, VK_SNAPSHOT, VK_EXECUTE, VK_INSERT, 0, 0, 0,     /* FF60 */ 
    894     VK_APPS, 
    895     VK_CANCEL, VK_HELP, VK_CANCEL, VK_CANCEL, 0, 0, 0, 0,       /* FF68 */ 
     1036    VK_SELECT, VK_SNAPSHOT, VK_EXECUTE, VK_INSERT, 0,0,0, VK_APPS, /* FF60 */ 
     1037    0, VK_CANCEL, VK_HELP, VK_CANCEL, 0, 0, 0, 0,               /* FF68 */ 
    8961038    0, 0, 0, 0, 0, 0, 0, 0,                                     /* FF70 */ 
    8971039    /* keypad keys */ 
     
    9011043    0, 0, 0, 0, 0, VK_HOME, VK_LEFT, VK_UP,                     /* FF90 */ 
    9021044    VK_RIGHT, VK_DOWN, VK_PRIOR, VK_NEXT,                       /* FF98 */ 
    903     VK_END, 0, VK_INSERT, VK_DELETE, 
     1045    VK_END, VK_CLEAR, VK_INSERT, VK_DELETE, 
    9041046    0, 0, 0, 0, 0, 0, 0, 0,                                     /* FFA0 */ 
    9051047    0, 0, VK_MULTIPLY, VK_ADD,                                  /* FFA8 */ 
     
    9071049    VK_NUMPAD0, VK_NUMPAD1, VK_NUMPAD2, VK_NUMPAD3,             /* FFB0 */ 
    9081050    VK_NUMPAD4, VK_NUMPAD5, VK_NUMPAD6, VK_NUMPAD7, 
    909     VK_NUMPAD8, VK_NUMPAD9, 0, 0, 0, 0,                         /* FFB8 */ 
     1051    VK_NUMPAD8, VK_NUMPAD9, 0, 0, 0, VK_OEM_NEC_EQUAL,          /* FFB8 */ 
    9101052    /* function keys */ 
    9111053    VK_F1, VK_F2, 
    9121054    VK_F3, VK_F4, VK_F5, VK_F6, VK_F7, VK_F8, VK_F9, VK_F10,    /* FFC0 */ 
    913     VK_F11, VK_F12, VK_LWIN /*VK_F13*/, VK_RWIN /*VK_F14*/,     /* FFC8 */ 
    914     VK_F15, VK_F16, 0, 0, 
     1055    VK_F11, VK_F12, VK_F13, VK_F14, VK_F15, VK_F16, 0, 0,       /* FFC8 */ 
    9151056    0, 0, 0, 0, 0, 0, 0, 0,                                     /* FFD0 */ 
    9161057    0, 0, 0, 0, 0, 0, 0, 0,                                     /* FFD8 */ 
     
    9421083    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,              /* FF58 */ 
    9431084    /* misc keys */ 
    944     /*?*/ 0, 0x137, /*?*/ 0, 0x152, 0x00, 0x00, 0x00, 0x15D,     /* FF60 */ 
     1085    /*?*/ 0, 0x137, /*?*/ 0, 0x152, 0x00, 0x00, 0x00, 0x00,      /* FF60 */ 
    9451086    /*?*/ 0, /*?*/ 0, 0x38, 0x146, 0x00, 0x00, 0x00, 0x00,       /* FF68 */ 
    9461087    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,              /* FF70 */ 
     
    9521093    0x4D, 0x50, 0x49, 0x51, 0x4F, 0x4C, 0x52, 0x53,              /* FF98 */ 
    9531094    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,              /* FFA0 */ 
    954     0x00, 0x00, 0x37, 0x4E, /*?*/ 0, 0x4A, 0x53, 0x135,          /* FFA8 */ 
     1095    0x00, 0x00, 0x37, 0x4E, 0x53, 0x4A, 0x53, 0x135,             /* FFA8 */ 
    9551096    0x52, 0x4F, 0x50, 0x51, 0x4B, 0x4C, 0x4D, 0x47,              /* FFB0 */ 
    9561097    0x48, 0x49, 0x00, 0x00, 0x00, 0x00,                          /* FFB8 */ 
     
    9581099    0x3B, 0x3C, 
    9591100    0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44,              /* FFC0 */ 
    960     0x57, 0x58, 0x15B, 0x15C, 0x00, 0x00, 0x00, 0x00,            /* FFC8 */ 
     1101    0x57, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,              /* FFC8 */ 
    9611102    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,              /* FFD0 */ 
    9621103    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,              /* FFD8 */ 
     
    9681109}; 
    9691110 
     1111static const WORD xfree86_vendor_key_vkey[256] = 
     1112{ 
     1113    0, 0, 0, 0, 0, 0, 0, 0,                                     /* 1008FF00 */ 
     1114    0, 0, 0, 0, 0, 0, 0, 0,                                     /* 1008FF08 */ 
     1115    0, VK_VOLUME_DOWN, VK_VOLUME_MUTE, VK_VOLUME_UP,            /* 1008FF10 */ 
     1116    VK_MEDIA_PLAY_PAUSE, VK_MEDIA_STOP, 
     1117    VK_MEDIA_PREV_TRACK, VK_MEDIA_NEXT_TRACK, 
     1118    0, VK_LAUNCH_MAIL, 0, VK_BROWSER_SEARCH,                    /* 1008FF18 */ 
     1119    0, 0, 0, VK_BROWSER_HOME, 
     1120    0, 0, 0, 0, 0, 0, VK_BROWSER_BACK, VK_BROWSER_FORWARD,      /* 1008FF20 */ 
     1121    VK_BROWSER_STOP, VK_BROWSER_REFRESH, 0, 0, 0, 0, 0, 0,      /* 1008FF28 */ 
     1122    VK_BROWSER_FAVORITES, 0, VK_LAUNCH_MEDIA_SELECT, 0,         /* 1008FF30 */ 
     1123    0, 0, 0, 0, 
     1124    0, 0, 0, 0, 0, 0, 0, 0,                                     /* 1008FF38 */ 
     1125    0, 0, 0, 0, 0, 0, 0, 0,                                     /* 1008FF40 */ 
     1126    0, 0, 0, 0, 0, 0, 0, 0,                                     /* 1008FF48 */ 
     1127    0, 0, 0, 0, 0, 0, 0, 0,                                     /* 1008FF50 */ 
     1128    0, 0, 0, 0, 0, 0, 0, 0,                                     /* 1008FF58 */ 
     1129    0, 0, 0, 0, 0, 0, 0, 0,                                     /* 1008FF60 */ 
     1130    0, 0, 0, 0, 0, 0, 0, 0,                                     /* 1008FF68 */ 
     1131    0, 0, 0, 0, 0, 0, 0, 0,                                     /* 1008FF70 */ 
     1132    0, 0, 0, 0, 0, 0, 0, 0,                                     /* 1008FF78 */ 
     1133    0, 0, 0, 0, 0, 0, 0, 0,                                     /* 1008FF80 */ 
     1134    0, 0, 0, 0, 0, 0, 0, 0,                                     /* 1008FF88 */ 
     1135    0, 0, 0, 0, 0, 0, 0, 0,                                     /* 1008FF90 */ 
     1136    0, 0, 0, 0, 0, 0, 0, 0,                                     /* 1008FF98 */ 
     1137    0, 0, 0, 0, 0, 0, 0, 0,                                     /* 1008FFA0 */ 
     1138    0, 0, 0, 0, 0, 0, 0, 0,                                     /* 1008FFA8 */ 
     1139    0, 0, 0, 0, 0, 0, 0, 0,                                     /* 1008FFB0 */ 
     1140    0, 0, 0, 0, 0, 0, 0, 0,                                     /* 1008FFB8 */ 
     1141    0, 0, 0, 0, 0, 0, 0, 0,                                     /* 1008FFC0 */ 
     1142    0, 0, 0, 0, 0, 0, 0, 0,                                     /* 1008FFC8 */ 
     1143    0, 0, 0, 0, 0, 0, 0, 0,                                     /* 1008FFD0 */ 
     1144    0, 0, 0, 0, 0, 0, 0, 0,                                     /* 1008FFD8 */ 
     1145    0, 0, 0, 0, 0, 0, 0, 0,                                     /* 1008FFE0 */ 
     1146    0, 0, 0, 0, 0, 0, 0, 0,                                     /* 1008FFE8 */ 
     1147    0, 0, 0, 0, 0, 0, 0, 0,                                     /* 1008FFF0 */ 
     1148    0, 0, 0, 0, 0, 0, 0, 0                                      /* 1008FFF8 */ 
     1149}; 
    9701150 
    9711151/* Returns the Windows virtual key code associated with the X event <e> */ 
     
    9741154{ 
    9751155    KeySym keysym = 0; 
    976  
    977     if (xic) 
    978         XmbLookupString(xic, e, NULL, 0, &keysym, NULL); 
     1156    Status status; 
     1157    char buf[24]; 
     1158 
     1159    /* Clients should pass only KeyPress events to XmbLookupString */ 
     1160    if (xic && e->type == KeyPress) 
     1161        XmbLookupString(xic, e, buf, sizeof(buf), &keysym, &status); 
    9791162    else 
    980         XLookupString(e, NULL, 0, &keysym, NULL); 
    981  
    982     if ((keysym >= 0xFFAE) && (keysym <= 0xFFB9) && (keysym != 0xFFAF) 
    983         && (e->state & NumLockMask)) 
     1163        XLookupString(e, buf, sizeof(buf), &keysym, NULL); 
     1164 
     1165    if ((e->state & NumLockMask) && 
     1166        (keysym == XK_KP_Separator || keysym == XK_KP_Decimal || 
     1167         (keysym >= XK_KP_0 && keysym <= XK_KP_9))) 
    9841168        /* Only the Keypad keys 0-9 and . send different keysyms 
    9851169         * depending on the NumLock state */ 
     
    9931177static BOOL NumState=FALSE, CapsState=FALSE; 
    9941178 
     1179 
    9951180/*********************************************************************** 
    996  *           send_keyboard_input 
     1181 *           X11DRV_send_keyboard_input 
    9971182 */ 
    998 static void send_keyboard_input( WORD wVk, WORD wScan, DWORD dwFlags, DWORD time ) 
     1183void X11DRV_send_keyboard_input( WORD wVk, WORD wScan, DWORD dwFlags, DWORD time, 
     1184                                 DWORD dwExtraInfo, UINT injected_flags ) 
    9991185{ 
    10001186#ifndef OUTOFWINE 
    1001     INPUT input; 
    1002  
    1003     input.type             = WINE_INTERNAL_INPUT_KEYBOARD; 
    1004     input.u.ki.wVk         = wVk; 
    1005     input.u.ki.wScan       = wScan; 
    1006     input.u.ki.dwFlags     = dwFlags; 
    1007     input.u.ki.time        = time; 
    1008     input.u.ki.dwExtraInfo = 0; 
    1009     SendInput( 1, &input, sizeof(input) ); 
    1010 #else 
     1187    UINT message; 
     1188    KEYLP keylp; 
     1189    KBDLLHOOKSTRUCT hook; 
     1190    WORD wVkStripped; 
     1191 
     1192    wVk = LOBYTE(wVk); 
     1193 
     1194    /* strip left/right for menu, control, shift */ 
     1195    if (wVk == VK_LMENU || wVk == VK_RMENU) 
     1196        wVkStripped = VK_MENU; 
     1197    else if (wVk == VK_LCONTROL || wVk == VK_RCONTROL) 
     1198        wVkStripped = VK_CONTROL; 
     1199    else if (wVk == VK_LSHIFT || wVk == VK_RSHIFT) 
     1200        wVkStripped = VK_SHIFT; 
     1201    else 
     1202        wVkStripped = wVk; 
     1203 
     1204    keylp.lp2 = 0; 
     1205    keylp.lp1.count = 1; 
     1206    keylp.lp1.code = wScan; 
     1207    keylp.lp1.extended = (dwFlags & KEYEVENTF_EXTENDEDKEY) != 0; 
     1208    keylp.lp1.win_internal = 0; /* this has something to do with dialogs, 
     1209                                * don't remember where I read it - AK */ 
     1210                                /* it's '1' under windows, when a dialog box appears 
     1211                                 * and you press one of the underlined keys - DF*/ 
     1212 
     1213    /* note that there is a test for all this */ 
     1214    if (dwFlags & KEYEVENTF_KEYUP ) 
     1215    { 
     1216        message = WM_KEYUP; 
     1217        if ((key_state_table[VK_MENU] & 0x80) && 
     1218            ((wVkStripped == VK_MENU) || (wVkStripped == VK_CONTROL) 
     1219             || !(key_state_table[VK_CONTROL] & 0x80))) 
     1220        { 
     1221            if( TrackSysKey == VK_MENU || /* <ALT>-down/<ALT>-up sequence */ 
     1222                (wVkStripped != VK_MENU)) /* <ALT>-down...<something else>-up */ 
     1223                message = WM_SYSKEYUP; 
     1224            TrackSysKey = 0; 
     1225        } 
     1226        key_state_table[wVk] &= ~0x80; 
     1227        key_state_table[wVkStripped] &= ~0x80; 
     1228        keylp.lp1.previous = 1; 
     1229        keylp.lp1.transition = 1; 
     1230    } 
     1231    else 
     1232    { 
     1233        keylp.lp1.previous = (key_state_table[wVk] & 0x80) != 0; 
     1234        keylp.lp1.transition = 0; 
     1235        if (!(key_state_table[wVk] & 0x80)) key_state_table[wVk] ^= 0x01; 
     1236        key_state_table[wVk] |= 0xc0; 
     1237        key_state_table[wVkStripped] |= 0xc0; 
     1238 
     1239        message = WM_KEYDOWN; 
     1240        if ((key_state_table[VK_MENU] & 0x80) && !(key_state_table[VK_CONTROL] & 0x80)) 
     1241        { 
     1242            message = WM_SYSKEYDOWN; 
     1243            TrackSysKey = wVkStripped; 
     1244        } 
     1245    } 
     1246 
     1247    keylp.lp1.context = (key_state_table[VK_MENU] & 0x80) != 0; /* 1 if alt */ 
     1248 
     1249    TRACE_(key)(" wParam=%04x, lParam=%08lx, InputKeyState=%x\n", 
     1250                wVk, keylp.lp2, key_state_table[wVk] ); 
     1251 
     1252    hook.vkCode      = wVk; 
     1253    hook.scanCode    = wScan; 
     1254    hook.flags       = (keylp.lp2 >> 24) | injected_flags; 
     1255    hook.time        = time; 
     1256    hook.dwExtraInfo = dwExtraInfo; 
     1257    if (HOOK_CallHooks( WH_KEYBOARD_LL, HC_ACTION, message, (LPARAM)&hook, TRUE )) return; 
     1258 
     1259    SERVER_START_REQ( send_hardware_message ) 
     1260    { 
     1261        req->id       = (injected_flags & LLKHF_INJECTED) ? 0 : GetCurrentThreadId(); 
     1262        req->win      = 0; 
     1263        req->msg      = message; 
     1264        req->wparam   = wVk; 
     1265        req->lparam   = keylp.lp2; 
     1266        req->x        = cursor_pos.x; 
     1267        req->y        = cursor_pos.y; 
     1268        req->time     = time; 
     1269        req->info     = dwExtraInfo; 
     1270        wine_server_call( req ); 
     1271    } 
     1272    SERVER_END_REQ; 
     1273#else // OUTOFWINE defined 
    10111274    // fill out our global structure 
    10121275    wineKeyboardInfo->wVk = wVk; 
     
    10141277    wineKeyboardInfo->dwFlags = dwFlags; 
    10151278    wineKeyboardInfo->time = time; 
    1016 #endif 
     1279#endif // OUTOFWINE defined 
    10171280} 
    10181281 
    10191282 
    10201283/********************************************************************** 
    1021  *      KEYBOARD_GenerateMsg 
     1284 *             KEYBOARD_GenerateMsg 
    10221285 * 
    10231286 * Generate Down+Up messages when NumLock or CapsLock is pressed. 
     
    10361299       And from there, a 'release' event will switch off the toggle key. */ 
    10371300    *State=FALSE; 
    1038     TRACE("INTERM : don\'t treat release of toggle key. InputKeyStateTable[%#x] = %#x\n",vkey,pKeyStateTable[vkey]); 
     1301    TRACE("INTERM : don't treat release of toggle key. key_state_table[%#x] = %#x\n", 
     1302          vkey,key_state_table[vkey]); 
    10391303  } else 
    10401304    { 
    10411305        down = (vkey==VK_NUMLOCK ? KEYEVENTF_EXTENDEDKEY : 0); 
    10421306        up = (vkey==VK_NUMLOCK ? KEYEVENTF_EXTENDEDKEY : 0) | KEYEVENTF_KEYUP; 
    1043         if ( pKeyStateTable[vkey] & 0x1 ) /* it was ON */ 
     1307        if ( key_state_table[vkey] & 0x1 ) /* it was ON */ 
    10441308          { 
    10451309            if (Evtype!=KeyPress) 
    10461310              { 
    10471311                TRACE("ON + KeyRelease => generating DOWN and UP messages.\n"); 
    1048                 send_keyboard_input( vkey, scan, down, event_time ); 
    1049                 send_keyboard_input( vkey, scan, up, event_time ); 
     1312                X11DRV_send_keyboard_input( vkey, scan, down, event_time, 0, 0 ); 
     1313                X11DRV_send_keyboard_input( vkey, scan, up, event_time, 0, 0 ); 
    10501314                *State=FALSE; 
    1051                 pKeyStateTable[vkey] &= ~0x01; /* Toggle state to off. */ 
     1315                key_state_table[vkey] &= ~0x01; /* Toggle state to off. */ 
    10521316              } 
    10531317          } 
     
    10561320            { 
    10571321              TRACE("OFF + Keypress => generating DOWN and UP messages.\n"); 
    1058               send_keyboard_input( vkey, scan, down, event_time ); 
    1059               send_keyboard_input( vkey, scan, up, event_time ); 
     1322              X11DRV_send_keyboard_input( vkey, scan, down, event_time, 0, 0 ); 
     1323              X11DRV_send_keyboard_input( vkey, scan, up, event_time, 0, 0 ); 
    10601324              *State=TRUE; /* Goes to intermediary state before going to ON */ 
    1061               <