summaryrefslogtreecommitdiff
path: root/input/layout/all_kbds
diff options
context:
space:
mode:
authorkarlf <[email protected]>2016-08-11 13:28:13 -0700
committerkarlf <[email protected]>2016-08-11 13:28:13 -0700
commit96eb96dfb613e4c745db6bd1f53a92fe7e2290fc (patch)
treead5f3ede5cbcd6b598677ce41bcf8318471bdd92 /input/layout/all_kbds
parent687b274aa38fd05c8c26e3068932121876d7f745 (diff)
Updated for "Windows 10 Anniversary Update" (Version 1607)
Diffstat (limited to 'input/layout/all_kbds')
-rw-r--r--input/layout/all_kbds/kbdfr/kbdfr.c491
-rw-r--r--input/layout/all_kbds/kbdfr/kbdfr.def4
-rw-r--r--input/layout/all_kbds/kbdfr/kbdfr.h66
-rw-r--r--input/layout/all_kbds/kbdfr/kbdfr.rc11
-rw-r--r--input/layout/all_kbds/kbdfr/kbdfr.vcxproj219
-rw-r--r--input/layout/all_kbds/kbdfr/kbdfr.vcxproj.Filters30
-rw-r--r--input/layout/all_kbds/kbdgr/kbdgr.c482
-rw-r--r--input/layout/all_kbds/kbdgr/kbdgr.def4
-rw-r--r--input/layout/all_kbds/kbdgr/kbdgr.h58
-rw-r--r--input/layout/all_kbds/kbdgr/kbdgr.rc11
-rw-r--r--input/layout/all_kbds/kbdgr/kbdgr.vcxproj219
-rw-r--r--input/layout/all_kbds/kbdgr/kbdgr.vcxproj.Filters30
12 files changed, 1625 insertions, 0 deletions
diff --git a/input/layout/all_kbds/kbdfr/kbdfr.c b/input/layout/all_kbds/kbdfr/kbdfr.c
new file mode 100644
index 00000000..784b9dd1
--- /dev/null
+++ b/input/layout/all_kbds/kbdfr/kbdfr.c
@@ -0,0 +1,491 @@
+/***************************************************************************\
+* Module Name: KBDFR.C
+*
+* keyboard layout for French
+*
+* Copyright (c) 1985-2000, Microsoft Corporation
+*
+* History:
+* KBDTOOL v3.11 - Created Thu Aug 24 18:10:18 2000
+\***************************************************************************/
+
+#include <windows.h>
+#include "kbd.h"
+#include "kbdFR.h"
+
+#if defined(_M_IA64)
+#pragma section(".data")
+#define ALLOC_SECTION_LDATA __declspec(allocate(".data"))
+#else
+#pragma data_seg(".data")
+#define ALLOC_SECTION_LDATA
+#endif
+
+/***************************************************************************\
+* ausVK[] - Virtual Scan Code to Virtual Key conversion table for French
+\***************************************************************************/
+
+static ALLOC_SECTION_LDATA USHORT ausVK[] = {
+ T00, T01, T02, T03, T04, T05, T06, T07,
+ T08, T09, T0A, T0B, T0C, T0D, T0E, T0F,
+ T10, T11, T12, T13, T14, T15, T16, T17,
+ T18, T19, T1A, T1B, T1C, T1D, T1E, T1F,
+ T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T2A, T2B, T2C, T2D, T2E, T2F,
+ T30, T31, T32, T33, T34, T35,
+
+ /*
+ * Right-hand Shift key must have KBDEXT bit set.
+ */
+ T36 | KBDEXT,
+
+ T37 | KBDMULTIVK, // numpad_* + Shift/Alt -> SnapShot
+
+ T38, T39, T3A, T3B, T3C, T3D, T3E,
+ T3F, T40, T41, T42, T43, T44,
+
+ /*
+ * NumLock Key:
+ * KBDEXT - VK_NUMLOCK is an Extended key
+ * KBDMULTIVK - VK_NUMLOCK or VK_PAUSE (without or with CTRL)
+ */
+ T45 | KBDEXT | KBDMULTIVK,
+
+ T46 | KBDMULTIVK,
+
+ /*
+ * Number Pad keys:
+ * KBDNUMPAD - digits 0-9 and decimal point.
+ * KBDSPECIAL - require special processing by Windows
+ */
+ T47 | KBDNUMPAD | KBDSPECIAL, // Numpad 7 (Home)
+ T48 | KBDNUMPAD | KBDSPECIAL, // Numpad 8 (Up),
+ T49 | KBDNUMPAD | KBDSPECIAL, // Numpad 9 (PgUp),
+ T4A,
+ T4B | KBDNUMPAD | KBDSPECIAL, // Numpad 4 (Left),
+ T4C | KBDNUMPAD | KBDSPECIAL, // Numpad 5 (Clear),
+ T4D | KBDNUMPAD | KBDSPECIAL, // Numpad 6 (Right),
+ T4E,
+ T4F | KBDNUMPAD | KBDSPECIAL, // Numpad 1 (End),
+ T50 | KBDNUMPAD | KBDSPECIAL, // Numpad 2 (Down),
+ T51 | KBDNUMPAD | KBDSPECIAL, // Numpad 3 (PgDn),
+ T52 | KBDNUMPAD | KBDSPECIAL, // Numpad 0 (Ins),
+ T53 | KBDNUMPAD | KBDSPECIAL, // Numpad . (Del),
+
+ T54, T55, T56, T57, T58, T59, T5A, T5B,
+ T5C, T5D, T5E, T5F, T60, T61, T62, T63,
+ T64, T65, T66, T67, T68, T69, T6A, T6B,
+ T6C, T6D, T6E, T6F, T70, T71, T72, T73,
+ T74, T75, T76, T77, T78, T79, T7A, T7B,
+ T7C, T7D, T7E
+
+};
+
+static ALLOC_SECTION_LDATA VSC_VK aE0VscToVk[] = {
+ { 0x10, X10 | KBDEXT }, // Speedracer: Previous Track
+ { 0x19, X19 | KBDEXT }, // Speedracer: Next Track
+ { 0x1D, X1D | KBDEXT }, // RControl
+ { 0x20, X20 | KBDEXT }, // Speedracer: Volume Mute
+ { 0x21, X21 | KBDEXT }, // Speedracer: Launch App 2
+ { 0x22, X22 | KBDEXT }, // Speedracer: Media Play/Pause
+ { 0x24, X24 | KBDEXT }, // Speedracer: Media Stop
+ { 0x2E, X2E | KBDEXT }, // Speedracer: Volume Down
+ { 0x30, X30 | KBDEXT }, // Speedracer: Volume Up
+ { 0x32, X32 | KBDEXT }, // Speedracer: Browser Home
+ { 0x35, X35 | KBDEXT }, // Numpad Divide
+ { 0x37, X37 | KBDEXT }, // Snapshot
+ { 0x38, X38 | KBDEXT }, // RMenu
+ { 0x47, X47 | KBDEXT }, // Home
+ { 0x48, X48 | KBDEXT }, // Up
+ { 0x49, X49 | KBDEXT }, // Prior
+ { 0x4B, X4B | KBDEXT }, // Left
+ { 0x4D, X4D | KBDEXT }, // Right
+ { 0x4F, X4F | KBDEXT }, // End
+ { 0x50, X50 | KBDEXT }, // Down
+ { 0x51, X51 | KBDEXT }, // Next
+ { 0x52, X52 | KBDEXT }, // Insert
+ { 0x53, X53 | KBDEXT }, // Delete
+ { 0x5B, X5B | KBDEXT }, // Left Win
+ { 0x5C, X5C | KBDEXT }, // Right Win
+ { 0x5D, X5D | KBDEXT }, // Application
+ { 0x5F, X5F | KBDEXT }, // Speedracer: Sleep
+ { 0x65, X65 | KBDEXT }, // Speedracer: Browser Search
+ { 0x66, X66 | KBDEXT }, // Speedracer: Browser Favorites
+ { 0x67, X67 | KBDEXT }, // Speedracer: Browser Refresh
+ { 0x68, X68 | KBDEXT }, // Speedracer: Browser Stop
+ { 0x69, X69 | KBDEXT }, // Speedracer: Browser Forward
+ { 0x6A, X6A | KBDEXT }, // Speedracer: Browser Back
+ { 0x6B, X6B | KBDEXT }, // Speedracer: Launch App 1
+ { 0x6C, X6C | KBDEXT }, // Speedracer: Launch Mail
+ { 0x6D, X6D | KBDEXT }, // Speedracer: Launch Media Selector
+ { 0x1C, X1C | KBDEXT }, // Numpad Enter
+ { 0x46, X46 | KBDEXT }, // Break (Ctrl + Pause)
+ { 0, 0 }
+};
+
+static ALLOC_SECTION_LDATA VSC_VK aE1VscToVk[] = {
+ { 0x1D, Y1D }, // Pause
+ { 0 , 0 }
+};
+
+/***************************************************************************\
+* aVkToBits[] - map Virtual Keys to Modifier Bits
+*
+* See kbd.h for a full description.
+*
+* French Keyboard has only three shifter keys:
+* SHIFT (L & R) affects alphabnumeric keys,
+* CTRL (L & R) is used to generate control characters
+* ALT (L & R) used for generating characters by number with numpad
+\***************************************************************************/
+static ALLOC_SECTION_LDATA VK_TO_BIT aVkToBits[] = {
+ { VK_SHIFT , KBDSHIFT },
+ { VK_CONTROL , KBDCTRL },
+ { VK_MENU , KBDALT },
+ { 0 , 0 }
+};
+
+/***************************************************************************\
+* aModification[] - map character modifier bits to modification number
+*
+* See kbd.h for a full description.
+*
+\***************************************************************************/
+
+static ALLOC_SECTION_LDATA MODIFIERS CharModifiers = {
+ &aVkToBits[0],
+ 6,
+ {
+ // Modification# // Keys Pressed
+ // ============= // =============
+ 0, //
+ 1, // Shift
+ 2, // Control
+ 4, // Shift + Control
+ SHFT_INVALID, // Menu
+ SHFT_INVALID, // Shift + Menu
+ 3 // Control + Menu
+ }
+};
+
+/***************************************************************************\
+*
+* aVkToWch2[] - Virtual Key to WCHAR translation for 2 shift states
+* aVkToWch3[] - Virtual Key to WCHAR translation for 3 shift states
+* aVkToWch4[] - Virtual Key to WCHAR translation for 4 shift states
+* aVkToWch5[] - Virtual Key to WCHAR translation for 5 shift states
+*
+* Table attributes: Unordered Scan, null-terminated
+*
+* Search this table for an entry with a matching Virtual Key to find the
+* corresponding unshifted and shifted WCHAR characters.
+*
+* Special values for VirtualKey (column 1)
+* 0xff - dead chars for the previous entry
+* 0 - terminate the list
+*
+* Special values for Attributes (column 2)
+* CAPLOK bit - CAPS-LOCK affect this key like SHIFT
+*
+* Special values for wch[*] (column 3 & 4)
+* WCH_NONE - No character
+* WCH_DEAD - Dead Key (diaresis) or invalid (US keyboard has none)
+* WCH_LGTR - Ligature (generates multiple characters)
+*
+\***************************************************************************/
+
+static ALLOC_SECTION_LDATA VK_TO_WCHARS2 aVkToWch2[] = {
+// | | Shift |
+// |=========|=========|
+ {VK_OEM_7 ,0 ,0x00b2 ,WCH_NONE },
+ {'1' ,CAPLOK ,'&' ,'1' },
+ {'A' ,CAPLOK ,'a' ,'A' },
+ {'Z' ,CAPLOK ,'z' ,'Z' },
+ {'R' ,CAPLOK ,'r' ,'R' },
+ {'T' ,CAPLOK ,'t' ,'T' },
+ {'Y' ,CAPLOK ,'y' ,'Y' },
+ {'U' ,CAPLOK ,'u' ,'U' },
+ {'I' ,CAPLOK ,'i' ,'I' },
+ {'O' ,CAPLOK ,'o' ,'O' },
+ {'P' ,CAPLOK ,'p' ,'P' },
+ {'Q' ,CAPLOK ,'q' ,'Q' },
+ {'S' ,CAPLOK ,'s' ,'S' },
+ {'D' ,CAPLOK ,'d' ,'D' },
+ {'F' ,CAPLOK ,'f' ,'F' },
+ {'G' ,CAPLOK ,'g' ,'G' },
+ {'H' ,CAPLOK ,'h' ,'H' },
+ {'J' ,CAPLOK ,'j' ,'J' },
+ {'K' ,CAPLOK ,'k' ,'K' },
+ {'L' ,CAPLOK ,'l' ,'L' },
+ {'M' ,CAPLOK ,'m' ,'M' },
+ {VK_OEM_3 ,CAPLOK ,0x00f9 ,'%' },
+ {'W' ,CAPLOK ,'w' ,'W' },
+ {'X' ,CAPLOK ,'x' ,'X' },
+ {'C' ,CAPLOK ,'c' ,'C' },
+ {'V' ,CAPLOK ,'v' ,'V' },
+ {'B' ,CAPLOK ,'b' ,'B' },
+ {'N' ,CAPLOK ,'n' ,'N' },
+ {VK_OEM_COMMA ,CAPLOK ,',' ,'?' },
+ {VK_OEM_PERIOD,CAPLOK ,';' ,'.' },
+ {VK_OEM_2 ,CAPLOK ,':' ,'/' },
+ {VK_OEM_8 ,CAPLOK ,'!' ,0x00a7 },
+ {VK_DECIMAL ,0 ,'.' ,'.' },
+ {VK_TAB ,0 ,'\t' ,'\t' },
+ {VK_ADD ,0 ,'+' ,'+' },
+ {VK_DIVIDE ,0 ,'/' ,'/' },
+ {VK_MULTIPLY ,0 ,'*' ,'*' },
+ {VK_SUBTRACT ,0 ,'-' ,'-' },
+ {0 ,0 ,0 ,0 }
+};
+
+static ALLOC_SECTION_LDATA VK_TO_WCHARS3 aVkToWch3[] = {
+// | | Shift | Ctrl |
+// |=========|=========|=========|
+ {VK_OEM_6 ,CAPLOK ,WCH_DEAD ,WCH_DEAD ,0x001b },
+ {0xff ,0 ,'^' ,0x00a8 ,WCH_NONE },
+ {VK_OEM_5 ,CAPLOK ,'*' ,0x00b5 ,0x001c },
+ {VK_OEM_102 ,0 ,'<' ,'>' ,0x001c },
+ {VK_BACK ,0 ,'\b' ,'\b' ,0x007f },
+ {VK_ESCAPE ,0 ,0x001b ,0x001b ,0x001b },
+ {VK_RETURN ,0 ,'\r' ,'\r' ,'\n' },
+ {VK_SPACE ,0 ,' ' ,' ' ,' ' },
+ {VK_CANCEL ,0 ,0x0003 ,0x0003 ,0x0003 },
+ {0 ,0 ,0 ,0 ,0 }
+};
+
+static ALLOC_SECTION_LDATA VK_TO_WCHARS4 aVkToWch4[] = {
+// | | Shift | Ctrl | Ctl+Alt|
+// |=========|=========|=========|=========|
+ {'2' ,CAPLOK ,0x00e9 ,'2' ,WCH_NONE ,WCH_DEAD },
+ {0xff ,0 ,WCH_NONE ,WCH_NONE ,WCH_NONE ,'~' },
+ {'3' ,CAPLOK ,'\"' ,'3' ,WCH_NONE ,'#' },
+ {'4' ,CAPLOK ,'\'' ,'4' ,WCH_NONE ,'{' },
+ {'7' ,CAPLOK ,0x00e8 ,'7' ,WCH_NONE ,WCH_DEAD },
+ {0xff ,0 ,WCH_NONE ,WCH_NONE ,WCH_NONE ,'`' },
+ {'0' ,CAPLOK ,0x00e0 ,'0' ,0x0000 ,'@' },
+ {VK_OEM_4 ,CAPLOK ,')' ,0x00b0 ,WCH_NONE ,']' },
+ {VK_OEM_PLUS ,CAPLOK ,'=' ,'+' ,WCH_NONE ,'}' },
+ {'E' ,CAPLOK ,'e' ,'E' ,WCH_NONE ,0x20ac },
+ {VK_OEM_1 ,CAPLOK ,'$' ,0x00a3 ,0x001d ,0x00a4 },
+ {0 ,0 ,0 ,0 ,0 ,0 }
+};
+
+static ALLOC_SECTION_LDATA VK_TO_WCHARS5 aVkToWch5[] = {
+// | | Shift | Ctrl | Ctl+Alt|S+Ctrl |
+// |=========|=========|=========|=========|=========|
+ {'5' ,CAPLOK ,'(' ,'5' ,WCH_NONE ,'[' ,0x001b },
+ {'6' ,CAPLOK ,'-' ,'6' ,WCH_NONE ,'|' ,0x001f },
+ {'8' ,CAPLOK ,'_' ,'8' ,WCH_NONE ,'\\' ,0x001c },
+ {'9' ,CAPLOK ,0x00e7 ,'9' ,WCH_NONE ,'^' ,0x001e },
+ {0 ,0 ,0 ,0 ,0 ,0 ,0 }
+};
+
+// Put this last so that VkKeyScan interprets number characters
+// as coming from the main section of the kbd (aVkToWch2 and
+// aVkToWch5) before considering the numpad (aVkToWch1).
+
+static ALLOC_SECTION_LDATA VK_TO_WCHARS1 aVkToWch1[] = {
+ { VK_NUMPAD0 , 0 , '0' },
+ { VK_NUMPAD1 , 0 , '1' },
+ { VK_NUMPAD2 , 0 , '2' },
+ { VK_NUMPAD3 , 0 , '3' },
+ { VK_NUMPAD4 , 0 , '4' },
+ { VK_NUMPAD5 , 0 , '5' },
+ { VK_NUMPAD6 , 0 , '6' },
+ { VK_NUMPAD7 , 0 , '7' },
+ { VK_NUMPAD8 , 0 , '8' },
+ { VK_NUMPAD9 , 0 , '9' },
+ { 0 , 0 , '\0' }
+};
+
+static ALLOC_SECTION_LDATA VK_TO_WCHAR_TABLE aVkToWcharTable[] = {
+ { (PVK_TO_WCHARS1)aVkToWch3, 3, sizeof(aVkToWch3[0]) },
+ { (PVK_TO_WCHARS1)aVkToWch4, 4, sizeof(aVkToWch4[0]) },
+ { (PVK_TO_WCHARS1)aVkToWch5, 5, sizeof(aVkToWch5[0]) },
+ { (PVK_TO_WCHARS1)aVkToWch2, 2, sizeof(aVkToWch2[0]) },
+ { (PVK_TO_WCHARS1)aVkToWch1, 1, sizeof(aVkToWch1[0]) },
+ { NULL, 0, 0 },
+};
+
+/***************************************************************************\
+* aKeyNames[], aKeyNamesExt[] - Virtual Scancode to Key Name tables
+*
+* Table attributes: Ordered Scan (by scancode), null-terminated
+*
+* Only the names of Extended, NumPad, Dead and Non-Printable keys are here.
+* (Keys producing printable characters are named by that character)
+\***************************************************************************/
+
+static ALLOC_SECTION_LDATA VSC_LPWSTR aKeyNames[] = {
+ 0x01, L"ECHAP",
+ 0x0e, L"RET.ARR",
+ 0x0f, L"TAB",
+ 0x1c, L"ENTREE",
+ 0x1d, L"CTRL",
+ 0x2a, L"MAJ",
+ 0x36, L"MAJ DROITE",
+ 0x37, L"* (PAVE NUM.)",
+ 0x38, L"ALT",
+ 0x39, L"ESPACE",
+ 0x3a, L"VERR.MAJ",
+ 0x3b, L"F1",
+ 0x3c, L"F2",
+ 0x3d, L"F3",
+ 0x3e, L"F4",
+ 0x3f, L"F5",
+ 0x40, L"F6",
+ 0x41, L"F7",
+ 0x42, L"F8",
+ 0x43, L"F9",
+ 0x44, L"F10",
+ 0x45, L"Pause",
+ 0x46, L"DEFIL",
+ 0x47, L"7 (PAVE NUM.)",
+ 0x48, L"8 (PAVE NUM.)",
+ 0x49, L"9 (PAVE NUM.)",
+ 0x4a, L"- (PAVE NUM.)",
+ 0x4b, L"4 (PAVE NUM.)",
+ 0x4c, L"5 (PAVE NUM.)",
+ 0x4d, L"6 (PAVE NUM.)",
+ 0x4e, L"+ (PAVE NUM.)",
+ 0x4f, L"1 (PAVE NUM.)",
+ 0x50, L"2 (PAVE NUM.)",
+ 0x51, L"3 (PAVE NUM.)",
+ 0x52, L"0 (PAVE NUM.)",
+ 0x53, L". (PAVE NUM.)",
+ 0x57, L"F11",
+ 0x58, L"F12",
+ 0 , NULL
+};
+
+static ALLOC_SECTION_LDATA VSC_LPWSTR aKeyNamesExt[] = {
+ 0x1c, L"ENTREE (PAVE NUM.)",
+ 0x1d, L"CTRL DROITE",
+ 0x35, L"/ (PAVE NUM.)",
+ 0x37, L"Impr.Ecran",
+ 0x38, L"ALT DROITE",
+ 0x45, L"Ver.Num",
+ 0x46, L"ATTN",
+ 0x47, L"ORIGINE",
+ 0x48, L"HAUT",
+ 0x49, L"PG.PREC",
+ 0x4b, L"GAUCHE",
+ 0x4d, L"DROITE",
+ 0x4f, L"FIN",
+ 0x50, L"BAS",
+ 0x51, L"PG.SUIV",
+ 0x52, L"INS",
+ 0x53, L"SUPPR",
+ 0x54, L"<00>",
+ 0x56, L"AIDE",
+ 0x5b, L"WINDOWS GAUCHE",
+ 0x5c, L"WINDOWS DROITE",
+ 0x5d, L"APPLICATION",
+ 0 , NULL
+};
+
+static ALLOC_SECTION_LDATA DEADKEY_LPWSTR aKeyNamesDead[] = {
+ L"^" L"ACCENT CIRCONFLEXE",
+ L"\x00a8" L"TREMA",
+ L"~" L"TILDE",
+ L"`" L"GRAVE",
+ NULL
+};
+
+static ALLOC_SECTION_LDATA DEADKEY aDeadKey[] = {
+ DEADTRANS( L'a' , L'^' , 0x00e2 , 0x0000),
+ DEADTRANS( L'e' , L'^' , 0x00ea , 0x0000),
+ DEADTRANS( L'i' , L'^' , 0x00ee , 0x0000),
+ DEADTRANS( L'o' , L'^' , 0x00f4 , 0x0000),
+ DEADTRANS( L'u' , L'^' , 0x00fb , 0x0000),
+ DEADTRANS( L'A' , L'^' , 0x00c2 , 0x0000),
+ DEADTRANS( L'E' , L'^' , 0x00ca , 0x0000),
+ DEADTRANS( L'I' , L'^' , 0x00ce , 0x0000),
+ DEADTRANS( L'O' , L'^' , 0x00d4 , 0x0000),
+ DEADTRANS( L'U' , L'^' , 0x00db , 0x0000),
+ DEADTRANS( L' ' , L'^' , L'^' , 0x0000),
+
+ DEADTRANS( L'a' , 0x00a8 , 0x00e4 , 0x0000),
+ DEADTRANS( L'e' , 0x00a8 , 0x00eb , 0x0000),
+ DEADTRANS( L'i' , 0x00a8 , 0x00ef , 0x0000),
+ DEADTRANS( L'o' , 0x00a8 , 0x00f6 , 0x0000),
+ DEADTRANS( L'u' , 0x00a8 , 0x00fc , 0x0000),
+ DEADTRANS( L'y' , 0x00a8 , 0x00ff , 0x0000),
+ DEADTRANS( L'A' , 0x00a8 , 0x00c4 , 0x0000),
+ DEADTRANS( L'E' , 0x00a8 , 0x00cb , 0x0000),
+ DEADTRANS( L'I' , 0x00a8 , 0x00cf , 0x0000),
+ DEADTRANS( L'O' , 0x00a8 , 0x00d6 , 0x0000),
+ DEADTRANS( L'U' , 0x00a8 , 0x00dc , 0x0000),
+ DEADTRANS( L' ' , 0x00a8 , 0x00a8 , 0x0000),
+
+ DEADTRANS( L'a' , L'~' , 0x00e3 , 0x0000),
+ DEADTRANS( L'A' , L'~' , 0x00c3 , 0x0000),
+ DEADTRANS( L'n' , L'~' , 0x00f1 , 0x0000),
+ DEADTRANS( L'N' , L'~' , 0x00d1 , 0x0000),
+ DEADTRANS( L'o' , L'~' , 0x00f5 , 0x0000),
+ DEADTRANS( L'O' , L'~' , 0x00d5 , 0x0000),
+ DEADTRANS( L' ' , L'~' , L'~' , 0x0000),
+
+ DEADTRANS( L'a' , L'`' , 0x00e0 , 0x0000),
+ DEADTRANS( L'e' , L'`' , 0x00e8 , 0x0000),
+ DEADTRANS( L'i' , L'`' , 0x00ec , 0x0000),
+ DEADTRANS( L'o' , L'`' , 0x00f2 , 0x0000),
+ DEADTRANS( L'u' , L'`' , 0x00f9 , 0x0000),
+ DEADTRANS( L'A' , L'`' , 0x00c0 , 0x0000),
+ DEADTRANS( L'E' , L'`' , 0x00c8 , 0x0000),
+ DEADTRANS( L'I' , L'`' , 0x00cc , 0x0000),
+ DEADTRANS( L'O' , L'`' , 0x00d2 , 0x0000),
+ DEADTRANS( L'U' , L'`' , 0x00d9 , 0x0000),
+ DEADTRANS( L' ' , L'`' , L'`' , 0x0000),
+
+ 0, 0
+};
+
+static ALLOC_SECTION_LDATA KBDTABLES KbdTables = {
+ /*
+ * Modifier keys
+ */
+ &CharModifiers,
+
+ /*
+ * Characters tables
+ */
+ aVkToWcharTable,
+
+ /*
+ * Diacritics
+ */
+ aDeadKey,
+
+ /*
+ * Names of Keys
+ */
+ aKeyNames,
+ aKeyNamesExt,
+ aKeyNamesDead,
+
+ /*
+ * Scan codes to Virtual Keys
+ */
+ ausVK,
+ sizeof(ausVK) / sizeof(ausVK[0]),
+ aE0VscToVk,
+ aE1VscToVk,
+
+ /*
+ * Locale-specific special processing
+ */
+ MAKELONG(KLLF_ALTGR, KBD_VERSION),
+
+ /*
+ * Ligatures
+ */
+ 0,
+ 0,
+ NULL
+};
+
+PKBDTABLES KbdLayerDescriptor(VOID)
+{
+ return &KbdTables;
+}
diff --git a/input/layout/all_kbds/kbdfr/kbdfr.def b/input/layout/all_kbds/kbdfr/kbdfr.def
new file mode 100644
index 00000000..3e8131fb
--- /dev/null
+++ b/input/layout/all_kbds/kbdfr/kbdfr.def
@@ -0,0 +1,4 @@
+LIBRARY KBDFR
+
+EXPORTS
+ KbdLayerDescriptor @1
diff --git a/input/layout/all_kbds/kbdfr/kbdfr.h b/input/layout/all_kbds/kbdfr/kbdfr.h
new file mode 100644
index 00000000..ec23fd5f
--- /dev/null
+++ b/input/layout/all_kbds/kbdfr/kbdfr.h
@@ -0,0 +1,66 @@
+/****************************** Module Header ******************************\
+* Module Name: KBDFR.H
+*
+* keyboard layout header for French
+*
+* Copyright (c) 1985-2000, Microsoft Corporation
+*
+* Various defines for use by keyboard input code.
+*
+* History:
+*
+* created by KBDTOOL v3.11 Thu Aug 24 18:10:18 2000
+*
+\***************************************************************************/
+
+/*
+ * kbd type should be controlled by cl command-line argument
+ */
+#define KBD_TYPE 4
+
+/*
+* Include the basis of all keyboard table values
+*/
+#include "kbd.h"
+#include <dontuse.h>
+/***************************************************************************\
+* The table below defines the virtual keys for various keyboard types where
+* the keyboard differ from the US keyboard.
+*
+* _EQ() : all keyboard types have the same virtual key for this scancode
+* _NE() : different virtual keys for this scancode, depending on kbd type
+*
+* +------+ +----------+----------+----------+----------+----------+----------+
+* | Scan | | kbd | kbd | kbd | kbd | kbd | kbd |
+* | code | | type 1 | type 2 | type 3 | type 4 | type 5 | type 6 |
+\****+-------+_+----------+----------+----------+----------+----------+----------+*/
+
+#undef T29
+#define T29 _EQ( OEM_7 )
+#undef T0C
+#define T0C _EQ( OEM_4 )
+#undef T10
+#define T10 _EQ( 'A' )
+#undef T11
+#define T11 _EQ( 'Z' )
+#undef T1A
+#define T1A _EQ( OEM_6 )
+#undef T1B
+#define T1B _EQ( OEM_1 )
+#undef T1E
+#define T1E _EQ( 'Q' )
+#undef T27
+#define T27 _EQ( 'M' )
+#undef T28
+#define T28 _EQ( OEM_3 )
+#undef T2C
+#define T2C _EQ( 'W' )
+#undef T32
+#define T32 _EQ( OEM_COMMA )
+#undef T33
+#define T33 _EQ( OEM_PERIOD )
+#undef T34
+#define T34 _EQ( OEM_2 )
+#undef T35
+#define T35 _EQ( OEM_8 )
+
diff --git a/input/layout/all_kbds/kbdfr/kbdfr.rc b/input/layout/all_kbds/kbdfr/kbdfr.rc
new file mode 100644
index 00000000..cb42c445
--- /dev/null
+++ b/input/layout/all_kbds/kbdfr/kbdfr.rc
@@ -0,0 +1,11 @@
+#include <windows.h>
+#include <ntverp.h>
+
+#define VER_FILETYPE VFT_DLL
+#define VER_FILESUBTYPE VFT2_DRV_KEYBOARD
+#define VER_FILEDESCRIPTION_STR "French Keyboard Layout"
+#define VER_INTERNALNAME_STR "kbdfr (3.11)"
+#define VER_ORIGINALFILENAME_STR "kbdfr.dll"
+
+#define VER_LANGNEUTRAL
+#include "common.ver"
diff --git a/input/layout/all_kbds/kbdfr/kbdfr.vcxproj b/input/layout/all_kbds/kbdfr/kbdfr.vcxproj
new file mode 100644
index 00000000..d4252520
--- /dev/null
+++ b/input/layout/all_kbds/kbdfr/kbdfr.vcxproj
@@ -0,0 +1,219 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{8CC545F3-0678-4AC8-8A25-2110DB6BF1BD}</ProjectGuid>
+ <RootNamespace>$(MSBuildProjectName)</RootNamespace>
+ <Configuration Condition="'$(Configuration)' == ''">Debug</Configuration>
+ <Platform Condition="'$(Platform)' == ''">Win32</Platform>
+ <SampleGuid>{051CA44C-EEB6-4936-84E5-972987B6EBE3}</SampleGuid>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>False</UseDebugLibraries>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ <DriverType />
+ <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset>
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ </PropertyGroup>
+ <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>True</UseDebugLibraries>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ <DriverType />
+ <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset>
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ </PropertyGroup>
+ <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>False</UseDebugLibraries>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ <DriverType />
+ <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset>
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ </PropertyGroup>
+ <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>True</UseDebugLibraries>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ <DriverType />
+ <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset>
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <PropertyGroup>
+ <OutDir>$(IntDir)</OutDir>
+ </PropertyGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
+ </ImportGroup>
+ <ItemGroup Label="WrappedTaskItems" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <TargetName>kbdfr</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <TargetName>kbdfr</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <TargetName>kbdfr</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <TargetName>kbdfr</TargetName>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\..\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ResourceCompile>
+ <ClCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\..\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Midl>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\..\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\..\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ResourceCompile>
+ <ClCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\..\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Midl>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\..\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\..\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ResourceCompile>
+ <ClCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\..\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Midl>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\..\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\..\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ResourceCompile>
+ <ClCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\..\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Midl>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\..\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Link>
+ <AdditionalOptions>%(AdditionalOptions) -merge:.edata=.data -merge:.rdata=.data -merge:.text=.data -merge:.bss=.data -section:.data,re</AdditionalOptions>
+ <AdditionalOptions>%(AdditionalOptions) /ignore:4254</AdditionalOptions>
+ <ModuleDefinitionFile>kbdfr.def</ModuleDefinitionFile>
+ </Link>
+ <ClCompile>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Link>
+ <AdditionalOptions>%(AdditionalOptions) -merge:.edata=.data -merge:.rdata=.data -merge:.text=.data -merge:.bss=.data -section:.data,re</AdditionalOptions>
+ <AdditionalOptions>%(AdditionalOptions) /ignore:4254</AdditionalOptions>
+ <ModuleDefinitionFile>kbdfr.def</ModuleDefinitionFile>
+ </Link>
+ <ClCompile>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Link>
+ <AdditionalOptions>%(AdditionalOptions) -merge:.edata=.data -merge:.rdata=.data -merge:.text=.data -merge:.bss=.data -section:.data,re</AdditionalOptions>
+ <AdditionalOptions>%(AdditionalOptions) /ignore:4254</AdditionalOptions>
+ <ModuleDefinitionFile>kbdfr.def</ModuleDefinitionFile>
+ </Link>
+ <ClCompile>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Link>
+ <AdditionalOptions>%(AdditionalOptions) -merge:.edata=.data -merge:.rdata=.data -merge:.text=.data -merge:.bss=.data -section:.data,re</AdditionalOptions>
+ <AdditionalOptions>%(AdditionalOptions) /ignore:4254</AdditionalOptions>
+ <ModuleDefinitionFile>kbdfr.def</ModuleDefinitionFile>
+ </Link>
+ <ClCompile>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="kbdfr.c" />
+ <ResourceCompile Include="kbdfr.rc" />
+ </ItemGroup>
+ <ItemGroup>
+ <Inf Exclude="@(Inf)" Include="*.inf" />
+ <FilesToPackage Include="$(TargetPath)" Condition="'$(ConfigurationType)'=='Driver' or '$(ConfigurationType)'=='DynamicLibrary'" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Exclude="@(None)" Include="*.txt;*.htm;*.html" />
+ <None Exclude="@(None)" Include="*.ico;*.cur;*.bmp;*.dlg;*.rct;*.gif;*.jpg;*.jpeg;*.wav;*.jpe;*.tiff;*.tif;*.png;*.rc2" />
+ <None Exclude="@(None)" Include="*.def;*.bat;*.hpj;*.asmx" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Exclude="@(ClInclude)" Include="*.h;*.hpp;*.hxx;*.hm;*.inl;*.xsd" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project> \ No newline at end of file
diff --git a/input/layout/all_kbds/kbdfr/kbdfr.vcxproj.Filters b/input/layout/all_kbds/kbdfr/kbdfr.vcxproj.Filters
new file mode 100644
index 00000000..bfaa9336
--- /dev/null
+++ b/input/layout/all_kbds/kbdfr/kbdfr.vcxproj.Filters
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx;*</Extensions>
+ <UniqueIdentifier>{15C7D960-5582-4A58-9857-E07EFB799C67}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Header Files">
+ <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+ <UniqueIdentifier>{7C275084-2AF3-4B5E-A09E-79492E933729}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Resource Files">
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms;man;xml</Extensions>
+ <UniqueIdentifier>{E3BA19AC-3AB1-4E9A-957A-6F65CC116AE3}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="kbdfr.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <None Include="kbdfr.def">
+ <Filter>Source Files</Filter>
+ </None>
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="kbdfr.rc">
+ <Filter>Resource Files</Filter>
+ </ResourceCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/input/layout/all_kbds/kbdgr/kbdgr.c b/input/layout/all_kbds/kbdgr/kbdgr.c
new file mode 100644
index 00000000..1c93c26f
--- /dev/null
+++ b/input/layout/all_kbds/kbdgr/kbdgr.c
@@ -0,0 +1,482 @@
+/***************************************************************************\
+* Module Name: KBDGR.C
+*
+* keyboard layout for German
+*
+* Copyright (c) 1985-2000, Microsoft Corporation
+*
+* History:
+* KBDTOOL v3.11 - Created Thu Aug 24 18:10:19 2000
+\***************************************************************************/
+
+#include <windows.h>
+#include "kbd.h"
+#include "kbdGR.h"
+
+#if defined(_M_IA64)
+#pragma section(".data")
+#define ALLOC_SECTION_LDATA __declspec(allocate(".data"))
+#else
+#pragma data_seg(".data")
+#define ALLOC_SECTION_LDATA
+#endif
+
+/***************************************************************************\
+* ausVK[] - Virtual Scan Code to Virtual Key conversion table for German
+\***************************************************************************/
+
+static ALLOC_SECTION_LDATA USHORT ausVK[] = {
+ T00, T01, T02, T03, T04, T05, T06, T07,
+ T08, T09, T0A, T0B, T0C, T0D, T0E, T0F,
+ T10, T11, T12, T13, T14, T15, T16, T17,
+ T18, T19, T1A, T1B, T1C, T1D, T1E, T1F,
+ T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T2A, T2B, T2C, T2D, T2E, T2F,
+ T30, T31, T32, T33, T34, T35,
+
+ /*
+ * Right-hand Shift key must have KBDEXT bit set.
+ */
+ T36 | KBDEXT,
+
+ T37 | KBDMULTIVK, // numpad_* + Shift/Alt -> SnapShot
+
+ T38, T39, T3A, T3B, T3C, T3D, T3E,
+ T3F, T40, T41, T42, T43, T44,
+
+ /*
+ * NumLock Key:
+ * KBDEXT - VK_NUMLOCK is an Extended key
+ * KBDMULTIVK - VK_NUMLOCK or VK_PAUSE (without or with CTRL)
+ */
+ T45 | KBDEXT | KBDMULTIVK,
+
+ T46 | KBDMULTIVK,
+
+ /*
+ * Number Pad keys:
+ * KBDNUMPAD - digits 0-9 and decimal point.
+ * KBDSPECIAL - require special processing by Windows
+ */
+ T47 | KBDNUMPAD | KBDSPECIAL, // Numpad 7 (Home)
+ T48 | KBDNUMPAD | KBDSPECIAL, // Numpad 8 (Up),
+ T49 | KBDNUMPAD | KBDSPECIAL, // Numpad 9 (PgUp),
+ T4A,
+ T4B | KBDNUMPAD | KBDSPECIAL, // Numpad 4 (Left),
+ T4C | KBDNUMPAD | KBDSPECIAL, // Numpad 5 (Clear),
+ T4D | KBDNUMPAD | KBDSPECIAL, // Numpad 6 (Right),
+ T4E,
+ T4F | KBDNUMPAD | KBDSPECIAL, // Numpad 1 (End),
+ T50 | KBDNUMPAD | KBDSPECIAL, // Numpad 2 (Down),
+ T51 | KBDNUMPAD | KBDSPECIAL, // Numpad 3 (PgDn),
+ T52 | KBDNUMPAD | KBDSPECIAL, // Numpad 0 (Ins),
+ T53 | KBDNUMPAD | KBDSPECIAL, // Numpad . (Del),
+
+ T54, T55, T56, T57, T58, T59, T5A, T5B,
+ T5C, T5D, T5E, T5F, T60, T61, T62, T63,
+ T64, T65, T66, T67, T68, T69, T6A, T6B,
+ T6C, T6D, T6E, T6F, T70, T71, T72, T73,
+ T74, T75, T76, T77, T78, T79, T7A, T7B,
+ T7C, T7D, T7E
+
+};
+
+static ALLOC_SECTION_LDATA VSC_VK aE0VscToVk[] = {
+ { 0x10, X10 | KBDEXT }, // Speedracer: Previous Track
+ { 0x19, X19 | KBDEXT }, // Speedracer: Next Track
+ { 0x1D, X1D | KBDEXT }, // RControl
+ { 0x20, X20 | KBDEXT }, // Speedracer: Volume Mute
+ { 0x21, X21 | KBDEXT }, // Speedracer: Launch App 2
+ { 0x22, X22 | KBDEXT }, // Speedracer: Media Play/Pause
+ { 0x24, X24 | KBDEXT }, // Speedracer: Media Stop
+ { 0x2E, X2E | KBDEXT }, // Speedracer: Volume Down
+ { 0x30, X30 | KBDEXT }, // Speedracer: Volume Up
+ { 0x32, X32 | KBDEXT }, // Speedracer: Browser Home
+ { 0x35, X35 | KBDEXT }, // Numpad Divide
+ { 0x37, X37 | KBDEXT }, // Snapshot
+ { 0x38, X38 | KBDEXT }, // RMenu
+ { 0x47, X47 | KBDEXT }, // Home
+ { 0x48, X48 | KBDEXT }, // Up
+ { 0x49, X49 | KBDEXT }, // Prior
+ { 0x4B, X4B | KBDEXT }, // Left
+ { 0x4D, X4D | KBDEXT }, // Right
+ { 0x4F, X4F | KBDEXT }, // End
+ { 0x50, X50 | KBDEXT }, // Down
+ { 0x51, X51 | KBDEXT }, // Next
+ { 0x52, X52 | KBDEXT }, // Insert
+ { 0x53, X53 | KBDEXT }, // Delete
+ { 0x5B, X5B | KBDEXT }, // Left Win
+ { 0x5C, X5C | KBDEXT }, // Right Win
+ { 0x5D, X5D | KBDEXT }, // Application
+ { 0x5F, X5F | KBDEXT }, // Speedracer: Sleep
+ { 0x65, X65 | KBDEXT }, // Speedracer: Browser Search
+ { 0x66, X66 | KBDEXT }, // Speedracer: Browser Favorites
+ { 0x67, X67 | KBDEXT }, // Speedracer: Browser Refresh
+ { 0x68, X68 | KBDEXT }, // Speedracer: Browser Stop
+ { 0x69, X69 | KBDEXT }, // Speedracer: Browser Forward
+ { 0x6A, X6A | KBDEXT }, // Speedracer: Browser Back
+ { 0x6B, X6B | KBDEXT }, // Speedracer: Launch App 1
+ { 0x6C, X6C | KBDEXT }, // Speedracer: Launch Mail
+ { 0x6D, X6D | KBDEXT }, // Speedracer: Launch Media Selector
+ { 0x1C, X1C | KBDEXT }, // Numpad Enter
+ { 0x46, X46 | KBDEXT }, // Break (Ctrl + Pause)
+ { 0, 0 }
+};
+
+static ALLOC_SECTION_LDATA VSC_VK aE1VscToVk[] = {
+ { 0x1D, Y1D }, // Pause
+ { 0 , 0 }
+};
+
+/***************************************************************************\
+* aVkToBits[] - map Virtual Keys to Modifier Bits
+*
+* See kbd.h for a full description.
+*
+* German Keyboard has only three shifter keys:
+* SHIFT (L & R) affects alphabnumeric keys,
+* CTRL (L & R) is used to generate control characters
+* ALT (L & R) used for generating characters by number with numpad
+\***************************************************************************/
+static ALLOC_SECTION_LDATA VK_TO_BIT aVkToBits[] = {
+ { VK_SHIFT , KBDSHIFT },
+ { VK_CONTROL , KBDCTRL },
+ { VK_MENU , KBDALT },
+ { 0 , 0 }
+};
+
+/***************************************************************************\
+* aModification[] - map character modifier bits to modification number
+*
+* See kbd.h for a full description.
+*
+\***************************************************************************/
+
+static ALLOC_SECTION_LDATA MODIFIERS CharModifiers = {
+ &aVkToBits[0],
+ 6,
+ {
+ // Modification# // Keys Pressed
+ // ============= // =============
+ 0, //
+ 1, // Shift
+ 3, // Control
+ 4, // Shift + Control
+ SHFT_INVALID, // Menu
+ SHFT_INVALID, // Shift + Menu
+ 2 // Control + Menu
+ }
+};
+
+/***************************************************************************\
+*
+* aVkToWch2[] - Virtual Key to WCHAR translation for 2 shift states
+* aVkToWch3[] - Virtual Key to WCHAR translation for 3 shift states
+* aVkToWch4[] - Virtual Key to WCHAR translation for 4 shift states
+* aVkToWch5[] - Virtual Key to WCHAR translation for 5 shift states
+*
+* Table attributes: Unordered Scan, null-terminated
+*
+* Search this table for an entry with a matching Virtual Key to find the
+* corresponding unshifted and shifted WCHAR characters.
+*
+* Special values for VirtualKey (column 1)
+* 0xff - dead chars for the previous entry
+* 0 - terminate the list
+*
+* Special values for Attributes (column 2)
+* CAPLOK bit - CAPS-LOCK affect this key like SHIFT
+*
+* Special values for wch[*] (column 3 & 4)
+* WCH_NONE - No character
+* WCH_DEAD - Dead Key (diaresis) or invalid (US keyboard has none)
+* WCH_LGTR - Ligature (generates multiple characters)
+*
+\***************************************************************************/
+
+static ALLOC_SECTION_LDATA VK_TO_WCHARS2 aVkToWch2[] = {
+// | | Shift |
+// |=========|=========|
+ {VK_OEM_5 ,0 ,WCH_DEAD ,0x00b0 },
+ {0xff ,0 ,'^' ,WCH_NONE },
+ {'1' ,CAPLOK ,'1' ,'!' },
+ {'4' ,CAPLOK ,'4' ,'$' },
+ {'5' ,CAPLOK ,'5' ,'%' },
+ {VK_OEM_6 ,0 ,WCH_DEAD ,WCH_DEAD },
+ {0xff ,0 ,0x00b4 ,'`' },
+ {'W' ,CAPLOK ,'w' ,'W' },
+ {'R' ,CAPLOK ,'r' ,'R' },
+ {'T' ,CAPLOK ,'t' ,'T' },
+ {'Z' ,CAPLOK ,'z' ,'Z' },
+ {'U' ,CAPLOK ,'u' ,'U' },
+ {'I' ,CAPLOK ,'i' ,'I' },
+ {'O' ,CAPLOK ,'o' ,'O' },
+ {'P' ,CAPLOK ,'p' ,'P' },
+ {'A' ,CAPLOK ,'a' ,'A' },
+ {'S' ,CAPLOK ,'s' ,'S' },
+ {'D' ,CAPLOK ,'d' ,'D' },
+ {'F' ,CAPLOK ,'f' ,'F' },
+ {'G' ,CAPLOK ,'g' ,'G' },
+ {'H' ,CAPLOK ,'h' ,'H' },
+ {'J' ,CAPLOK ,'j' ,'J' },
+ {'K' ,CAPLOK ,'k' ,'K' },
+ {'L' ,CAPLOK ,'l' ,'L' },
+ {VK_OEM_3 ,CAPLOK ,0x00f6 ,0x00d6 },
+ {VK_OEM_7 ,CAPLOK ,0x00e4 ,0x00c4 },
+ {'Y' ,CAPLOK ,'y' ,'Y' },
+ {'X' ,CAPLOK ,'x' ,'X' },
+ {'C' ,CAPLOK ,'c' ,'C' },
+ {'V' ,CAPLOK ,'v' ,'V' },
+ {'B' ,CAPLOK ,'b' ,'B' },
+ {'N' ,CAPLOK ,'n' ,'N' },
+ {VK_OEM_COMMA ,CAPLOK ,',' ,';' },
+ {VK_OEM_PERIOD,CAPLOK ,'.' ,':' },
+ {VK_DECIMAL ,0 ,',' ,',' },
+ {VK_TAB ,0 ,'\t' ,'\t' },
+ {VK_ADD ,0 ,'+' ,'+' },
+ {VK_DIVIDE ,0 ,'/' ,'/' },
+ {VK_MULTIPLY ,0 ,'*' ,'*' },
+ {VK_SUBTRACT ,0 ,'-' ,'-' },
+ {0 ,0 ,0 ,0 }
+};
+
+static ALLOC_SECTION_LDATA VK_TO_WCHARS3 aVkToWch3[] = {
+// | | Shift | Ctl+Alt|
+// |=========|=========|=========|
+ {'3' ,CAPLOK ,'3' ,0x00a7 ,0x00b3 },
+ {'7' ,CAPLOK ,'7' ,'/' ,'{' },
+ {'8' ,CAPLOK ,'8' ,'(' ,'[' },
+ {'9' ,CAPLOK ,'9' ,')' ,']' },
+ {'0' ,CAPLOK ,'0' ,'=' ,'}' },
+ {VK_OEM_4 ,CAPLOK ,0x00df ,'?' ,'\\' },
+ {'Q' ,CAPLOK ,'q' ,'Q' ,'@' },
+ {'E' ,CAPLOK ,'e' ,'E' ,0x20ac },
+ {'M' ,CAPLOK ,'m' ,'M' ,0x00b5 },
+ {VK_OEM_102 ,0 ,'<' ,'>' ,'|' },
+ {0 ,0 ,0 ,0 ,0 }
+};
+
+static ALLOC_SECTION_LDATA VK_TO_WCHARS4 aVkToWch4[] = {
+// | | Shift | Ctl+Alt| Ctrl |
+// |=========|=========|=========|=========|
+ {VK_OEM_1 ,CAPLOK ,0x00fc ,0x00dc ,WCH_NONE ,0x001b },
+ {VK_OEM_PLUS ,CAPLOK ,'+' ,'*' ,'~' ,0x001d },
+ {VK_OEM_2 ,CAPLOK ,'#' ,'\'' ,WCH_NONE ,0x001c },
+ {VK_BACK ,0 ,'\b' ,'\b' ,WCH_NONE ,0x007f },
+ {VK_ESCAPE ,0 ,0x001b ,0x001b ,WCH_NONE ,0x001b },
+ {VK_RETURN ,0 ,'\r' ,'\r' ,WCH_NONE ,'\n' },
+ {VK_SPACE ,0 ,' ' ,' ' ,WCH_NONE ,' ' },
+ {VK_CANCEL ,0 ,0x0003 ,0x0003 ,WCH_NONE ,0x0003 },
+ {0 ,0 ,0 ,0 ,0 ,0 }
+};
+
+static ALLOC_SECTION_LDATA VK_TO_WCHARS5 aVkToWch5[] = {
+// | | Shift | Ctl+Alt| Ctrl |S+Ctrl |
+// |=========|=========|=========|=========|=========|
+ {'2' ,CAPLOK ,'2' ,'\"' ,0x00b2 ,WCH_NONE ,0x0000 },
+ {'6' ,CAPLOK ,'6' ,'&' ,WCH_NONE ,WCH_NONE ,0x001e },
+ {VK_OEM_MINUS ,0 ,'-' ,'_' ,WCH_NONE ,WCH_NONE ,0x001f },
+ {0 ,0 ,0 ,0 ,0 ,0 ,0 }
+};
+
+// Put this last so that VkKeyScan interprets number characters
+// as coming from the main section of the kbd (aVkToWch2 and
+// aVkToWch5) before considering the numpad (aVkToWch1).
+
+static ALLOC_SECTION_LDATA VK_TO_WCHARS1 aVkToWch1[] = {
+ { VK_NUMPAD0 , 0 , '0' },
+ { VK_NUMPAD1 , 0 , '1' },
+ { VK_NUMPAD2 , 0 , '2' },
+ { VK_NUMPAD3 , 0 , '3' },
+ { VK_NUMPAD4 , 0 , '4' },
+ { VK_NUMPAD5 , 0 , '5' },
+ { VK_NUMPAD6 , 0 , '6' },
+ { VK_NUMPAD7 , 0 , '7' },
+ { VK_NUMPAD8 , 0 , '8' },
+ { VK_NUMPAD9 , 0 , '9' },
+ { 0 , 0 , '\0' }
+};
+
+static ALLOC_SECTION_LDATA VK_TO_WCHAR_TABLE aVkToWcharTable[] = {
+ { (PVK_TO_WCHARS1)aVkToWch3, 3, sizeof(aVkToWch3[0]) },
+ { (PVK_TO_WCHARS1)aVkToWch4, 4, sizeof(aVkToWch4[0]) },
+ { (PVK_TO_WCHARS1)aVkToWch5, 5, sizeof(aVkToWch5[0]) },
+ { (PVK_TO_WCHARS1)aVkToWch2, 2, sizeof(aVkToWch2[0]) },
+ { (PVK_TO_WCHARS1)aVkToWch1, 1, sizeof(aVkToWch1[0]) },
+ { NULL, 0, 0 },
+};
+
+/***************************************************************************\
+* aKeyNames[], aKeyNamesExt[] - Virtual Scancode to Key Name tables
+*
+* Table attributes: Ordered Scan (by scancode), null-terminated
+*
+* Only the names of Extended, NumPad, Dead and Non-Printable keys are here.
+* (Keys producing printable characters are named by that character)
+\***************************************************************************/
+
+static ALLOC_SECTION_LDATA VSC_LPWSTR aKeyNames[] = {
+ 0x01, L"ESC",
+ 0x0e, L"R\x00DC" L"CK",
+ 0x0f, L"TABULATOR",
+ 0x1c, L"EINGABE",
+ 0x1d, L"STRG",
+ 0x2a, L"UMSCHALT",
+ 0x36, L"UMSCHALT RECHTS",
+ 0x37, L" (ZEHNERTASTATUR)",
+ 0x38, L"ALT",
+ 0x39, L"LEER",
+ 0x3a, L"FESTSTELL",
+ 0x3b, L"F1",
+ 0x3c, L"F2",
+ 0x3d, L"F3",
+ 0x3e, L"F4",
+ 0x3f, L"F5",
+ 0x40, L"F6",
+ 0x41, L"F7",
+ 0x42, L"F8",
+ 0x43, L"F9",
+ 0x44, L"F10",
+ 0x45, L"PAUSE",
+ 0x46, L"ROLLEN-FESTSTELL",
+ 0x47, L"7 (ZEHNERTASTATUR)",
+ 0x48, L"8 (ZEHNERTASTATUR)",
+ 0x49, L"9 (ZEHNERTASTATUR)",
+ 0x4a, L"- (ZEHNERTASTATUR)",
+ 0x4b, L"4 (ZEHNERTASTATUR)",
+ 0x4c, L"5 (ZEHNERTASTATUR)",
+ 0x4d, L"6 (ZEHNERTASTATUR)",
+ 0x4e, L"+ (ZEHNERTASTATUR)",
+ 0x4f, L"1 (ZEHNERTASTATUR)",
+ 0x50, L"2 (ZEHNERTASTATUR)",
+ 0x51, L"3 (ZEHNERTASTATUR)",
+ 0x52, L"0 (ZEHNERTASTATUR)",
+ 0x53, L"KOMMA (ZEHNERTASTATUR)",
+ 0x57, L"F11",
+ 0x58, L"F12",
+ 0 , NULL
+};
+
+static ALLOC_SECTION_LDATA VSC_LPWSTR aKeyNamesExt[] = {
+ 0x1c, L"EINGABE (ZEHNERTASTATUR)",
+ 0x1d, L"STRG-RECHTS",
+ 0x35, L" (ZEHNERTASTATUR)",
+ 0x37, L"DRUCK",
+ 0x38, L"ALT GR",
+ 0x45, L"NUM-FESTSTELL",
+ 0x46, L"UNTBR",
+ 0x47, L"POS1",
+ 0x48, L"NACH-OBEN",
+ 0x49, L"BILD-NACH-OBEN",
+ 0x4b, L"NACH-LINKS",
+ 0x4d, L"NACH-RECHTS",
+ 0x4f, L"ENDE",
+ 0x50, L"NACH-UNTEN",
+ 0x51, L"BILD-NACH-UNTEN",
+ 0x52, L"EINFG",
+ 0x53, L"ENTF",
+ 0x54, L"<00>",
+ 0x56, L"HILFE",
+ 0x5b, L"LINKE WINDOWS",
+ 0x5c, L"RECHTE WINDOWS",
+ 0x5d, L"ANWENDUNG",
+ 0 , NULL
+};
+
+static ALLOC_SECTION_LDATA DEADKEY_LPWSTR aKeyNamesDead[] = {
+ L"\x00b4" L"AKUT",
+ L"`" L"GRAVIS",
+ L"^" L"ZIRKUMFLEX",
+ NULL
+};
+
+static ALLOC_SECTION_LDATA DEADKEY aDeadKey[] = {
+ DEADTRANS( L'a' , L'^' , 0x00e2 , 0x0000),
+ DEADTRANS( L'e' , L'^' , 0x00ea , 0x0000),
+ DEADTRANS( L'i' , L'^' , 0x00ee , 0x0000),
+ DEADTRANS( L'o' , L'^' , 0x00f4 , 0x0000),
+ DEADTRANS( L'u' , L'^' , 0x00fb , 0x0000),
+ DEADTRANS( L'A' , L'^' , 0x00c2 , 0x0000),
+ DEADTRANS( L'E' , L'^' , 0x00ca , 0x0000),
+ DEADTRANS( L'I' , L'^' , 0x00ce , 0x0000),
+ DEADTRANS( L'O' , L'^' , 0x00d4 , 0x0000),
+ DEADTRANS( L'U' , L'^' , 0x00db , 0x0000),
+ DEADTRANS( L' ' , L'^' , L'^' , 0x0000),
+
+ DEADTRANS( L'a' , 0x00b4 , 0x00e1 , 0x0000),
+ DEADTRANS( L'e' , 0x00b4 , 0x00e9 , 0x0000),
+ DEADTRANS( L'i' , 0x00b4 , 0x00ed , 0x0000),
+ DEADTRANS( L'o' , 0x00b4 , 0x00f3 , 0x0000),
+ DEADTRANS( L'u' , 0x00b4 , 0x00fa , 0x0000),
+ DEADTRANS( L'y' , 0x00b4 , 0x00fd , 0x0000),
+ DEADTRANS( L'A' , 0x00b4 , 0x00c1 , 0x0000),
+ DEADTRANS( L'E' , 0x00b4 , 0x00c9 , 0x0000),
+ DEADTRANS( L'I' , 0x00b4 , 0x00cd , 0x0000),
+ DEADTRANS( L'O' , 0x00b4 , 0x00d3 , 0x0000),
+ DEADTRANS( L'U' , 0x00b4 , 0x00da , 0x0000),
+ DEADTRANS( L'Y' , 0x00b4 , 0x00dd , 0x0000),
+ DEADTRANS( L' ' , 0x00b4 , 0x00b4 , 0x0000),
+
+ DEADTRANS( L'a' , L'`' , 0x00e0 , 0x0000),
+ DEADTRANS( L'e' , L'`' , 0x00e8 , 0x0000),
+ DEADTRANS( L'i' , L'`' , 0x00ec , 0x0000),
+ DEADTRANS( L'o' , L'`' , 0x00f2 , 0x0000),
+ DEADTRANS( L'u' , L'`' , 0x00f9 , 0x0000),
+ DEADTRANS( L'A' , L'`' , 0x00c0 , 0x0000),
+ DEADTRANS( L'E' , L'`' , 0x00c8 , 0x0000),
+ DEADTRANS( L'I' , L'`' , 0x00cc , 0x0000),
+ DEADTRANS( L'O' , L'`' , 0x00d2 , 0x0000),
+ DEADTRANS( L'U' , L'`' , 0x00d9 , 0x0000),
+ DEADTRANS( L' ' , L'`' , L'`' , 0x0000),
+
+ 0, 0
+};
+
+static ALLOC_SECTION_LDATA KBDTABLES KbdTables = {
+ /*
+ * Modifier keys
+ */
+ &CharModifiers,
+
+ /*
+ * Characters tables
+ */
+ aVkToWcharTable,
+
+ /*
+ * Diacritics
+ */
+ aDeadKey,
+
+ /*
+ * Names of Keys
+ */
+ aKeyNames,
+ aKeyNamesExt,
+ aKeyNamesDead,
+
+ /*
+ * Scan codes to Virtual Keys
+ */
+ ausVK,
+ sizeof(ausVK) / sizeof(ausVK[0]),
+ aE0VscToVk,
+ aE1VscToVk,
+
+ /*
+ * Locale-specific special processing
+ */
+ MAKELONG(KLLF_ALTGR, KBD_VERSION),
+
+ /*
+ * Ligatures
+ */
+ 0,
+ 0,
+ NULL
+};
+
+PKBDTABLES KbdLayerDescriptor(VOID)
+{
+ return &KbdTables;
+}
diff --git a/input/layout/all_kbds/kbdgr/kbdgr.def b/input/layout/all_kbds/kbdgr/kbdgr.def
new file mode 100644
index 00000000..a6a97d5a
--- /dev/null
+++ b/input/layout/all_kbds/kbdgr/kbdgr.def
@@ -0,0 +1,4 @@
+LIBRARY KBDGR
+
+EXPORTS
+ KbdLayerDescriptor @1
diff --git a/input/layout/all_kbds/kbdgr/kbdgr.h b/input/layout/all_kbds/kbdgr/kbdgr.h
new file mode 100644
index 00000000..5a283440
--- /dev/null
+++ b/input/layout/all_kbds/kbdgr/kbdgr.h
@@ -0,0 +1,58 @@
+/****************************** Module Header ******************************\
+* Module Name: KBDGR.H
+*
+* keyboard layout header for German
+*
+* Copyright (c) 1985-2000, Microsoft Corporation
+*
+* Various defines for use by keyboard input code.
+*
+* History:
+*
+* created by KBDTOOL v3.11 Thu Aug 24 18:10:19 2000
+*
+\***************************************************************************/
+
+/*
+ * kbd type should be controlled by cl command-line argument
+ */
+#define KBD_TYPE 4
+
+/*
+* Include the basis of all keyboard table values
+*/
+#include "kbd.h"
+#include <dontuse.h>
+/***************************************************************************\
+* The table below defines the virtual keys for various keyboard types where
+* the keyboard differ from the US keyboard.
+*
+* _EQ() : all keyboard types have the same virtual key for this scancode
+* _NE() : different virtual keys for this scancode, depending on kbd type
+*
+* +------+ +----------+----------+----------+----------+----------+----------+
+* | Scan | | kbd | kbd | kbd | kbd | kbd | kbd |
+* | code | | type 1 | type 2 | type 3 | type 4 | type 5 | type 6 |
+\****+-------+_+----------+----------+----------+----------+----------+----------+*/
+
+#undef T29
+#define T29 _EQ( OEM_5 )
+#undef T0C
+#define T0C _EQ( OEM_4 )
+#undef T0D
+#define T0D _EQ( OEM_6 )
+#undef T15
+#define T15 _EQ( 'Z' )
+#undef T1A
+#define T1A _EQ( OEM_1 )
+#undef T1B
+#define T1B _EQ( OEM_PLUS )
+#undef T2B
+#define T2B _EQ( OEM_2 )
+#undef T27
+#define T27 _EQ( OEM_3 )
+#undef T2C
+#define T2C _EQ( 'Y' )
+#undef T35
+#define T35 _EQ( OEM_MINUS )
+
diff --git a/input/layout/all_kbds/kbdgr/kbdgr.rc b/input/layout/all_kbds/kbdgr/kbdgr.rc
new file mode 100644
index 00000000..6c66f938
--- /dev/null
+++ b/input/layout/all_kbds/kbdgr/kbdgr.rc
@@ -0,0 +1,11 @@
+#include <windows.h>
+#include <ntverp.h>
+
+#define VER_FILETYPE VFT_DLL
+#define VER_FILESUBTYPE VFT2_DRV_KEYBOARD
+#define VER_FILEDESCRIPTION_STR "German Keyboard Layout"
+#define VER_INTERNALNAME_STR "kbdgr (3.11)"
+#define VER_ORIGINALFILENAME_STR "kbdgr.dll"
+
+#define VER_LANGNEUTRAL
+#include "common.ver"
diff --git a/input/layout/all_kbds/kbdgr/kbdgr.vcxproj b/input/layout/all_kbds/kbdgr/kbdgr.vcxproj
new file mode 100644
index 00000000..c59a9625
--- /dev/null
+++ b/input/layout/all_kbds/kbdgr/kbdgr.vcxproj
@@ -0,0 +1,219 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{F918E44C-4E53-4267-BFDB-71112122DFE2}</ProjectGuid>
+ <RootNamespace>$(MSBuildProjectName)</RootNamespace>
+ <Configuration Condition="'$(Configuration)' == ''">Debug</Configuration>
+ <Platform Condition="'$(Platform)' == ''">Win32</Platform>
+ <SampleGuid>{410247ED-4375-426C-A52A-1242555AB0AE}</SampleGuid>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>False</UseDebugLibraries>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ <DriverType />
+ <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset>
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ </PropertyGroup>
+ <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>True</UseDebugLibraries>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ <DriverType />
+ <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset>
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ </PropertyGroup>
+ <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>False</UseDebugLibraries>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ <DriverType />
+ <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset>
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ </PropertyGroup>
+ <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>True</UseDebugLibraries>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ <DriverType />
+ <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset>
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <PropertyGroup>
+ <OutDir>$(IntDir)</OutDir>
+ </PropertyGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
+ </ImportGroup>
+ <ItemGroup Label="WrappedTaskItems" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <TargetName>kbdgr</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <TargetName>kbdgr</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <TargetName>kbdgr</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <TargetName>kbdgr</TargetName>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\..\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ResourceCompile>
+ <ClCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\..\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Midl>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\..\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\..\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ResourceCompile>
+ <ClCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\..\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Midl>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\..\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\..\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ResourceCompile>
+ <ClCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\..\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Midl>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\..\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\..\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ResourceCompile>
+ <ClCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\..\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Midl>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);..\..\inc</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Link>
+ <AdditionalOptions>%(AdditionalOptions) -merge:.edata=.data -merge:.rdata=.data -merge:.text=.data -merge:.bss=.data -section:.data,re</AdditionalOptions>
+ <AdditionalOptions>%(AdditionalOptions) /ignore:4254</AdditionalOptions>
+ <ModuleDefinitionFile>kbdgr.def</ModuleDefinitionFile>
+ </Link>
+ <ClCompile>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Link>
+ <AdditionalOptions>%(AdditionalOptions) -merge:.edata=.data -merge:.rdata=.data -merge:.text=.data -merge:.bss=.data -section:.data,re</AdditionalOptions>
+ <AdditionalOptions>%(AdditionalOptions) /ignore:4254</AdditionalOptions>
+ <ModuleDefinitionFile>kbdgr.def</ModuleDefinitionFile>
+ </Link>
+ <ClCompile>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Link>
+ <AdditionalOptions>%(AdditionalOptions) -merge:.edata=.data -merge:.rdata=.data -merge:.text=.data -merge:.bss=.data -section:.data,re</AdditionalOptions>
+ <AdditionalOptions>%(AdditionalOptions) /ignore:4254</AdditionalOptions>
+ <ModuleDefinitionFile>kbdgr.def</ModuleDefinitionFile>
+ </Link>
+ <ClCompile>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Link>
+ <AdditionalOptions>%(AdditionalOptions) -merge:.edata=.data -merge:.rdata=.data -merge:.text=.data -merge:.bss=.data -section:.data,re</AdditionalOptions>
+ <AdditionalOptions>%(AdditionalOptions) /ignore:4254</AdditionalOptions>
+ <ModuleDefinitionFile>kbdgr.def</ModuleDefinitionFile>
+ </Link>
+ <ClCompile>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="kbdgr.c" />
+ <ResourceCompile Include="kbdgr.rc" />
+ </ItemGroup>
+ <ItemGroup>
+ <Inf Exclude="@(Inf)" Include="*.inf" />
+ <FilesToPackage Include="$(TargetPath)" Condition="'$(ConfigurationType)'=='Driver' or '$(ConfigurationType)'=='DynamicLibrary'" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Exclude="@(None)" Include="*.txt;*.htm;*.html" />
+ <None Exclude="@(None)" Include="*.ico;*.cur;*.bmp;*.dlg;*.rct;*.gif;*.jpg;*.jpeg;*.wav;*.jpe;*.tiff;*.tif;*.png;*.rc2" />
+ <None Exclude="@(None)" Include="*.def;*.bat;*.hpj;*.asmx" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Exclude="@(ClInclude)" Include="*.h;*.hpp;*.hxx;*.hm;*.inl;*.xsd" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project> \ No newline at end of file
diff --git a/input/layout/all_kbds/kbdgr/kbdgr.vcxproj.Filters b/input/layout/all_kbds/kbdgr/kbdgr.vcxproj.Filters
new file mode 100644
index 00000000..7972fc8c
--- /dev/null
+++ b/input/layout/all_kbds/kbdgr/kbdgr.vcxproj.Filters
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx;*</Extensions>
+ <UniqueIdentifier>{04250DA4-9C11-47C6-ADB5-D51AFB576121}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Header Files">
+ <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+ <UniqueIdentifier>{44BD7566-A35B-46E2-8C7A-C5DB8E778A25}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Resource Files">
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms;man;xml</Extensions>
+ <UniqueIdentifier>{6E6580AB-01C6-4F48-A3DA-B2802C85EC4F}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="kbdgr.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <None Include="kbdgr.def">
+ <Filter>Source Files</Filter>
+ </None>
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="kbdgr.rc">
+ <Filter>Resource Files</Filter>
+ </ResourceCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file