- Implement list of keyboard layouts on Settings Page

svn path=/trunk/; revision=72154
This commit is contained in:
Dmitry Chapyshev 2016-08-07 23:28:50 +00:00
parent 71757bb0fe
commit 6b265ca585
8 changed files with 716 additions and 73 deletions

View file

@ -3,7 +3,12 @@ spec2def(input_new.dll input.spec)
list(APPEND SOURCE
input.c
input.h)
input.h
layout_list.c
layout_list.h
locale_list.c
locale_list.h
settings_page.c)
add_rc_deps(input.rc ${CMAKE_CURRENT_SOURCE_DIR}/resources/keyboard-shortcuts.ico)

View file

@ -15,73 +15,66 @@
#define NUM_APPLETS (1)
LONG CALLBACK SystemApplet(VOID);
HINSTANCE hApplet = 0;
HANDLE hProcessHeap;
HINSTANCE hApplet = NULL;
HWND hCPLWindow;
/* Applets */
APPLET Applets[NUM_APPLETS] =
static APPLET Applets[NUM_APPLETS] =
{
{IDI_CPLSYSTEM, IDS_CPLSYSTEMNAME, IDS_CPLSYSTEMDESCRIPTION, SystemApplet}
};
VOID
InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc)
InitPropSheetPage(PROPSHEETPAGE *page, WORD idDlg, DLGPROC DlgProc)
{
ZeroMemory(psp, sizeof(PROPSHEETPAGE));
psp->dwSize = sizeof(PROPSHEETPAGE);
psp->dwFlags = PSP_DEFAULT;
psp->hInstance = hApplet;
psp->pszTemplate = MAKEINTRESOURCE(idDlg);
psp->pfnDlgProc = DlgProc;
}
memset(page, 0, sizeof(PROPSHEETPAGE));
INT_PTR CALLBACK
SettingsPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
return FALSE;
page->dwSize = sizeof(PROPSHEETPAGE);
page->dwFlags = PSP_DEFAULT;
page->hInstance = hApplet;
page->pszTemplate = MAKEINTRESOURCE(idDlg);
page->pfnDlgProc = DlgProc;
}
INT_PTR CALLBACK
AdvancedSettingsPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
return FALSE;
return FALSE;
}
/* First Applet */
LONG CALLBACK
SystemApplet(VOID)
{
PROPSHEETPAGE psp[2];
PROPSHEETHEADER psh;
TCHAR Caption[1024];
PROPSHEETPAGE page[2];
PROPSHEETHEADER header;
WCHAR szCaption[MAX_STR_LEN];
LoadString(hApplet, IDS_CPLSYSTEMNAME, Caption, sizeof(Caption) / sizeof(TCHAR));
LoadString(hApplet, IDS_CPLSYSTEMNAME, szCaption, ARRAYSIZE(szCaption));
ZeroMemory(&psh, sizeof(PROPSHEETHEADER));
psh.dwSize = sizeof(PROPSHEETHEADER);
psh.dwFlags = PSH_PROPSHEETPAGE;
psh.hwndParent = hCPLWindow;
psh.hInstance = hApplet;
psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDI_CPLSYSTEM));
psh.pszCaption = Caption;
psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE);
psh.nStartPage = 0;
psh.ppsp = psp;
psh.pfnCallback = NULL;
memset(&header, 0, sizeof(PROPSHEETHEADER));
header.dwSize = sizeof(PROPSHEETHEADER);
header.dwFlags = PSH_PROPSHEETPAGE;
header.hwndParent = hCPLWindow;
header.hInstance = hApplet;
header.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDI_CPLSYSTEM));
header.pszCaption = szCaption;
header.nPages = ARRAYSIZE(page);
header.nStartPage = 0;
header.ppsp = page;
header.pfnCallback = NULL;
/* Settings */
InitPropSheetPage(&psp[0], IDD_PROPPAGESETTINGS, (DLGPROC)SettingsPageProc);
InitPropSheetPage(&page[0], IDD_PROPPAGESETTINGS, SettingsPageProc);
/* Advanced Settings */
InitPropSheetPage(&psp[1], IDD_PROPPAGEADVANCEDSETTINGS, (DLGPROC)AdvancedSettingsPageProc);
InitPropSheetPage(&page[1], IDD_PROPPAGEADVANCEDSETTINGS, AdvancedSettingsPageProc);
return (LONG)(PropertySheet(&psh) != -1);
return (LONG)(PropertySheet(&header) != -1);
}
@ -93,6 +86,7 @@ CPlApplet(HWND hwndCPl, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
DWORD i;
i = (DWORD)lParam1;
switch (uMsg)
{
case CPL_INIT:
@ -129,7 +123,6 @@ DllMain(HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpvReserved)
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
hApplet = hinstDLL;
hProcessHeap = GetProcessHeap();
break;
}

View file

@ -9,8 +9,11 @@
#include <winnls.h>
#include <winreg.h>
#include <winuser.h>
#include <wingdi.h>
#include <commctrl.h>
#include <tchar.h>
#include <wchar.h>
#include <strsafe.h>
#include <stdlib.h>
#include "resource.h"
@ -25,7 +28,6 @@ typedef struct
} APPLET, *PAPPLET;
extern HINSTANCE hApplet;
extern HANDLE hProcessHeap;
// Character Count of a layout ID like "00000409"
#define CCH_LAYOUT_ID 8
@ -33,44 +35,33 @@ extern HANDLE hProcessHeap;
// Maximum Character Count of a ULONG in decimal
#define CCH_ULONG_DEC 10
#define MAX_STR_LEN 256
/* input.c */
VOID
InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc);
InitPropSheetPage(PROPSHEETPAGE *page, WORD idDlg, DLGPROC DlgProc);
/* settings.c */
/* settings_dialog.c */
INT_PTR CALLBACK
SettingsPageProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam);
BOOL
GetLayoutName(LPCTSTR szLCID, LPTSTR szName);
VOID
UpdateLayoutsList(VOID);
BOOL
IsLayoutExists(LPTSTR szLayoutID, LPTSTR szLangID);
/* advsettings.c */
INT_PTR CALLBACK
AdvancedSettingsPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
/* keysettings.c */
INT_PTR CALLBACK
KeySettingsDlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam);
VOID
UpdateKeySettingsList(VOID);
/* add.c */
INT_PTR CALLBACK
AddDlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam);
VOID
CreateKeyboardLayoutList(HWND hItemsList);
INT
GetLayoutCount(LPTSTR szLang);
/* changekeyseq.c */
INT_PTR CALLBACK
ChangeKeySeqDlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam);
BOOL
GetHotkeys(LPTSTR szHotkey, LPTSTR szLangHotkey, LPTSTR szLayoutHotkey);
SettingsPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
void ShowLastWin32Error(HWND hWndOwner);
static inline WCHAR*
DublicateString(const WCHAR *pszString)
{
WCHAR *pszDublicate;
size_t size;
size = (wcslen(pszString) + 1) * sizeof(WCHAR);
pszDublicate = (WCHAR*) malloc(size);
if (pszDublicate != NULL)
{
StringCbCopyW(pszDublicate, size, pszString);
}
return pszDublicate;
}
#endif /* _INPUT_H */

View file

@ -0,0 +1,221 @@
/*
* PROJECT: input.dll
* FILE: dll/cpl/input/layout_list.c
* PURPOSE: input.dll
* PROGRAMMER: Dmitry Chapyshev (dmitry@reactos.org)
*/
#include "layout_list.h"
static LAYOUT_LIST_NODE *_LayoutList = NULL;
static LAYOUT_LIST_NODE*
LayoutList_Append(DWORD dwId, DWORD dwSpecialId, const WCHAR *pszName, const WCHAR *pszFile)
{
LAYOUT_LIST_NODE *pCurrent;
LAYOUT_LIST_NODE *pNew;
if (pszName == NULL || pszFile == NULL)
return NULL;
pCurrent = _LayoutList;
pNew = (LAYOUT_LIST_NODE*)malloc(sizeof(LAYOUT_LIST_NODE));
if (pNew == NULL)
return NULL;
memset(pNew, 0, sizeof(LAYOUT_LIST_NODE));
pNew->pszName = DublicateString(pszName);
if (pNew->pszName == NULL)
{
free(pNew);
return NULL;
}
pNew->pszFile = DublicateString(pszFile);
if (pNew->pszFile == NULL)
{
free(pNew->pszName);
free(pNew);
return NULL;
}
pNew->dwId = dwId;
pNew->dwSpecialId = dwSpecialId;
if (pCurrent == NULL)
{
_LayoutList = pNew;
}
else
{
while (pCurrent->pNext != NULL)
{
pCurrent = pCurrent->pNext;
}
pNew->pPrev = pCurrent;
pCurrent->pNext = pNew;
}
return pNew;
}
VOID
LayoutList_Destroy(VOID)
{
LAYOUT_LIST_NODE *pCurrent;
if (_LayoutList == NULL)
return;
pCurrent = _LayoutList;
while (pCurrent != NULL)
{
LAYOUT_LIST_NODE *pNext = pCurrent->pNext;
free(pCurrent->pszName);
free(pCurrent->pszFile);
free(pCurrent);
pCurrent = pNext;
}
_LayoutList = NULL;
}
VOID
LayoutList_Create(VOID)
{
WCHAR szSystemDirectory[MAX_PATH];
WCHAR szLayoutId[MAX_PATH];
DWORD dwIndex = 0;
DWORD dwSize;
HKEY hKey;
GetSystemDirectoryW(szSystemDirectory, ARRAYSIZE(szSystemDirectory));
if (RegOpenKeyExW(HKEY_LOCAL_MACHINE,
L"SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts",
0,
KEY_ENUMERATE_SUB_KEYS,
&hKey) != ERROR_SUCCESS)
{
return;
}
dwSize = sizeof(szLayoutId);
while (RegEnumKeyExW(hKey, dwIndex, szLayoutId, &dwSize,
NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
{
HKEY hLayoutKey;
if (RegOpenKeyExW(hKey,
szLayoutId,
0,
KEY_QUERY_VALUE,
&hLayoutKey) == ERROR_SUCCESS)
{
WCHAR szBuffer[MAX_PATH];
dwSize = sizeof(szBuffer);
if (RegQueryValueExW(hLayoutKey,
L"Layout File",
NULL, NULL,
(LPBYTE)szBuffer, &dwSize) == ERROR_SUCCESS)
{
WCHAR szFilePath[MAX_PATH];
StringCchPrintfW(szFilePath, ARRAYSIZE(szFilePath),
L"%s\\%s", szSystemDirectory, szBuffer);
if (GetFileAttributes(szFilePath) != INVALID_FILE_ATTRIBUTES)
{
DWORD dwSpecialId = 0;
WCHAR *pszEnd;
dwSize = sizeof(szBuffer);
if (RegQueryValueExW(hLayoutKey,
L"Layout Id",
NULL, NULL,
(LPBYTE)szBuffer, &dwSize) == ERROR_SUCCESS)
{
dwSpecialId = wcstoul(szBuffer, &pszEnd, 16);
}
dwSize = sizeof(szBuffer);
if (RegQueryValueExW(hLayoutKey,
L"Layout Text",
NULL, NULL,
(LPBYTE)szBuffer, &dwSize) == ERROR_SUCCESS)
{
DWORD dwLayoutId;
dwLayoutId = wcstoul(szLayoutId, &pszEnd, 16);
LayoutList_Append(dwLayoutId,
dwSpecialId,
szBuffer,
szFilePath);
}
}
}
RegCloseKey(hLayoutKey);
}
dwSize = sizeof(szLayoutId);
++dwIndex;
}
RegCloseKey(hKey);
}
WCHAR*
LayoutList_GetNameByHkl(HKL hkl)
{
LAYOUT_LIST_NODE *pCurrent;
if ((HIWORD(hkl) & 0xF000) == 0xF000)
{
DWORD dwSpecialId = (HIWORD(hkl) & 0x0FFF);
for (pCurrent = _LayoutList; pCurrent != NULL; pCurrent = pCurrent->pNext)
{
if (dwSpecialId == pCurrent->dwSpecialId)
{
return pCurrent->pszName;
}
}
}
else
{
for (pCurrent = _LayoutList; pCurrent != NULL; pCurrent = pCurrent->pNext)
{
if (HIWORD(hkl) == LOWORD(pCurrent->dwId))
{
return pCurrent->pszName;
}
}
}
return NULL;
}
LAYOUT_LIST_NODE*
LayoutList_Get(VOID)
{
return _LayoutList;
}

View file

@ -0,0 +1,25 @@
#pragma once
#include "input.h"
typedef struct _LAYOUT_LIST_NODE
{
WCHAR *pszName;
WCHAR *pszFile;
DWORD dwId;
DWORD dwSpecialId;
struct _LAYOUT_LIST_NODE *pPrev;
struct _LAYOUT_LIST_NODE *pNext;
} LAYOUT_LIST_NODE;
VOID
LayoutList_Create(VOID);
VOID
LayoutList_Destroy(VOID);
WCHAR*
LayoutList_GetNameByHkl(HKL hkl);
LAYOUT_LIST_NODE*
LayoutList_Get(VOID);

View file

@ -0,0 +1,154 @@
/*
* 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, WCHAR *pszName, WCHAR *pszIndicator)
{
LOCALE_LIST_NODE *pCurrent;
LOCALE_LIST_NODE *pNew;
if (pszName == NULL || pszIndicator == NULL)
return NULL;
pCurrent = _LocaleList;
pNew = (LOCALE_LIST_NODE*) malloc(sizeof(LOCALE_LIST_NODE));
if (pNew == NULL)
return NULL;
memset(pNew, 0, sizeof(LOCALE_LIST_NODE));
pNew->pszName = DublicateString(pszName);
if (pNew->pszName == NULL)
{
free(pNew);
return NULL;
}
pNew->pszIndicator = DublicateString(pszIndicator);
if (pNew->pszIndicator == NULL)
{
free(pNew->pszName);
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 = sizeof(szValue);
dwIndex = 0;
while (RegEnumValueW(hKey, dwIndex, szValue, &dwSize,
NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
{
WCHAR szName[MAX_STR_LEN];
WCHAR *End;
DWORD dwId;
dwId = wcstoul(szValue, &End, 16);
if (GetLocaleInfoW(LOWORD(dwId),
LOCALE_SLANGUAGE,
szName, ARRAYSIZE(szName)))
{
WCHAR szIndicator[MAX_STR_LEN];
if (GetLocaleInfoW(LOWORD(dwId),
LOCALE_SABBREVLANGNAME | LOCALE_NOUSEROVERRIDE,
szIndicator,
ARRAYSIZE(szIndicator)))
{
size_t len = wcslen(szIndicator);
if (len > 0)
{
szIndicator[len - 1] = 0;
}
}
LocaleList_Append(dwId, szName, szIndicator);
}
dwSize = sizeof(szValue);
++dwIndex;
}
return _LocaleList;
}
LOCALE_LIST_NODE*
LocaleList_Get(VOID)
{
return _LocaleList;
}

View file

@ -0,0 +1,21 @@
#pragma once
#include "input.h"
typedef struct _LOCALE_LIST_NODE
{
WCHAR *pszName;
WCHAR *pszIndicator;
DWORD dwId;
struct _LOCALE_LIST_NODE *pPrev;
struct _LOCALE_LIST_NODE *pNext;
} LOCALE_LIST_NODE;
LOCALE_LIST_NODE*
LocaleList_Create(VOID);
VOID
LocaleList_Destroy(VOID);
LOCALE_LIST_NODE*
LocaleList_Get(VOID);

View file

@ -0,0 +1,233 @@
/*
* PROJECT: input.dll
* FILE: dll/cpl/input/settings_page.c
* PURPOSE: input.dll
* PROGRAMMER: Dmitry Chapyshev (dmitry@reactos.org)
*/
#include "input.h"
#include "layout_list.h"
#include "locale_list.h"
static HICON
CreateLayoutIcon(LPWSTR szLayout)
{
HDC hdc, hdcsrc;
HBITMAP hBitmap, hBmpNew, hBmpOld;
RECT rect;
HFONT hFont = NULL;
ICONINFO IconInfo;
HICON hIcon = NULL;
hdcsrc = GetDC(NULL);
hdc = CreateCompatibleDC(hdcsrc);
hBitmap = CreateCompatibleBitmap(hdcsrc,
GetSystemMetrics(SM_CXSMICON),
GetSystemMetrics(SM_CYSMICON));
ReleaseDC(NULL, hdcsrc);
if (hdc && hBitmap)
{
hBmpNew = CreateBitmap(GetSystemMetrics(SM_CXSMICON),
GetSystemMetrics(SM_CYSMICON),
1, 1, NULL);
if (hBmpNew)
{
hBmpOld = SelectObject(hdc, hBitmap);
rect.right = GetSystemMetrics(SM_CXSMICON);
rect.left = 0;
rect.bottom = GetSystemMetrics(SM_CYSMICON);
rect.top = 0;
SetBkColor(hdc, GetSysColor(COLOR_HIGHLIGHT));
SetTextColor(hdc, GetSysColor(COLOR_HIGHLIGHTTEXT));
ExtTextOut(hdc, rect.left, rect.top, ETO_OPAQUE, &rect, L"", 0, NULL);
hFont = CreateFont(-11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, FF_DONTCARE, L"Tahoma");
SelectObject(hdc, hFont);
DrawText(hdc, szLayout, 2, &rect, DT_SINGLELINE|DT_CENTER|DT_VCENTER);
SelectObject(hdc, hBmpNew);
PatBlt(hdc, 0, 0,
GetSystemMetrics(SM_CXSMICON),
GetSystemMetrics(SM_CYSMICON),
BLACKNESS);
SelectObject(hdc, hBmpOld);
IconInfo.hbmColor = hBitmap;
IconInfo.hbmMask = hBmpNew;
IconInfo.fIcon = TRUE;
hIcon = CreateIconIndirect(&IconInfo);
DeleteObject(hBmpNew);
DeleteObject(hBmpOld);
DeleteObject(hFont);
}
}
DeleteDC(hdc);
DeleteObject(hBitmap);
return hIcon;
}
static VOID
AddToLayoutListView(HWND hwndList,
WCHAR *pszLanguageName,
WCHAR *pszLayoutName,
WCHAR *pszIndicatorTitle)
{
INT ItemIndex = -1;
INT ImageIndex = -1;
LV_ITEM item;
HIMAGELIST hImageList;
hImageList = ListView_GetImageList(hwndList, LVSIL_SMALL);
if (hImageList != NULL)
{
HICON hLayoutIcon;
hLayoutIcon = CreateLayoutIcon(pszIndicatorTitle);
if (hLayoutIcon != NULL)
{
ImageIndex = ImageList_AddIcon(hImageList, hLayoutIcon);
DestroyIcon(hLayoutIcon);
}
}
memset(&item, 0, sizeof(LV_ITEM));
item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE;
item.pszText = pszLanguageName;
item.iItem = -1;
item.lParam = (LPARAM)NULL;
item.iImage = ImageIndex;
ItemIndex = ListView_InsertItem(hwndList, &item);
ListView_SetItemText(hwndList, ItemIndex, 1, pszLayoutName);
}
static VOID
OnInitSettingsPage(HWND hwndDlg)
{
WCHAR szBuffer[MAX_STR_LEN];
LV_COLUMN column;
HWND hLayoutList;
HIMAGELIST hLayoutImageList;
INT iLayoutCount;
HKL *pActiveLayoutList;
hLayoutList = GetDlgItem(hwndDlg, IDC_KEYLAYOUT_LIST);
ListView_SetExtendedListViewStyle(hLayoutList, LVS_EX_FULLROWSELECT);
memset(&column, 0, sizeof(LV_COLUMN));
column.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
LoadString(hApplet, IDS_LANGUAGE, szBuffer, ARRAYSIZE(szBuffer));
column.fmt = LVCFMT_LEFT;
column.iSubItem = 0;
column.pszText = szBuffer;
column.cx = 175;
ListView_InsertColumn(hLayoutList, 0, &column);
LoadString(hApplet, IDS_LAYOUT, szBuffer, ARRAYSIZE(szBuffer));
column.fmt = LVCFMT_RIGHT;
column.cx = 155;
column.iSubItem = 1;
column.pszText = szBuffer;
ListView_InsertColumn(hLayoutList, 1, &column);
hLayoutImageList = ImageList_Create(GetSystemMetrics(SM_CXSMICON),
GetSystemMetrics(SM_CYSMICON),
ILC_COLOR8 | ILC_MASK, 0, 0);
if (hLayoutImageList != NULL)
{
ListView_SetImageList(hLayoutList, hLayoutImageList, LVSIL_SMALL);
}
LayoutList_Create();
LocaleList_Create();
iLayoutCount = GetKeyboardLayoutList(0, NULL);
pActiveLayoutList = (HKL*) malloc(iLayoutCount * sizeof(HKL));
if (pActiveLayoutList != NULL)
{
if (GetKeyboardLayoutList(iLayoutCount, pActiveLayoutList) > 0)
{
INT iIndex;
for (iIndex = 0; iIndex < iLayoutCount; iIndex++)
{
LOCALE_LIST_NODE *CurrentLocale;
for (CurrentLocale = LocaleList_Get();
CurrentLocale != NULL;
CurrentLocale = CurrentLocale->pNext)
{
if (LOWORD(CurrentLocale->dwId) == LOWORD(pActiveLayoutList[iIndex]))
{
AddToLayoutListView(hLayoutList,
CurrentLocale->pszName,
LayoutList_GetNameByHkl(pActiveLayoutList[iIndex]),
CurrentLocale->pszIndicator);
}
}
}
}
free(pActiveLayoutList);
}
}
static VOID
OnDestroySettingsPage(HWND hwndDlg)
{
HIMAGELIST hImageList;
LayoutList_Destroy();
LocaleList_Destroy();
hImageList = ListView_GetImageList(GetDlgItem(hwndDlg, IDC_KEYLAYOUT_LIST),
LVSIL_SMALL);
if (hImageList != NULL)
{
ImageList_Destroy(hImageList);
}
}
INT_PTR CALLBACK
SettingsPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG:
OnInitSettingsPage(hwndDlg);
break;
case WM_DESTROY:
OnDestroySettingsPage(hwndDlg);
break;
case WM_COMMAND:
{
}
break;
}
return FALSE;
}