mirror of
https://github.com/reactos/reactos.git
synced 2025-02-23 08:55:19 +00:00
[INPUT]
- Implement list of keyboard layouts on Settings Page svn path=/trunk/; revision=72154
This commit is contained in:
parent
71757bb0fe
commit
6b265ca585
8 changed files with 716 additions and 73 deletions
|
@ -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)
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
221
reactos/dll/cpl/input_new/layout_list.c
Normal file
221
reactos/dll/cpl/input_new/layout_list.c
Normal 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;
|
||||
}
|
25
reactos/dll/cpl/input_new/layout_list.h
Normal file
25
reactos/dll/cpl/input_new/layout_list.h
Normal 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);
|
154
reactos/dll/cpl/input_new/locale_list.c
Normal file
154
reactos/dll/cpl/input_new/locale_list.c
Normal 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;
|
||||
}
|
21
reactos/dll/cpl/input_new/locale_list.h
Normal file
21
reactos/dll/cpl/input_new/locale_list.h
Normal 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);
|
233
reactos/dll/cpl/input_new/settings_page.c
Normal file
233
reactos/dll/cpl/input_new/settings_page.c
Normal 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;
|
||||
}
|
Loading…
Reference in a new issue