3 * FILE: dll/cpl/input/add.c
5 * PROGRAMMER: Dmitry Chapyshev (dmitry@reactos.org)
13 static HWND hLangList
;
14 static HWND hLayoutList
;
17 SelectLayoutByLang(VOID
)
19 TCHAR Layout
[MAX_PATH
], Lang
[MAX_PATH
], LangID
[CCH_LAYOUT_ID
+ 1];
23 iIndex
= SendMessage(hLangList
, CB_GETCURSEL
, 0, 0);
24 Lcid
= SendMessage(hLangList
, CB_GETITEMDATA
, iIndex
, 0);
26 GetLocaleInfo(MAKELCID(Lcid
, SORT_DEFAULT
), LOCALE_ILANGUAGE
, Lang
, sizeof(Lang
) / sizeof(TCHAR
));
28 wsprintf(LangID
, _T("0000%s"), Lang
);
30 if (GetLayoutName(LangID
, Layout
))
32 SendMessage(hLayoutList
, CB_SELECTSTRING
,
33 (WPARAM
) -1, (LPARAM
)Layout
);
38 GetLayoutCount(LPTSTR szLang
)
41 TCHAR szLayoutID
[3 + 1], szPreload
[CCH_LAYOUT_ID
+ 1], szLOLang
[MAX_PATH
];
42 DWORD dwIndex
= 0, dwType
, dwSize
;
45 if (RegOpenKeyEx(HKEY_CURRENT_USER
, _T("Keyboard Layout\\Preload"),
46 0, KEY_QUERY_VALUE
, &hKey
) == ERROR_SUCCESS
)
48 dwSize
= sizeof(szLayoutID
);
50 while (RegEnumValue(hKey
, dwIndex
, szLayoutID
, &dwSize
, NULL
, &dwType
, NULL
, NULL
) == ERROR_SUCCESS
)
52 dwSize
= sizeof(szPreload
);
53 RegQueryValueEx(hKey
, szLayoutID
, NULL
, NULL
, (LPBYTE
)szPreload
, &dwSize
);
55 for (i
= 4, j
= 0; i
< _tcslen(szPreload
)+1; i
++, j
++)
56 szLOLang
[j
] = szPreload
[i
];
58 if (_tcscmp(szLOLang
, szLang
) == 0) Count
+= 1;
60 dwSize
= sizeof(szLayoutID
);
71 AddNewLayout(HWND hwndDlg
)
73 TCHAR NewLayout
[CCH_ULONG_DEC
+ 1], Lang
[MAX_PATH
],
74 LangID
[CCH_LAYOUT_ID
+ 1], Layout
[MAX_PATH
],
75 SubPath
[CCH_LAYOUT_ID
+ 1], szMessage
[MAX_PATH
];
82 iLayout
= SendMessage(hLayoutList
, CB_GETCURSEL
, 0, 0);
83 if (iLayout
== CB_ERR
) return;
85 if (RegOpenKeyEx(HKEY_CURRENT_USER
, _T("Keyboard Layout\\Preload"), 0, KEY_ALL_ACCESS
, &hKey
) == ERROR_SUCCESS
)
87 if (RegQueryInfoKey(hKey
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, &cValues
, NULL
, NULL
, NULL
, NULL
) == ERROR_SUCCESS
)
89 _ultot(cValues
+ 1, NewLayout
, 10);
91 iLang
= SendMessage(hLangList
, CB_GETCURSEL
, 0, 0);
92 lcid
= SendMessage(hLangList
, CB_GETITEMDATA
, iLang
, 0);
93 pts
= (PTSTR
) SendMessage(hLayoutList
, CB_GETITEMDATA
, iLayout
, 0);
95 GetLocaleInfo(MAKELCID(lcid
, SORT_DEFAULT
), LOCALE_ILANGUAGE
, Lang
, sizeof(Lang
) / sizeof(TCHAR
));
96 wsprintf(LangID
, _T("0000%s"), Lang
);
98 if (IsLayoutExists(pts
, LangID
))
100 LoadString(hApplet
, IDS_LAYOUT_EXISTS2
, szMessage
, sizeof(szMessage
) / sizeof(TCHAR
));
101 MessageBox(hwndDlg
, szMessage
, NULL
, MB_OK
| MB_ICONINFORMATION
);
107 if (_tcscmp(LangID
, pts
) != 0)
109 if (!GetLayoutName(pts
, Layout
))
117 if (!GetLayoutName(LangID
, Layout
))
124 if (SendMessage(hLayoutList
, CB_SELECTSTRING
, (WPARAM
) -1, (LPARAM
)Layout
) != CB_ERR
)
126 if (GetLayoutCount(Lang
) >= 1)
128 wsprintf(SubPath
, _T("d%03d%s"), GetLayoutCount(Lang
), Lang
);
130 else if ((_tcscmp(LangID
, pts
) != 0) && (GetLayoutCount(Lang
) == 0))
132 wsprintf(SubPath
, _T("d%03d%s"), 0, Lang
);
134 else SubPath
[0] = '\0';
142 if (_tcslen(SubPath
) != 0)
144 if (RegCreateKeyEx(HKEY_CURRENT_USER
, _T("Keyboard Layout\\Substitutes"), 0, NULL
,
145 REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
,
146 NULL
, &hSubKey
, NULL
) == ERROR_SUCCESS
)
148 if (RegSetValueEx(hSubKey
, SubPath
, 0, REG_SZ
, (LPBYTE
)pts
,
149 (DWORD
)((CCH_LAYOUT_ID
+ 1) * sizeof(TCHAR
))) != ERROR_SUCCESS
)
151 RegCloseKey(hSubKey
);
155 RegCloseKey(hSubKey
);
157 lstrcpy(pts
, SubPath
);
160 if (RegSetValueEx(hKey
,
165 (DWORD
)((CCH_LAYOUT_ID
+ 1) * sizeof(TCHAR
))) == ERROR_SUCCESS
)
175 CreateKeyboardLayoutList(HWND hItemsList
)
179 TCHAR szLayoutID
[CCH_LAYOUT_ID
+ 1], KeyName
[MAX_PATH
];
183 if (RegOpenKeyEx(HKEY_LOCAL_MACHINE
, _T("System\\CurrentControlSet\\Control\\Keyboard Layouts"), 0, KEY_ENUMERATE_SUB_KEYS
, &hKey
) == ERROR_SUCCESS
)
185 dwSize
= sizeof(szLayoutID
) / sizeof(TCHAR
);
187 while (RegEnumKeyEx(hKey
, dwIndex
, szLayoutID
, &dwSize
, NULL
, NULL
, NULL
, NULL
) == ERROR_SUCCESS
)
191 GetLayoutName(szLayoutID
, KeyName
);
193 iIndex
= (INT
) SendMessage(hItemsList
, CB_ADDSTRING
, 0, (LPARAM
)KeyName
);
195 pstrLayoutID
= (PTSTR
)HeapAlloc(hProcessHeap
, 0, sizeof(szLayoutID
));
196 lstrcpy(pstrLayoutID
, szLayoutID
);
197 SendMessage(hItemsList
, CB_SETITEMDATA
, iIndex
, (LPARAM
)pstrLayoutID
);
200 if (_tcscmp(szLayoutID
, _T("00000409")) == 0)
202 SendMessage(hItemsList
, CB_SETCURSEL
, (WPARAM
)iIndex
, (LPARAM
)0);
207 dwSize
= sizeof(szLayoutID
) / sizeof(TCHAR
);
214 /* Language enumerate procedure */
216 LanguagesEnumProc(LPTSTR lpLanguage
)
222 Lcid
= _tcstoul(lpLanguage
, NULL
, 16);
224 GetLocaleInfo(Lcid
, LOCALE_SLANGUAGE
, Lang
, sizeof(Lang
) / sizeof(Lang
[0]));
225 Index
= (INT
)SendMessage(hLangList
, CB_ADDSTRING
,
228 SendMessage(hLangList
, CB_SETITEMDATA
,
229 Index
, (LPARAM
)Lcid
);
234 SendMessage(hLangList
, CB_SELECTSTRING
,
235 (WPARAM
) -1, (LPARAM
)Lang
);
242 AddDlgProc(HWND hDlg
,
247 UNREFERENCED_PARAMETER(lParam
);
253 hLangList
= GetDlgItem(hDlg
, IDC_INPUT_LANG_COMBO
);
254 hLayoutList
= GetDlgItem(hDlg
, IDC_KEYBOARD_LO_COMBO
);
255 EnumSystemLocales(LanguagesEnumProc
, LCID_INSTALLED
);
256 CreateKeyboardLayoutList(hLayoutList
);
262 switch (LOWORD(wParam
))
264 case IDC_INPUT_LANG_COMBO
:
266 if (HIWORD(wParam
) == CBN_SELCHANGE
)
268 SelectLayoutByLang();
276 EndDialog(hDlg
, LOWORD(wParam
));
282 EndDialog(hDlg
, LOWORD(wParam
));
292 for(iCount
= SendMessage(hLayoutList
, CB_GETCOUNT
, 0, 0); --iCount
>= 0;)
293 HeapFree(hProcessHeap
, 0, (LPVOID
)SendMessage(hLayoutList
, CB_GETITEMDATA
, iCount
, 0));