3 * FILE: dll/win32/input/add.c
5 * PROGRAMMER: Dmitry Chapyshev (dmitry@reactos.org)
14 static HWND hLangList
;
15 static HWND hLayoutList
;
18 SelectLayoutByLang(VOID
)
20 TCHAR Layout
[MAX_PATH
], Lang
[MAX_PATH
], LangID
[CCH_LAYOUT_ID
+ 1];
24 iIndex
= SendMessage(hLangList
, CB_GETCURSEL
, 0, 0);
25 Lcid
= SendMessage(hLangList
, CB_GETITEMDATA
, iIndex
, 0);
27 GetLocaleInfo(MAKELCID(Lcid
, SORT_DEFAULT
), LOCALE_ILANGUAGE
, Lang
, sizeof(Lang
) / sizeof(TCHAR
));
29 wsprintf(LangID
, _T("0000%s"), Lang
);
31 if (GetLayoutName(LangID
, Layout
))
33 SendMessage(hLayoutList
, CB_SELECTSTRING
,
34 (WPARAM
) -1, (LPARAM
)Layout
);
39 GetLayoutCount(LPTSTR szLang
)
42 TCHAR szLayoutID
[3 + 1], szPreload
[CCH_LAYOUT_ID
+ 1], szLOLang
[MAX_PATH
];
43 DWORD dwIndex
= 0, dwType
, dwSize
;
46 if (RegOpenKeyEx(HKEY_CURRENT_USER
, _T("Keyboard Layout\\Preload"),
47 0, KEY_QUERY_VALUE
, &hKey
) == ERROR_SUCCESS
)
49 dwSize
= sizeof(szLayoutID
);
51 while (RegEnumValue(hKey
, dwIndex
, szLayoutID
, &dwSize
, NULL
, &dwType
, NULL
, NULL
) == ERROR_SUCCESS
)
53 dwSize
= sizeof(szPreload
);
54 RegQueryValueEx(hKey
, szLayoutID
, NULL
, NULL
, (LPBYTE
)szPreload
, &dwSize
);
56 for (i
= 4, j
= 0; i
< _tcslen(szPreload
)+1; i
++, j
++)
57 szLOLang
[j
] = szPreload
[i
];
59 if (_tcscmp(szLOLang
, szLang
) == 0) Count
+= 1;
61 dwSize
= sizeof(szLayoutID
);
72 AddNewLayout(HWND hwndDlg
)
74 TCHAR NewLayout
[CCH_ULONG_DEC
+ 1], Lang
[MAX_PATH
],
75 LangID
[CCH_LAYOUT_ID
+ 1], Layout
[MAX_PATH
],
76 SubPath
[CCH_LAYOUT_ID
+ 1], szMessage
[MAX_PATH
];
83 iLayout
= SendMessage(hLayoutList
, CB_GETCURSEL
, 0, 0);
84 if (iLayout
== CB_ERR
) return;
86 if (RegOpenKeyEx(HKEY_CURRENT_USER
, _T("Keyboard Layout\\Preload"), 0, KEY_ALL_ACCESS
, &hKey
) == ERROR_SUCCESS
)
88 if (RegQueryInfoKey(hKey
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, &cValues
, NULL
, NULL
, NULL
, NULL
) == ERROR_SUCCESS
)
90 _ultot(cValues
+ 1, NewLayout
, 10);
92 iLang
= SendMessage(hLangList
, CB_GETCURSEL
, 0, 0);
93 lcid
= SendMessage(hLangList
, CB_GETITEMDATA
, iLang
, 0);
94 pts
= (PTSTR
) SendMessage(hLayoutList
, CB_GETITEMDATA
, iLayout
, 0);
96 GetLocaleInfo(MAKELCID(lcid
, SORT_DEFAULT
), LOCALE_ILANGUAGE
, Lang
, sizeof(Lang
) / sizeof(TCHAR
));
97 wsprintf(LangID
, _T("0000%s"), Lang
);
99 if (IsLayoutExists(pts
, LangID
))
101 LoadString(hApplet
, IDS_LAYOUT_EXISTS2
, szMessage
, sizeof(szMessage
) / sizeof(TCHAR
));
102 MessageBox(hwndDlg
, szMessage
, NULL
, MB_OK
| MB_ICONINFORMATION
);
108 if (_tcscmp(LangID
, pts
) != 0)
110 if (!GetLayoutName(pts
, Layout
))
118 if (!GetLayoutName(LangID
, Layout
))
125 if (SendMessage(hLayoutList
, CB_SELECTSTRING
, (WPARAM
) -1, (LPARAM
)Layout
) != CB_ERR
)
127 if (GetLayoutCount(Lang
) >= 1)
129 wsprintf(SubPath
, _T("d%03d%s"), GetLayoutCount(Lang
), Lang
);
131 else if ((_tcscmp(LangID
, pts
) != 0) && (GetLayoutCount(Lang
) == 0))
133 wsprintf(SubPath
, _T("d%03d%s"), 0, Lang
);
135 else SubPath
[0] = '\0';
143 if (_tcslen(SubPath
) != 0)
145 if (RegCreateKeyEx(HKEY_CURRENT_USER
, _T("Keyboard Layout\\Substitutes"), 0, NULL
,
146 REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
,
147 NULL
, &hSubKey
, NULL
) == ERROR_SUCCESS
)
149 if (RegSetValueEx(hSubKey
, SubPath
, 0, REG_SZ
, (LPBYTE
)pts
,
150 (DWORD
)((CCH_LAYOUT_ID
+ 1) * sizeof(TCHAR
))) != ERROR_SUCCESS
)
152 RegCloseKey(hSubKey
);
156 RegCloseKey(hSubKey
);
158 lstrcpy(pts
, SubPath
);
161 if (RegSetValueEx(hKey
,
166 (DWORD
)((CCH_LAYOUT_ID
+ 1) * sizeof(TCHAR
))) == ERROR_SUCCESS
)
176 CreateKeyboardLayoutList(HWND hItemsList
)
180 TCHAR szLayoutID
[CCH_LAYOUT_ID
+ 1], KeyName
[MAX_PATH
];
184 if (RegOpenKeyEx(HKEY_LOCAL_MACHINE
, _T("System\\CurrentControlSet\\Control\\Keyboard Layouts"), 0, KEY_ENUMERATE_SUB_KEYS
, &hKey
) == ERROR_SUCCESS
)
186 dwSize
= sizeof(szLayoutID
) / sizeof(TCHAR
);
188 while (RegEnumKeyEx(hKey
, dwIndex
, szLayoutID
, &dwSize
, NULL
, NULL
, NULL
, NULL
) == ERROR_SUCCESS
)
192 GetLayoutName(szLayoutID
, KeyName
);
194 iIndex
= (INT
) SendMessage(hItemsList
, CB_ADDSTRING
, 0, (LPARAM
)KeyName
);
196 pstrLayoutID
= (PTSTR
)HeapAlloc(hProcessHeap
, 0, sizeof(szLayoutID
));
197 lstrcpy(pstrLayoutID
, szLayoutID
);
198 SendMessage(hItemsList
, CB_SETITEMDATA
, iIndex
, (LPARAM
)pstrLayoutID
);
201 if (_tcscmp(szLayoutID
, _T("00000409")) == 0)
203 SendMessage(hItemsList
, CB_SETCURSEL
, (WPARAM
)iIndex
, (LPARAM
)0);
208 dwSize
= sizeof(szLayoutID
) / sizeof(TCHAR
);
215 /* Language enumerate procedure */
217 LanguagesEnumProc(LPTSTR lpLanguage
)
223 Lcid
= _tcstoul(lpLanguage
, NULL
, 16);
225 GetLocaleInfo(Lcid
, LOCALE_SLANGUAGE
, Lang
, sizeof(Lang
));
226 Index
= (INT
)SendMessage(hLangList
, CB_ADDSTRING
,
229 SendMessage(hLangList
, CB_SETITEMDATA
,
230 Index
, (LPARAM
)Lcid
);
235 SendMessage(hLangList
, CB_SELECTSTRING
,
236 (WPARAM
) -1, (LPARAM
)Lang
);
243 AddDlgProc(HWND hDlg
,
248 UNREFERENCED_PARAMETER(lParam
);
254 hLangList
= GetDlgItem(hDlg
, IDC_INPUT_LANG_COMBO
);
255 hLayoutList
= GetDlgItem(hDlg
, IDC_KEYBOARD_LO_COMBO
);
256 EnumSystemLocales(LanguagesEnumProc
, LCID_INSTALLED
);
257 CreateKeyboardLayoutList(hLayoutList
);
263 switch (LOWORD(wParam
))
265 case IDC_INPUT_LANG_COMBO
:
267 if (HIWORD(wParam
) == CBN_SELCHANGE
)
269 SelectLayoutByLang();
277 EndDialog(hDlg
, LOWORD(wParam
));
283 EndDialog(hDlg
, LOWORD(wParam
));
293 for(iCount
= SendMessage(hLayoutList
, CB_GETCOUNT
, 0, 0); --iCount
>= 0;)
294 HeapFree(hProcessHeap
, 0, (LPVOID
)SendMessage(hLayoutList
, CB_GETITEMDATA
, iCount
, 0));