ReactOS 0.4.16-dev-336-gb667d82
input_list.c File Reference
Include dependency graph for input_list.c:

Go to the source code of this file.

Classes

struct  MUI_SUBFONT
 

Macros

#define NOTHING
 

Functions

BOOL UpdateRegistryForFontSubstitutes (MUI_SUBFONT *pSubstitutes)
 
VOID GetSystemLibraryPath (LPWSTR pszPath, INT cchPath, LPCWSTR pszFileName)
 
BOOL InputList_SetFontSubstitutes (LCID dwLocaleId)
 
static INPUT_LIST_NODEInputList_AppendNode (VOID)
 
static VOID InputList_RemoveNode (INPUT_LIST_NODE *pNode)
 
VOID InputList_Destroy (VOID)
 
static BOOL InputList_PrepareUserRegistry (PHKEY phPreloadKey, PHKEY phSubstKey)
 
static BOOL InputList_FindPreloadKLID (HKEY hPreloadKey, DWORD dwKLID)
 
static BOOL InputList_WriteSubst (HKEY hSubstKey, DWORD dwPhysicalKLID, DWORD dwLogicalKLID)
 
static DWORD InputList_DoSubst (HKEY hPreloadKey, HKEY hSubstKey, DWORD dwPhysicalKLID, DWORD dwLogicalKLID)
 
static VOID InputList_AddInputMethodToUserRegistry (HKEY hPreloadKey, HKEY hSubstKey, DWORD dwNumber, INPUT_LIST_NODE *pNode)
 
BOOL InputList_Process (VOID)
 
BOOL InputList_Add (LOCALE_LIST_NODE *pLocale, LAYOUT_LIST_NODE *pLayout)
 
VOID InputList_SetDefault (INPUT_LIST_NODE *pNode)
 
INPUT_LIST_NODEInputList_FindNextDefault (INPUT_LIST_NODE *pNode)
 
BOOL InputList_Remove (INPUT_LIST_NODE *pNode)
 
BOOL InputList_RemoveByLang (LANGID wLangId)
 
VOID InputList_Create (VOID)
 
static INT InputList_Compare (INPUT_LIST_NODE *pNode1, INPUT_LIST_NODE *pNode2)
 
VOID InputList_Sort (VOID)
 
INT InputList_GetAliveCount (VOID)
 
INPUT_LIST_NODEInputList_GetFirst (VOID)
 

Variables

static INPUT_LIST_NODE_InputList = NULL
 

Macro Definition Documentation

◆ NOTHING

#define NOTHING

Definition at line 10 of file input_list.c.

Function Documentation

◆ GetSystemLibraryPath()

VOID GetSystemLibraryPath ( LPWSTR  pszPath,
INT  cchPath,
LPCWSTR  pszFileName 
)

Definition at line 42 of file input_list.c.

43{
44 WCHAR szSysDir[MAX_PATH];
45 GetSystemDirectoryW(szSysDir, ARRAYSIZE(szSysDir));
46 StringCchPrintfW(pszPath, cchPath, L"%s\\%s", szSysDir, pszFileName);
47}
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
#define MAX_PATH
Definition: compat.h:34
UINT WINAPI GetSystemDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
Definition: path.c:2313
#define L(x)
Definition: ntvdm.h:50
STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:530
WORD WORD PSZ PSZ pszFileName
Definition: vdmdbg.h:44
__wchar_t WCHAR
Definition: xmlstorage.h:180

◆ InputList_Add()

BOOL InputList_Add ( LOCALE_LIST_NODE pLocale,
LAYOUT_LIST_NODE pLayout 
)

Definition at line 502 of file input_list.c.

503{
504 WCHAR szIndicator[MAX_STR_LEN];
505 INPUT_LIST_NODE *pInput = NULL;
506
507 if (pLocale == NULL || pLayout == NULL)
508 {
509 return FALSE;
510 }
511
512 for (pInput = _InputList; pInput != NULL; pInput = pInput->pNext)
513 {
515 continue;
516
517 if (pInput->pLocale == pLocale && pInput->pLayout == pLayout)
518 {
519 return FALSE; /* Already exists */
520 }
521 }
522
523 pInput = InputList_AppendNode();
525 pInput->pLocale = pLocale;
526 pInput->pLayout = pLayout;
527
528 if (GetLocaleInfoW(LOWORD(pInput->pLocale->dwId),
530 szIndicator,
531 ARRAYSIZE(szIndicator)))
532 {
533 size_t len = wcslen(szIndicator);
534
535 if (len > 0)
536 {
537 szIndicator[len - 1] = 0;
538 pInput->pszIndicator = _wcsdup(szIndicator);
539 }
540 }
541
542 return TRUE;
543}
#define MAX_STR_LEN
Definition: defines.h:43
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
INT WINAPI GetLocaleInfoW(LCID lcid, LCTYPE lctype, LPWSTR buffer, INT len)
Definition: locale.c:1666
GLenum GLsizei len
Definition: glext.h:6722
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
static INPUT_LIST_NODE * _InputList
Definition: input_list.c:134
static INPUT_LIST_NODE * InputList_AppendNode(VOID)
Definition: input_list.c:138
#define INPUT_LIST_NODE_FLAG_DELETED
Definition: input_list.h:24
#define INPUT_LIST_NODE_FLAG_ADDED
Definition: input_list.h:17
#define LOWORD(l)
Definition: pedump.c:82
_Check_return_ _CRTIMP wchar_t *__cdecl _wcsdup(_In_z_ const wchar_t *_Str)
LPWSTR pszIndicator
Definition: input_list.h:41
struct _INPUT_LIST_NODE * pNext
Definition: input_list.h:44
LAYOUT_LIST_NODE * pLayout
Definition: input_list.h:37
LOCALE_LIST_NODE * pLocale
Definition: input_list.h:36
#define LOCALE_NOUSEROVERRIDE
Definition: winnls.h:19
#define LOCALE_SABBREVLANGNAME
Definition: winnls.h:29

Referenced by OnCommandAddDialog().

◆ InputList_AddInputMethodToUserRegistry()

static VOID InputList_AddInputMethodToUserRegistry ( HKEY  hPreloadKey,
HKEY  hSubstKey,
DWORD  dwNumber,
INPUT_LIST_NODE pNode 
)
static

Definition at line 332 of file input_list.c.

337{
338 WCHAR szNumber[32], szLogicalKLID[KL_NAMELENGTH];
339 DWORD dwPhysicalKLID, dwLogicalKLID, cbValue;
340 HKL hKL = pNode->hkl;
341
342 if (IS_IME_HKL(hKL)) /* IME? */
343 {
344 /* Do not substitute the IME KLID */
345 dwLogicalKLID = dwPhysicalKLID = HandleToUlong(hKL);
346 }
347 else
348 {
349 /* Substitute the KLID if necessary */
350 dwPhysicalKLID = pNode->pLayout->dwKLID;
351 dwLogicalKLID = pNode->pLocale->dwId;
352 dwLogicalKLID = InputList_DoSubst(hPreloadKey, hSubstKey, dwPhysicalKLID, dwLogicalKLID);
353 }
354
355 /* Write the Preload value (number |--> logical KLID) */
356 StringCchPrintfW(szNumber, ARRAYSIZE(szNumber), L"%lu", dwNumber);
357 StringCchPrintfW(szLogicalKLID, ARRAYSIZE(szLogicalKLID), L"%08x", dwLogicalKLID);
358 cbValue = (wcslen(szLogicalKLID) + 1) * sizeof(WCHAR);
359 RegSetValueExW(hPreloadKey,
360 szNumber,
361 0,
362 REG_SZ,
363 (LPBYTE)szLogicalKLID,
364 cbValue);
365
366 if ((pNode->wFlags & INPUT_LIST_NODE_FLAG_ADDED) ||
368 {
372
373 pNode->hkl = LoadKeyboardLayoutW(szLogicalKLID, uFlags);
374 }
375}
#define HandleToUlong(h)
Definition: basetsd.h:79
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4882
UINT uFlags
Definition: api.c:59
unsigned long DWORD
Definition: ntddk_ex.h:95
#define IS_IME_HKL(hKL)
Definition: imm32_undoc.h:20
static DWORD InputList_DoSubst(HKEY hPreloadKey, HKEY hSubstKey, DWORD dwPhysicalKLID, DWORD dwLogicalKLID)
Definition: input_list.c:295
#define INPUT_LIST_NODE_FLAG_EDITED
Definition: input_list.h:11
#define INPUT_LIST_NODE_FLAG_DEFAULT
Definition: input_list.h:30
#define REG_SZ
Definition: layer.c:22
UINT_PTR HKL
Definition: msctf.idl:143
unsigned int UINT
Definition: ndis.h:50
unsigned char * LPBYTE
Definition: typedefs.h:53
#define KL_NAMELENGTH
Definition: winuser.h:122
#define KLF_REPLACELANG
Definition: winuser.h:115
HKL WINAPI LoadKeyboardLayoutW(_In_ LPCWSTR, _In_ UINT)
#define KLF_SUBSTITUTE_OK
Definition: winuser.h:112
#define KLF_NOTELLSHELL
Definition: winuser.h:116

Referenced by InputList_Process().

◆ InputList_AppendNode()

static INPUT_LIST_NODE * InputList_AppendNode ( VOID  )
static

Definition at line 138 of file input_list.c.

139{
140 INPUT_LIST_NODE *pCurrent;
141 INPUT_LIST_NODE *pNew;
142
143 pNew = (INPUT_LIST_NODE*)malloc(sizeof(INPUT_LIST_NODE));
144 if (pNew == NULL)
145 return NULL;
146
147 ZeroMemory(pNew, sizeof(INPUT_LIST_NODE));
148
149 if (_InputList == NULL) /* Empty? */
150 {
151 _InputList = pNew;
152 return pNew;
153 }
154
155 /* Find last node */
156 for (pCurrent = _InputList; pCurrent->pNext; pCurrent = pCurrent->pNext)
157 {
158 NOTHING;
159 }
160
161 /* Add to the end */
162 pCurrent->pNext = pNew;
163 pNew->pPrev = pCurrent;
164
165 return pNew;
166}
#define malloc
Definition: debug_ros.c:4
#define NOTHING
Definition: input_list.c:10
struct _INPUT_LIST_NODE * pPrev
Definition: input_list.h:43
#define ZeroMemory
Definition: winbase.h:1737

Referenced by InputList_Add(), and InputList_Create().

◆ InputList_Compare()

static INT InputList_Compare ( INPUT_LIST_NODE pNode1,
INPUT_LIST_NODE pNode2 
)
static

Definition at line 715 of file input_list.c.

716{
717 INT nCompare = _wcsicmp(pNode1->pszIndicator, pNode2->pszIndicator);
718 if (nCompare != 0)
719 return nCompare;
720
721 return _wcsicmp(pNode1->pLayout->pszName, pNode2->pLayout->pszName);
722}
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
int32_t INT
Definition: typedefs.h:58

Referenced by InputList_Sort().

◆ InputList_Create()

VOID InputList_Create ( VOID  )

Definition at line 659 of file input_list.c.

660{
661 INT iLayoutCount, iIndex;
662 WCHAR szIndicator[MAX_STR_LEN];
663 INPUT_LIST_NODE *pInput;
664 HKL *pLayoutList, hklDefault;
665
666 SystemParametersInfoW(SPI_GETDEFAULTINPUTLANG, 0, &hklDefault, 0);
667
668 iLayoutCount = GetKeyboardLayoutList(0, NULL);
669 pLayoutList = (HKL*) malloc(iLayoutCount * sizeof(HKL));
670
671 if (!pLayoutList || GetKeyboardLayoutList(iLayoutCount, pLayoutList) <= 0)
672 {
673 free(pLayoutList);
674 return;
675 }
676
677 for (iIndex = 0; iIndex < iLayoutCount; ++iIndex)
678 {
679 HKL hKL = pLayoutList[iIndex];
682 if (!pLocale || !pLayout)
683 continue;
684
685 pInput = InputList_AppendNode();
686 pInput->pLocale = pLocale;
687 pInput->pLayout = pLayout;
688 pInput->hkl = hKL;
689
690 if (pInput->hkl == hklDefault) /* Default HKL? */
691 {
693 hklDefault = NULL; /* No more default item */
694 }
695
696 /* Get abbrev language name */
697 szIndicator[0] = 0;
698 if (GetLocaleInfoW(LOWORD(pInput->pLocale->dwId),
700 szIndicator,
701 ARRAYSIZE(szIndicator)))
702 {
703 size_t len = wcslen(szIndicator);
704 if (len > 0)
705 {
706 szIndicator[len - 1] = 0;
707 pInput->pszIndicator = _wcsdup(szIndicator);
708 }
709 }
710 }
711
712 free(pLayoutList);
713}
#define free
Definition: debug_ros.c:5
LAYOUT_LIST_NODE * LayoutList_GetByHkl(HKL hkl)
Definition: layout_list.c:207
LOCALE_LIST_NODE * LocaleList_GetByHkl(HKL hkl)
Definition: locale_list.c:129
UINT WINAPI GetKeyboardLayoutList(_In_ int nBuff, _Out_writes_to_opt_(nBuff, return) HKL FAR *lpList)
BOOL WINAPI SystemParametersInfoW(_In_ UINT uiAction, _In_ UINT uiParam, _Inout_opt_ PVOID pvParam, _In_ UINT fWinIni)

Referenced by OnInitSettingsPage().

◆ InputList_Destroy()

VOID InputList_Destroy ( VOID  )

Definition at line 197 of file input_list.c.

198{
199 INPUT_LIST_NODE *pCurrent;
200 INPUT_LIST_NODE *pNext;
201
202 if (_InputList == NULL)
203 return;
204
205 for (pCurrent = _InputList; pCurrent; pCurrent = pNext)
206 {
207 pNext = pCurrent->pNext;
208
209 free(pCurrent->pszIndicator);
210 free(pCurrent);
211 }
212
214}

Referenced by OnDestroySettingsPage().

◆ InputList_DoSubst()

static DWORD InputList_DoSubst ( HKEY  hPreloadKey,
HKEY  hSubstKey,
DWORD  dwPhysicalKLID,
DWORD  dwLogicalKLID 
)
static

Definition at line 295 of file input_list.c.

297{
298 DWORD iTrial;
299 BOOL bSubstNeeded = (dwPhysicalKLID != dwLogicalKLID) || (HIWORD(dwPhysicalKLID) != 0);
300
301 for (iTrial = 1; iTrial <= 1000; ++iTrial)
302 {
303 if (!InputList_FindPreloadKLID(hPreloadKey, dwLogicalKLID)) /* Not found? */
304 {
305 if (bSubstNeeded)
306 {
307 /* Write now */
308 InputList_WriteSubst(hSubstKey, dwPhysicalKLID, dwLogicalKLID);
309 }
310 return dwLogicalKLID;
311 }
312
313 bSubstNeeded = TRUE;
314
315 /* Calculate the next logical KLID */
316 if (!IS_SUBST_KLID(dwLogicalKLID))
317 {
318 dwLogicalKLID |= SUBST_MASK;
319 }
320 else
321 {
322 WORD wLow = LOWORD(dwLogicalKLID);
323 WORD wHigh = HIWORD(dwLogicalKLID);
324 dwLogicalKLID = MAKELONG(wLow, wHigh + 1);
325 }
326 }
327
328 return 0;
329}
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned short WORD
Definition: ntddk_ex.h:93
#define SUBST_MASK
Definition: imm32_undoc.h:17
#define IS_SUBST_KLID(dwKLID)
Definition: imm32_undoc.h:25
static BOOL InputList_WriteSubst(HKEY hSubstKey, DWORD dwPhysicalKLID, DWORD dwLogicalKLID)
Definition: input_list.c:281
static BOOL InputList_FindPreloadKLID(HKEY hPreloadKey, DWORD dwKLID)
Definition: input_list.c:251
#define MAKELONG(a, b)
Definition: typedefs.h:249
#define HIWORD(l)
Definition: typedefs.h:247

Referenced by InputList_AddInputMethodToUserRegistry().

◆ InputList_FindNextDefault()

INPUT_LIST_NODE * InputList_FindNextDefault ( INPUT_LIST_NODE pNode)

Definition at line 568 of file input_list.c.

569{
570 INPUT_LIST_NODE *pCurrent;
571
572 for (pCurrent = pNode->pNext; pCurrent; pCurrent = pCurrent->pNext)
573 {
574 if (pCurrent->wFlags & INPUT_LIST_NODE_FLAG_DELETED)
575 continue;
576
577 return pCurrent;
578 }
579
580 for (pCurrent = pNode->pPrev; pCurrent; pCurrent = pCurrent->pPrev)
581 {
582 if (pCurrent->wFlags & INPUT_LIST_NODE_FLAG_DELETED)
583 continue;
584
585 return pCurrent;
586 }
587
588 return NULL;
589}

Referenced by InputList_Remove().

◆ InputList_FindPreloadKLID()

static BOOL InputList_FindPreloadKLID ( HKEY  hPreloadKey,
DWORD  dwKLID 
)
static

Definition at line 251 of file input_list.c.

252{
253 DWORD dwNumber, dwType, cbValue;
254 WCHAR szNumber[16], szValue[KL_NAMELENGTH], szKLID[KL_NAMELENGTH];
255
256 StringCchPrintfW(szKLID, ARRAYSIZE(szKLID), L"%08x", dwKLID);
257
258 for (dwNumber = 1; dwNumber <= 1000; ++dwNumber)
259 {
260 StringCchPrintfW(szNumber, ARRAYSIZE(szNumber), L"%u", dwNumber);
261
262 cbValue = ARRAYSIZE(szValue) * sizeof(WCHAR);
263 if (RegQueryValueExW(hPreloadKey, szNumber, NULL, &dwType,
264 (LPBYTE)szValue, &cbValue) != ERROR_SUCCESS)
265 {
266 break;
267 }
268
269 if (dwType != REG_SZ)
270 continue;
271
272 szValue[ARRAYSIZE(szValue) - 1] = 0;
273 if (_wcsicmp(szKLID, szValue) == 0)
274 return TRUE;
275 }
276
277 return FALSE;
278}
#define ERROR_SUCCESS
Definition: deptool.c:10
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4103

Referenced by InputList_DoSubst().

◆ InputList_GetAliveCount()

INT InputList_GetAliveCount ( VOID  )

Definition at line 783 of file input_list.c.

784{
785 INPUT_LIST_NODE *pNode;
786 INT nCount = 0;
787
788 for (pNode = _InputList; pNode; pNode = pNode->pNext)
789 {
791 continue;
792
793 ++nCount;
794 }
795
796 return nCount;
797}

Referenced by UpdateInputListView().

◆ InputList_GetFirst()

INPUT_LIST_NODE * InputList_GetFirst ( VOID  )

Definition at line 800 of file input_list.c.

801{
802 return _InputList;
803}

Referenced by InitDefaultLangComboBox(), and UpdateInputListView().

◆ InputList_PrepareUserRegistry()

static BOOL InputList_PrepareUserRegistry ( PHKEY  phPreloadKey,
PHKEY  phSubstKey 
)
static

Definition at line 218 of file input_list.c.

219{
220 BOOL bResult = FALSE;
221 HKEY hKey;
222
223 *phPreloadKey = *phSubstKey = NULL;
224
226 L"Keyboard Layout",
227 0,
229 &hKey) == ERROR_SUCCESS)
230 {
231 RegDeleteKeyW(hKey, L"Preload");
232 RegDeleteKeyW(hKey, L"Substitutes");
233
235 }
236
237 if (RegCreateKeyW(HKEY_CURRENT_USER, L"Keyboard Layout", &hKey) == ERROR_SUCCESS &&
238 RegCreateKeyW(hKey, L"Preload", phPreloadKey) == ERROR_SUCCESS &&
239 RegCreateKeyW(hKey, L"Substitutes", phSubstKey) == ERROR_SUCCESS)
240 {
241 bResult = TRUE;
242 }
243
244 if (hKey)
246
247 return bResult;
248}
#define RegCloseKey(hKey)
Definition: registry.h:49
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
LONG WINAPI RegDeleteKeyW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey)
Definition: reg.c:1239
LONG WINAPI RegCreateKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:1201
FxAutoRegKey hKey
#define KEY_ALL_ACCESS
Definition: nt_native.h:1041
#define HKEY_CURRENT_USER
Definition: winreg.h:11

Referenced by InputList_Process().

◆ InputList_Process()

BOOL InputList_Process ( VOID  )

Definition at line 382 of file input_list.c.

383{
384 INPUT_LIST_NODE *pCurrent;
385 DWORD dwNumber;
386 BOOL bRet = FALSE;
387 HKEY hPreloadKey, hSubstKey;
388 HKL hDefaultKL = NULL;
389
390 if (!InputList_PrepareUserRegistry(&hPreloadKey, &hSubstKey))
391 {
392 if (hPreloadKey)
393 RegCloseKey(hPreloadKey);
394 if (hSubstKey)
395 RegCloseKey(hSubstKey);
396 return FALSE;
397 }
398
399 /* Find change in the IME HKLs */
400 for (pCurrent = _InputList; pCurrent != NULL; pCurrent = pCurrent->pNext)
401 {
402 if (!IS_IME_HKL(pCurrent->hkl))
403 continue;
404
405 if ((pCurrent->wFlags & INPUT_LIST_NODE_FLAG_ADDED) ||
406 (pCurrent->wFlags & INPUT_LIST_NODE_FLAG_EDITED) ||
408 {
409 bRet = TRUE; /* Reboot is needed */
410 break;
411 }
412 }
413
414 /* Process DELETED and EDITED entries */
415 for (pCurrent = _InputList; pCurrent != NULL; pCurrent = pCurrent->pNext)
416 {
417 if ((pCurrent->wFlags & INPUT_LIST_NODE_FLAG_DELETED) ||
419 {
420
421 /* Only unload the DELETED and EDITED entries */
422 if (UnloadKeyboardLayout(pCurrent->hkl))
423 {
424 /* But the EDITED entries are used later */
425 if (pCurrent->wFlags & INPUT_LIST_NODE_FLAG_DELETED)
426 {
427 InputList_RemoveNode(pCurrent);
428 }
429 }
430 }
431 }
432
433 /* Add the DEFAULT entry and set font substitutes */
434 for (pCurrent = _InputList; pCurrent != NULL; pCurrent = pCurrent->pNext)
435 {
436 if (pCurrent->wFlags & INPUT_LIST_NODE_FLAG_DELETED)
437 continue;
438
439 if (pCurrent->wFlags & INPUT_LIST_NODE_FLAG_DEFAULT)
440 {
441 bRet = InputList_SetFontSubstitutes(pCurrent->pLocale->dwId);
442 InputList_AddInputMethodToUserRegistry(hPreloadKey, hSubstKey, 1, pCurrent);
443
444 /* Activate the DEFAULT entry */
445 ActivateKeyboardLayout(pCurrent->hkl, KLF_RESET);
446
447 /* Save it */
448 hDefaultKL = pCurrent->hkl;
449 break;
450 }
451 }
452
453 /* Add entries except DEFAULT to registry */
454 dwNumber = 2;
455 for (pCurrent = _InputList; pCurrent != NULL; pCurrent = pCurrent->pNext)
456 {
457 if (pCurrent->wFlags & INPUT_LIST_NODE_FLAG_DELETED)
458 continue;
459 if (pCurrent->wFlags & INPUT_LIST_NODE_FLAG_DEFAULT)
460 continue;
461
462 InputList_AddInputMethodToUserRegistry(hPreloadKey, hSubstKey, dwNumber, pCurrent);
463
464 ++dwNumber;
465 }
466
467 /* Remove ADDED and EDITED flags */
468 for (pCurrent = _InputList; pCurrent != NULL; pCurrent = pCurrent->pNext)
469 {
471 }
472
473 /* Change the default keyboard language */
474 if (SystemParametersInfoW(SPI_SETDEFAULTINPUTLANG, 0, &hDefaultKL, 0))
475 {
476 DWORD dwRecipients = BSM_ALLDESKTOPS | BSM_APPLICATIONS;
477
479 &dwRecipients,
480 WM_INPUTLANGCHANGEREQUEST,
481 INPUTLANGCHANGE_SYSCHARSET,
482 (LPARAM)hDefaultKL);
483 }
484
485 /* Retry to delete (in case of failure to delete the default keyboard) */
486 for (pCurrent = _InputList; pCurrent != NULL; pCurrent = pCurrent->pNext)
487 {
488 if (pCurrent->wFlags & INPUT_LIST_NODE_FLAG_DELETED)
489 {
490 UnloadKeyboardLayout(pCurrent->hkl);
491 InputList_RemoveNode(pCurrent);
492 }
493 }
494
495 RegCloseKey(hPreloadKey);
496 RegCloseKey(hSubstKey);
497 return bRet;
498}
#define BSF_POSTMESSAGE
Definition: dbt.h:58
#define BSM_APPLICATIONS
Definition: dbt.h:48
#define BSM_ALLDESKTOPS
Definition: dbt.h:49
static BOOL InputList_PrepareUserRegistry(PHKEY phPreloadKey, PHKEY phSubstKey)
Definition: input_list.c:218
BOOL InputList_SetFontSubstitutes(LCID dwLocaleId)
Definition: input_list.c:50
static VOID InputList_RemoveNode(INPUT_LIST_NODE *pNode)
Definition: input_list.c:170
static VOID InputList_AddInputMethodToUserRegistry(HKEY hPreloadKey, HKEY hSubstKey, DWORD dwNumber, INPUT_LIST_NODE *pNode)
Definition: input_list.c:332
LONG WINAPI BroadcastSystemMessageW(DWORD dwFlags, LPDWORD lpdwRecipients, UINT uiMessage, WPARAM wParam, LPARAM lParam)
Definition: message.c:3408
LONG_PTR LPARAM
Definition: windef.h:208
BOOL WINAPI UnloadKeyboardLayout(_In_ HKL)
HKL WINAPI ActivateKeyboardLayout(_In_ HKL, _In_ UINT)

Referenced by OnNotifySettingsPage().

◆ InputList_Remove()

BOOL InputList_Remove ( INPUT_LIST_NODE pNode)

Definition at line 596 of file input_list.c.

597{
598 BOOL ret = FALSE;
599 BOOL bRemoveNode = FALSE;
600
601 if (pNode == NULL)
602 return FALSE;
603
605 {
606 /*
607 * If the input method has been added to the list, but not yet written
608 * in the registry, then simply remove it from the list
609 */
610 bRemoveNode = TRUE;
611 }
612 else
613 {
615 }
616
618 {
620 if (pCurrent)
622
623 pNode->wFlags &= ~INPUT_LIST_NODE_FLAG_DEFAULT;
624 ret = TRUE; /* default input is changed */
625 }
626
627 if (bRemoveNode)
628 {
630 }
631
632 return ret;
633}
INPUT_LIST_NODE * InputList_FindNextDefault(INPUT_LIST_NODE *pNode)
Definition: input_list.c:568
int ret

Referenced by InputList_RemoveByLang(), and OnCommandSettingsPage().

◆ InputList_RemoveByLang()

BOOL InputList_RemoveByLang ( LANGID  wLangId)

Definition at line 636 of file input_list.c.

637{
638 BOOL ret = FALSE;
639 INPUT_LIST_NODE *pCurrent;
640
641Retry:
642 for (pCurrent = _InputList; pCurrent; pCurrent = pCurrent->pNext)
643 {
644 if (pCurrent->wFlags & INPUT_LIST_NODE_FLAG_DELETED)
645 continue;
646
647 if (LOWORD(pCurrent->pLocale->dwId) == wLangId)
648 {
649 if (InputList_Remove(pCurrent))
650 ret = TRUE; /* default input is changed */
651 goto Retry;
652 }
653 }
654
655 return ret;
656}
_In_ PSCSI_REQUEST_BLOCK _Out_ NTSTATUS _Inout_ BOOLEAN * Retry
Definition: classpnp.h:312
BOOL InputList_Remove(INPUT_LIST_NODE *pNode)
Definition: input_list.c:596

Referenced by OnCommandSettingsPage().

◆ InputList_RemoveNode()

static VOID InputList_RemoveNode ( INPUT_LIST_NODE pNode)
static

Definition at line 170 of file input_list.c.

171{
172 INPUT_LIST_NODE *pCurrent = pNode;
173
174 if (_InputList == NULL)
175 return;
176
177 if (pCurrent != NULL)
178 {
179 INPUT_LIST_NODE *pNext = pCurrent->pNext;
180 INPUT_LIST_NODE *pPrev = pCurrent->pPrev;
181
182 free(pCurrent->pszIndicator);
183 free(pCurrent);
184
185 if (pNext != NULL)
186 pNext->pPrev = pPrev;
187
188 if (pPrev != NULL)
189 pPrev->pNext = pNext;
190 else
191 _InputList = pNext;
192 }
193}

Referenced by InputList_Process(), and InputList_Remove().

◆ InputList_SetDefault()

VOID InputList_SetDefault ( INPUT_LIST_NODE pNode)

Definition at line 547 of file input_list.c.

548{
549 INPUT_LIST_NODE *pCurrent;
550
551 if (pNode == NULL)
552 return;
553
554 for (pCurrent = _InputList; pCurrent != NULL; pCurrent = pCurrent->pNext)
555 {
556 if (pCurrent == pNode)
557 {
559 }
560 else
561 {
562 pCurrent->wFlags &= ~INPUT_LIST_NODE_FLAG_DEFAULT;
563 }
564 }
565}

Referenced by OnCommandSettingsPage().

◆ InputList_SetFontSubstitutes()

BOOL InputList_SetFontSubstitutes ( LCID  dwLocaleId)

Definition at line 50 of file input_list.c.

51{
52 MUI_SUBFONT *pSubstitutes;
53 WORD wLangID, wPrimaryLangID, wSubLangID;
54
55 wLangID = LANGIDFROMLCID(dwLocaleId);
56 wPrimaryLangID = PRIMARYLANGID(wLangID);
57 wSubLangID = SUBLANGID(wLangID);
58
59 /* FIXME: Add more if necessary */
60 switch (wPrimaryLangID)
61 {
62 default:
63 pSubstitutes = LatinFonts;
64 break;
65 case LANG_AZERI:
66 case LANG_BELARUSIAN:
67 case LANG_BULGARIAN:
68 case LANG_KAZAK:
69 case LANG_RUSSIAN:
70 case LANG_SERBIAN:
71 case LANG_TATAR:
72 case LANG_UKRAINIAN:
73 case LANG_UZBEK:
74 pSubstitutes = CyrillicFonts;
75 break;
76 case LANG_GREEK:
77 pSubstitutes = GreekFonts;
78 break;
79 case LANG_HEBREW:
80 pSubstitutes = HebrewFonts;
81 break;
82 case LANG_CHINESE:
83 switch (wSubLangID)
84 {
87 pSubstitutes = ChineseSimplifiedFonts;
88 break;
92 pSubstitutes = ChineseTraditionalFonts;
93 break;
94 default:
95 pSubstitutes = NULL;
96 DebugBreak();
97 break;
98 }
99 break;
100 case LANG_JAPANESE:
101 pSubstitutes = JapaneseFonts;
102 break;
103 case LANG_KOREAN:
104 pSubstitutes = KoreanFonts;
105 break;
106 case LANG_ARABIC:
107 case LANG_ARMENIAN:
108 case LANG_BENGALI:
109 case LANG_FARSI:
110 case LANG_GEORGIAN:
111 case LANG_GUJARATI:
112 case LANG_HINDI:
113 case LANG_KONKANI:
114 case LANG_MARATHI:
115 case LANG_PUNJABI:
116 case LANG_SANSKRIT:
117 case LANG_TAMIL:
118 case LANG_TELUGU:
119 case LANG_THAI:
120 case LANG_URDU:
121 case LANG_VIETNAMESE:
122 pSubstitutes = UnicodeFonts;
123 break;
124 }
125
126 if (pSubstitutes)
127 {
129 return TRUE;
130 }
131 return FALSE;
132}
BOOL UpdateRegistryForFontSubstitutes(MUI_SUBFONT *pSubstitutes)
Definition: input_list.c:20
MUI_SUBFONT UnicodeFonts[]
Definition: muifonts.h:335
MUI_SUBFONT KoreanFonts[]
Definition: muifonts.h:284
MUI_SUBFONT ChineseSimplifiedFonts[]
Definition: muifonts.h:137
MUI_SUBFONT LatinFonts[]
Definition: muifonts.h:3
MUI_SUBFONT GreekFonts[]
Definition: muifonts.h:68
MUI_SUBFONT HebrewFonts[]
Definition: muifonts.h:100
MUI_SUBFONT ChineseTraditionalFonts[]
Definition: muifonts.h:185
MUI_SUBFONT CyrillicFonts[]
Definition: muifonts.h:36
MUI_SUBFONT JapaneseFonts[]
Definition: muifonts.h:233
#define LANG_TATAR
Definition: nls.h:130
#define LANG_KONKANI
Definition: nls.h:83
#define LANG_HINDI
Definition: nls.h:68
#define LANG_TAMIL
Definition: nls.h:129
#define LANG_FARSI
Definition: nls.h:55
#define LANG_THAI
Definition: nls.h:132
#define SUBLANG_CHINESE_SINGAPORE
Definition: nls.h:211
#define SUBLANGID(l)
Definition: nls.h:17
#define LANG_SANSKRIT
Definition: nls.h:115
#define LANG_AZERI
Definition: nls.h:32
#define LANG_HEBREW
Definition: nls.h:67
#define SUBLANG_CHINESE_MACAU
Definition: nls.h:212
#define LANG_UKRAINIAN
Definition: nls.h:139
#define LANG_URDU
Definition: nls.h:141
#define LANG_BULGARIAN
Definition: nls.h:40
#define LANG_BELARUSIAN
Definition: nls.h:35
#define LANG_GEORGIAN
Definition: nls.h:61
#define LANG_GREEK
Definition: nls.h:63
#define LANGIDFROMLCID(l)
Definition: nls.h:18
#define SUBLANG_CHINESE_TRADITIONAL
Definition: nls.h:208
#define LANG_BENGALI
Definition: nls.h:36
#define SUBLANG_CHINESE_SIMPLIFIED
Definition: nls.h:209
#define LANG_RUSSIAN
Definition: nls.h:113
#define LANG_VIETNAMESE
Definition: nls.h:143
#define LANG_PUNJABI
Definition: nls.h:109
#define LANG_ARABIC
Definition: nls.h:29
#define SUBLANG_CHINESE_HONGKONG
Definition: nls.h:210
#define LANG_CHINESE
Definition: nls.h:42
#define LANG_SERBIAN
Definition: nls.h:116
#define LANG_JAPANESE
Definition: nls.h:76
#define PRIMARYLANGID(l)
Definition: nls.h:16
#define LANG_KOREAN
Definition: nls.h:84
#define LANG_GUJARATI
Definition: nls.h:65
#define LANG_MARATHI
Definition: nls.h:98
#define LANG_UZBEK
Definition: nls.h:142
#define LANG_TELUGU
Definition: nls.h:131
#define LANG_ARMENIAN
Definition: nls.h:30
#define LANG_KAZAK
Definition: nls.h:79
Definition: mui.h:4
void WINAPI DebugBreak(void)

Referenced by InputList_Process().

◆ InputList_Sort()

VOID InputList_Sort ( VOID  )

Definition at line 724 of file input_list.c.

725{
727 INPUT_LIST_NODE *pNext, *pPrev;
728 INPUT_LIST_NODE *pMinimum, *pNode;
729
731
732 while (pList)
733 {
734 /* Find the minimum node */
735 pMinimum = NULL;
736 for (pNode = pList; pNode; pNode = pNext)
737 {
738 pNext = pNode->pNext;
739
740 if (pMinimum == NULL)
741 {
742 pMinimum = pNode;
743 }
744 else if (InputList_Compare(pNode, pMinimum) < 0)
745 {
746 pMinimum = pNode;
747 }
748 }
749
750 // Remove pMinimum from pList
751 pNext = pMinimum->pNext;
752 pPrev = pMinimum->pPrev;
753 if (pNext)
754 pNext->pPrev = pPrev;
755 if (pPrev)
756 pPrev->pNext = pNext;
757 else
758 pList = pNext;
759
760 // Append pMinimum to _InputList
761 if (!_InputList)
762 {
763 pMinimum->pPrev = pMinimum->pNext = NULL;
764 _InputList = pMinimum;
765 }
766 else
767 {
768 /* Find last node */
769 for (pNode = _InputList; pNode->pNext; pNode = pNode->pNext)
770 {
771 NOTHING;
772 }
773
774 /* Add to the end */
775 pNode->pNext = pMinimum;
776 pMinimum->pPrev = pNode;
777 pMinimum->pNext = NULL;
778 }
779 }
780}
FxChildList * pList
static INT InputList_Compare(INPUT_LIST_NODE *pNode1, INPUT_LIST_NODE *pNode2)
Definition: input_list.c:715

Referenced by UpdateInputListView().

◆ InputList_WriteSubst()

static BOOL InputList_WriteSubst ( HKEY  hSubstKey,
DWORD  dwPhysicalKLID,
DWORD  dwLogicalKLID 
)
static

Definition at line 281 of file input_list.c.

282{
283 DWORD cbValue;
284 WCHAR szLogicalKLID[KL_NAMELENGTH], szPhysicalKLID[KL_NAMELENGTH];
285
286 StringCchPrintfW(szLogicalKLID, ARRAYSIZE(szLogicalKLID), L"%08x", dwLogicalKLID);
287 StringCchPrintfW(szPhysicalKLID, ARRAYSIZE(szPhysicalKLID), L"%08x", dwPhysicalKLID);
288
289 cbValue = (wcslen(szPhysicalKLID) + 1) * sizeof(WCHAR);
290 return RegSetValueExW(hSubstKey, szLogicalKLID, 0, REG_SZ, (LPBYTE)szPhysicalKLID,
291 cbValue) == ERROR_SUCCESS;
292}

Referenced by InputList_DoSubst().

◆ UpdateRegistryForFontSubstitutes()

BOOL UpdateRegistryForFontSubstitutes ( MUI_SUBFONT pSubstitutes)

Definition at line 20 of file input_list.c.

21{
22 DWORD cbData;
23 HKEY hKey;
24 static const WCHAR pszKey[] =
25 L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\FontSubstitutes";
26
28 return FALSE;
29
30 /* Overwrite only */
31 for (; pSubstitutes->FontName; ++pSubstitutes)
32 {
33 cbData = (lstrlenW(pSubstitutes->SubFontName) + 1) * sizeof(WCHAR);
34 RegSetValueExW(hKey, pSubstitutes->FontName, 0,
35 REG_SZ, (LPBYTE)pSubstitutes->SubFontName, cbData);
36 }
37
39 return TRUE;
40}
#define lstrlenW
Definition: compat.h:750
PCWSTR SubFontName
Definition: mui.h:6
PCWSTR FontName
Definition: mui.h:5
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12

Referenced by InputList_SetFontSubstitutes().

Variable Documentation

◆ _InputList