- Timestamp:
- 05/08/07 10:47:31 (2 years ago)
- Files:
-
- trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk (modified) (1 diff)
- trunk/src/VBox/Frontends/VirtualBox/include/XKeyboard.h (modified) (1 diff)
- trunk/src/VBox/Frontends/VirtualBox/src/linux/XKeyboard.cpp (modified) (3 diffs)
- trunk/src/VBox/Frontends/VirtualBox/src/linux/XKeyboardNew.cpp (modified) (5 diffs)
- trunk/src/VBox/Frontends/VirtualBox/src/linux/keyboard.c (modified) (99 diffs)
- trunk/src/VBox/Frontends/VirtualBox/src/linux/keyboard_outofwine.h (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk
r2478 r2529 148 148 src/VBoxFBDDRAW.cpp 149 149 150 ifdef XKEYBOARD_NEW151 VirtualBox_SOURCES.linux = \152 src/linux/XKeyboardNew.cpp153 else154 150 VirtualBox_SOURCES.linux = \ 155 151 src/linux/XKeyboard.cpp \ 156 src/linux/keyboard.c 157 endif 152 src/linux/keyboard.c \ 153 src/linux/XKeyboardNew.cpp 158 154 159 155 VirtualBox_SOURCES.darwin = \ trunk/src/VBox/Frontends/VirtualBox/include/XKeyboard.h
r382 r2529 44 44 int getKeysymsPerKeycode(); 45 45 46 // initialize the X keyboard subsystem, safe for use on remote X servers 47 bool initXKeyboardSafe(Display *dpy); 48 // our custom keyboard handler, safe for use on remote X servers 49 void 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 52 int getKeysymsPerKeycodeSafe(); 53 46 54 47 55 #endif // __XKeyboard_h__ trunk/src/VBox/Frontends/VirtualBox/src/linux/XKeyboard.cpp
r382 r2529 51 51 * within our environment. 52 52 */ 53 bool initXKeyboard (Display *dpy)53 bool initXKeyboardSafe(Display *dpy) 54 54 { 55 55 // update the global display pointer … … 63 63 * possible to undo the dreaded scancode to X11 conversion. Sigh! 64 64 */ 65 void handleXKeyEvent (Display *dpy, XEvent *event, WINEKEYBOARDINFO *wineKbdInfo)65 void handleXKeyEventSafe(Display *dpy, XEvent *event, WINEKEYBOARDINFO *wineKbdInfo) 66 66 { 67 67 // update the global display pointer … … 71 71 } 72 72 73 int getKeysymsPerKeycode ()73 int getKeysymsPerKeycodeSafe() 74 74 { 75 75 return X11DRV_GetKeysymsPerKeycode(); trunk/src/VBox/Frontends/VirtualBox/src/linux/XKeyboardNew.cpp
r1558 r2529 24 24 #include <XKeyboard.h> 25 25 #include <cstring> 26 #include <cstdlib> 26 27 27 28 #define LOG_GROUP LOG_GROUP_GUI … … 53 54 54 55 static int keysyms_per_keycode; /** Number of keyboard language layouts the host has */ 56 static bool remote_display = false; /** Are we displaying on a remote X server? */ 55 57 56 58 /** 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 58 61 * so that Dmitry can press <hostkey>+Q while using his Cyrillic keyboard layout :) 59 62 */ … … 62 65 int min, max; 63 66 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")); 64 76 /* Find out how approximately how many keys there are on the keyboard, needed for the next 65 77 call */ … … 76 88 * Convert X11 keycodes back to scancodes. 77 89 */ 78 void handleXKeyEvent(Display * /* dpy */, XEvent *event, WINEKEYBOARDINFO *wineKbdInfo)90 void handleXKeyEvent(Display * dpy, XEvent *event, WINEKEYBOARDINFO *wineKbdInfo) 79 91 { 80 92 unsigned int uKeyCode = event->xkey.keycode; 93 94 if (remote_display == true) 95 { 96 handleXKeyEventSafe(dpy, event, wineKbdInfo); 97 return; 98 } 81 99 memset(reinterpret_cast<void *>(wineKbdInfo), 0, sizeof(WINEKEYBOARDINFO)); 82 100 /* Basic scancodes are translated to keycodes by adding 8, so we just subtract again. */ … … 107 125 int getKeysymsPerKeycode() 108 126 { 127 if (remote_display == true) 128 return getKeysymsPerKeycodeSafe(); 109 129 return keysyms_per_keycode; 110 130 } trunk/src/VBox/Frontends/VirtualBox/src/linux/keyboard.c
r382 r2529 21 21 * You should have received a copy of the GNU Lesser General Public 22 22 * License along with this library; if not, write to the Free Software 23 * Foundation, Inc., 5 9 Temple Place, Suite 330, Boston, MA 02111-1307USA23 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 24 24 */ 25 26 // our master define to make this module usable outside wide 25 // our master define to make this module usable outside wine 26 27 27 #define OUTOFWINE 28 28 … … 30 30 #include "keyboard_outofwine.h" 31 31 int use_xkb = 1; 32 #endif 32 #endif // OUTOFWINE defined 33 33 34 34 #ifndef OUTOFWINE 35 35 #include "config.h" 36 #endif 36 #endif // OUTOFWINE not defined 37 37 38 38 #include <X11/Xatom.h> … … 41 41 #include <X11/Xresource.h> 42 42 #include <X11/Xutil.h> 43 #ifdef HAVE_X KB43 #ifdef HAVE_X11_XKBLIB_H 44 44 #include <X11/XKBlib.h> 45 45 #endif … … 60 60 #include "win.h" 61 61 #include "x11drv.h" 62 #include "wine/server.h" 62 63 #include "wine/unicode.h" 63 64 #include "wine/debug.h" … … 65 66 WINE_DEFAULT_DEBUG_CHANNEL(keyboard); 66 67 WINE_DECLARE_DEBUG_CHANNEL(key); 67 WINE_DECLARE_DEBUG_CHANNEL(dinput); 68 #endif // OUTOFWINE 68 #endif // OUTOFWINE not defined 69 70 typedef 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 */ 96 BYTE key_state_table[256]; 97 98 static BYTE TrackSysKey = 0; /* determine whether ALT key up will cause a WM_SYSKEYUP 99 or a WM_KEYUP message */ 69 100 70 101 static int min_keycode, max_keycode, keysyms_per_keycode; 71 102 static WORD keyc2vkey[256], keyc2scan[256]; 72 103 73 static LPBYTE pKeyStateTable;74 104 static int NumLockMask, AltGrMask; /* mask in the XKeyEvent state */ 75 105 static int kcControl, kcAlt, kcShift, kcNumLock, kcCapsLock; /* keycodes */ … … 139 169 }; 140 170 171 static 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 141 186 static const WORD main_key_vkey_qwerty[MAIN_LEN] = 142 187 { 143 188 /* 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, 148 193 VK_OEM_102 /* the 102nd key (actually to the right of l-shift) */ 149 194 }; 150 195 196 static 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 151 206 static const WORD main_key_vkey_qwerty_v2[MAIN_LEN] = 152 207 { 153 208 /* 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, 158 213 VK_OEM_102 /* the 102nd key (actually to the right of l-shift) */ 159 214 }; … … 162 217 { 163 218 /* 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, 168 223 VK_OEM_102 /* the 102nd key (actually to the right of l-shift) */ 169 224 }; … … 172 227 { 173 228 /* 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_2229 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 178 233 }; 179 234 … … 181 236 { 182 237 /* 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, 187 242 VK_OEM_102, /* the 102nd key (actually to the right of l-shift) */ 188 243 }; … … 191 246 { 192 247 /* 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, 197 252 VK_OEM_102 /* the 102nd key (actually to the right of l-shift) */ 198 253 }; … … 201 256 { 202 257 /* 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', 207 262 VK_OEM_102 /* the 102nd key (actually to the right of l-shift) */ 208 263 }; … … 270 325 }; 271 326 272 /*** French keyboard layout ( contributed by Eric Pouech) */327 /*** French keyboard layout (setxkbmap fr) */ 273 328 static const char main_key_FR[MAIN_LEN][4] = 274 329 { 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","ù%","*µ", 278 333 "wW","xX","cC","vV","bB","nN",",?",";.",":/","!§", 279 334 "<>" … … 290 345 }; 291 346 292 /*** German keyboard layout ( contributed by Ulrich Weigand) */347 /*** German keyboard layout (setxkbmap de) */ 293 348 static const char main_key_DE[MAIN_LEN][4] = 294 349 { 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",",;",".:","-_", 299 354 "<>|" 300 355 }; … … 319 374 }; 320 375 321 /*** Swiss German keyboard layout ( contributed by Jonathan Naylor) */376 /*** Swiss German keyboard layout (setxkbmap ch -variant de) */ 322 377 static const char main_key_SG[MAIN_LEN][4] = 323 378 { 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","öé","äà","$£", 327 382 "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) */ 332 387 static const char main_key_SF[MAIN_LEN][4] = 333 388 { 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","éö","àä","$£", 337 392 "yY","xX","cC","vV","bB","nN","mM",",;",".:","-_", 338 "<> \\"393 "<>" 339 394 }; 340 395 … … 369 424 }; 370 425 371 /*** Estonian keyboard layout ( contributed by Raul Metsma zombi82@hot.ee) */426 /*** Estonian keyboard layout (setxkbmap ee) */ 372 427 static const char main_key_ET[MAIN_LEN][4] = 373 428 { 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","öÖ","äÄ","'*", 377 432 "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) */ 382 437 static const char main_key_CF[MAIN_LEN][4] = 383 438 { … … 389 444 }; 390 445 446 /*** Canadian French keyboard layout (setxkbmap ca -variant fr) */ 447 static 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) */ 457 static 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 391 466 /*** Portuguese keyboard layout (setxkbmap pt) */ 392 467 static const char main_key_PT[MAIN_LEN][4] = … … 509 584 }; 510 585 586 /*** Ukrainian keyboard layout KOI8-U by O. Nykyforchyn */ 587 /*** (as it appears on most of keyboards sold today) */ 588 static 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) */ 598 static 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 511 607 /*** Spanish keyboard layout (setxkbmap es) */ 512 608 static const char main_key_ES[MAIN_LEN][4] = … … 529 625 }; 530 626 531 /*** Hungarian keyboard layout ( contributed by Zoltán Kovács) */627 /*** Hungarian keyboard layout (setxkbmap hu) */ 532 628 static const char main_key_HU[MAIN_LEN][4] = 533 629 { 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 "íÍ" 539 635 }; 540 636 … … 559 655 }; 560 656 657 /*** Serbian keyboard layout (setxkbmap sr) ***/ 658 static 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) ***/ 668 static 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 561 677 /*** Croatian keyboard layout specific for me <jelly@srk.fer.hr> ***/ 562 678 static const char main_key_HR_jelly[MAIN_LEN][4] = … … 605 721 "qQ","wW","eE","rR","tT","yY","uU","iI","oO","pP","Ž`","[{", 606 722 "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",",<",".>",";:","/?", 609 724 }; 610 725 … … 615 730 "qQ","wW","eE","rR","tT","yY","uU","iI","oO","pP","4`","[{*", 616 731 "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" 619 733 }; 620 734 … … 630 744 /*** Slovak keyboard layout (see cssk_ibm(sk_qwerty) in xkbsel) 631 745 - dead_abovering replaced with degree - no symbol in iso8859-2 632 - brokenbar replaced with bar */746 - brokenbar replaced with bar */ 633 747 static const char main_key_SK[MAIN_LEN][4] = 634 748 { … … 690 804 }; 691 805 692 /*** Lithuanian (Baltic) keyboard layout (pc/lt in XFree86 4.3.0, contributed by Nerijus Baliûnas) */806 /*** Lithuanian keyboard layout (setxkbmap lt) */ 693 807 static const char main_key_LT_B[MAIN_LEN][4] = 694 808 { … … 696 810 "qQ","wW","eE","rR","tT","yY","uU","iI","oO","pP","[{","]}", 697 811 "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 "ª¬" 699 814 }; 700 815 … … 706 821 "aAæ","sSß","dD","fF","gG","hH","jJ","kK","lL","þÞ","iÝ",",;`", 707 822 "zZ","xX","cC","vV","bB","nN","mM","öÖ","çÇ",".:" 823 }; 824 825 /*** Turkish keyboard layout (setxkbmap tr) */ 826 static 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) */ 836 static 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 "<>" 708 843 }; 709 844 … … 757 892 "aA¿Ä","sSËŠ","dD¡¯","fFŽâ","gGà¬","hHéç","jJèë","kKÒÉ","lLÊÈ",";:Ç«","\'\"§.","\\|£¥", 758 893 "zZŒ(","xX»)","cCá©","vVÍÎ","bBÚ","nN×ì","mM·?",",<Á²",".>ãÌ","/?œÆ" 759 }; 894 }; 760 895 761 896 /*** VNC keyboard layout */ … … 769 904 static const WORD main_key_vkey_vnc[MAIN_LEN] = 770 905 { 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', 773 908 VK_OEM_102 774 909 }; … … 818 953 {0x040c, "French keyboard layout", &main_key_FR, &main_key_scan_qwerty, &main_key_vkey_azerty}, 819 954 {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}, 820 957 {0x080c, "Belgian keyboard layout", &main_key_BE, &main_key_scan_qwerty, &main_key_vkey_azerty}, 821 958 {0x0816, "Portuguese keyboard layout", &main_key_PT, &main_key_scan_qwerty, &main_key_vkey_qwerty}, … … 832 969 {0x0419, "Russian phonetic keyboard layout", &main_key_RU_phonetic, &main_key_scan_qwerty, &main_key_vkey_qwerty}, 833 970 {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}, 834 973 {0x040a, "Spanish keyboard layout", &main_key_ES, &main_key_scan_qwerty, &main_key_vkey_qwerty}, 835 974 {0x0410, "Italian keyboard layout", &main_key_IT, &main_key_scan_qwerty, &main_key_vkey_qwerty}, … … 838 977 {0x0415, "Polish (programmer's) keyboard layout", &main_key_PL, &main_key_scan_qwerty, &main_key_vkey_qwerty}, 839 978 {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 */ 840 981 {0x041a, "Croatian keyboard layout", &main_key_HR, &main_key_scan_qwerty, &main_key_vkey_qwertz}, 841 982 {0x041a, "Croatian keyboard layout (specific)", &main_key_HR_jelly, &main_key_scan_qwerty, &main_key_vkey_qwerty}, 842 {0x e0010411, "Japanese 106 keyboard layout", &main_key_JA_jp106, &main_key_scan_qwerty, &main_key_vkey_qwerty},843 {0x e0010411, "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}, 844 985 {0x041b, "Slovak keyboard layout", &main_key_SK, &main_key_scan_qwerty, &main_key_vkey_qwerty}, 845 986 {0x041b, "Slovak and Czech keyboard layout without dead keys", &main_key_SK_prog, &main_key_scan_qwerty, &main_key_vkey_qwerty}, … … 850 991 {0x0427, "Lithuanian (Baltic) keyboard layout", &main_key_LT_B, &main_key_scan_qwerty, &main_key_vkey_qwerty}, 851 992 {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}, 852 995 {0x040d, "Israelian keyboard layout", &main_key_IL, &main_key_scan_qwerty, &main_key_vkey_qwerty}, 853 996 {0x040d, "Israelian phonetic keyboard layout", &main_key_IL_phonetic, &main_key_scan_qwerty, &main_key_vkey_qwerty}, … … 891 1034 0, 0, 0, 0, 0, 0, 0, 0, /* FF58 */ 892 1035 /* 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 */ 896 1038 0, 0, 0, 0, 0, 0, 0, 0, /* FF70 */ 897 1039 /* keypad keys */ … … 901 1043 0, 0, 0, 0, 0, VK_HOME, VK_LEFT, VK_UP, /* FF90 */ 902 1044 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, 904 1046 0, 0, 0, 0, 0, 0, 0, 0, /* FFA0 */ 905 1047 0, 0, VK_MULTIPLY, VK_ADD, /* FFA8 */ … … 907 1049 VK_NUMPAD0, VK_NUMPAD1, VK_NUMPAD2, VK_NUMPAD3, /* FFB0 */ 908 1050 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 */ 910 1052 /* function keys */ 911 1053 VK_F1, VK_F2, 912 1054 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 */ 915 1056 0, 0, 0, 0, 0, 0, 0, 0, /* FFD0 */ 916 1057 0, 0, 0, 0, 0, 0, 0, 0, /* FFD8 */ … … 942 1083 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* FF58 */ 943 1084 /* misc keys */ 944 /*?*/ 0, 0x137, /*?*/ 0, 0x152, 0x00, 0x00, 0x00, 0x 15D,/* FF60 */1085 /*?*/ 0, 0x137, /*?*/ 0, 0x152, 0x00, 0x00, 0x00, 0x00, /* FF60 */ 945 1086 /*?*/ 0, /*?*/ 0, 0x38, 0x146, 0x00, 0x00, 0x00, 0x00, /* FF68 */ 946 1087 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* FF70 */ … … 952 1093 0x4D, 0x50, 0x49, 0x51, 0x4F, 0x4C, 0x52, 0x53, /* FF98 */ 953 1094 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 */ 955 1096 0x52, 0x4F, 0x50, 0x51, 0x4B, 0x4C, 0x4D, 0x47, /* FFB0 */ 956 1097 0x48, 0x49, 0x00, 0x00, 0x00, 0x00, /* FFB8 */ … … 958 1099 0x3B, 0x3C, 959 1100 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44, /* FFC0 */ 960 0x57, 0x58, 0x 15B, 0x15C, 0x00, 0x00, 0x00, 0x00,/* FFC8 */1101 0x57, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* FFC8 */ 961 1102 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* FFD0 */ 962 1103 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* FFD8 */ … … 968 1109 }; 969 1110 1111 static 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 }; 970 1150 971 1151 /* Returns the Windows virtual key code associated with the X event <e> */ … … 974 1154 { 975 1155 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); 979 1162 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))) 984 1168 /* Only the Keypad keys 0-9 and . send different keysyms 985 1169 * depending on the NumLock state */ … … 993 1177 static BOOL NumState=FALSE, CapsState=FALSE; 994 1178 1179 995 1180 /*********************************************************************** 996 * send_keyboard_input1181 * X11DRV_send_keyboard_input 997 1182 */ 998 static void send_keyboard_input( WORD wVk, WORD wScan, DWORD dwFlags, DWORD time ) 1183 void X11DRV_send_keyboard_input( WORD wVk, WORD wScan, DWORD dwFlags, DWORD time, 1184 DWORD dwExtraInfo, UINT injected_flags ) 999 1185 { 1000 1186 #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 1011 1274 // fill out our global structure 1012 1275 wineKeyboardInfo->wVk = wVk; … … 1014 1277 wineKeyboardInfo->dwFlags = dwFlags; 1015 1278 wineKeyboardInfo->time = time; 1016 #endif 1279 #endif // OUTOFWINE defined 1017 1280 } 1018 1281 1019 1282 1020 1283 /********************************************************************** 1021 * KEYBOARD_GenerateMsg1284 * KEYBOARD_GenerateMsg 1022 1285 * 1023 1286 * Generate Down+Up messages when NumLock or CapsLock is pressed. … … 1036 1299 And from there, a 'release' event will switch off the toggle key. */ 1037 1300 *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]); 1039 1303 } else 1040 1304 { 1041 1305 down = (vkey==VK_NUMLOCK ? KEYEVENTF_EXTENDEDKEY : 0); 1042 1306 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 */ 1044 1308 { 1045 1309 if (Evtype!=KeyPress) 1046 1310 { 1047 1311 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 ); 1050 1314 *State=FALSE; 1051 pKeyStateTable[vkey] &= ~0x01; /* Toggle state to off. */1315 key_state_table[vkey] &= ~0x01; /* Toggle state to off. */ 1052 1316 } 1053 1317 } … … 1056 1320 { 1057 1321 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 ); 1060 1324 *State=TRUE; /* Goes to intermediary state before going to ON */ 1061 <

