https://git.reactos.org/?p=reactos.git;a=commitdiff;h=5f4bb73edaaa738759cc86bf4cffde85c0765513

commit 5f4bb73edaaa738759cc86bf4cffde85c0765513
Author:     Katayama Hirofumi MZ <[email protected]>
AuthorDate: Thu Sep 29 07:31:43 2022 +0900
Commit:     GitHub <[email protected]>
CommitDate: Thu Sep 29 07:31:43 2022 +0900

    [CPL][INPUT] Make the ListView a TreeView (#4726)
    
    - Make the list a TreeView.
    - Modify IDD_PROPPAGESETTINGS resource dialog for UI compatibility.
---
 dll/cpl/input/input.rc               |   2 +
 dll/cpl/input/input_list.c           | 116 ++++++-
 dll/cpl/input/input_list.h           |  11 +-
 dll/cpl/input/lang/bg-BG.rc          |  20 +-
 dll/cpl/input/lang/cs-CZ.rc          |  20 +-
 dll/cpl/input/lang/de-DE.rc          |  20 +-
 dll/cpl/input/lang/el-GR.rc          |  20 +-
 dll/cpl/input/lang/en-US.rc          |  20 +-
 dll/cpl/input/lang/es-ES.rc          |  20 +-
 dll/cpl/input/lang/fr-FR.rc          |  20 +-
 dll/cpl/input/lang/he-IL.rc          |  20 +-
 dll/cpl/input/lang/id-ID.rc          |  20 +-
 dll/cpl/input/lang/it-IT.rc          |  20 +-
 dll/cpl/input/lang/ja-JP.rc          |  20 +-
 dll/cpl/input/lang/no-NO.rc          |  20 +-
 dll/cpl/input/lang/pl-PL.rc          |  20 +-
 dll/cpl/input/lang/pt-BR.rc          |  20 +-
 dll/cpl/input/lang/pt-PT.rc          |  20 +-
 dll/cpl/input/lang/ro-RO.rc          |  20 +-
 dll/cpl/input/lang/ru-RU.rc          |  20 +-
 dll/cpl/input/lang/sk-SK.rc          |  20 +-
 dll/cpl/input/lang/sq-AL.rc          |  20 +-
 dll/cpl/input/lang/tr-TR.rc          |  20 +-
 dll/cpl/input/lang/uk-UA.rc          |  20 +-
 dll/cpl/input/lang/zh-CN.rc          |  20 +-
 dll/cpl/input/lang/zh-HK.rc          |  20 +-
 dll/cpl/input/lang/zh-TW.rc          |  20 +-
 dll/cpl/input/resource.h             |   5 +-
 dll/cpl/input/resources/dot.ico      | Bin 0 -> 894 bytes
 dll/cpl/input/resources/keyboard.ico | Bin 0 -> 25214 bytes
 dll/cpl/input/settings_page.c        | 588 ++++++++++++++++++++++++-----------
 31 files changed, 815 insertions(+), 387 deletions(-)

diff --git a/dll/cpl/input/input.rc b/dll/cpl/input/input.rc
index 706a14cdb62..52b23b3cc45 100644
--- a/dll/cpl/input/input.rc
+++ b/dll/cpl/input/input.rc
@@ -13,6 +13,8 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
 #include <reactos/version.rc>
 
 IDI_CPLSYSTEM ICON "resources/keyboard-shortcuts.ico"
+IDI_KEYBOARD ICON "resources/keyboard.ico"
+IDI_DOT ICON "resources/dot.ico"
 
 #include <reactos/manifest_hosted.rc>
 
diff --git a/dll/cpl/input/input_list.c b/dll/cpl/input/input_list.c
index 97fe16a13b6..ec415b372fe 100644
--- a/dll/cpl/input/input_list.c
+++ b/dll/cpl/input/input_list.c
@@ -7,6 +7,7 @@
 */
 
 #include "input_list.h"
+#define NOTHING
 
 typedef struct
 {
@@ -154,7 +155,7 @@ InputList_AppendNode(VOID)
     /* Find last node */
     for (pCurrent = _InputList; pCurrent->pNext; pCurrent = pCurrent->pNext)
     {
-        ;
+        NOTHING;
     }
 
     /* Add to the end */
@@ -568,13 +569,14 @@ InputList_FindNextDefault(INPUT_LIST_NODE *pNode)
  * It marks the input method for deletion, but does not delete it directly.
  * To apply the changes using InputList_Process()
  */
-VOID
+BOOL
 InputList_Remove(INPUT_LIST_NODE *pNode)
 {
+    BOOL ret = FALSE;
     BOOL bRemoveNode = FALSE;
 
     if (pNode == NULL)
-        return;
+        return FALSE;
 
     if (pNode->wFlags & INPUT_LIST_NODE_FLAG_ADDED)
     {
@@ -596,14 +598,39 @@ InputList_Remove(INPUT_LIST_NODE *pNode)
             pCurrent->wFlags |= INPUT_LIST_NODE_FLAG_DEFAULT;
 
         pNode->wFlags &= ~INPUT_LIST_NODE_FLAG_DEFAULT;
+        ret = TRUE; /* default input is changed */
     }
 
     if (bRemoveNode)
     {
         InputList_RemoveNode(pNode);
     }
+
+    return ret;
 }
 
+BOOL
+InputList_RemoveByLang(LANGID wLangId)
+{
+    BOOL ret = FALSE;
+    INPUT_LIST_NODE *pCurrent;
+
+Retry:
+    for (pCurrent = _InputList; pCurrent; pCurrent = pCurrent->pNext)
+    {
+        if (pCurrent->wFlags & INPUT_LIST_NODE_FLAG_DELETED)
+            continue;
+
+        if (LOWORD(pCurrent->pLocale->dwId) == wLangId)
+        {
+            if (InputList_Remove(pCurrent))
+                ret = TRUE; /* default input is changed */
+            goto Retry;
+        }
+    }
+
+    return ret;
+}
 
 VOID
 InputList_Create(VOID)
@@ -662,6 +689,89 @@ InputList_Create(VOID)
     free(pLayoutList);
 }
 
+static INT InputList_Compare(INPUT_LIST_NODE *pNode1, INPUT_LIST_NODE *pNode2)
+{
+    INT nCompare = _wcsicmp(pNode1->pszIndicator, pNode2->pszIndicator);
+    if (nCompare != 0)
+        return nCompare;
+
+    return _wcsicmp(pNode1->pLayout->pszName, pNode2->pLayout->pszName);
+}
+
+VOID InputList_Sort(VOID)
+{
+    INPUT_LIST_NODE *pList = _InputList;
+    INPUT_LIST_NODE *pNext, *pPrev;
+    INPUT_LIST_NODE *pMinimum, *pNode;
+
+    _InputList = NULL;
+
+    while (pList)
+    {
+        /* Find the minimum node */
+        pMinimum = NULL;
+        for (pNode = pList; pNode; pNode = pNext)
+        {
+            pNext = pNode->pNext;
+
+            if (pMinimum == NULL)
+            {
+                pMinimum = pNode;
+            }
+            else if (InputList_Compare(pNode, pMinimum) < 0)
+            {
+                pMinimum = pNode;
+            }
+        }
+
+        // Remove pMinimum from pList
+        pNext = pMinimum->pNext;
+        pPrev = pMinimum->pPrev;
+        if (pNext)
+            pNext->pPrev = pPrev;
+        if (pPrev)
+            pPrev->pNext = pNext;
+        else
+            pList = pNext;
+
+        // Append pMinimum to _InputList
+        if (!_InputList)
+        {
+            pMinimum->pPrev = pMinimum->pNext = NULL;
+            _InputList = pMinimum;
+        }
+        else
+        {
+            /* Find last node */
+            for (pNode = _InputList; pNode->pNext; pNode = pNode->pNext)
+            {
+                NOTHING;
+            }
+
+            /* Add to the end */
+            pNode->pNext = pMinimum;
+            pMinimum->pPrev = pNode;
+            pMinimum->pNext = NULL;
+        }
+    }
+}
+
+INT
+InputList_GetAliveCount(VOID)
+{
+    INPUT_LIST_NODE *pNode;
+    INT nCount = 0;
+
+    for (pNode = _InputList; pNode; pNode = pNode->pNext)
+    {
+        if (pNode->wFlags & INPUT_LIST_NODE_FLAG_DELETED)
+            continue;
+
+        ++nCount;
+    }
+
+    return nCount;
+}
 
 INPUT_LIST_NODE*
 InputList_GetFirst(VOID)
diff --git a/dll/cpl/input/input_list.h b/dll/cpl/input/input_list.h
index 5c947dbaae2..59785bf8166 100644
--- a/dll/cpl/input/input_list.h
+++ b/dll/cpl/input/input_list.h
@@ -57,9 +57,18 @@ InputList_Add(LOCALE_LIST_NODE *pLocale, LAYOUT_LIST_NODE 
*pLayout);
 VOID
 InputList_SetDefault(INPUT_LIST_NODE *pNode);
 
-VOID
+INT
+InputList_GetAliveCount(VOID);
+
+BOOL
 InputList_Remove(INPUT_LIST_NODE *pNode);
 
+BOOL
+InputList_RemoveByLang(LANGID wLangId);
+
+VOID
+InputList_Sort(VOID);
+
 VOID
 InputList_Destroy(VOID);
 
diff --git a/dll/cpl/input/lang/bg-BG.rc b/dll/cpl/input/lang/bg-BG.rc
index ffc54fcc3ab..9833958bd6e 100644
--- a/dll/cpl/input/lang/bg-BG.rc
+++ b/dll/cpl/input/lang/bg-BG.rc
@@ -5,14 +5,18 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Настройки"
 FONT 8, "MS Shell Dlg"
 BEGIN
-    LTEXT "Посочете избраните от вас услуги за всеки посочен в списъка 
език.\nПромяната на списъка става с „Премахване“ и „Добавяне“.", -1, 9, 6, 238, 
25
-    CONTROL "TEXT", IDC_KEYLAYOUT_LIST, "SYSLISTVIEW32", WS_BORDER | 
WS_VSCROLL | WS_TABSTOP | LVS_SINGLESEL | LVS_NOSORTHEADER | LVS_SHOWSELALWAYS 
| LVS_REPORT, 8, 36, 237, 101
-    PUSHBUTTON "&Прилагане на подразбираните", IDC_SET_DEFAULT, 101, 159, 144, 
14
-    PUSHBUTTON "&Добавяне...", IDC_ADD_BUTTON, 27, 142, 70, 14
-    PUSHBUTTON "Пре&махване", IDC_REMOVE_BUTTON, 101, 142, 70, 14
-    PUSHBUTTON "&Свойства...", IDC_PROP_BUTTON, 175, 142, 70, 14
-    GROUPBOX "Предпочитания", -1, 7, 185, 240, 36
-    PUSHBUTTON "Настройка на &клавишите...", IDC_KEY_SET_BTN, 14, 198, 110, 14
+    GROUPBOX "Default input &language", -1, 5, 5, 246, 55
+    LTEXT "Select one of the installed input languages to use when your 
computer starts.", -1, 15, 15, 230, 23
+    COMBOBOX IDC_DEFAULT_LANGUAGE, 15, 40, 230, 300, CBS_HASSTRINGS | 
CBS_AUTOHSCROLL | CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    GROUPBOX "&Installed services", -1, 5, 65, 246, 125
+    LTEXT "Посочете избраните от вас услуги за всеки посочен в списъка език. 
Промяната на списъка става с „Премахване“ и „Добавяне“.", -1, 15, 78, 230, 25
+    CONTROL "", IDC_KEYLAYOUT_LIST, "SysTreeView32", TVS_SHOWSELALWAYS | 
TVS_DISABLEDRAGDROP | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 15, 105, 155, 80
+    PUSHBUTTON "&Добавяне...", IDC_ADD_BUTTON, 175, 105, 70, 14
+    PUSHBUTTON "Пре&махване", IDC_REMOVE_BUTTON, 175, 125, 70, 14
+    PUSHBUTTON "&Свойства...", IDC_PROP_BUTTON, 175, 145, 70, 14
+    GROUPBOX "Предпочитания", -1, 5, 195, 245, 30
+    PUSHBUTTON "Language &Bar...", IDC_LANGUAGE_BAR, 15, 205, 110, 14
+    PUSHBUTTON "Настройка на &клавишите...", IDC_KEY_SET_BTN, 133, 205, 110, 14
 END
 
 IDD_PROPPAGEADVANCEDSETTINGS DIALOGEX 0, 0, 254, 228
diff --git a/dll/cpl/input/lang/cs-CZ.rc b/dll/cpl/input/lang/cs-CZ.rc
index df2c7d2756c..f1046fab271 100644
--- a/dll/cpl/input/lang/cs-CZ.rc
+++ b/dll/cpl/input/lang/cs-CZ.rc
@@ -10,14 +10,18 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Nastavení"
 FONT 8, "MS Shell Dlg"
 BEGIN
-    LTEXT "Zvolte služby pro každý vstupní jazyk v seznamu.\nSeznam lze měnit 
pomocí tlačítek Přidat a Odebrat.", -1, 9, 6, 238, 25
-    CONTROL "TEXT", IDC_KEYLAYOUT_LIST, "SYSLISTVIEW32", WS_BORDER | 
WS_VSCROLL | WS_TABSTOP | LVS_SINGLESEL | LVS_NOSORTHEADER | LVS_SHOWSELALWAYS 
| LVS_REPORT, 8, 36, 237, 101
-    PUSHBUTTON "Nas&tavit výchozí", IDC_SET_DEFAULT, 101, 159, 144, 14
-    PUSHBUTTON "&Přidat...", IDC_ADD_BUTTON, 27, 142, 70, 14
-    PUSHBUTTON "&Odebrat", IDC_REMOVE_BUTTON, 101, 142, 70, 14
-    PUSHBUTTON "&Vlastnosti...", IDC_PROP_BUTTON, 175, 142, 70, 14
-    GROUPBOX "Předvolby", -1, 7, 185, 240, 36
-    PUSHBUTTON "&Nastavení kláves...", IDC_KEY_SET_BTN, 14, 198, 110, 14
+    GROUPBOX "Default input &language", -1, 5, 5, 246, 55
+    LTEXT "Select one of the installed input languages to use when your 
computer starts.", -1, 15, 15, 230, 23
+    COMBOBOX IDC_DEFAULT_LANGUAGE, 15, 40, 230, 300, CBS_HASSTRINGS | 
CBS_AUTOHSCROLL | CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    GROUPBOX "&Installed services", -1, 5, 65, 246, 125
+    LTEXT "Zvolte služby pro každý vstupní jazyk v seznamu. Seznam lze měnit 
pomocí tlačítek Přidat a Odebrat.", -1, 15, 78, 230, 25
+    CONTROL "", IDC_KEYLAYOUT_LIST, "SysTreeView32", TVS_SHOWSELALWAYS | 
TVS_DISABLEDRAGDROP | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 15, 105, 155, 80
+    PUSHBUTTON "&Přidat...", IDC_ADD_BUTTON, 175, 105, 70, 14
+    PUSHBUTTON "&Odebrat", IDC_REMOVE_BUTTON, 175, 125, 70, 14
+    PUSHBUTTON "&Vlastnosti...", IDC_PROP_BUTTON, 175, 145, 70, 14
+    GROUPBOX "Předvolby", -1, 5, 195, 245, 30
+    PUSHBUTTON "Language &Bar...", IDC_LANGUAGE_BAR, 15, 205, 110, 14
+    PUSHBUTTON "&Nastavení kláves...", IDC_KEY_SET_BTN, 133, 205, 110, 14
 END
 
 IDD_PROPPAGEADVANCEDSETTINGS DIALOGEX 0, 0, 254, 228
diff --git a/dll/cpl/input/lang/de-DE.rc b/dll/cpl/input/lang/de-DE.rc
index 702e67219c9..b23641e5cee 100644
--- a/dll/cpl/input/lang/de-DE.rc
+++ b/dll/cpl/input/lang/de-DE.rc
@@ -5,14 +5,18 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Einstellungen"
 FONT 8, "MS Shell Dlg"
 BEGIN
-    LTEXT "Wählen Sie die Dienste aus, die Sie für die Eingabesprachen in der 
Liste verwenden wollen.\nVerwenden Sie ""Hinzufügen"" und ""Entfernen"", um die 
Liste zu bearbeiten.", -1, 9, 6, 238, 25
-    CONTROL "TEXT", IDC_KEYLAYOUT_LIST, "SYSLISTVIEW32", WS_BORDER | 
WS_VSCROLL | WS_TABSTOP | LVS_SINGLESEL | LVS_NOSORTHEADER | LVS_SHOWSELALWAYS 
| LVS_REPORT, 8, 36, 237, 101
-    PUSHBUTTON "&Als Standard", IDC_SET_DEFAULT, 101, 159, 144, 14
-    PUSHBUTTON "&Hinzufügen...", IDC_ADD_BUTTON, 27, 142, 70, 14
-    PUSHBUTTON "Ent&fernen", IDC_REMOVE_BUTTON, 101, 142, 70, 14
-    PUSHBUTTON "&Eigenschaften...", IDC_PROP_BUTTON, 175, 142, 70, 14
-    GROUPBOX "Einstellungen", -1, 7, 185, 240, 36
-    PUSHBUTTON "&Tasteneinstellungen...", IDC_KEY_SET_BTN, 14, 198, 110, 14
+    GROUPBOX "Default input &language", -1, 5, 5, 246, 55
+    LTEXT "Select one of the installed input languages to use when your 
computer starts.", -1, 15, 15, 230, 23
+    COMBOBOX IDC_DEFAULT_LANGUAGE, 15, 40, 230, 300, CBS_HASSTRINGS | 
CBS_AUTOHSCROLL | CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    GROUPBOX "&Installed services", -1, 5, 65, 246, 125
+    LTEXT "Wählen Sie die Dienste aus, die Sie für die Eingabesprachen in der 
Liste verwenden wollen. Verwenden Sie ""Hinzufügen"" und ""Entfernen"", um die 
Liste zu bearbeiten.", -1, 15, 78, 230, 25
+    CONTROL "", IDC_KEYLAYOUT_LIST, "SysTreeView32", TVS_SHOWSELALWAYS | 
TVS_DISABLEDRAGDROP | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 15, 105, 155, 80
+    PUSHBUTTON "&Hinzufügen...", IDC_ADD_BUTTON, 175, 105, 70, 14
+    PUSHBUTTON "Ent&fernen", IDC_REMOVE_BUTTON, 175, 125, 70, 14
+    PUSHBUTTON "&Eigenschaften...", IDC_PROP_BUTTON, 175, 145, 70, 14
+    GROUPBOX "Einstellungen", -1, 5, 195, 245, 30
+    PUSHBUTTON "Language &Bar...", IDC_LANGUAGE_BAR, 15, 205, 110, 14
+    PUSHBUTTON "&Tasteneinstellungen...", IDC_KEY_SET_BTN, 133, 205, 110, 14
 END
 
 IDD_PROPPAGEADVANCEDSETTINGS DIALOGEX 0, 0, 254, 228
diff --git a/dll/cpl/input/lang/el-GR.rc b/dll/cpl/input/lang/el-GR.rc
index 87691f00b1c..464aaa58581 100644
--- a/dll/cpl/input/lang/el-GR.rc
+++ b/dll/cpl/input/lang/el-GR.rc
@@ -5,14 +5,18 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Ρυθμίσεις"
 FONT 8, "MS Shell Dlg"
 BEGIN
-    LTEXT "Επιλέξτε τις υπηρεσίες που θέλετε για κάθε γλώσσα εισαγωγής που 
εμφανίζεται στη λίστα.\nΧρησιμοποιήστε τα κουμπιά Προσθήκη και Κατάργηση για 
την τροποποίηση αυτής της λίστας.", -1, 9, 6, 238, 33
-    CONTROL "TEXT", IDC_KEYLAYOUT_LIST, "SYSLISTVIEW32", WS_BORDER | 
WS_VSCROLL | WS_TABSTOP | LVS_SINGLESEL | LVS_NOSORTHEADER | LVS_SHOWSELALWAYS 
| LVS_REPORT, 8, 42, 237, 95
-    PUSHBUTTON "&Set Default", IDC_SET_DEFAULT, 101, 159, 144, 14
-    PUSHBUTTON "Π&ροσθήκη...", IDC_ADD_BUTTON, 27, 142, 70, 14
-    PUSHBUTTON "&Κατάργηση", IDC_REMOVE_BUTTON, 101, 142, 70, 14
-    PUSHBUTTON "&Ιδιότητες...", IDC_PROP_BUTTON, 175, 142, 70, 14
-    GROUPBOX "Προτιμήσεις", -1, 7, 185, 240, 36
-    PUSHBUTTON "&Ρυθμίσεις πλήκτρων...", IDC_KEY_SET_BTN, 14, 198, 110, 14
+    GROUPBOX "Default input &language", -1, 5, 5, 246, 55
+    LTEXT "Select one of the installed input languages to use when your 
computer starts.", -1, 15, 15, 230, 23
+    COMBOBOX IDC_DEFAULT_LANGUAGE, 15, 40, 230, 300, CBS_HASSTRINGS | 
CBS_AUTOHSCROLL | CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    GROUPBOX "&Installed services", -1, 5, 65, 246, 125
+    LTEXT "Επιλέξτε τις υπηρεσίες που θέλετε για κάθε γλώσσα εισαγωγής που 
εμφανίζεται στη λίστα. Χρησιμοποιήστε τα κουμπιά Προσθήκη και Κατάργηση για την 
τροποποίηση αυτής της λίστας.", -1, 15, 78, 230, 25
+    CONTROL "", IDC_KEYLAYOUT_LIST, "SysTreeView32", TVS_SHOWSELALWAYS | 
TVS_DISABLEDRAGDROP | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 15, 105, 155, 80
+    PUSHBUTTON "Π&ροσθήκη...", IDC_ADD_BUTTON, 175, 105, 70, 14
+    PUSHBUTTON "&Κατάργηση", IDC_REMOVE_BUTTON, 175, 125, 70, 14
+    PUSHBUTTON "&Ιδιότητες...", IDC_PROP_BUTTON, 175, 145, 70, 14
+    GROUPBOX "Προτιμήσεις", -1, 5, 195, 245, 30
+    PUSHBUTTON "Language &Bar...", IDC_LANGUAGE_BAR, 15, 205, 110, 14
+    PUSHBUTTON "&Ρυθμίσεις πλήκτρων...", IDC_KEY_SET_BTN, 133, 205, 110, 14
 END
 
 IDD_PROPPAGEADVANCEDSETTINGS DIALOGEX 0, 0, 254, 228
diff --git a/dll/cpl/input/lang/en-US.rc b/dll/cpl/input/lang/en-US.rc
index 1abf3968a41..41e07463b91 100644
--- a/dll/cpl/input/lang/en-US.rc
+++ b/dll/cpl/input/lang/en-US.rc
@@ -5,14 +5,18 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Settings"
 FONT 8, "MS Shell Dlg"
 BEGIN
-    LTEXT "Select the services that you want for each input language shown in 
the list.\nUse the Add and Remove buttons to modify this list.", -1, 9, 6, 238, 
25
-    CONTROL "TEXT", IDC_KEYLAYOUT_LIST, "SYSLISTVIEW32", WS_BORDER | 
WS_VSCROLL | WS_TABSTOP | LVS_SINGLESEL | LVS_NOSORTHEADER | LVS_SHOWSELALWAYS 
| LVS_REPORT, 8, 36, 237, 101
-    PUSHBUTTON "&Set Default", IDC_SET_DEFAULT, 101, 159, 144, 14
-    PUSHBUTTON "A&dd...", IDC_ADD_BUTTON, 27, 142, 70, 14
-    PUSHBUTTON "&Remove", IDC_REMOVE_BUTTON, 101, 142, 70, 14
-    PUSHBUTTON "&Properties...", IDC_PROP_BUTTON, 175, 142, 70, 14
-    GROUPBOX "Preferences", -1, 7, 185, 240, 36
-    PUSHBUTTON "&Key Settings...", IDC_KEY_SET_BTN, 14, 198, 110, 14
+    GROUPBOX "Default input &language", -1, 5, 5, 246, 55
+    LTEXT "Select one of the installed input languages to use when your 
computer starts.", -1, 15, 15, 230, 23
+    COMBOBOX IDC_DEFAULT_LANGUAGE, 15, 40, 230, 300, CBS_HASSTRINGS | 
CBS_AUTOHSCROLL | CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    GROUPBOX "&Installed services", -1, 5, 65, 246, 125
+    LTEXT "Select the services that you want for each input language shown in 
the list. Use the Add and Remove buttons to modify this list.", -1, 15, 78, 
230, 25
+    CONTROL "", IDC_KEYLAYOUT_LIST, "SysTreeView32", TVS_SHOWSELALWAYS | 
TVS_DISABLEDRAGDROP | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 15, 105, 155, 80
+    PUSHBUTTON "A&dd...", IDC_ADD_BUTTON, 175, 105, 70, 14
+    PUSHBUTTON "&Remove", IDC_REMOVE_BUTTON, 175, 125, 70, 14
+    PUSHBUTTON "&Properties...", IDC_PROP_BUTTON, 175, 145, 70, 14
+    GROUPBOX "Preferences", -1, 5, 195, 245, 30
+    PUSHBUTTON "Language &Bar...", IDC_LANGUAGE_BAR, 15, 205, 110, 14
+    PUSHBUTTON "&Key Settings...", IDC_KEY_SET_BTN, 133, 205, 110, 14
 END
 
 IDD_PROPPAGEADVANCEDSETTINGS DIALOGEX 0, 0, 254, 228
diff --git a/dll/cpl/input/lang/es-ES.rc b/dll/cpl/input/lang/es-ES.rc
index 433bb279f5b..c4dd0b014bd 100644
--- a/dll/cpl/input/lang/es-ES.rc
+++ b/dll/cpl/input/lang/es-ES.rc
@@ -14,14 +14,18 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Configuración"
 FONT 8, "MS Shell Dlg"
 BEGIN
-    LTEXT "Seleccione los servicios que desea para cada idioma mostrado en la 
lista. Use los botones de Agregar y Quitar para modificar esta lista.", -1, 9, 
6, 238, 17
-    CONTROL "TEXT", IDC_KEYLAYOUT_LIST, "SYSLISTVIEW32", WS_BORDER | 
WS_VSCROLL | WS_TABSTOP | LVS_SINGLESEL | LVS_NOSORTHEADER | LVS_SHOWSELALWAYS 
| LVS_REPORT, 8, 28, 237, 109
-    PUSHBUTTON "Pr&edeterminado", IDC_SET_DEFAULT, 101, 159, 144, 14
-    PUSHBUTTON "Ag&regar...", IDC_ADD_BUTTON, 27, 142, 70, 14
-    PUSHBUTTON "&Quitar", IDC_REMOVE_BUTTON, 101, 142, 70, 14
-    PUSHBUTTON "&Propiedades...", IDC_PROP_BUTTON, 175, 142, 70, 14
-    GROUPBOX "Pre&ferencias ", -1, 7, 185, 240, 36
-    PUSHBUTTON "C&onfiguración de teclas...", IDC_KEY_SET_BTN, 14, 198, 110, 14
+    GROUPBOX "Default input &language", -1, 5, 5, 246, 55
+    LTEXT "Select one of the installed input languages to use when your 
computer starts.", -1, 15, 15, 230, 23
+    COMBOBOX IDC_DEFAULT_LANGUAGE, 15, 40, 230, 300, CBS_HASSTRINGS | 
CBS_AUTOHSCROLL | CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    GROUPBOX "&Installed services", -1, 5, 65, 246, 125
+    LTEXT "Seleccione los servicios que desea para cada idioma mostrado en la 
lista. Use los botones de Agregar y Quitar para modificar esta lista.", -1, 15, 
78, 230, 25
+    CONTROL "", IDC_KEYLAYOUT_LIST, "SysTreeView32", TVS_SHOWSELALWAYS | 
TVS_DISABLEDRAGDROP | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 15, 105, 155, 80
+    PUSHBUTTON "Ag&regar...", IDC_ADD_BUTTON, 175, 105, 70, 14
+    PUSHBUTTON "&Quitar", IDC_REMOVE_BUTTON, 175, 125, 70, 14
+    PUSHBUTTON "&Propiedades...", IDC_PROP_BUTTON, 175, 145, 70, 14
+    GROUPBOX "Pre&ferencias", -1, 5, 195, 245, 30
+    PUSHBUTTON "Language &Bar...", IDC_LANGUAGE_BAR, 15, 205, 110, 14
+    PUSHBUTTON "C&onfiguración de teclas...", IDC_KEY_SET_BTN, 133, 205, 110, 
14
 END
 
 IDD_PROPPAGEADVANCEDSETTINGS DIALOGEX 0, 0, 254, 228
diff --git a/dll/cpl/input/lang/fr-FR.rc b/dll/cpl/input/lang/fr-FR.rc
index e6d45431874..26fd2848772 100644
--- a/dll/cpl/input/lang/fr-FR.rc
+++ b/dll/cpl/input/lang/fr-FR.rc
@@ -5,14 +5,18 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Paramètres"
 FONT 8, "MS Shell Dlg"
 BEGIN
-    LTEXT "Sélectionnez les services que vous désirez pour chaque langue de 
saisie affichée dans la liste.\nUtilisez les boutons Ajouter et Supprimer pour 
modifier la liste.", -1, 9, 6, 238, 25
-    CONTROL "TEXT", IDC_KEYLAYOUT_LIST, "SYSLISTVIEW32", WS_BORDER | 
WS_VSCROLL | WS_TABSTOP | LVS_SINGLESEL | LVS_NOSORTHEADER | LVS_SHOWSELALWAYS 
| LVS_REPORT, 8, 36, 237, 101
-    PUSHBUTTON "Par &défaut", IDC_SET_DEFAULT, 101, 159, 144, 14
-    PUSHBUTTON "A&jouter...", IDC_ADD_BUTTON, 27, 142, 70, 14
-    PUSHBUTTON "Supp&rimer", IDC_REMOVE_BUTTON, 101, 142, 70, 14
-    PUSHBUTTON "&Propriétés...", IDC_PROP_BUTTON, 175, 142, 70, 14
-    GROUPBOX "Pré&férences", -1, 7, 185, 240, 36
-    PUSHBUTTON "Para&mètres des touches...", IDC_KEY_SET_BTN, 14, 198, 110, 14
+    GROUPBOX "Default input &language", -1, 5, 5, 246, 55
+    LTEXT "Select one of the installed input languages to use when your 
computer starts.", -1, 15, 15, 230, 23
+    COMBOBOX IDC_DEFAULT_LANGUAGE, 15, 40, 230, 300, CBS_HASSTRINGS | 
CBS_AUTOHSCROLL | CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    GROUPBOX "&Installed services", -1, 5, 65, 246, 125
+    LTEXT "Sélectionnez les services que vous désirez pour chaque langue de 
saisie affichée dans la liste. Utilisez les boutons Ajouter et Supprimer pour 
modifier la liste.", -1, 15, 78, 230, 25
+    CONTROL "", IDC_KEYLAYOUT_LIST, "SysTreeView32", TVS_SHOWSELALWAYS | 
TVS_DISABLEDRAGDROP | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 15, 105, 155, 80
+    PUSHBUTTON "A&jouter...", IDC_ADD_BUTTON, 175, 105, 70, 14
+    PUSHBUTTON "Supp&rimer", IDC_REMOVE_BUTTON, 175, 125, 70, 14
+    PUSHBUTTON "&Propriétés...", IDC_PROP_BUTTON, 175, 145, 70, 14
+    GROUPBOX "Pré&férences", -1, 5, 195, 245, 30
+    PUSHBUTTON "Language &Bar...", IDC_LANGUAGE_BAR, 15, 205, 110, 14
+    PUSHBUTTON "Para&mètres des touches...", IDC_KEY_SET_BTN, 133, 205, 110, 14
 END
 
 IDD_PROPPAGEADVANCEDSETTINGS DIALOGEX 0, 0, 254, 228
diff --git a/dll/cpl/input/lang/he-IL.rc b/dll/cpl/input/lang/he-IL.rc
index 45dc162a539..b88284c27ca 100644
--- a/dll/cpl/input/lang/he-IL.rc
+++ b/dll/cpl/input/lang/he-IL.rc
@@ -7,14 +7,18 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "הגדרות"
 FONT 8, "MS Shell Dlg"
 BEGIN
-    LTEXT "Select the services that you want for each input language shown in 
the list.\nUse the Add and Remove buttons to modify this list.", -1, 9, 6, 238, 
25
-    CONTROL "TEXT", IDC_KEYLAYOUT_LIST, "SYSLISTVIEW32", WS_BORDER | 
WS_VSCROLL | WS_TABSTOP | LVS_SINGLESEL | LVS_NOSORTHEADER | LVS_SHOWSELALWAYS 
| LVS_REPORT, 8, 36, 237, 101
-    PUSHBUTTON "קבע כברירת מחדל...", IDC_SET_DEFAULT, 101, 159, 144, 14
-    PUSHBUTTON "הוסף...", IDC_ADD_BUTTON, 27, 142, 70, 14
-    PUSHBUTTON "הסר", IDC_REMOVE_BUTTON, 101, 142, 70, 14
-    PUSHBUTTON "מאפיניים...", IDC_PROP_BUTTON, 175, 142, 70, 14
-    GROUPBOX "העדפות", -1, 7, 185, 240, 36
-    PUSHBUTTON "הגדרות מקשים...", IDC_KEY_SET_BTN, 14, 198, 110, 14
+    GROUPBOX "Default input &language", -1, 5, 5, 246, 55
+    LTEXT "Select one of the installed input languages to use when your 
computer starts.", -1, 15, 15, 230, 23
+    COMBOBOX IDC_DEFAULT_LANGUAGE, 15, 40, 230, 300, CBS_HASSTRINGS | 
CBS_AUTOHSCROLL | CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    GROUPBOX "&Installed services", -1, 5, 65, 246, 125
+    LTEXT "Select the services that you want for each input language shown in 
the list. Use the Add and Remove buttons to modify this list.", -1, 15, 78, 
230, 25
+    CONTROL "", IDC_KEYLAYOUT_LIST, "SysTreeView32", TVS_SHOWSELALWAYS | 
TVS_DISABLEDRAGDROP | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 15, 105, 155, 80
+    PUSHBUTTON "הוסף...", IDC_ADD_BUTTON, 175, 105, 70, 14
+    PUSHBUTTON "הסר", IDC_REMOVE_BUTTON, 175, 125, 70, 14
+    PUSHBUTTON "מאפיניים...", IDC_PROP_BUTTON, 175, 145, 70, 14
+    GROUPBOX "העדפות", -1, 5, 195, 245, 30
+    PUSHBUTTON "Language &Bar...", IDC_LANGUAGE_BAR, 15, 205, 110, 14
+    PUSHBUTTON "הגדרות מקשים...", IDC_KEY_SET_BTN, 133, 205, 110, 14
 END
 
 IDD_PROPPAGEADVANCEDSETTINGS DIALOGEX 0, 0, 254, 228
diff --git a/dll/cpl/input/lang/id-ID.rc b/dll/cpl/input/lang/id-ID.rc
index 6805553a9b8..0c65a242953 100644
--- a/dll/cpl/input/lang/id-ID.rc
+++ b/dll/cpl/input/lang/id-ID.rc
@@ -5,14 +5,18 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Setelan"
 FONT 8, "MS Shell Dlg"
 BEGIN
-    LTEXT "Pilih layanan yang anda inginkan untuk setiap bahasa masukan untuk 
ditampilkan dalam daftar.\nGunakan tombol Tambah atau Hapus untuk mengubah 
daftar.", -1, 9, 6, 238, 25
-    CONTROL "TEXT", IDC_KEYLAYOUT_LIST, "SYSLISTVIEW32", WS_BORDER | 
WS_VSCROLL | WS_TABSTOP | LVS_SINGLESEL | LVS_NOSORTHEADER | LVS_SHOWSELALWAYS 
| LVS_REPORT, 8, 36, 237, 101
-    PUSHBUTTON "&Setelan Asal", IDC_SET_DEFAULT, 101, 159, 144, 14
-    PUSHBUTTON "&Tambah...", IDC_ADD_BUTTON, 27, 142, 70, 14
-    PUSHBUTTON "&Hapus", IDC_REMOVE_BUTTON, 101, 142, 70, 14
-    PUSHBUTTON "&Properti...", IDC_PROP_BUTTON, 175, 142, 70, 14
-    GROUPBOX "Preferensi", -1, 7, 185, 240, 36
-    PUSHBUTTON "Setelan To&mbol...", IDC_KEY_SET_BTN, 14, 198, 110, 14
+    GROUPBOX "Default input &language", -1, 5, 5, 246, 55
+    LTEXT "Select one of the installed input languages to use when your 
computer starts.", -1, 15, 15, 230, 23
+    COMBOBOX IDC_DEFAULT_LANGUAGE, 15, 40, 230, 300, CBS_HASSTRINGS | 
CBS_AUTOHSCROLL | CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    GROUPBOX "&Installed services", -1, 5, 65, 246, 125
+    LTEXT "Pilih layanan yang anda inginkan untuk setiap bahasa masukan untuk 
ditampilkan dalam daftar. Gunakan tombol Tambah atau Hapus untuk mengubah 
daftar.", -1, 15, 78, 230, 25
+    CONTROL "", IDC_KEYLAYOUT_LIST, "SysTreeView32", TVS_SHOWSELALWAYS | 
TVS_DISABLEDRAGDROP | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 15, 105, 155, 80
+    PUSHBUTTON "&Tambah...", IDC_ADD_BUTTON, 175, 105, 70, 14
+    PUSHBUTTON "&Hapus", IDC_REMOVE_BUTTON, 175, 125, 70, 14
+    PUSHBUTTON "&Properti...", IDC_PROP_BUTTON, 175, 145, 70, 14
+    GROUPBOX "Preferensi", -1, 5, 195, 245, 30
+    PUSHBUTTON "Language &Bar...", IDC_LANGUAGE_BAR, 15, 205, 110, 14
+    PUSHBUTTON "Setelan To&mbol...", IDC_KEY_SET_BTN, 133, 205, 110, 14
 END
 
 IDD_PROPPAGEADVANCEDSETTINGS DIALOGEX 0, 0, 254, 228
diff --git a/dll/cpl/input/lang/it-IT.rc b/dll/cpl/input/lang/it-IT.rc
index 06f46fafb64..872727901f6 100644
--- a/dll/cpl/input/lang/it-IT.rc
+++ b/dll/cpl/input/lang/it-IT.rc
@@ -5,14 +5,18 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Impostazioni"
 FONT 8, "MS Shell Dlg"
 BEGIN
-    LTEXT "Scegliere i servizi desiderati per ognuna delle lingue nella 
lista.\nUsare Aggiungi e Rimuovi per modificare la lista.", -1, 9, 6, 238, 17
-    CONTROL "TEXT", IDC_KEYLAYOUT_LIST, "SYSLISTVIEW32", WS_BORDER | 
WS_VSCROLL | WS_TABSTOP | LVS_SINGLESEL | LVS_NOSORTHEADER | LVS_SHOWSELALWAYS 
| LVS_REPORT, 8, 28, 237, 109
-    PUSHBUTTON "&Predefinito", IDC_SET_DEFAULT, 101, 159, 144, 14
-    PUSHBUTTON "&Aggiungi...", IDC_ADD_BUTTON, 27, 142, 70, 14
-    PUSHBUTTON "&Rimuovi", IDC_REMOVE_BUTTON, 101, 142, 70, 14
-    PUSHBUTTON "&Proprietà...", IDC_PROP_BUTTON, 175, 142, 70, 14
-    GROUPBOX "Preferenze", -1, 7, 185, 240, 36
-    PUSHBUTTON "&Impostazioni tasti...", IDC_KEY_SET_BTN, 14, 198, 110, 14
+    GROUPBOX "Default input &language", -1, 5, 5, 246, 55
+    LTEXT "Select one of the installed input languages to use when your 
computer starts.", -1, 15, 15, 230, 23
+    COMBOBOX IDC_DEFAULT_LANGUAGE, 15, 40, 230, 300, CBS_HASSTRINGS | 
CBS_AUTOHSCROLL | CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    GROUPBOX "&Installed services", -1, 5, 65, 246, 125
+    LTEXT "Scegliere i servizi desiderati per ognuna delle lingue nella lista. 
Usare Aggiungi e Rimuovi per modificare la lista.", -1, 15, 78, 230, 25
+    CONTROL "", IDC_KEYLAYOUT_LIST, "SysTreeView32", TVS_SHOWSELALWAYS | 
TVS_DISABLEDRAGDROP | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 15, 105, 155, 80
+    PUSHBUTTON "&Aggiungi...", IDC_ADD_BUTTON, 175, 105, 70, 14
+    PUSHBUTTON "&Rimuovi", IDC_REMOVE_BUTTON, 175, 125, 70, 14
+    PUSHBUTTON "&Proprietà...", IDC_PROP_BUTTON, 175, 145, 70, 14
+    GROUPBOX "Preferenze", -1, 5, 195, 245, 30
+    PUSHBUTTON "Language &Bar...", IDC_LANGUAGE_BAR, 15, 205, 110, 14
+    PUSHBUTTON "&Impostazioni tasti...", IDC_KEY_SET_BTN, 133, 205, 110, 14
 END
 
 IDD_PROPPAGEADVANCEDSETTINGS DIALOGEX 0, 0, 254, 228
diff --git a/dll/cpl/input/lang/ja-JP.rc b/dll/cpl/input/lang/ja-JP.rc
index be53b949ef0..7fe83d20e85 100644
--- a/dll/cpl/input/lang/ja-JP.rc
+++ b/dll/cpl/input/lang/ja-JP.rc
@@ -5,14 +5,18 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "設定"
 FONT 9, "MS UI Gothic"
 BEGIN
-    LTEXT "リストで示されている各入力言語にご希望のサービスを選択して下さい。\nリストを変更するには、追加または削除ボタンをお使いください。", 
-1, 9, 6, 238, 25
-    CONTROL "TEXT", IDC_KEYLAYOUT_LIST, "SYSLISTVIEW32", WS_BORDER | 
WS_VSCROLL | WS_TABSTOP | LVS_SINGLESEL | LVS_NOSORTHEADER | LVS_SHOWSELALWAYS 
| LVS_REPORT, 8, 36, 237, 101
-    PUSHBUTTON "既定にする(&S)", IDC_SET_DEFAULT, 101, 159, 144, 14
-    PUSHBUTTON "追加(&D)...", IDC_ADD_BUTTON, 27, 142, 70, 14
-    PUSHBUTTON "削除(&R)", IDC_REMOVE_BUTTON, 101, 142, 70, 14
-    PUSHBUTTON "プロパティ(&P)...", IDC_PROP_BUTTON, 175, 142, 70, 14
-    GROUPBOX "プレファレンス", -1, 7, 185, 240, 36
-    PUSHBUTTON "キー設定(&K)...", IDC_KEY_SET_BTN, 14, 198, 110, 14
+    GROUPBOX "デフォルトの入力言語(&L)", -1, 5, 5, 246, 55
+    LTEXT "コンピュータ起動時に使う、インストール済みの入力言語の一つを選択して下さい。", -1, 15, 15, 230, 23
+    COMBOBOX IDC_DEFAULT_LANGUAGE, 15, 40, 230, 300, CBS_HASSTRINGS | 
CBS_AUTOHSCROLL | CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    GROUPBOX "インストール済みのサービス(&I)", -1, 5, 65, 246, 125
+    LTEXT "リストで示されている各入力言語にご希望のサービスを選択して下さい。リストを変更するには、追加または削除ボタンをお使いください。", 
-1, 15, 78, 230, 25
+    CONTROL "", IDC_KEYLAYOUT_LIST, "SysTreeView32", TVS_SHOWSELALWAYS | 
TVS_DISABLEDRAGDROP | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 15, 105, 155, 80
+    PUSHBUTTON "追加(&D)...", IDC_ADD_BUTTON, 175, 105, 70, 14
+    PUSHBUTTON "削除(&R)", IDC_REMOVE_BUTTON, 175, 125, 70, 14
+    PUSHBUTTON "プロパティ(&P)...", IDC_PROP_BUTTON, 175, 145, 70, 14
+    GROUPBOX "詳細設定", -1, 5, 195, 245, 30
+    PUSHBUTTON "言語バー(&B)...", IDC_LANGUAGE_BAR, 15, 205, 110, 14
+    PUSHBUTTON "キー設定(&K)...", IDC_KEY_SET_BTN, 133, 205, 110, 14
 END
 
 IDD_PROPPAGEADVANCEDSETTINGS DIALOGEX 0, 0, 254, 228
diff --git a/dll/cpl/input/lang/no-NO.rc b/dll/cpl/input/lang/no-NO.rc
index 60bdf8f482f..fa996580e08 100644
--- a/dll/cpl/input/lang/no-NO.rc
+++ b/dll/cpl/input/lang/no-NO.rc
@@ -5,14 +5,18 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Innstillinger"
 FONT 8, "MS Shell Dlg"
 BEGIN
-    LTEXT "Velg tjenesten som du vil ha for hver inndataspråk som er vist i 
listen.\nBruk legg til og fjern knappen for å endre denne listen.", -1, 9, 6, 
238, 25
-    CONTROL "TEXT", IDC_KEYLAYOUT_LIST, "SYSLISTVIEW32", WS_BORDER | 
WS_VSCROLL | WS_TABSTOP | LVS_SINGLESEL | LVS_NOSORTHEADER | LVS_SHOWSELALWAYS 
| LVS_REPORT, 8, 36, 237, 101
-    PUSHBUTTON "&Sett Standard", IDC_SET_DEFAULT, 101, 159, 144, 14
-    PUSHBUTTON "Le&gg til...", IDC_ADD_BUTTON, 27, 142, 70, 14
-    PUSHBUTTON "&Fjern", IDC_REMOVE_BUTTON, 101, 142, 70, 14
-    PUSHBUTTON "&Egenskaper...", IDC_PROP_BUTTON, 175, 142, 70, 14
-    GROUPBOX "Innstillinger", -1, 7, 185, 240, 36
-    PUSHBUTTON "&Tasteinnstillinger...", IDC_KEY_SET_BTN, 14, 198, 110, 14
+    GROUPBOX "Default input &language", -1, 5, 5, 246, 55
+    LTEXT "Select one of the installed input languages to use when your 
computer starts.", -1, 15, 15, 230, 23
+    COMBOBOX IDC_DEFAULT_LANGUAGE, 15, 40, 230, 300, CBS_HASSTRINGS | 
CBS_AUTOHSCROLL | CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    GROUPBOX "&Installed services", -1, 5, 65, 246, 125
+    LTEXT "Velg tjenesten som du vil ha for hver inndataspråk som er vist i 
listen. Bruk legg til og fjern knappen for å endre denne listen.", -1, 15, 78, 
230, 25
+    CONTROL "", IDC_KEYLAYOUT_LIST, "SysTreeView32", TVS_SHOWSELALWAYS | 
TVS_DISABLEDRAGDROP | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 15, 105, 155, 80
+    PUSHBUTTON "Le&gg til...", IDC_ADD_BUTTON, 175, 105, 70, 14
+    PUSHBUTTON "&Fjern", IDC_REMOVE_BUTTON, 175, 125, 70, 14
+    PUSHBUTTON "&Egenskaper...", IDC_PROP_BUTTON, 175, 145, 70, 14
+    GROUPBOX "Innstillinger", -1, 5, 195, 245, 30
+    PUSHBUTTON "Language &Bar...", IDC_LANGUAGE_BAR, 15, 205, 110, 14
+    PUSHBUTTON "&Tasteinnstillinger...", IDC_KEY_SET_BTN, 133, 205, 110, 14
 END
 
 IDD_PROPPAGEADVANCEDSETTINGS DIALOGEX 0, 0, 254, 228
diff --git a/dll/cpl/input/lang/pl-PL.rc b/dll/cpl/input/lang/pl-PL.rc
index 93672cc60b1..11603d4c4cb 100644
--- a/dll/cpl/input/lang/pl-PL.rc
+++ b/dll/cpl/input/lang/pl-PL.rc
@@ -13,14 +13,18 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Ustawienia"
 FONT 8, "MS Shell Dlg"
 BEGIN
-    LTEXT "Wybierz usługi dla kadego używanego języka z listy.\nListę można 
modyfikować przyciskami Dodaj i Usuń.", -1, 9, 6, 238, 17
-    CONTROL "TEXT", IDC_KEYLAYOUT_LIST, "SYSLISTVIEW32", WS_BORDER | 
WS_VSCROLL | WS_TABSTOP | LVS_SINGLESEL | LVS_NOSORTHEADER | LVS_SHOWSELALWAYS 
| LVS_REPORT, 8, 28, 237, 109
-    PUSHBUTTON "&Ustaw domyślne", IDC_SET_DEFAULT, 101, 159, 144, 14
-    PUSHBUTTON "&Dodaj...", IDC_ADD_BUTTON, 27, 142, 70, 14
-    PUSHBUTTON "U&suń", IDC_REMOVE_BUTTON, 101, 142, 70, 14
-    PUSHBUTTON "&Właściwości...", IDC_PROP_BUTTON, 175, 142, 70, 14
-    GROUPBOX "Preferencje", -1, 7, 185, 240, 36
-    PUSHBUTTON "Us&tawienia klawiszy...", IDC_KEY_SET_BTN, 14, 198, 110, 14
+    GROUPBOX "Default input &language", -1, 5, 5, 246, 55
+    LTEXT "Select one of the installed input languages to use when your 
computer starts.", -1, 15, 15, 230, 23
+    COMBOBOX IDC_DEFAULT_LANGUAGE, 15, 40, 230, 300, CBS_HASSTRINGS | 
CBS_AUTOHSCROLL | CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    GROUPBOX "&Installed services", -1, 5, 65, 246, 125
+    LTEXT "Wybierz usługi dla kadego używanego języka z listy. Listę można 
modyfikować przyciskami Dodaj i Usuń.", -1, 15, 78, 230, 25
+    CONTROL "", IDC_KEYLAYOUT_LIST, "SysTreeView32", TVS_SHOWSELALWAYS | 
TVS_DISABLEDRAGDROP | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 15, 105, 155, 80
+    PUSHBUTTON "&Dodaj...", IDC_ADD_BUTTON, 175, 105, 70, 14
+    PUSHBUTTON "U&suń", IDC_REMOVE_BUTTON, 175, 125, 70, 14
+    PUSHBUTTON "&Właściwości...", IDC_PROP_BUTTON, 175, 145, 70, 14
+    GROUPBOX "Preferencje", -1, 5, 195, 245, 30
+    PUSHBUTTON "Language &Bar...", IDC_LANGUAGE_BAR, 15, 205, 110, 14
+    PUSHBUTTON "Us&tawienia klawiszy...", IDC_KEY_SET_BTN, 133, 205, 110, 14
 END
 
 IDD_PROPPAGEADVANCEDSETTINGS DIALOGEX 0, 0, 254, 228
diff --git a/dll/cpl/input/lang/pt-BR.rc b/dll/cpl/input/lang/pt-BR.rc
index 855f986998d..af1929f8f9f 100644
--- a/dll/cpl/input/lang/pt-BR.rc
+++ b/dll/cpl/input/lang/pt-BR.rc
@@ -5,14 +5,18 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Configurações"
 FONT 8, "MS Shell Dlg"
 BEGIN
-    LTEXT "Selecione os serviços desejados para cada idioma de entrada 
mostrado na lista. Use os botões 'Adicionar' e 'Remover' para modificar essa 
lista.", -1, 9, 6, 238, 25
-    CONTROL "TEXT", IDC_KEYLAYOUT_LIST, "SYSLISTVIEW32", WS_BORDER | 
WS_VSCROLL | WS_TABSTOP | LVS_SINGLESEL | LVS_NOSORTHEADER | LVS_SHOWSELALWAYS 
| LVS_REPORT, 8, 36, 237, 101
-    PUSHBUTTON "De&finir padrão", IDC_SET_DEFAULT, 101, 159, 144, 14
-    PUSHBUTTON "&Adicionar...", IDC_ADD_BUTTON, 27, 142, 70, 14
-    PUSHBUTTON "&Remover", IDC_REMOVE_BUTTON, 101, 142, 70, 14
-    PUSHBUTTON "&Propriedades...", IDC_PROP_BUTTON, 175, 142, 70, 14
-    GROUPBOX "Preferências", -1, 7, 185, 240, 36
-    PUSHBUTTON "&Configurações de tecla...", IDC_KEY_SET_BTN, 14, 198, 110, 14
+    GROUPBOX "Default input &language", -1, 5, 5, 246, 55
+    LTEXT "Select one of the installed input languages to use when your 
computer starts.", -1, 15, 15, 230, 23
+    COMBOBOX IDC_DEFAULT_LANGUAGE, 15, 40, 230, 300, CBS_HASSTRINGS | 
CBS_AUTOHSCROLL | CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    GROUPBOX "&Installed services", -1, 5, 65, 246, 125
+    LTEXT "Selecione os serviços desejados para cada idioma de entrada 
mostrado na lista. Use os botões 'Adicionar' e 'Remover' para modificar essa 
lista.", -1, 15, 78, 230, 25
+    CONTROL "", IDC_KEYLAYOUT_LIST, "SysTreeView32", TVS_SHOWSELALWAYS | 
TVS_DISABLEDRAGDROP | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 15, 105, 155, 80
+    PUSHBUTTON "&Adicionar...", IDC_ADD_BUTTON, 175, 105, 70, 14
+    PUSHBUTTON "&Remover", IDC_REMOVE_BUTTON, 175, 125, 70, 14
+    PUSHBUTTON "&Propriedades...", IDC_PROP_BUTTON, 175, 145, 70, 14
+    GROUPBOX "Preferências", -1, 5, 195, 245, 30
+    PUSHBUTTON "Language &Bar...", IDC_LANGUAGE_BAR, 15, 205, 110, 14
+    PUSHBUTTON "&Configurações de tecla...", IDC_KEY_SET_BTN, 133, 205, 110, 14
 END
 
 IDD_PROPPAGEADVANCEDSETTINGS DIALOGEX 0, 0, 254, 228
diff --git a/dll/cpl/input/lang/pt-PT.rc b/dll/cpl/input/lang/pt-PT.rc
index 01df2d6d4a6..58c10e99ca0 100644
--- a/dll/cpl/input/lang/pt-PT.rc
+++ b/dll/cpl/input/lang/pt-PT.rc
@@ -5,14 +5,18 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Definições"
 FONT 8, "MS Shell Dlg"
 BEGIN
-    LTEXT "Seleccione os serviços desejados para cada idioma de entrada 
mostrado na lista. Use os botões 'Adicionar' e 'Remover' para modificar a 
lista.", -1, 9, 6, 238, 25
-    CONTROL "TEXT", IDC_KEYLAYOUT_LIST, "SYSLISTVIEW32", WS_BORDER | 
WS_VSCROLL | WS_TABSTOP | LVS_SINGLESEL | LVS_NOSORTHEADER | LVS_SHOWSELALWAYS 
| LVS_REPORT, 8, 36, 237, 101
-    PUSHBUTTON "De&finir padrão", IDC_SET_DEFAULT, 101, 159, 144, 14
-    PUSHBUTTON "&Adicionar...", IDC_ADD_BUTTON, 27, 142, 70, 14
-    PUSHBUTTON "&Remover", IDC_REMOVE_BUTTON, 101, 142, 70, 14
-    PUSHBUTTON "&Propriedades...", IDC_PROP_BUTTON, 175, 142, 70, 14
-    GROUPBOX "Preferências", -1, 7, 185, 240, 36
-    PUSHBUTTON "&Definições de tecla...", IDC_KEY_SET_BTN, 14, 198, 110, 14
+    GROUPBOX "Default input &language", -1, 5, 5, 246, 55
+    LTEXT "Select one of the installed input languages to use when your 
computer starts.", -1, 15, 15, 230, 23
+    COMBOBOX IDC_DEFAULT_LANGUAGE, 15, 40, 230, 300, CBS_HASSTRINGS | 
CBS_AUTOHSCROLL | CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    GROUPBOX "&Installed services", -1, 5, 65, 246, 125
+    LTEXT "Seleccione os serviços desejados para cada idioma de entrada 
mostrado na lista. Use os botões 'Adicionar' e 'Remover' para modificar a 
lista.", -1, 15, 78, 230, 25
+    CONTROL "", IDC_KEYLAYOUT_LIST, "SysTreeView32", TVS_SHOWSELALWAYS | 
TVS_DISABLEDRAGDROP | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 15, 105, 155, 80
+    PUSHBUTTON "&Adicionar...", IDC_ADD_BUTTON, 175, 105, 70, 14
+    PUSHBUTTON "&Remover", IDC_REMOVE_BUTTON, 175, 125, 70, 14
+    PUSHBUTTON "&Propriedades...", IDC_PROP_BUTTON, 175, 145, 70, 14
+    GROUPBOX "Preferências", -1, 5, 195, 245, 30
+    PUSHBUTTON "Language &Bar...", IDC_LANGUAGE_BAR, 15, 205, 110, 14
+    PUSHBUTTON "&Definições de tecla...", IDC_KEY_SET_BTN, 133, 205, 110, 14
 END
 
 IDD_PROPPAGEADVANCEDSETTINGS DIALOGEX 0, 0, 254, 228
diff --git a/dll/cpl/input/lang/ro-RO.rc b/dll/cpl/input/lang/ro-RO.rc
index a280fbdd318..e21a9401a53 100644
--- a/dll/cpl/input/lang/ro-RO.rc
+++ b/dll/cpl/input/lang/ro-RO.rc
@@ -7,14 +7,18 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Configurare"
 FONT 8, "MS Shell Dlg"
 BEGIN
-    LTEXT "Gestionați serviciile aferente limbilor de intrare utilizate în 
sistem. Utilizați butoanele pentru a aduce modificări listei.", -1, 9, 6, 238, 
25
-    CONTROL "TEXT", IDC_KEYLAYOUT_LIST, "SYSLISTVIEW32", WS_BORDER | 
WS_VSCROLL | WS_TABSTOP | LVS_SINGLESEL | LVS_NOSORTHEADER | LVS_SHOWSELALWAYS 
| LVS_REPORT, 8, 36, 237, 101
-    PUSHBUTTON "&Restabilește opțiunile implicite", IDC_SET_DEFAULT, 101, 159, 
144, 14
-    PUSHBUTTON "A&dăugare…", IDC_ADD_BUTTON, 27, 142, 70, 14
-    PUSHBUTTON "&Elimină", IDC_REMOVE_BUTTON, 101, 142, 70, 14
-    PUSHBUTTON "&Proprietăți…", IDC_PROP_BUTTON, 175, 142, 70, 14
-    GROUPBOX "Preferințe", -1, 7, 185, 240, 36
-    PUSHBUTTON "&Combinații de taste…", IDC_KEY_SET_BTN, 14, 198, 110, 14
+    GROUPBOX "Default input &language", -1, 5, 5, 246, 55
+    LTEXT "Select one of the installed input languages to use when your 
computer starts.", -1, 15, 15, 230, 23
+    COMBOBOX IDC_DEFAULT_LANGUAGE, 15, 40, 230, 300, CBS_HASSTRINGS | 
CBS_AUTOHSCROLL | CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    GROUPBOX "&Installed services", -1, 5, 65, 246, 125
+    LTEXT "Gestionați serviciile aferente limbilor de intrare utilizate în 
sistem. Utilizați butoanele pentru a aduce modificări listei.", -1, 15, 78, 
230, 25
+    CONTROL "", IDC_KEYLAYOUT_LIST, "SysTreeView32", TVS_SHOWSELALWAYS | 
TVS_DISABLEDRAGDROP | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 15, 105, 155, 80
+    PUSHBUTTON "A&dăugare…", IDC_ADD_BUTTON, 175, 105, 70, 14
+    PUSHBUTTON "&Elimină", IDC_REMOVE_BUTTON, 175, 125, 70, 14
+    PUSHBUTTON "&Proprietăți…", IDC_PROP_BUTTON, 175, 145, 70, 14
+    GROUPBOX "Preferințe", -1, 5, 195, 245, 30
+    PUSHBUTTON "Language &Bar...", IDC_LANGUAGE_BAR, 15, 205, 110, 14
+    PUSHBUTTON "&Combinații de taste…", IDC_KEY_SET_BTN, 133, 205, 110, 14
 END
 
 IDD_PROPPAGEADVANCEDSETTINGS DIALOGEX 0, 0, 254, 228
diff --git a/dll/cpl/input/lang/ru-RU.rc b/dll/cpl/input/lang/ru-RU.rc
index 2a7bd8646a6..2b45a8cdaa8 100644
--- a/dll/cpl/input/lang/ru-RU.rc
+++ b/dll/cpl/input/lang/ru-RU.rc
@@ -5,14 +5,18 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Параметры"
 FONT 8, "MS Shell Dlg"
 BEGIN
-    LTEXT "Выберите нужные раскладки для каждого языка ввода из списка. Для 
изменения списка служат кнопки ""Добавить"" и ""Удалить"".", -1, 9, 6, 238, 17
-    CONTROL "TEXT", IDC_KEYLAYOUT_LIST, "SYSLISTVIEW32", WS_BORDER | 
WS_VSCROLL | WS_TABSTOP | LVS_SINGLESEL | LVS_NOSORTHEADER | LVS_SHOWSELALWAYS 
| LVS_REPORT, 8, 28, 237, 109
-    PUSHBUTTON "Ус&тановить по умолчанию", IDC_SET_DEFAULT, 101, 159, 144, 14
-    PUSHBUTTON "&Добавить...", IDC_ADD_BUTTON, 27, 142, 70, 14
-    PUSHBUTTON "&Удалить", IDC_REMOVE_BUTTON, 101, 142, 70, 14
-    PUSHBUTTON "&Свойства...", IDC_PROP_BUTTON, 175, 142, 70, 14
-    GROUPBOX "Параметры", -1, 7, 185, 240, 36
-    PUSHBUTTON "&Параметры клавиатуры...", IDC_KEY_SET_BTN, 14, 198, 110, 14
+    GROUPBOX "Default input &language", -1, 5, 5, 246, 55
+    LTEXT "Select one of the installed input languages to use when your 
computer starts.", -1, 15, 15, 230, 23
+    COMBOBOX IDC_DEFAULT_LANGUAGE, 15, 40, 230, 300, CBS_HASSTRINGS | 
CBS_AUTOHSCROLL | CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    GROUPBOX "&Installed services", -1, 5, 65, 246, 125
+    LTEXT "Выберите нужные раскладки для каждого языка ввода из списка. Для 
изменения списка служат кнопки ""Добавить"" и ""Удалить"".", -1, 15, 78, 230, 25
+    CONTROL "", IDC_KEYLAYOUT_LIST, "SysTreeView32", TVS_SHOWSELALWAYS | 
TVS_DISABLEDRAGDROP | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 15, 105, 155, 80
+    PUSHBUTTON "&Добавить...", IDC_ADD_BUTTON, 175, 105, 70, 14
+    PUSHBUTTON "&Удалить", IDC_REMOVE_BUTTON, 175, 125, 70, 14
+    PUSHBUTTON "&Свойства...", IDC_PROP_BUTTON, 175, 145, 70, 14
+    GROUPBOX "Параметры", -1, 5, 195, 245, 30
+    PUSHBUTTON "Language &Bar...", IDC_LANGUAGE_BAR, 15, 205, 110, 14
+    PUSHBUTTON "&Параметры клавиатуры...", IDC_KEY_SET_BTN, 133, 205, 110, 14
 END
 
 IDD_PROPPAGEADVANCEDSETTINGS DIALOGEX 0, 0, 254, 228
diff --git a/dll/cpl/input/lang/sk-SK.rc b/dll/cpl/input/lang/sk-SK.rc
index c0899d3e311..6b93972ee18 100644
--- a/dll/cpl/input/lang/sk-SK.rc
+++ b/dll/cpl/input/lang/sk-SK.rc
@@ -10,14 +10,18 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Nastavenia"
 FONT 8, "MS Shell Dlg"
 BEGIN
-    LTEXT "Vyberte služby, ktoré chcete priradiť ku každému vstupnému jazyku 
uvedenému v zozname.\nPoužite tlačidlá Pridať a Odstrániť k úprave zoznamu.", 
-1, 9, 6, 238, 25
-    CONTROL "TEXT", IDC_KEYLAYOUT_LIST, "SYSLISTVIEW32", WS_BORDER | 
WS_VSCROLL | WS_TABSTOP | LVS_SINGLESEL | LVS_NOSORTHEADER | LVS_SHOWSELALWAYS 
| LVS_REPORT, 8, 36, 237, 101
-    PUSHBUTTON "Pred&voliť", IDC_SET_DEFAULT, 101, 159, 144, 14
-    PUSHBUTTON "&Pridať...", IDC_ADD_BUTTON, 27, 142, 70, 14
-    PUSHBUTTON "O&dstrániť", IDC_REMOVE_BUTTON, 101, 142, 70, 14
-    PUSHBUTTON "Vl&astnosti...", IDC_PROP_BUTTON, 175, 142, 70, 14
-    GROUPBOX "Preferencie", -1, 7, 185, 240, 36
-    PUSHBUTTON "Nastavenie &klávesov...", IDC_KEY_SET_BTN, 14, 198, 110, 14
+    GROUPBOX "Default input &language", -1, 5, 5, 246, 55
+    LTEXT "Select one of the installed input languages to use when your 
computer starts.", -1, 15, 15, 230, 23
+    COMBOBOX IDC_DEFAULT_LANGUAGE, 15, 40, 230, 300, CBS_HASSTRINGS | 
CBS_AUTOHSCROLL | CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    GROUPBOX "&Installed services", -1, 5, 65, 246, 125
+    LTEXT "Vyberte služby, ktoré chcete priradiť ku každému vstupnému jazyku 
uvedenému v zozname. Použite tlačidlá Pridať a Odstrániť k úprave zoznamu.", 
-1, 15, 78, 230, 25
+    CONTROL "", IDC_KEYLAYOUT_LIST, "SysTreeView32", TVS_SHOWSELALWAYS | 
TVS_DISABLEDRAGDROP | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 15, 105, 155, 80
+    PUSHBUTTON "&Pridať...", IDC_ADD_BUTTON, 175, 105, 70, 14
+    PUSHBUTTON "O&dstrániť", IDC_REMOVE_BUTTON, 175, 125, 70, 14
+    PUSHBUTTON "Vl&astnosti...", IDC_PROP_BUTTON, 175, 145, 70, 14
+    GROUPBOX "Preferencie", -1, 5, 195, 245, 30
+    PUSHBUTTON "Language &Bar...", IDC_LANGUAGE_BAR, 15, 205, 110, 14
+    PUSHBUTTON "Nastavenie &klávesov...", IDC_KEY_SET_BTN, 133, 205, 110, 14
 END
 
 IDD_PROPPAGEADVANCEDSETTINGS DIALOGEX 0, 0, 254, 228
diff --git a/dll/cpl/input/lang/sq-AL.rc b/dll/cpl/input/lang/sq-AL.rc
index 5eda787ad32..a2d95b4a527 100644
--- a/dll/cpl/input/lang/sq-AL.rc
+++ b/dll/cpl/input/lang/sq-AL.rc
@@ -9,14 +9,18 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Cilësimet"
 FONT 8, "MS Shell Dlg"
 BEGIN
-    LTEXT "Zgjidhni shërbimet që ju dëshironi për çdo gjuhë të dhënash treguar 
në listë.\nPërdor Shto dhe Hiq butonat për të modifikuar këtë listë.", -1, 9, 
6, 238, 25
-    CONTROL "TEXT", IDC_KEYLAYOUT_LIST, "SYSLISTVIEW32", WS_BORDER | 
WS_VSCROLL | WS_TABSTOP | LVS_SINGLESEL | LVS_NOSORTHEADER | LVS_SHOWSELALWAYS 
| LVS_REPORT, 8, 36, 237, 101
-    PUSHBUTTON "&Vendos Parazgjedhur", IDC_SET_DEFAULT, 101, 159, 144, 14
-    PUSHBUTTON "Sh&to...", IDC_ADD_BUTTON, 27, 142, 70, 14
-    PUSHBUTTON "&Hiq", IDC_REMOVE_BUTTON, 101, 142, 70, 14
-    PUSHBUTTON "&Karakteristikat...", IDC_PROP_BUTTON, 175, 142, 70, 14
-    GROUPBOX "Preferenca", -1, 7, 185, 240, 36
-    PUSHBUTTON "&Çeles cilësimesh...", IDC_KEY_SET_BTN, 14, 198, 110, 14
+    GROUPBOX "Default input &language", -1, 5, 5, 246, 55
+    LTEXT "Select one of the installed input languages to use when your 
computer starts.", -1, 15, 15, 230, 23
+    COMBOBOX IDC_DEFAULT_LANGUAGE, 15, 40, 230, 300, CBS_HASSTRINGS | 
CBS_AUTOHSCROLL | CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    GROUPBOX "&Installed services", -1, 5, 65, 246, 125
+    LTEXT "Zgjidhni shërbimet që ju dëshironi për çdo gjuhë të dhënash treguar 
në listë. Përdor Shto dhe Hiq butonat për të modifikuar këtë listë.", -1, 15, 
78, 230, 25
+    CONTROL "", IDC_KEYLAYOUT_LIST, "SysTreeView32", TVS_SHOWSELALWAYS | 
TVS_DISABLEDRAGDROP | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 15, 105, 155, 80
+    PUSHBUTTON "Sh&to...", IDC_ADD_BUTTON, 175, 105, 70, 14
+    PUSHBUTTON "&Hiq", IDC_REMOVE_BUTTON, 175, 125, 70, 14
+    PUSHBUTTON "&Karakteristikat...", IDC_PROP_BUTTON, 175, 145, 70, 14
+    GROUPBOX "Preferenca", -1, 5, 195, 245, 30
+    PUSHBUTTON "Language &Bar...", IDC_LANGUAGE_BAR, 15, 205, 110, 14
+    PUSHBUTTON "&Çeles cilësimesh...", IDC_KEY_SET_BTN, 133, 205, 110, 14
 END
 
 IDD_PROPPAGEADVANCEDSETTINGS DIALOGEX 0, 0, 254, 228
diff --git a/dll/cpl/input/lang/tr-TR.rc b/dll/cpl/input/lang/tr-TR.rc
index fc7441526ec..fcfab5246f8 100644
--- a/dll/cpl/input/lang/tr-TR.rc
+++ b/dll/cpl/input/lang/tr-TR.rc
@@ -7,14 +7,18 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Ayarlar"
 FONT 8, "MS Shell Dlg"
 BEGIN
-    LTEXT "Listede gösterilen her bir giriş dili için istediğiniz hizmetleri 
seçiniz.\nBu listeyi değiştirmek için Ekle veya Sil tuşlarını kullanınız.", -1, 
9, 6, 238, 25
-    CONTROL "TEXT", IDC_KEYLAYOUT_LIST, "SYSLISTVIEW32", WS_BORDER | 
WS_VSCROLL | WS_TABSTOP | LVS_SINGLESEL | LVS_NOSORTHEADER | LVS_SHOWSELALWAYS 
| LVS_REPORT, 8, 36, 237, 101
-    PUSHBUTTON "Ö&n Tanımlı Yap", IDC_SET_DEFAULT, 101, 159, 144, 14
-    PUSHBUTTON "&Ekle...", IDC_ADD_BUTTON, 27, 142, 70, 14
-    PUSHBUTTON "&Sil", IDC_REMOVE_BUTTON, 101, 142, 70, 14
-    PUSHBUTTON "Ö&zellikler...", IDC_PROP_BUTTON, 175, 142, 70, 14
-    GROUPBOX "Tercihler", -1, 7, 185, 240, 36
-    PUSHBUTTON "&Tuş Ayarları...", IDC_KEY_SET_BTN, 14, 198, 110, 14
+    GROUPBOX "Default input &language", -1, 5, 5, 246, 55
+    LTEXT "Select one of the installed input languages to use when your 
computer starts.", -1, 15, 15, 230, 23
+    COMBOBOX IDC_DEFAULT_LANGUAGE, 15, 40, 230, 300, CBS_HASSTRINGS | 
CBS_AUTOHSCROLL | CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    GROUPBOX "&Installed services", -1, 5, 65, 246, 125
+    LTEXT "Listede gösterilen her bir giriş dili için istediğiniz hizmetleri 
seçiniz. Bu listeyi değiştirmek için Ekle veya Sil tuşlarını kullanınız.", -1, 
15, 78, 230, 25
+    CONTROL "", IDC_KEYLAYOUT_LIST, "SysTreeView32", TVS_SHOWSELALWAYS | 
TVS_DISABLEDRAGDROP | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 15, 105, 155, 80
+    PUSHBUTTON "&Ekle...", IDC_ADD_BUTTON, 175, 105, 70, 14
+    PUSHBUTTON "&Sil", IDC_REMOVE_BUTTON, 175, 125, 70, 14
+    PUSHBUTTON "Ö&zellikler...", IDC_PROP_BUTTON, 175, 145, 70, 14
+    GROUPBOX "Tercihler", -1, 5, 195, 245, 30
+    PUSHBUTTON "Language &Bar...", IDC_LANGUAGE_BAR, 15, 205, 110, 14
+    PUSHBUTTON "&Tuş Ayarları...", IDC_KEY_SET_BTN, 133, 205, 110, 14
 END
 
 IDD_PROPPAGEADVANCEDSETTINGS DIALOGEX 0, 0, 254, 228
diff --git a/dll/cpl/input/lang/uk-UA.rc b/dll/cpl/input/lang/uk-UA.rc
index a341ebaffdb..2d91e093aa6 100644
--- a/dll/cpl/input/lang/uk-UA.rc
+++ b/dll/cpl/input/lang/uk-UA.rc
@@ -13,14 +13,18 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Параметри"
 FONT 8, "MS Shell Dlg"
 BEGIN
-    LTEXT "Виберіть потрібні розкладки для кожної мови введення зі списку. Для 
зміни списку використовуйте кнопки ""Додати"" і ""Видалити"".", -1, 9, 6, 238, 
25
-    CONTROL "TEXT", IDC_KEYLAYOUT_LIST, "SYSLISTVIEW32", WS_BORDER | 
WS_VSCROLL | WS_TABSTOP | LVS_SINGLESEL | LVS_NOSORTHEADER | LVS_SHOWSELALWAYS 
| LVS_REPORT, 8, 36, 237, 101
-    PUSHBUTTON "Встановити за замов&чуванням", IDC_SET_DEFAULT, 101, 159, 144, 
14
-    PUSHBUTTON "&Додати...", IDC_ADD_BUTTON, 27, 142, 70, 14
-    PUSHBUTTON "В&идалити", IDC_REMOVE_BUTTON, 101, 142, 70, 14
-    PUSHBUTTON "В&ластивості...", IDC_PROP_BUTTON, 175, 142, 70, 14
-    GROUPBOX "Налаштування", -1, 7, 185, 240, 36
-    PUSHBUTTON "&Параметри клавіатури...", IDC_KEY_SET_BTN, 14, 198, 110, 14
+    GROUPBOX "Default input &language", -1, 5, 5, 246, 55
+    LTEXT "Select one of the installed input languages to use when your 
computer starts.", -1, 15, 15, 230, 23
+    COMBOBOX IDC_DEFAULT_LANGUAGE, 15, 40, 230, 300, CBS_HASSTRINGS | 
CBS_AUTOHSCROLL | CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    GROUPBOX "&Installed services", -1, 5, 65, 246, 125
+    LTEXT "Виберіть потрібні розкладки для кожної мови введення зі списку. Для 
зміни списку використовуйте кнопки ""Додати"" і ""Видалити"".", -1, 15, 78, 
230, 25
+    CONTROL "", IDC_KEYLAYOUT_LIST, "SysTreeView32", TVS_SHOWSELALWAYS | 
TVS_DISABLEDRAGDROP | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 15, 105, 155, 80
+    PUSHBUTTON "&Додати...", IDC_ADD_BUTTON, 175, 105, 70, 14
+    PUSHBUTTON "В&идалити", IDC_REMOVE_BUTTON, 175, 125, 70, 14
+    PUSHBUTTON "В&ластивості...", IDC_PROP_BUTTON, 175, 145, 70, 14
+    GROUPBOX "Налаштування", -1, 5, 195, 245, 30
+    PUSHBUTTON "Language &Bar...", IDC_LANGUAGE_BAR, 15, 205, 110, 14
+    PUSHBUTTON "&Параметри клавіатури...", IDC_KEY_SET_BTN, 133, 205, 110, 14
 END
 
 IDD_PROPPAGEADVANCEDSETTINGS DIALOGEX 0, 0, 254, 228
diff --git a/dll/cpl/input/lang/zh-CN.rc b/dll/cpl/input/lang/zh-CN.rc
index fbd602efcfd..3a6e20841c4 100644
--- a/dll/cpl/input/lang/zh-CN.rc
+++ b/dll/cpl/input/lang/zh-CN.rc
@@ -7,14 +7,18 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "设置"
 FONT 9, "宋体"
 BEGIN
-    LTEXT "为列表中显示的每个输入语言选择服务。\n使用“添加”和“删除”按钮来修改这个列表。", -1, 9, 6, 238, 25
-    CONTROL "TEXT", IDC_KEYLAYOUT_LIST, "SYSLISTVIEW32", WS_BORDER | 
WS_VSCROLL | WS_TABSTOP | LVS_SINGLESEL | LVS_NOSORTHEADER | LVS_SHOWSELALWAYS 
| LVS_REPORT, 8, 36, 237, 101
-    PUSHBUTTON "设为默认值(&S)", IDC_SET_DEFAULT, 101, 159, 144, 14
-    PUSHBUTTON "添加(&D)...", IDC_ADD_BUTTON, 27, 142, 70, 14
-    PUSHBUTTON "删除(&R)", IDC_REMOVE_BUTTON, 101, 142, 70, 14
-    PUSHBUTTON "属性(&P)...", IDC_PROP_BUTTON, 175, 142, 70, 14
-    GROUPBOX "首选项", -1, 7, 185, 240, 36
-    PUSHBUTTON "键设置(&K)...", IDC_KEY_SET_BTN, 14, 198, 110, 14
+    GROUPBOX "Default input &language", -1, 5, 5, 246, 55
+    LTEXT "Select one of the installed input languages to use when your 
computer starts.", -1, 15, 15, 230, 23
+    COMBOBOX IDC_DEFAULT_LANGUAGE, 15, 40, 230, 300, CBS_HASSTRINGS | 
CBS_AUTOHSCROLL | CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    GROUPBOX "&Installed services", -1, 5, 65, 246, 125
+    LTEXT "为列表中显示的每个输入语言选择服务。使用“添加”和“删除”按钮来修改这个列表。", -1, 15, 78, 230, 25
+    CONTROL "", IDC_KEYLAYOUT_LIST, "SysTreeView32", TVS_SHOWSELALWAYS | 
TVS_DISABLEDRAGDROP | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 15, 105, 155, 80
+    PUSHBUTTON "添加(&D)...", IDC_ADD_BUTTON, 175, 105, 70, 14
+    PUSHBUTTON "删除(&R)", IDC_REMOVE_BUTTON, 175, 125, 70, 14
+    PUSHBUTTON "属性(&P)...", IDC_PROP_BUTTON, 175, 145, 70, 14
+    GROUPBOX "首选项", -1, 5, 195, 245, 30
+    PUSHBUTTON "Language &Bar...", IDC_LANGUAGE_BAR, 15, 205, 110, 14
+    PUSHBUTTON "键设置(&K)...", IDC_KEY_SET_BTN, 133, 205, 110, 14
 END
 
 IDD_PROPPAGEADVANCEDSETTINGS DIALOGEX 0, 0, 254, 228
diff --git a/dll/cpl/input/lang/zh-HK.rc b/dll/cpl/input/lang/zh-HK.rc
index 79f635bfc88..9430e0ff36e 100644
--- a/dll/cpl/input/lang/zh-HK.rc
+++ b/dll/cpl/input/lang/zh-HK.rc
@@ -13,14 +13,18 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "設定"
 FONT 9, "新細明體"
 BEGIN
-    LTEXT "為列表中顯示的每個輸入語言選擇服務。\n請按[新增]和[刪除]按鈕來修改這個列表。", -1, 9, 6, 238, 25
-    CONTROL "TEXT", IDC_KEYLAYOUT_LIST, "SYSLISTVIEW32", WS_BORDER | 
WS_VSCROLL | WS_TABSTOP | LVS_SINGLESEL | LVS_NOSORTHEADER | LVS_SHOWSELALWAYS 
| LVS_REPORT, 8, 36, 237, 101
-    PUSHBUTTON "設為預設值(&S)", IDC_SET_DEFAULT, 101, 159, 144, 14
-    PUSHBUTTON "新增(&D)...", IDC_ADD_BUTTON, 27, 142, 70, 14
-    PUSHBUTTON "刪除(&R)", IDC_REMOVE_BUTTON, 101, 142, 70, 14
-    PUSHBUTTON "內容(&P)...", IDC_PROP_BUTTON, 175, 142, 70, 14
-    GROUPBOX "偏好設定", -1, 7, 185, 240, 36
-    PUSHBUTTON "按鍵設定(&K)...", IDC_KEY_SET_BTN, 14, 198, 110, 14
+    GROUPBOX "Default input &language", -1, 5, 5, 246, 55
+    LTEXT "Select one of the installed input languages to use when your 
computer starts.", -1, 15, 15, 230, 23
+    COMBOBOX IDC_DEFAULT_LANGUAGE, 15, 40, 230, 300, CBS_HASSTRINGS | 
CBS_AUTOHSCROLL | CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    GROUPBOX "&Installed services", -1, 5, 65, 246, 125
+    LTEXT "為列表中顯示的每個輸入語言選擇服務。請按[新增]和[刪除]按鈕來修改這個列表。", -1, 15, 78, 230, 25
+    CONTROL "", IDC_KEYLAYOUT_LIST, "SysTreeView32", TVS_SHOWSELALWAYS | 
TVS_DISABLEDRAGDROP | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 15, 105, 155, 80
+    PUSHBUTTON "新增(&D)...", IDC_ADD_BUTTON, 175, 105, 70, 14
+    PUSHBUTTON "刪除(&R)", IDC_REMOVE_BUTTON, 175, 125, 70, 14
+    PUSHBUTTON "內容(&P)...", IDC_PROP_BUTTON, 175, 145, 70, 14
+    GROUPBOX "偏好設定", -1, 5, 195, 245, 30
+    PUSHBUTTON "Language &Bar...", IDC_LANGUAGE_BAR, 15, 205, 110, 14
+    PUSHBUTTON "按鍵設定(&K)...", IDC_KEY_SET_BTN, 133, 205, 110, 14
 END
 
 IDD_PROPPAGEADVANCEDSETTINGS DIALOGEX 0, 0, 254, 228
diff --git a/dll/cpl/input/lang/zh-TW.rc b/dll/cpl/input/lang/zh-TW.rc
index b5902c9b4df..e7ddb4a0ce0 100644
--- a/dll/cpl/input/lang/zh-TW.rc
+++ b/dll/cpl/input/lang/zh-TW.rc
@@ -13,14 +13,18 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "設定"
 FONT 9, "新細明體"
 BEGIN
-    LTEXT "為列表中顯示的每個輸入語言選擇服務。\n請按[新增]和[刪除]按鈕來修改這個列表。", -1, 9, 6, 238, 25
-    CONTROL "TEXT", IDC_KEYLAYOUT_LIST, "SYSLISTVIEW32", WS_BORDER | 
WS_VSCROLL | WS_TABSTOP | LVS_SINGLESEL | LVS_NOSORTHEADER | LVS_SHOWSELALWAYS 
| LVS_REPORT, 8, 36, 237, 101
-    PUSHBUTTON "設為預設值(&S)", IDC_SET_DEFAULT, 101, 159, 144, 14
-    PUSHBUTTON "新增(&D)...", IDC_ADD_BUTTON, 27, 142, 70, 14
-    PUSHBUTTON "刪除(&R)", IDC_REMOVE_BUTTON, 101, 142, 70, 14
-    PUSHBUTTON "內容(&P)...", IDC_PROP_BUTTON, 175, 142, 70, 14
-    GROUPBOX "偏好設定", -1, 7, 185, 240, 36
-    PUSHBUTTON "按鍵設定(&K)...", IDC_KEY_SET_BTN, 14, 198, 110, 14
+    GROUPBOX "Default input &language", -1, 5, 5, 246, 55
+    LTEXT "Select one of the installed input languages to use when your 
computer starts.", -1, 15, 15, 230, 23
+    COMBOBOX IDC_DEFAULT_LANGUAGE, 15, 40, 230, 300, CBS_HASSTRINGS | 
CBS_AUTOHSCROLL | CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    GROUPBOX "&Installed services", -1, 5, 65, 246, 125
+    LTEXT "為列表中顯示的每個輸入語言選擇服務。請按[新增]和[刪除]按鈕來修改這個列表。", -1, 15, 78, 230, 25
+    CONTROL "", IDC_KEYLAYOUT_LIST, "SysTreeView32", TVS_SHOWSELALWAYS | 
TVS_DISABLEDRAGDROP | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 15, 105, 155, 80
+    PUSHBUTTON "新增(&D)...", IDC_ADD_BUTTON, 175, 105, 70, 14
+    PUSHBUTTON "刪除(&R)", IDC_REMOVE_BUTTON, 175, 125, 70, 14
+    PUSHBUTTON "內容(&P)...", IDC_PROP_BUTTON, 175, 145, 70, 14
+    GROUPBOX "偏好設定", -1, 5, 195, 245, 30
+    PUSHBUTTON "Language &Bar...", IDC_LANGUAGE_BAR, 15, 205, 110, 14
+    PUSHBUTTON "按鍵設定(&K)...", IDC_KEY_SET_BTN, 133, 205, 110, 14
 END
 
 IDD_PROPPAGEADVANCEDSETTINGS DIALOGEX 0, 0, 254, 228
diff --git a/dll/cpl/input/resource.h b/dll/cpl/input/resource.h
index 7a76196151b..31a2083f235 100644
--- a/dll/cpl/input/resource.h
+++ b/dll/cpl/input/resource.h
@@ -6,6 +6,8 @@
 #define IDI_MIC_ICO       203
 #define IDI_INFO_ICO      207
 #define IDI_CPLSYSTEM     1502
+#define IDI_KEYBOARD      1503
+#define IDI_DOT           1504
 
 /* IDD */
 #define IDD_PROPPAGESETTINGS         500
@@ -17,7 +19,7 @@
 
 /* IDC */
 #define IDC_KEYLAYOUT_LIST       1000
-#define IDC_SET_DEFAULT          1001
+#define IDC_DEFAULT_LANGUAGE     1001
 #define IDC_ADD_BUTTON           1002
 #define IDC_REMOVE_BUTTON        1003
 #define IDC_PROP_BUTTON          1004
@@ -37,6 +39,7 @@
 #define IDC_CTRL_LAYOUT          1018
 #define IDC_LEFT_ALT_LANG        1019
 #define IDC_LEFT_ALT_LAYOUT      1020
+#define IDC_LANGUAGE_BAR         1021
 
 /* IDS */
 #define IDS_CPLSYSTEMNAME        1
diff --git a/dll/cpl/input/resources/dot.ico b/dll/cpl/input/resources/dot.ico
new file mode 100644
index 00000000000..2ae06af2d03
Binary files /dev/null and b/dll/cpl/input/resources/dot.ico differ
diff --git a/dll/cpl/input/resources/keyboard.ico 
b/dll/cpl/input/resources/keyboard.ico
new file mode 100644
index 00000000000..ad016fdc47b
Binary files /dev/null and b/dll/cpl/input/resources/keyboard.ico differ
diff --git a/dll/cpl/input/settings_page.c b/dll/cpl/input/settings_page.c
index 86ff2162f66..c49e25d9b29 100644
--- a/dll/cpl/input/settings_page.c
+++ b/dll/cpl/input/settings_page.c
@@ -11,178 +11,360 @@
 #include "locale_list.h"
 #include "input_list.h"
 
+static INT s_nAliveLeafCount = 0;
+static INT s_nRootCount = 0;
+static INT s_iKeyboardImage = -1;
+static INT s_iDotImage = -1;
+static BOOL s_bDefaultInputChanged = FALSE;
+
 static HICON
-CreateLayoutIcon(LPWSTR szLayout, BOOL bIsDefault)
+CreateLayoutIcon(LANGID LangID)
 {
-    INT width = GetSystemMetrics(SM_CXSMICON) * 2;
-    INT height = GetSystemMetrics(SM_CYSMICON);
+    WCHAR szBuf[4];
     HDC hdc;
-    HDC hdcsrc;
-    HBITMAP hBitmap;
-    HICON hIcon = NULL;
-
-    hdcsrc = GetDC(NULL);
-    hdc = CreateCompatibleDC(hdcsrc);
-    hBitmap = CreateCompatibleBitmap(hdcsrc, width, height);
-
-    ReleaseDC(NULL, hdcsrc);
-
-    if (hdc && hBitmap)
+    HBITMAP hbmColor, hbmMono, hBmpOld;
+    RECT rect;
+    HFONT hFontOld, hFont;
+    ICONINFO IconInfo;
+    HICON hIcon;
+    LOGFONTW lf;
+    BITMAPINFO bmi;
+    INT cxIcon = GetSystemMetrics(SM_CXSMICON);
+    INT cyIcon = GetSystemMetrics(SM_CYSMICON);
+
+    /* Getting "EN", "FR", etc. from English, French, ... */
+    if (!GetLocaleInfoW(LangID, LOCALE_SABBREVLANGNAME | LOCALE_NOUSEROVERRIDE,
+                        szBuf, ARRAYSIZE(szBuf)))
     {
-        HBITMAP hBmpNew;
-
-        hBmpNew = CreateBitmap(width, height, 1, 1, NULL);
-        if (hBmpNew)
-        {
-            LOGFONTW lf;
+        StringCchCopyW(szBuf, ARRAYSIZE(szBuf), L"??");
+    }
+    szBuf[2] = UNICODE_NULL; /* Truncate the identifier to two characters: 
"ENG" --> "EN" etc. */
+
+    /* Prepare for DIB (device-independent bitmap) */
+    ZeroMemory(&bmi, sizeof(bmi));
+    bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader);
+    bmi.bmiHeader.biWidth = cxIcon;
+    bmi.bmiHeader.biHeight = cyIcon;
+    bmi.bmiHeader.biPlanes = 1;
+    bmi.bmiHeader.biBitCount = 24;
+
+    /* Create hdc, hbmColor and hbmMono */
+    hdc = CreateCompatibleDC(NULL);
+    hbmColor = CreateDIBSection(hdc, &bmi, DIB_RGB_COLORS, NULL, NULL, 0);
+    hbmMono = CreateBitmap(cxIcon, cyIcon, 1, 1, NULL);
+
+    /* Create a font */
+    if (SystemParametersInfoW(SPI_GETICONTITLELOGFONT, sizeof(lf), &lf, 0))
+        hFont = CreateFontIndirectW(&lf);
+    else
+        hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
+
+    /* Checking NULL */
+    if (!hdc || !hbmColor || !hbmMono || !hFont)
+    {
+        if (hdc)
+            DeleteDC(hdc);
+        if (hbmColor)
+            DeleteObject(hbmColor);
+        if (hbmMono)
+            DeleteObject(hbmMono);
+        if (hFont)
+            DeleteObject(hFont);
+        return NULL;
+    }
 
-            if (SystemParametersInfoW(SPI_GETICONTITLELOGFONT, sizeof(lf), 
&lf, 0))
-            {
-                ICONINFO IconInfo;
-                HFONT hFont;
+    SetRect(&rect, 0, 0, cxIcon, cyIcon);
+
+    /* Draw hbmColor */
+    hBmpOld = SelectObject(hdc, hbmColor);
+    SetDCBrushColor(hdc, GetSysColor(COLOR_HIGHLIGHT));
+    FillRect(hdc, &rect, (HBRUSH)GetStockObject(DC_BRUSH));
+    hFontOld = SelectObject(hdc, hFont);
+    SetTextColor(hdc, GetSysColor(COLOR_HIGHLIGHTTEXT));
+    SetBkMode(hdc, TRANSPARENT);
+    DrawTextW(hdc, szBuf, 2, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
+    SelectObject(hdc, hFontOld);
+    SelectObject(hdc, hBmpOld);
+
+    /* Fill hbmMono by black */
+    hBmpOld = SelectObject(hdc, hbmMono);
+    PatBlt(hdc, 0, 0, cxIcon, cyIcon, BLACKNESS);
+    SelectObject(hdc, hBmpOld);
+
+    /* Create an icon from hbmColor and hbmMono */
+    IconInfo.hbmColor = hbmColor;
+    IconInfo.hbmMask = hbmMono;
+    IconInfo.fIcon = TRUE;
+    hIcon = CreateIconIndirect(&IconInfo);
+
+    /* Clean up */
+    DeleteObject(hbmColor);
+    DeleteObject(hbmMono);
+    DeleteObject(hFont);
+    DeleteDC(hdc);
 
-                hFont = CreateFontIndirectW(&lf);
+    return hIcon;
+}
 
-                if (hFont != NULL)
-                {
-                    HBITMAP hBmpOld;
+static VOID InitDefaultLangComboBox(HWND hwndCombo)
+{
+    WCHAR szText[256];
+    INPUT_LIST_NODE *pNode;
+    INT iIndex, nCount, iDefault = (INT)SendMessageW(hwndCombo, CB_GETCURSEL, 
0, 0);
 
-                    hBmpOld = SelectObject(hdc, hBitmap);
+    SendMessageW(hwndCombo, CB_RESETCONTENT, 0, 0);
 
-                    if (hBmpOld != NULL)
-                    {
-                        RECT rect;
+    for (pNode = InputList_GetFirst(); pNode != NULL; pNode = pNode->pNext)
+    {
+        if (pNode->wFlags & INPUT_LIST_NODE_FLAG_DELETED)
+            continue;
 
-                        SetRect(&rect, 0, 0, width / 2, height);
+        StringCchPrintfW(szText, _countof(szText), L"%s - %s",
+                         pNode->pLocale->pszName, pNode->pLayout->pszName);
+        iIndex = (INT)SendMessageW(hwndCombo, CB_ADDSTRING, 0, (LPARAM)szText);
+        SendMessageW(hwndCombo, CB_SETITEMDATA, iIndex, (LPARAM)pNode);
 
-                        if (bIsDefault != FALSE)
-                        {
-                            SetBkColor(hdc, GetSysColor(COLOR_WINDOW));
-                            SetTextColor(hdc, GetSysColor(COLOR_WINDOWTEXT));
+        if (pNode->wFlags & INPUT_LIST_NODE_FLAG_DEFAULT)
+            iDefault = iIndex;
+    }
 
-                            ExtTextOutW(hdc, rect.left, rect.top, ETO_OPAQUE, 
&rect, L"", 0, NULL);
+    nCount = (INT)SendMessageW(hwndCombo, CB_GETCOUNT, 0, 0);
+    if (iDefault >= nCount)
+        SendMessageW(hwndCombo, CB_SETCURSEL, nCount - 1, 0);
+    else
+        SendMessageW(hwndCombo, CB_SETCURSEL, iDefault, 0);
+}
 
-                            SelectObject(hdc, hFont);
-                            DrawFrameControl(hdc, &rect, DFC_MENU, 
DFCS_MENUBULLET);
-                        }
-                        else
-                        {
-                            FillRect(hdc, &rect, 
GetSysColorBrush(COLOR_WINDOW));
-                        }
+static VOID
+SetControlsState(HWND hwndDlg)
+{
+    HWND hwndList = GetDlgItem(hwndDlg, IDC_KEYLAYOUT_LIST);
+    HWND hwndCombo = GetDlgItem(hwndDlg, IDC_DEFAULT_LANGUAGE);
+    BOOL bIsLeaf, bCanRemove, bCanProp;
+    HTREEITEM hSelected = TreeView_GetSelection(hwndList);
+    TV_ITEM item = { TVIF_PARAM | TVIF_HANDLE };
+    item.hItem = hSelected;
 
-                        SetRect(&rect, width / 2, 0, width, height);
+    bIsLeaf = (hSelected && TreeView_GetItem(hwndList, &item) && 
HIWORD(item.lParam));
 
-                        SetBkColor(hdc, GetSysColor(COLOR_HIGHLIGHT));
-                        SetTextColor(hdc, GetSysColor(COLOR_HIGHLIGHTTEXT));
+    bCanRemove = (bIsLeaf && (s_nAliveLeafCount > 1)) || (s_nRootCount > 1);
+    bCanProp = bIsLeaf;
 
-                        ExtTextOutW(hdc, rect.left, rect.top, ETO_OPAQUE, 
&rect, L"", 0, NULL);
+    EnableWindow(GetDlgItem(hwndDlg, IDC_REMOVE_BUTTON), bCanRemove);
+    EnableWindow(GetDlgItem(hwndDlg, IDC_PROP_BUTTON), bCanProp);
 
-                        SelectObject(hdc, hFont);
-                        DrawTextW(hdc, szLayout, 2, &rect, DT_SINGLELINE | 
DT_CENTER | DT_VCENTER);
+    InitDefaultLangComboBox(hwndCombo);
+}
 
-                        SelectObject(hdc, hBmpNew);
+static BOOL CALLBACK
+EnumResNameProc(HMODULE hModule, LPCWSTR lpszType, LPWSTR lpszName, LONG_PTR 
lParam)
+{
+    HICON* phIconSm = (HICON*)lParam;
+    if (*phIconSm)
+        return FALSE;
+
+    *phIconSm = (HICON)LoadImageW(hModule, lpszName, IMAGE_ICON,
+                                  GetSystemMetrics(SM_CXSMICON),
+                                  GetSystemMetrics(SM_CYSMICON),
+                                  0);
+    return TRUE;
+}
 
-                        PatBlt(hdc, 0, 0, width, height, BLACKNESS);
+static HICON LoadIMEIcon(LPCTSTR pszImeFile)
+{
+    WCHAR szSysDir[MAX_PATH], szPath[MAX_PATH];
+    HINSTANCE hImeInst;
+    HICON hIconSm = NULL;
 
-                        SelectObject(hdc, hBmpOld);
+    GetSystemDirectoryW(szSysDir, _countof(szSysDir));
+    StringCchPrintfW(szPath, _countof(szPath), L"%s\\%s", szSysDir, 
pszImeFile);
 
-                        IconInfo.hbmColor = hBitmap;
-                        IconInfo.hbmMask = hBmpNew;
-                        IconInfo.fIcon = TRUE;
+    hImeInst = LoadLibraryExW(szPath, NULL, DONT_RESOLVE_DLL_REFERENCES);
+    if (hImeInst == NULL)
+        return NULL;
 
-                        hIcon = CreateIconIndirect(&IconInfo);
+    EnumResourceNamesW(hImeInst, RT_GROUP_ICON, EnumResNameProc, 
(LPARAM)&hIconSm);
+    FreeLibrary(hImeInst);
 
-                        DeleteObject(hBmpOld);
-                    }
+    return hIconSm;
+}
 
-                    DeleteObject(hFont);
-                }
-            }
+static HTREEITEM FindLanguageInList(HWND hwndList, LPCTSTR pszLangName)
+{
+    TV_ITEM item;
+    TCHAR szText[128];
+    HTREEITEM hItem;
 
-            DeleteObject(hBmpNew);
-        }
+    hItem = TreeView_GetRoot(hwndList);
+    while (hItem)
+    {
+        szText[0] = 0;
+        item.mask       = TVIF_TEXT | TVIF_HANDLE;
+        item.pszText    = szText;
+        item.cchTextMax = _countof(szText);
+        item.hItem      = hItem;
+        TreeView_GetItem(hwndList, &item);
+        if (_wcsicmp(szText, pszLangName) == 0)
+            return hItem;
+
+        hItem = TreeView_GetNextSibling(hwndList, hItem);
     }
 
-    DeleteDC(hdc);
-    DeleteObject(hBitmap);
-
-    return hIcon;
+    return NULL;
 }
 
-
 static VOID
-SetControlsState(HWND hwndDlg)
+AddToInputListView(HWND hwndList, INPUT_LIST_NODE *pInputNode)
 {
-    HWND hwndList = GetDlgItem(hwndDlg, IDC_KEYLAYOUT_LIST);
-    INT iSelected = ListView_GetNextItem(hwndList, -1, LVNI_SELECTED);
-    INT nCount = ListView_GetItemCount(hwndList);
-    BOOL bCanRemove = (iSelected != -1) && (nCount >= 2);
-    BOOL bCanDefault = (iSelected != -1) && (nCount >= 2);
-    BOOL bCanProp = (iSelected != -1);
-
-    LV_ITEM item = { LVIF_PARAM, iSelected };
-    if (ListView_GetItem(hwndList, &item))
+    TV_ITEM item;
+    TV_INSERTSTRUCT insert;
+    HIMAGELIST hImageList = TreeView_GetImageList(hwndList, TVSIL_NORMAL);
+    WCHAR szKeyboard[64];
+    HTREEITEM hItem;
+    BOOL bBold = !!(pInputNode->wFlags & INPUT_LIST_NODE_FLAG_DEFAULT);
+
+    hItem = FindLanguageInList(hwndList, pInputNode->pLocale->pszName);
+    if (hItem == NULL)
     {
-        INPUT_LIST_NODE *pInput = (INPUT_LIST_NODE*)item.lParam;
+        // Language icon
+        INT LangImageIndex = -1;
+        HICON hLangIcon = CreateLayoutIcon(LOWORD(pInputNode->pLocale->dwId));
+        if (hLangIcon)
+        {
+            LangImageIndex = ImageList_AddIcon(hImageList, hLangIcon);
+            DestroyIcon(hLangIcon);
+        }
 
-        if (pInput && (pInput->wFlags & INPUT_LIST_NODE_FLAG_DEFAULT))
+        // Language
+        ZeroMemory(&item, sizeof(item));
+        item.mask           = TVIF_TEXT | TVIF_IMAGE | TVIF_PARAM | 
TVIF_SELECTEDIMAGE | TVIF_STATE;
+        item.pszText        = pInputNode->pLocale->pszName;
+        item.iImage         = LangImageIndex;
+        item.iSelectedImage = LangImageIndex;
+        item.lParam         = LOWORD(pInputNode->pLocale->dwId); // 
HIWORD(item.lParam) == 0
+        if (bBold)
         {
-            bCanDefault = FALSE;
+            item.state = item.stateMask = TVIS_BOLD;
         }
+        insert.hParent      = TVI_ROOT;
+        insert.hInsertAfter = TVI_LAST;
+        insert.item         = item;
+        hItem = TreeView_InsertItem(hwndList, &insert);
+
+        // The type of input method (currently keyboard only)
+        LoadStringW(hApplet, IDS_KEYBOARD, szKeyboard, _countof(szKeyboard));
+        ZeroMemory(&item, sizeof(item));
+        item.mask           = TVIF_TEXT | TVIF_IMAGE | TVIF_PARAM | 
TVIF_SELECTEDIMAGE;
+        item.pszText        = szKeyboard;
+        item.iImage         = s_iKeyboardImage;
+        item.iSelectedImage = s_iKeyboardImage;
+        item.lParam         = 0;  // HIWORD(item.lParam) == 0
+        insert.hParent      = hItem;
+        insert.hInsertAfter = TVI_LAST;
+        insert.item         = item;
+        hItem = TreeView_InsertItem(hwndList, &insert);
     }
+    else
+    {
+        // Language
+        ZeroMemory(&item, sizeof(item));
+        item.mask           = TVIF_STATE | TVIF_HANDLE;
+        item.hItem          = hItem;
+        item.stateMask      = TVIS_BOLD;
+        if (TreeView_GetItem(hwndList, &item) && bBold && !(item.state & 
TVIS_BOLD))
+        {
+            // Make the item bold
+            item.mask = TVIF_STATE | TVIF_HANDLE;
+            item.hItem = hItem;
+            item.state = item.stateMask = TVIS_BOLD;
+            TreeView_SetItem(hwndList, &item);
+        }
 
-    EnableWindow(GetDlgItem(hwndDlg, IDC_REMOVE_BUTTON), bCanRemove);
-    EnableWindow(GetDlgItem(hwndDlg, IDC_PROP_BUTTON), bCanProp);
-    EnableWindow(GetDlgItem(hwndDlg, IDC_SET_DEFAULT), bCanDefault);
-}
-
-static VOID
-AddToInputListView(HWND hwndList, INPUT_LIST_NODE *pInputNode)
-{
-    INT ItemIndex, ImageIndex = -1;
-    LV_ITEM item;
-    HIMAGELIST hImageList = ListView_GetImageList(hwndList, LVSIL_SMALL);
+        // The type of input method (currently keyboard only)
+        hItem = TreeView_GetChild(hwndList, hItem);
+    }
 
-    if (hImageList != NULL)
+    // Input method
+    if (hItem)
     {
-        HICON hLayoutIcon;
+        INT ImeImageIndex = s_iDotImage;
+        if (IS_IME_HKL(pInputNode->hkl) && pInputNode->pLayout->pszImeFile) // 
IME?
+        {
+            HICON hImeIcon = LoadIMEIcon(pInputNode->pLayout->pszImeFile);
+            if (hImeIcon)
+            {
+                ImeImageIndex = ImageList_AddIcon(hImageList, hImeIcon);
+                DestroyIcon(hImeIcon);
+            }
+        }
 
-        hLayoutIcon = CreateLayoutIcon(pInputNode->pszIndicator,
-                                       (pInputNode->wFlags & 
INPUT_LIST_NODE_FLAG_DEFAULT));
-        if (hLayoutIcon != NULL)
+        ZeroMemory(&item, sizeof(item));
+        item.mask           = TVIF_TEXT | TVIF_IMAGE | TVIF_PARAM | 
TVIF_SELECTEDIMAGE | TVIF_STATE;
+        item.pszText        = pInputNode->pLayout->pszName;
+        item.iImage         = ImeImageIndex;
+        item.iSelectedImage = ImeImageIndex;
+        item.lParam         = (LPARAM)pInputNode; // HIWORD(item.lParam) != 0
+        if (bBold)
         {
-            ImageIndex = ImageList_AddIcon(hImageList, hLayoutIcon);
-            DestroyIcon(hLayoutIcon);
+            item.state = item.stateMask = TVIS_BOLD; // Make the item bold
         }
+        insert.hParent      = hItem;
+        insert.hInsertAfter = TVI_LAST;
+        insert.item         = item;
+        hItem = TreeView_InsertItem(hwndList, &insert);
     }
-
-    ZeroMemory(&item, sizeof(item));
-    item.mask    = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE;
-    item.pszText = pInputNode->pLocale->pszName;
-    item.iItem   = ListView_GetItemCount(hwndList);
-    item.lParam  = (LPARAM)pInputNode;
-    item.iImage  = ImageIndex;
-    ItemIndex = ListView_InsertItem(hwndList, &item);
-
-    ListView_SetItemText(hwndList, ItemIndex, 1, pInputNode->pLayout->pszName);
 }
 
+static VOID ExpandTreeItem(HWND hwndTree, HTREEITEM hItem)
+{
+    TreeView_Expand(hwndTree, hItem, TVE_EXPAND);
+    hItem = TreeView_GetChild(hwndTree, hItem);
+    while (hItem)
+    {
+        ExpandTreeItem(hwndTree, hItem);
+        hItem = TreeView_GetNextSibling(hwndTree, hItem);
+    }
+}
 
 static VOID
 UpdateInputListView(HWND hwndList)
 {
     INPUT_LIST_NODE *pNode;
-    HIMAGELIST hImageList = ListView_GetImageList(hwndList, LVSIL_SMALL);
-    INT iSelected = ListView_GetNextItem(hwndList, -1, LVNI_SELECTED);
+    HIMAGELIST hImageList = TreeView_GetImageList(hwndList, TVSIL_NORMAL);
+    HTREEITEM hItem;
+    HICON hKeyboardIcon, hDotIcon;
+
+    ImageList_RemoveAll(hImageList);
+    TreeView_DeleteAllItems(hwndList);
+
+    // Add keyboard icon
+    s_iKeyboardImage = -1;
+    hKeyboardIcon = (HICON)LoadImageW(hApplet, MAKEINTRESOURCEW(IDI_KEYBOARD), 
IMAGE_ICON,
+                                      GetSystemMetrics(SM_CXSMICON), 
GetSystemMetrics(SM_CYSMICON),
+                                      0);
+    if (hKeyboardIcon)
+    {
+        s_iKeyboardImage = ImageList_AddIcon(hImageList, hKeyboardIcon);
+        DestroyIcon(hKeyboardIcon);
+    }
 
-    if (hImageList)
+    // Add dot icon
+    s_iDotImage = -1;
+    hDotIcon = (HICON)LoadImageW(hApplet, MAKEINTRESOURCEW(IDI_DOT), 
IMAGE_ICON,
+                                 GetSystemMetrics(SM_CXSMICON), 
GetSystemMetrics(SM_CYSMICON),
+                                 0);
+    if (hDotIcon)
     {
-        ImageList_RemoveAll(hImageList);
+        s_iDotImage = ImageList_AddIcon(hImageList, hDotIcon);
+        DestroyIcon(hDotIcon);
     }
 
-    ListView_DeleteAllItems(hwndList);
+    InputList_Sort();
 
-    for (pNode = InputList_GetFirst(); pNode != NULL; pNode = pNode->pNext)
+    s_nAliveLeafCount = InputList_GetAliveCount();
+
+    // Add items to the list
+    for (pNode = InputList_GetFirst(); pNode; pNode = pNode->pNext)
     {
         if (pNode->wFlags & INPUT_LIST_NODE_FLAG_DELETED)
             continue;
@@ -190,62 +372,43 @@ UpdateInputListView(HWND hwndList)
         AddToInputListView(hwndList, pNode);
     }
 
-    if (iSelected != -1)
+    // Expand all (with counting s_nRootCount)
+    s_nRootCount = 0;
+    hItem = TreeView_GetRoot(hwndList);
+    while (hItem)
     {
-        INT nCount = ListView_GetItemCount(hwndList);
-        LV_ITEM item = { LVIF_STATE };
-        item.state = item.stateMask = LVIS_SELECTED;
-        item.iItem = ((nCount == iSelected) ? nCount - 1 : iSelected);
-        ListView_SetItem(hwndList, &item);
+        ++s_nRootCount;
+        ExpandTreeItem(hwndList, hItem);
+        hItem = TreeView_GetNextSibling(hwndList, hItem);
     }
 
+    // Redraw
     InvalidateRect(hwndList, NULL, TRUE);
 }
 
-
 static VOID
 OnInitSettingsPage(HWND hwndDlg)
 {
     HWND hwndInputList = GetDlgItem(hwndDlg, IDC_KEYLAYOUT_LIST);
+    HIMAGELIST hLayoutImageList, hOldImageList;
 
     LayoutList_Create();
     LocaleList_Create();
     InputList_Create();
 
-    if (hwndInputList != NULL)
-    {
-        WCHAR szBuffer[MAX_STR_LEN];
-        HIMAGELIST hLayoutImageList;
-        LV_COLUMN column = { LVCF_FMT | LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM 
};
-
-        ListView_SetExtendedListViewStyle(hwndInputList, LVS_EX_FULLROWSELECT);
-
-        LoadStringW(hApplet, IDS_LANGUAGE, szBuffer, ARRAYSIZE(szBuffer));
-        column.fmt      = LVCFMT_LEFT;
-        column.iSubItem = 0;
-        column.pszText  = szBuffer;
-        column.cx       = 175;
-        ListView_InsertColumn(hwndInputList, 0, &column);
-
-        LoadStringW(hApplet, IDS_LAYOUT, szBuffer, ARRAYSIZE(szBuffer));
-        column.fmt      = LVCFMT_RIGHT;
-        column.cx       = 155;
-        column.iSubItem = 1;
-        column.pszText  = szBuffer;
-        ListView_InsertColumn(hwndInputList, 1, &column);
-
-        hLayoutImageList = ImageList_Create(GetSystemMetrics(SM_CXSMICON) * 2,
-                                            GetSystemMetrics(SM_CYSMICON),
-                                            ILC_COLOR8 | ILC_MASK, 0, 0);
-        if (hLayoutImageList != NULL)
-        {
-            HIMAGELIST hOldImagelist = ListView_SetImageList(hwndInputList, 
hLayoutImageList, LVSIL_SMALL);
-            ImageList_Destroy(hOldImagelist);
-        }
+    EnableWindow(GetDlgItem(hwndDlg, IDC_LANGUAGE_BAR), FALSE);
 
-        UpdateInputListView(hwndInputList);
+    hLayoutImageList = ImageList_Create(GetSystemMetrics(SM_CXSMICON),
+                                        GetSystemMetrics(SM_CYSMICON),
+                                        ILC_COLOR8 | ILC_MASK, 0, 0);
+    if (hLayoutImageList != NULL)
+    {
+        hOldImageList = TreeView_SetImageList(hwndInputList, hLayoutImageList, 
TVSIL_NORMAL);
+        ImageList_Destroy(hOldImageList);
     }
 
+    UpdateInputListView(hwndInputList);
+
     SetControlsState(hwndDlg);
 }
 
@@ -283,12 +446,30 @@ OnCommandSettingsPage(HWND hwndDlg, WPARAM wParam)
             HWND hwndList = GetDlgItem(hwndDlg, IDC_KEYLAYOUT_LIST);
             if (hwndList)
             {
-                LVITEM item = { LVIF_PARAM };
-                item.iItem = ListView_GetNextItem(hwndList, -1, LVNI_SELECTED);
+                HTREEITEM hItem = TreeView_GetSelection(hwndList);
+                TV_ITEM item = { TVIF_HANDLE | TVIF_PARAM };
+                item.hItem = hItem;
 
-                if (ListView_GetItem(hwndList, &item))
+                if (hItem && TreeView_GetItem(hwndList, &item))
                 {
-                    InputList_Remove((INPUT_LIST_NODE*) item.lParam);
+                    if (item.lParam == 0) // Branch? (currently branch is 
keyboard only)
+                    {
+                        // Get root of branch
+                        item.hItem = TreeView_GetParent(hwndList, hItem);
+                        TreeView_GetItem(hwndList, &item);
+                    }
+
+                    if (HIWORD(item.lParam)) // Leaf?
+                    {
+                        if (InputList_Remove((INPUT_LIST_NODE*)item.lParam))
+                            s_bDefaultInputChanged = TRUE;
+                    }
+                    else // Root?
+                    {
+                        if (InputList_RemoveByLang(LOWORD(item.lParam)))
+                            s_bDefaultInputChanged = TRUE;
+                    }
+
                     UpdateInputListView(hwndList);
                     SetControlsState(hwndDlg);
                     PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
@@ -302,10 +483,11 @@ OnCommandSettingsPage(HWND hwndDlg, WPARAM wParam)
             HWND hwndList = GetDlgItem(hwndDlg, IDC_KEYLAYOUT_LIST);
             if (hwndList)
             {
-                LVITEM item = { LVIF_PARAM };
-                item.iItem = ListView_GetNextItem(hwndList, -1, LVNI_SELECTED);
+                HTREEITEM hItem = TreeView_GetSelection(hwndList);
+                TV_ITEM item = { TVIF_HANDLE | TVIF_PARAM };
+                item.hItem = hItem;
 
-                if (ListView_GetItem(hwndList, &item))
+                if (hItem && TreeView_GetItem(hwndList, &item) && 
HIWORD(item.lParam))
                 {
                     if (DialogBoxParamW(hApplet,
                                         MAKEINTRESOURCEW(IDD_INPUT_LANG_PROP),
@@ -322,25 +504,6 @@ OnCommandSettingsPage(HWND hwndDlg, WPARAM wParam)
         }
         break;
 
-        case IDC_SET_DEFAULT:
-        {
-            HWND hwndList = GetDlgItem(hwndDlg, IDC_KEYLAYOUT_LIST);
-            if (hwndList)
-            {
-                LVITEM item = { LVIF_PARAM };
-                item.iItem = ListView_GetNextItem(hwndList, -1, LVNI_SELECTED);
-
-                if (ListView_GetItem(hwndList, &item))
-                {
-                    InputList_SetDefault((INPUT_LIST_NODE*) item.lParam);
-                    UpdateInputListView(hwndList);
-                    SetControlsState(hwndDlg);
-                    PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
-                }
-            }
-        }
-        break;
-
         case IDC_KEY_SET_BTN:
         {
             DialogBoxW(hApplet,
@@ -349,6 +512,38 @@ OnCommandSettingsPage(HWND hwndDlg, WPARAM wParam)
                        KeySettingsDialogProc);
         }
         break;
+
+        case IDC_LANGUAGE_BAR:
+        {
+            // FIXME
+            break;
+        }
+
+        case IDC_DEFAULT_LANGUAGE:
+        {
+            if (HIWORD(wParam) == CBN_SELENDOK)
+            {
+                HWND hwndList = GetDlgItem(hwndDlg, IDC_KEYLAYOUT_LIST);
+                HWND hwndCombo = GetDlgItem(hwndDlg, IDC_DEFAULT_LANGUAGE);
+                INT iSelected = (INT)SendMessageW(hwndCombo, CB_GETCURSEL, 0, 
0);
+                if (iSelected != CB_ERR)
+                {
+                    LPARAM lParam = SendMessageW(hwndCombo, CB_GETITEMDATA, 
iSelected, 0);
+                    if (lParam)
+                    {
+                        INPUT_LIST_NODE* pNode = (INPUT_LIST_NODE*)lParam;
+                        if (!(pNode->wFlags & INPUT_LIST_NODE_FLAG_DEFAULT))
+                        {
+                            s_bDefaultInputChanged = TRUE;
+                            InputList_SetDefault(pNode);
+                            UpdateInputListView(hwndList);
+                            SetControlsState(hwndDlg);
+                            PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
+                        }
+                    }
+                }
+            }
+        }
     }
 }
 
@@ -356,6 +551,9 @@ static BOOL IsRebootNeeded(VOID)
 {
     INPUT_LIST_NODE *pNode;
 
+    if (s_bDefaultInputChanged)
+        return TRUE;
+
     for (pNode = InputList_GetFirst(); pNode != NULL; pNode = pNode->pNext)
     {
         if (IS_IME_HKL(pNode->hkl)) /* IME? */
@@ -394,21 +592,31 @@ BOOL EnableProcessPrivileges(LPCWSTR lpPrivilegeName, 
BOOL bEnable)
     return Ret;
 }
 
-static VOID
+static INT_PTR
 OnNotifySettingsPage(HWND hwndDlg, LPARAM lParam)
 {
     LPNMHDR header = (LPNMHDR)lParam;
 
     switch (header->code)
     {
-        case LVN_ITEMCHANGED:
+        case TVN_SELCHANGED:
+        {
+            SetControlsState(hwndDlg);
+            break;
+        }
+
+        case TVN_ITEMEXPANDING:
         {
-            if (header->idFrom == IDC_KEYLAYOUT_LIST)
+            // FIXME: Prevent collapse (COMCTL32 is buggy)
+            // https://bugs.winehq.org/show_bug.cgi?id=53727
+            NM_TREEVIEW* pTreeView = (NM_TREEVIEW*)lParam;
+            if ((pTreeView->action & TVE_TOGGLE) == TVE_COLLAPSE)
             {
-                SetControlsState(hwndDlg);
+                SetWindowLongPtrW(hwndDlg, DWLP_MSGRESULT, TRUE);
+                return TRUE;
             }
+            break;
         }
-        break;
 
         case PSN_APPLY:
         {
@@ -429,11 +637,12 @@ OnNotifySettingsPage(HWND hwndDlg, LPARAM lParam)
                     ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0);
                 }
             }
+            break;
         }
-        break;
     }
-}
 
+    return 0;
+}
 
 INT_PTR CALLBACK
 SettingsPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
@@ -453,8 +662,7 @@ SettingsPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, 
LPARAM lParam)
             break;
 
         case WM_NOTIFY:
-            OnNotifySettingsPage(hwndDlg, lParam);
-            break;
+            return OnNotifySettingsPage(hwndDlg, lParam);
     }
 
     return FALSE;


Reply via email to