4 * FILE: dll/win32/input/add.c
6 * PROGRAMMER: Dmitry Chapyshev (dmitry@reactos.org)
15 static HWND hLangList
;
16 static HWND hLayoutList
;
19 SelectLayoutByLang(VOID
)
21 TCHAR Layout
[MAX_PATH
], Lang
[MAX_PATH
], LangID
[CCH_LAYOUT_ID
+ 1];
25 iIndex
= SendMessage(hLangList
, CB_GETCURSEL
, 0, 0);
26 Lcid
= SendMessage(hLangList
, CB_GETITEMDATA
, iIndex
, 0);
28 GetLocaleInfo(MAKELCID(Lcid
, SORT_DEFAULT
), LOCALE_ILANGUAGE
, Lang
, sizeof(Lang
) / sizeof(TCHAR
));
30 wsprintf(LangID
, _T("0000%s"), Lang
);
32 if (GetLayoutName(LangID
, Layout
))
34 SendMessage(hLayoutList
, CB_SELECTSTRING
,
35 (WPARAM
) -1, (LPARAM
)Layout
);
40 GetLayoutCount(LPTSTR szLang
)
43 TCHAR szLayoutID
[3 + 1], szPreload
[CCH_LAYOUT_ID
+ 1], szLOLang
[MAX_PATH
];
44 DWORD dwIndex
= 0, dwType
, dwSize
;
47 if (RegOpenKeyEx(HKEY_CURRENT_USER
, _T("Keyboard Layout\\Preload"),
48 0, KEY_QUERY_VALUE
, &hKey
) == ERROR_SUCCESS
)
50 dwSize
= sizeof(szLayoutID
);
52 while (RegEnumValue(hKey
, dwIndex
, szLayoutID
, &dwSize
, NULL
, &dwType
, NULL
, NULL
) == ERROR_SUCCESS
)
54 dwSize
= sizeof(szPreload
);
55 RegQueryValueEx(hKey
, szLayoutID
, NULL
, NULL
, (LPBYTE
)szPreload
, &dwSize
);
57 for (i
= 4, j
= 0; i
< _tcslen(szPreload
)+1; i
++, j
++)
58 szLOLang
[j
] = szPreload
[i
];
60 if (_tcscmp(szLOLang
, szLang
) == 0) Count
+= 1;
62 dwSize
= sizeof(szLayoutID
);
73 AddNewLayout(HWND hwndDlg
)
75 TCHAR NewLayout
[CCH_ULONG_DEC
+ 1], Lang
[MAX_PATH
],
76 LangID
[CCH_LAYOUT_ID
+ 1], Layout
[MAX_PATH
],
77 SubPath
[CCH_LAYOUT_ID
+ 1], szMessage
[MAX_PATH
];
84 iLayout
= SendMessage(hLayoutList
, CB_GETCURSEL
, 0, 0);
85 if (iLayout
== CB_ERR
) return;
87 if (RegOpenKeyEx(HKEY_CURRENT_USER
, _T("Keyboard Layout\\Preload"), 0, KEY_ALL_ACCESS
, &hKey
) == ERROR_SUCCESS
)
89 if (RegQueryInfoKey(hKey
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, &cValues
, NULL
, NULL
, NULL
, NULL
) == ERROR_SUCCESS
)
91 _ultot(cValues
+ 1, NewLayout
, 10);
93 iLang
= SendMessage(hLangList
, CB_GETCURSEL
, 0, 0);
94 lcid
= SendMessage(hLangList
, CB_GETITEMDATA
, iLang
, 0);
95 pts
= (PTSTR
) SendMessage(hLayoutList
, CB_GETITEMDATA
, iLayout
, 0);
97 GetLocaleInfo(MAKELCID(lcid
, SORT_DEFAULT
), LOCALE_ILANGUAGE
, Lang
, sizeof(Lang
) / sizeof(TCHAR
));
98 wsprintf(LangID
, _T("0000%s"), Lang
);
100 if (IsLayoutExists(pts
, LangID
))
102 LoadString(hApplet
, IDS_LAYOUT_EXISTS2
, szMessage
, sizeof(szMessage
) / sizeof(TCHAR
));
103 MessageBox(hwndDlg
, szMessage
, NULL
, MB_OK
| MB_ICONINFORMATION
);
109 if (GetLayoutName(LangID
, Layout
))
111 if ((SendMessage(hLayoutList
, CB_SELECTSTRING
, (WPARAM
) -1, (LPARAM
)Layout
) != CB_ERR
)&&
112 (GetLayoutCount(Lang
) >= 1))
114 wsprintf(SubPath
, _T("d%03d%s"), GetLayoutCount(Lang
)-1, Lang
);
116 else SubPath
[0] = '\0';
119 if (_tcslen(SubPath
) != 0)
121 if (RegCreateKeyEx(HKEY_CURRENT_USER
, _T("Keyboard Layout\\Substitutes"), 0, NULL
,
122 REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
,
123 NULL
, &hSubKey
, NULL
) == ERROR_SUCCESS
)
125 if (RegSetValueEx(hSubKey
, SubPath
, 0, REG_SZ
, (LPBYTE
)pts
,
126 (DWORD
)((CCH_LAYOUT_ID
+ 1) * sizeof(TCHAR
))) != ERROR_SUCCESS
)
128 RegCloseKey(hSubKey
);
132 RegCloseKey(hSubKey
);
134 lstrcpy(pts
, SubPath
);
137 if (RegSetValueEx(hKey
,
142 (DWORD
)((CCH_LAYOUT_ID
+ 1) * sizeof(TCHAR
))) == ERROR_SUCCESS
)
152 CreateKeyboardLayoutList(HWND hItemsList
)
156 TCHAR szLayoutID
[CCH_LAYOUT_ID
+ 1], KeyName
[MAX_PATH
];
160 if (RegOpenKeyEx(HKEY_LOCAL_MACHINE
, _T("System\\CurrentControlSet\\Control\\Keyboard Layouts"), 0, KEY_ENUMERATE_SUB_KEYS
, &hKey
) == ERROR_SUCCESS
)
162 dwSize
= sizeof(szLayoutID
) / sizeof(TCHAR
);
164 while (RegEnumKeyEx(hKey
, dwIndex
, szLayoutID
, &dwSize
, NULL
, NULL
, NULL
, NULL
) == ERROR_SUCCESS
)
166 GetLayoutName(szLayoutID
, KeyName
);
168 INT iIndex
= (INT
) SendMessage(hItemsList
, CB_ADDSTRING
, 0, (LPARAM
)KeyName
);
170 pstrLayoutID
= (PTSTR
)HeapAlloc(hProcessHeap
, 0, sizeof(szLayoutID
));
171 lstrcpy(pstrLayoutID
, szLayoutID
);
172 SendMessage(hItemsList
, CB_SETITEMDATA
, iIndex
, (LPARAM
)pstrLayoutID
);
175 if (_tcscmp(szLayoutID
, _T("00000409")) == 0)
177 SendMessage(hItemsList
, CB_SETCURSEL
, (WPARAM
)iIndex
, (LPARAM
)0);
182 dwSize
= sizeof(szLayoutID
) / sizeof(TCHAR
);
189 /* Language enumerate procedure */
191 LanguagesEnumProc(LPTSTR lpLanguage
)
197 Lcid
= _tcstoul(lpLanguage
, NULL
, 16);
199 GetLocaleInfo(Lcid
, LOCALE_SLANGUAGE
, Lang
, sizeof(Lang
));
200 Index
= (INT
)SendMessage(hLangList
, CB_ADDSTRING
,
203 SendMessage(hLangList
, CB_SETITEMDATA
,
204 Index
, (LPARAM
)Lcid
);
209 SendMessage(hLangList
, CB_SELECTSTRING
,
210 (WPARAM
) -1, (LPARAM
)Lang
);
217 AddDlgProc(HWND hDlg
,
222 UNREFERENCED_PARAMETER(lParam
);
228 hLangList
= GetDlgItem(hDlg
, IDC_INPUT_LANG_COMBO
);
229 hLayoutList
= GetDlgItem(hDlg
, IDC_KEYBOARD_LO_COMBO
);
230 EnumSystemLocales(LanguagesEnumProc
, LCID_INSTALLED
);
231 CreateKeyboardLayoutList(hLayoutList
);
237 switch (LOWORD(wParam
))
239 case IDC_INPUT_LANG_COMBO
:
241 if (HIWORD(wParam
) == CBN_SELCHANGE
)
243 SelectLayoutByLang();
251 EndDialog(hDlg
, LOWORD(wParam
));
257 EndDialog(hDlg
, LOWORD(wParam
));
267 for(iCount
= SendMessage(hLayoutList
, CB_GETCOUNT
, 0, 0); --iCount
>= 0;)
268 HeapFree(hProcessHeap
, 0, (LPVOID
)SendMessage(hLayoutList
, CB_GETITEMDATA
, iCount
, 0));