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 (_tcscmp(LangID
, pts
) != 0)
111 if (!GetLayoutName(pts
, Layout
))
119 if (!GetLayoutName(LangID
, Layout
))
126 if (SendMessage(hLayoutList
, CB_SELECTSTRING
, (WPARAM
) -1, (LPARAM
)Layout
) != CB_ERR
)
128 if (GetLayoutCount(Lang
) >= 1)
130 wsprintf(SubPath
, _T("d%03d%s"), GetLayoutCount(Lang
), Lang
);
132 else if ((_tcscmp(LangID
, pts
) != 0) && (GetLayoutCount(Lang
) == 0))
134 wsprintf(SubPath
, _T("d%03d%s"), 0, Lang
);
136 else SubPath
[0] = '\0';
144 if (_tcslen(SubPath
) != 0)
146 if (RegCreateKeyEx(HKEY_CURRENT_USER
, _T("Keyboard Layout\\Substitutes"), 0, NULL
,
147 REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
,
148 NULL
, &hSubKey
, NULL
) == ERROR_SUCCESS
)
150 if (RegSetValueEx(hSubKey
, SubPath
, 0, REG_SZ
, (LPBYTE
)pts
,
151 (DWORD
)((CCH_LAYOUT_ID
+ 1) * sizeof(TCHAR
))) != ERROR_SUCCESS
)
153 RegCloseKey(hSubKey
);
157 RegCloseKey(hSubKey
);
159 lstrcpy(pts
, SubPath
);
162 if (RegSetValueEx(hKey
,
167 (DWORD
)((CCH_LAYOUT_ID
+ 1) * sizeof(TCHAR
))) == ERROR_SUCCESS
)
177 CreateKeyboardLayoutList(HWND hItemsList
)
181 TCHAR szLayoutID
[CCH_LAYOUT_ID
+ 1], KeyName
[MAX_PATH
];
185 if (RegOpenKeyEx(HKEY_LOCAL_MACHINE
, _T("System\\CurrentControlSet\\Control\\Keyboard Layouts"), 0, KEY_ENUMERATE_SUB_KEYS
, &hKey
) == ERROR_SUCCESS
)
187 dwSize
= sizeof(szLayoutID
) / sizeof(TCHAR
);
189 while (RegEnumKeyEx(hKey
, dwIndex
, szLayoutID
, &dwSize
, NULL
, NULL
, NULL
, NULL
) == ERROR_SUCCESS
)
193 GetLayoutName(szLayoutID
, KeyName
);
195 iIndex
= (INT
) SendMessage(hItemsList
, CB_ADDSTRING
, 0, (LPARAM
)KeyName
);
197 pstrLayoutID
= (PTSTR
)HeapAlloc(hProcessHeap
, 0, sizeof(szLayoutID
));
198 lstrcpy(pstrLayoutID
, szLayoutID
);
199 SendMessage(hItemsList
, CB_SETITEMDATA
, iIndex
, (LPARAM
)pstrLayoutID
);
202 if (_tcscmp(szLayoutID
, _T("00000409")) == 0)
204 SendMessage(hItemsList
, CB_SETCURSEL
, (WPARAM
)iIndex
, (LPARAM
)0);
209 dwSize
= sizeof(szLayoutID
) / sizeof(TCHAR
);
216 /* Language enumerate procedure */
218 LanguagesEnumProc(LPTSTR lpLanguage
)
224 Lcid
= _tcstoul(lpLanguage
, NULL
, 16);
226 GetLocaleInfo(Lcid
, LOCALE_SLANGUAGE
, Lang
, sizeof(Lang
));
227 Index
= (INT
)SendMessage(hLangList
, CB_ADDSTRING
,
230 SendMessage(hLangList
, CB_SETITEMDATA
,
231 Index
, (LPARAM
)Lcid
);
236 SendMessage(hLangList
, CB_SELECTSTRING
,
237 (WPARAM
) -1, (LPARAM
)Lang
);
244 AddDlgProc(HWND hDlg
,
249 UNREFERENCED_PARAMETER(lParam
);
255 hLangList
= GetDlgItem(hDlg
, IDC_INPUT_LANG_COMBO
);
256 hLayoutList
= GetDlgItem(hDlg
, IDC_KEYBOARD_LO_COMBO
);
257 EnumSystemLocales(LanguagesEnumProc
, LCID_INSTALLED
);
258 CreateKeyboardLayoutList(hLayoutList
);
264 switch (LOWORD(wParam
))
266 case IDC_INPUT_LANG_COMBO
:
268 if (HIWORD(wParam
) == CBN_SELCHANGE
)
270 SelectLayoutByLang();
278 EndDialog(hDlg
, LOWORD(wParam
));
284 EndDialog(hDlg
, LOWORD(wParam
));
294 for(iCount
= SendMessage(hLayoutList
, CB_GETCOUNT
, 0, 0); --iCount
>= 0;)
295 HeapFree(hProcessHeap
, 0, (LPVOID
)SendMessage(hLayoutList
, CB_GETITEMDATA
, iCount
, 0));