mirror of
https://github.com/reactos/reactos.git
synced 2024-08-27 05:38:41 +00:00
150 lines
2.7 KiB
C
150 lines
2.7 KiB
C
/*
|
|
* PROJECT: input.dll
|
|
* FILE: dll/cpl/input/locale_list.c
|
|
* PURPOSE: input.dll
|
|
* PROGRAMMER: Dmitry Chapyshev (dmitry@reactos.org)
|
|
*/
|
|
|
|
#include "locale_list.h"
|
|
|
|
|
|
static LOCALE_LIST_NODE *_LocaleList = NULL;
|
|
|
|
|
|
static LOCALE_LIST_NODE*
|
|
LocaleList_Append(DWORD dwId, const WCHAR *pszName)
|
|
{
|
|
LOCALE_LIST_NODE *pCurrent;
|
|
LOCALE_LIST_NODE *pNew;
|
|
|
|
if (pszName == NULL)
|
|
return NULL;
|
|
|
|
pCurrent = _LocaleList;
|
|
|
|
pNew = (LOCALE_LIST_NODE*)malloc(sizeof(LOCALE_LIST_NODE));
|
|
if (pNew == NULL)
|
|
return NULL;
|
|
|
|
ZeroMemory(pNew, sizeof(LOCALE_LIST_NODE));
|
|
|
|
pNew->pszName = _wcsdup(pszName);
|
|
if (pNew->pszName == NULL)
|
|
{
|
|
free(pNew);
|
|
return NULL;
|
|
}
|
|
|
|
pNew->dwId = dwId;
|
|
|
|
if (pCurrent == NULL)
|
|
{
|
|
_LocaleList = pNew;
|
|
}
|
|
else
|
|
{
|
|
while (pCurrent->pNext != NULL)
|
|
{
|
|
pCurrent = pCurrent->pNext;
|
|
}
|
|
|
|
pNew->pPrev = pCurrent;
|
|
pCurrent->pNext = pNew;
|
|
}
|
|
|
|
return pNew;
|
|
}
|
|
|
|
|
|
VOID
|
|
LocaleList_Destroy(VOID)
|
|
{
|
|
LOCALE_LIST_NODE *pCurrent;
|
|
|
|
if (_LocaleList == NULL)
|
|
return;
|
|
|
|
pCurrent = _LocaleList;
|
|
|
|
while (pCurrent != NULL)
|
|
{
|
|
LOCALE_LIST_NODE *pNext = pCurrent->pNext;
|
|
|
|
free(pCurrent->pszName);
|
|
free(pCurrent);
|
|
|
|
pCurrent = pNext;
|
|
}
|
|
|
|
_LocaleList = NULL;
|
|
}
|
|
|
|
|
|
LOCALE_LIST_NODE*
|
|
LocaleList_Create(VOID)
|
|
{
|
|
WCHAR szValue[MAX_PATH];
|
|
DWORD dwIndex;
|
|
DWORD dwSize;
|
|
HKEY hKey;
|
|
|
|
if (RegOpenKeyExW(HKEY_LOCAL_MACHINE,
|
|
L"SYSTEM\\CurrentControlSet\\Control\\Nls\\Language",
|
|
0,
|
|
KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE,
|
|
&hKey) != ERROR_SUCCESS)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
dwSize = ARRAYSIZE(szValue);
|
|
dwIndex = 0;
|
|
|
|
while (RegEnumValueW(hKey, dwIndex, szValue, &dwSize,
|
|
NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
|
|
{
|
|
WCHAR szName[MAX_STR_LEN];
|
|
DWORD dwId;
|
|
|
|
dwId = DWORDfromString(szValue);
|
|
|
|
if (GetLocaleInfoW(LOWORD(dwId),
|
|
LOCALE_SLANGUAGE,
|
|
szName, ARRAYSIZE(szName)))
|
|
{
|
|
LocaleList_Append(dwId, szName);
|
|
}
|
|
|
|
dwSize = ARRAYSIZE(szValue);
|
|
++dwIndex;
|
|
}
|
|
|
|
RegCloseKey(hKey);
|
|
|
|
return _LocaleList;
|
|
}
|
|
|
|
|
|
LOCALE_LIST_NODE*
|
|
LocaleList_GetByHkl(HKL hkl)
|
|
{
|
|
LOCALE_LIST_NODE *pCurrent;
|
|
|
|
for (pCurrent = _LocaleList; pCurrent != NULL; pCurrent = pCurrent->pNext)
|
|
{
|
|
if (LOWORD(pCurrent->dwId) == LOWORD(hkl))
|
|
{
|
|
return pCurrent;
|
|
}
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
|
|
LOCALE_LIST_NODE*
|
|
LocaleList_GetFirst(VOID)
|
|
{
|
|
return _LocaleList;
|
|
}
|