[INPUT]
authorDmitry Chapyshev <dmitry@reactos.org>
Tue, 9 Aug 2016 18:26:43 +0000 (18:26 +0000)
committerDmitry Chapyshev <dmitry@reactos.org>
Tue, 9 Aug 2016 18:26:43 +0000 (18:26 +0000)
- Implement editing input methods
- Marking default layout
- Other bugfixes

svn path=/trunk/; revision=72168

25 files changed:
reactos/dll/cpl/input_new/edit_dialog.c
reactos/dll/cpl/input_new/input_list.c
reactos/dll/cpl/input_new/input_list.h
reactos/dll/cpl/input_new/key_settings_dialog.c
reactos/dll/cpl/input_new/lang/bg-BG.rc
reactos/dll/cpl/input_new/lang/cs-CZ.rc
reactos/dll/cpl/input_new/lang/de-DE.rc
reactos/dll/cpl/input_new/lang/el-GR.rc
reactos/dll/cpl/input_new/lang/en-US.rc
reactos/dll/cpl/input_new/lang/es-ES.rc
reactos/dll/cpl/input_new/lang/fr-FR.rc
reactos/dll/cpl/input_new/lang/he-IL.rc
reactos/dll/cpl/input_new/lang/it-IT.rc
reactos/dll/cpl/input_new/lang/no-NO.rc
reactos/dll/cpl/input_new/lang/pl-PL.rc
reactos/dll/cpl/input_new/lang/pt-BR.rc
reactos/dll/cpl/input_new/lang/ro-RO.rc
reactos/dll/cpl/input_new/lang/ru-RU.rc
reactos/dll/cpl/input_new/lang/sk-SK.rc
reactos/dll/cpl/input_new/lang/sq-AL.rc
reactos/dll/cpl/input_new/lang/tr-TR.rc
reactos/dll/cpl/input_new/lang/uk-UA.rc
reactos/dll/cpl/input_new/lang/zh-CN.rc
reactos/dll/cpl/input_new/lang/zh-TW.rc
reactos/dll/cpl/input_new/settings_page.c

index f096076..4acd2c0 100644 (file)
@@ -6,29 +6,83 @@
 */
 
 #include "input.h"
+#include "locale_list.h"
+#include "input_list.h"
 
 
 INT_PTR CALLBACK
-EditDialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+EditDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
     UNREFERENCED_PARAMETER(lParam);
 
     switch (uMsg)
     {
         case WM_INITDIALOG:
-            break;
+        {
+            LAYOUT_LIST_NODE *pCurrentLayout;
+            INPUT_LIST_NODE *pInput;
+            HWND hwndList;
+
+            pInput = (INPUT_LIST_NODE*) lParam;
+
+            if (pInput == NULL)
+                return TRUE;
+
+            SetWindowLongPtrW(hwndDlg, GWLP_USERDATA, (LONG_PTR) pInput);
+
+            SetWindowTextW(GetDlgItem(hwndDlg, IDC_INPUT_LANG_STR), pInput->pLocale->pszName);
+
+            hwndList = GetDlgItem(hwndDlg, IDC_KB_LAYOUT_IME_COMBO);
+
+            for (pCurrentLayout = LayoutList_GetFirst();
+                 pCurrentLayout != NULL;
+                 pCurrentLayout = pCurrentLayout->pNext)
+            {
+                INT iItemIndex;
+
+                iItemIndex = ComboBox_AddString(hwndList, pCurrentLayout->pszName);
+                ComboBox_SetItemData(hwndList, iItemIndex, pCurrentLayout);
+            }
+
+            ComboBox_SelectString(hwndList, 0, pInput->pLayout->pszName);
+        }
+        break;
 
         case WM_COMMAND:
         {
             switch (LOWORD(wParam))
             {
                 case IDOK:
-                    EndDialog(hDlg, LOWORD(wParam));
-                    break;
+                {
+                    INPUT_LIST_NODE *pInput;
+                    HWND hwndList;
+
+                    hwndList = GetDlgItem(hwndDlg, IDC_KB_LAYOUT_IME_COMBO);
+
+                    pInput = (INPUT_LIST_NODE*) GetWindowLongPtrW(hwndDlg, GWLP_USERDATA);
+
+                    if (pInput != NULL)
+                    {
+                        LAYOUT_LIST_NODE *pNewLayout;
+
+                        pNewLayout = (LAYOUT_LIST_NODE*)ComboBox_GetItemData(hwndList,
+                                                                             ComboBox_GetCurSel(hwndList));
+                        if (pNewLayout != NULL)
+                        {
+                            pInput->pLayout = pNewLayout;
+                            pInput->wFlags |= INPUT_LIST_NODE_FLAG_EDITED;
+                        }
+                    }
+
+                    EndDialog(hwndDlg, LOWORD(wParam));
+                }
+                break;
 
                 case IDCANCEL:
-                    EndDialog(hDlg, LOWORD(wParam));
-                    break;
+                {
+                    EndDialog(hwndDlg, LOWORD(wParam));
+                }
+                break;
             }
         }
         break;
index a61e649..2fea50b 100644 (file)
@@ -215,28 +215,37 @@ InputList_AddInputMethodToUserRegistry(DWORD dwIndex, INPUT_LIST_NODE *pNode)
         }
     }
 
-    if (pNode->dwFlags & INPUT_LIST_NODE_FLAG_ADDED)
+    if ((pNode->wFlags & INPUT_LIST_NODE_FLAG_ADDED) ||
+        (pNode->wFlags & INPUT_LIST_NODE_FLAG_EDITED))
     {
         pNode->hkl = LoadKeyboardLayoutW(szPreload, KLF_SUBSTITUTE_OK | KLF_NOTELLSHELL);
     }
 }
 
 
+/*
+ * Writes any changes in input methods to the registry
+ */
 VOID
 InputList_Process(VOID)
 {
     INPUT_LIST_NODE *pCurrent;
     DWORD dwIndex;
 
-    /* Process deleted input methods */
+    /* Process deleted and edited input methods */
     for (pCurrent = _InputList; pCurrent != NULL; pCurrent = pCurrent->pNext)
     {
-        if (!(pCurrent->dwFlags & INPUT_LIST_NODE_FLAG_DELETED))
-            continue;
-
-        if (UnloadKeyboardLayout(pCurrent->hkl))
+        if ((pCurrent->wFlags & INPUT_LIST_NODE_FLAG_DELETED) ||
+            (pCurrent->wFlags & INPUT_LIST_NODE_FLAG_EDITED))
         {
-            InputList_RemoveNode(pCurrent);
+            if (UnloadKeyboardLayout(pCurrent->hkl))
+            {
+                /* Only unload the edited input method, but does not delete it from the list */
+                if (!(pCurrent->wFlags & INPUT_LIST_NODE_FLAG_EDITED))
+                {
+                    InputList_RemoveNode(pCurrent);
+                }
+            }
         }
     }
 
@@ -245,7 +254,7 @@ InputList_Process(VOID)
     /* Find default input method */
     for (pCurrent = _InputList; pCurrent != NULL; pCurrent = pCurrent->pNext)
     {
-        if (pCurrent->dwFlags & INPUT_LIST_NODE_FLAG_DEFAULT)
+        if (pCurrent->wFlags & INPUT_LIST_NODE_FLAG_DEFAULT)
         {
             InputList_AddInputMethodToUserRegistry(1, pCurrent);
             break;
@@ -273,7 +282,7 @@ InputList_Process(VOID)
 
     for (pCurrent = _InputList; pCurrent != NULL; pCurrent = pCurrent->pNext)
     {
-        if (pCurrent->dwFlags & INPUT_LIST_NODE_FLAG_DEFAULT)
+        if (pCurrent->wFlags & INPUT_LIST_NODE_FLAG_DEFAULT)
             continue;
 
         InputList_AddInputMethodToUserRegistry(dwIndex, pCurrent);
@@ -283,7 +292,7 @@ InputList_Process(VOID)
 }
 
 
-VOID
+BOOL
 InputList_Add(LOCALE_LIST_NODE *pLocale, LAYOUT_LIST_NODE *pLayout)
 {
     WCHAR szIndicator[MAX_STR_LEN];
@@ -291,12 +300,20 @@ InputList_Add(LOCALE_LIST_NODE *pLocale, LAYOUT_LIST_NODE *pLayout)
 
     if (pLocale == NULL || pLayout == NULL)
     {
-        return;
+        return FALSE;
+    }
+
+    for (pInput = _InputList; pInput != NULL; pInput = pInput->pNext)
+    {
+        if (pInput->pLocale == pLocale && pInput->pLayout == pLayout)
+        {
+            return FALSE;
+        }
     }
 
     pInput = InputList_AppendNode();
 
-    pInput->dwFlags |= INPUT_LIST_NODE_FLAG_ADDED;
+    pInput->wFlags = INPUT_LIST_NODE_FLAG_ADDED;
 
     pInput->pLocale = pLocale;
     pInput->pLayout = pLayout;
@@ -314,6 +331,8 @@ InputList_Add(LOCALE_LIST_NODE *pLocale, LAYOUT_LIST_NODE *pLayout)
             pInput->pszIndicator = DublicateString(szIndicator);
         }
     }
+
+    return TRUE;
 }
 
 
@@ -329,35 +348,57 @@ InputList_SetDefault(INPUT_LIST_NODE *pNode)
     {
         if (pCurrent == pNode)
         {
-            pCurrent->dwFlags |= INPUT_LIST_NODE_FLAG_DEFAULT;
+            pCurrent->wFlags |= INPUT_LIST_NODE_FLAG_DEFAULT;
         }
         else
         {
-            pCurrent->dwFlags &= ~INPUT_LIST_NODE_FLAG_DEFAULT;
+            pCurrent->wFlags &= ~INPUT_LIST_NODE_FLAG_DEFAULT;
         }
     }
 }
 
 
+/*
+ * It marks the input method for deletion, but does not delete it directly.
+ * To apply the changes using InputList_Process()
+ */
 VOID
 InputList_Remove(INPUT_LIST_NODE *pNode)
 {
+    BOOL bRemoveNode = FALSE;
+
     if (pNode == NULL)
         return;
 
-    pNode->dwFlags |= INPUT_LIST_NODE_FLAG_DELETED;
+    if (pNode->wFlags & INPUT_LIST_NODE_FLAG_ADDED)
+    {
+        /*
+         * If the input method has been added to the list, but not yet written
+         * in the registry, then simply remove it from the list
+         */
+        bRemoveNode = TRUE;
+    }
+    else
+    {
+        pNode->wFlags = INPUT_LIST_NODE_FLAG_DELETED;
+    }
 
-    if (pNode->dwFlags & INPUT_LIST_NODE_FLAG_DEFAULT)
+    if (pNode->wFlags & INPUT_LIST_NODE_FLAG_DEFAULT)
     {
         if (pNode->pNext != NULL)
         {
-            pNode->pNext->dwFlags |= INPUT_LIST_NODE_FLAG_DEFAULT;
+            pNode->pNext->wFlags |= INPUT_LIST_NODE_FLAG_DEFAULT;
         }
         else if (pNode->pPrev != NULL)
         {
-            pNode->pPrev->dwFlags |= INPUT_LIST_NODE_FLAG_DEFAULT;
+            pNode->pPrev->wFlags |= INPUT_LIST_NODE_FLAG_DEFAULT;
         }
     }
+
+    if (bRemoveNode != FALSE)
+    {
+        InputList_RemoveNode(pNode);
+    }
 }
 
 
@@ -368,7 +409,7 @@ InputList_Create(VOID)
     HKL *pLayoutList;
 
     iLayoutCount = GetKeyboardLayoutList(0, NULL);
-    pLayoutList = (HKL*)malloc(iLayoutCount * sizeof(HKL));
+    pLayoutList = (HKL*) malloc(iLayoutCount * sizeof(HKL));
 
     if (pLayoutList != NULL)
     {
@@ -403,7 +444,7 @@ InputList_Create(VOID)
 
                     if (pInput->hkl == hklDefault)
                     {
-                        pInput->dwFlags |= INPUT_LIST_NODE_FLAG_DEFAULT;
+                        pInput->wFlags |= INPUT_LIST_NODE_FLAG_DEFAULT;
                     }
 
                     if (GetLocaleInfoW(LOWORD(pInput->pLocale->dwId),
index 837f03e..d2659f3 100644 (file)
@@ -5,20 +5,20 @@
 #include "layout_list.h"
 
 
-#define INPUT_LIST_NODE_FLAG_EDITED    0x00000001
-#define INPUT_LIST_NODE_FLAG_ADDED     0x00000002
-#define INPUT_LIST_NODE_FLAG_DELETED   0x00000004
-#define INPUT_LIST_NODE_FLAG_DEFAULT   0x00000008
+#define INPUT_LIST_NODE_FLAG_EDITED    0x0001
+#define INPUT_LIST_NODE_FLAG_ADDED     0x0002
+#define INPUT_LIST_NODE_FLAG_DELETED   0x0004
+#define INPUT_LIST_NODE_FLAG_DEFAULT   0x0008
 
 
 typedef struct _INPUT_LIST_NODE
 {
-    DWORD dwFlags;
+    WORD wFlags;
 
     LOCALE_LIST_NODE *pLocale;
     LAYOUT_LIST_NODE *pLayout;
 
-    HKL hkl;
+    HKL hkl; /* Only for loaded input methods */
 
     WCHAR *pszIndicator;
 
@@ -33,7 +33,7 @@ InputList_Create(VOID);
 VOID
 InputList_Process(VOID);
 
-VOID
+BOOL
 InputList_Add(LOCALE_LIST_NODE *pLocale, LAYOUT_LIST_NODE *pLayout);
 
 VOID
index 619224e..0e1a80f 100644 (file)
@@ -9,7 +9,43 @@
 
 
 INT_PTR CALLBACK
-KeySettingsDialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+ChangeKeySeqDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+    UNREFERENCED_PARAMETER(lParam);
+
+    switch (uMsg)
+    {
+        case WM_INITDIALOG:
+        {
+
+        }
+        break;
+
+        case WM_COMMAND:
+        {
+            switch (LOWORD(wParam))
+            {
+                case IDOK:
+                {
+                    EndDialog(hwndDlg, LOWORD(wParam));
+                }
+                break;
+
+                case IDCANCEL:
+                {
+                    EndDialog(hwndDlg, LOWORD(wParam));
+                }
+                break;
+            }
+        }
+        break;
+    }
+
+    return FALSE;
+}
+
+INT_PTR CALLBACK
+KeySettingsDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
     UNREFERENCED_PARAMETER(lParam);
 
@@ -22,13 +58,29 @@ KeySettingsDialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
         {
             switch (LOWORD(wParam))
             {
+                case IDC_CHANGE_KEY_SEQ_BTN:
+                {
+                    if (DialogBoxW(hApplet,
+                                   MAKEINTRESOURCEW(IDD_CHANGE_KEY_SEQ),
+                                   hwndDlg,
+                                   ChangeKeySeqDialogProc) == IDOK)
+                    {
+
+                    }
+                }
+                break;
+
                 case IDOK:
-                    EndDialog(hDlg, LOWORD(wParam));
-                    break;
+                {
+                    EndDialog(hwndDlg, LOWORD(wParam));
+                }
+                break;
 
                 case IDCANCEL:
-                    EndDialog(hDlg, LOWORD(wParam));
-                    break;
+                {
+                    EndDialog(hwndDlg, LOWORD(wParam));
+                }
+                break;
             }
         }
         break;
index fa8ac2b..615bf75 100644 (file)
@@ -6,10 +6,10 @@ 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_SORTASCENDING | LVS_REPORT | 0x0000808D, 8, 36, 237, 101
+    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_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
index 70e4c89..71f3a53 100644 (file)
@@ -11,10 +11,10 @@ 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_SORTASCENDING | LVS_REPORT | 0x0000808D, 8, 36, 237, 101
+    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 "&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
index ac5cc1a..3f646dc 100644 (file)
@@ -6,10 +6,10 @@ 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_SORTASCENDING | LVS_REPORT | 0x0000808D, 8, 36, 237, 101
+    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 "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
index a4f8c9c..7964c5e 100644 (file)
@@ -6,10 +6,10 @@ 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_SORTASCENDING | LVS_REPORT | 0x0000808D, 8, 42, 237, 95
+    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_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
index 9009057..0c8f84d 100644 (file)
@@ -6,10 +6,10 @@ 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_SORTASCENDING | LVS_REPORT | 0x0000808D, 8, 36, 237, 101
+    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 "&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
index b88f7ae..28675d3 100644 (file)
@@ -8,10 +8,10 @@ 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_SORTASCENDING | LVS_REPORT | 0x0000808D, 8, 28, 237, 109
+    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 "&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
index 20a4b29..24884ab 100644 (file)
@@ -6,10 +6,10 @@ 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_SORTASCENDING | LVS_REPORT | 0x0000808D, 8, 36, 237, 101
+    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 "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
index 79fc0b5..2ffcf11 100644 (file)
@@ -8,10 +8,10 @@ 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_SORTASCENDING | LVS_REPORT | 0x0000808D, 8, 36, 237, 101
+    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_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
index b0cd2c8..7575de6 100644 (file)
@@ -6,10 +6,10 @@ 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_SORTASCENDING | LVS_REPORT | 0x0000808D, 8, 28, 237, 109
+    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 "&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
index c9a3d4a..aa209ab 100644 (file)
@@ -6,10 +6,10 @@ 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 "TEKST", IDC_KEYLAYOUT_LIST, "SYSLISTVIEW32", WS_BORDER | WS_VSCROLL | WS_TABSTOP | LVS_SORTASCENDING | LVS_REPORT | 0x0000808D, 8, 36, 237, 101
+    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 "&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
index b52f953..62ef5fa 100644 (file)
@@ -14,10 +14,10 @@ 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_SORTASCENDING | LVS_REPORT | 0x0000808D, 8, 28, 237, 109
+    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 "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
index d492ae0..8b1ca89 100644 (file)
@@ -6,7 +6,7 @@ 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_SORTASCENDING | LVS_REPORT | 0x0000808D, 8, 36, 237, 101
+    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
index b870155..fc1ebec 100644 (file)
@@ -8,7 +8,7 @@ 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_SORTASCENDING | LVS_REPORT | 0x0000808D, 8, 36, 237, 101
+    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
index 72958c1..b25e80e 100644 (file)
@@ -6,10 +6,10 @@ 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_SORTASCENDING | LVS_REPORT | 0x0000808D, 8, 28, 237, 109
+    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_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
index 51064b7..513459a 100644 (file)
@@ -11,10 +11,10 @@ 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_SORTASCENDING | LVS_REPORT | 0x0000808D, 8, 36, 237, 101
+    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 "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
index 4d9253a..7b47ca7 100644 (file)
@@ -10,10 +10,10 @@ 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_SORTASCENDING | LVS_REPORT | 0x0000808D, 8, 36, 237, 101
+    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 "&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
index 59c2a56..7bfe910 100644 (file)
@@ -8,10 +8,10 @@ CAPTION "Ayarlar"
 FONT 8, "MS Shell Dlg"
 BEGIN
     LTEXT "Dizelgede gösterilen tüm giriş dilleri için istediğiniz hizmetleri seçiniz.\nBu dizelgeyi değiştirmek için Ekle veyâ Sil düğmelerini kullanınız.", -1, 9, 6, 238, 25
-    CONTROL "TEXT", IDC_KEYLAYOUT_LIST, "SYSLISTVIEW32", WS_BORDER | WS_VSCROLL | WS_TABSTOP | LVS_SORTASCENDING | LVS_REPORT | 0x0000808D, 8, 36, 237, 101
+    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 "&Sil", IDC_REMOVE_BUTTON, 101, 142, 70, 14
     PUSHBUTTON "&Husûsiyetler...", IDC_PROP_BUTTON, 175, 142, 70, 14
     GROUPBOX "Yeğlemeler", -1, 7, 185, 240, 36
     PUSHBUTTON "&Düğme Ayarları...", IDC_KEY_SET_BTN, 14, 198, 110, 14
index fdfe7a2..84aae8f 100644 (file)
@@ -14,10 +14,10 @@ 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_SORTASCENDING | LVS_REPORT | 0x0000808D, 8, 36, 237, 101
+    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_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
index 5a75381..2df9bea 100644 (file)
@@ -8,7 +8,7 @@ CAPTION "设置"
 FONT 9, "MS Shell Dlg"
 BEGIN
     LTEXT "为列表中显示的每个输入语言选择服务。\n使用“添加”和“删除”按钮来修改这个列表。", -1, 9, 6, 238, 25
-    CONTROL "TEXT", IDC_KEYLAYOUT_LIST, "SYSLISTVIEW32", WS_BORDER | WS_VSCROLL | WS_TABSTOP | LVS_SORTASCENDING | LVS_REPORT | 0x0000808D, 8, 36, 237, 101
+    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
index f248dab..4aa96e7 100644 (file)
@@ -8,7 +8,7 @@ CAPTION "設定"
 FONT 9, "MS Shell Dlg"
 BEGIN
     LTEXT "為列表中顯示的每個輸入語言選擇服務。\n使用“添加”和“刪除”按鈕來修改這個列表。", -1, 9, 6, 238, 25
-    CONTROL "TEXT", IDC_KEYLAYOUT_LIST, "SYSLISTVIEW32", WS_BORDER | WS_VSCROLL | WS_TABSTOP | LVS_SORTASCENDING | LVS_REPORT | 0x0000808D, 8, 36, 237, 101
+    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
index 6b4ed92..1d12d6c 100644 (file)
 
 
 static HICON
-CreateLayoutIcon(LPWSTR szLayout)
+CreateLayoutIcon(LPWSTR szLayout, BOOL bIsDefault)
 {
+    INT width = GetSystemMetrics(SM_CXSMICON) * 2;
+    INT height = GetSystemMetrics(SM_CYSMICON);
     HDC hdc;
     HDC hdcsrc;
     HBITMAP hBitmap;
@@ -21,60 +23,83 @@ CreateLayoutIcon(LPWSTR szLayout)
 
     hdcsrc = GetDC(NULL);
     hdc = CreateCompatibleDC(hdcsrc);
-    hBitmap = CreateCompatibleBitmap(hdcsrc,
-                                     GetSystemMetrics(SM_CXSMICON),
-                                     GetSystemMetrics(SM_CYSMICON));
+    hBitmap = CreateCompatibleBitmap(hdcsrc, width, height);
+
     ReleaseDC(NULL, hdcsrc);
 
     if (hdc && hBitmap)
     {
         HBITMAP hBmpNew;
 
-        hBmpNew = CreateBitmap(GetSystemMetrics(SM_CXSMICON),
-                               GetSystemMetrics(SM_CYSMICON),
-                               1, 1, NULL);
+        hBmpNew = CreateBitmap(width, height, 1, 1, NULL);
         if (hBmpNew)
         {
-            ICONINFO IconInfo;
-            HBITMAP hBmpOld;
-            HFONT hFont;
-            RECT rect;
+            LOGFONT lf;
+
+            if (SystemParametersInfoW(SPI_GETICONTITLELOGFONT, sizeof(LOGFONT), &lf, 0))
+            {
+                ICONINFO IconInfo;
+                HFONT hFont;
+
+                hFont = CreateFontIndirectW(&lf);
+
+                if (hFont != NULL)
+                {
+                    HBITMAP hBmpOld;
+
+                    hBmpOld = SelectObject(hdc, hBitmap);
+
+                    if (hBmpOld != NULL)
+                    {
+                        RECT rect;
+
+                        SetRect(&rect, 0, 0, width / 2, height);
+
+                        if (bIsDefault != FALSE)
+                        {
+                            SetBkColor(hdc, GetSysColor(COLOR_WINDOW));
+                            SetTextColor(hdc, GetSysColor(COLOR_WINDOWTEXT));
+
+                            ExtTextOutW(hdc, rect.left, rect.top, ETO_OPAQUE, &rect, L"", 0, NULL);
+
+                            SelectObject(hdc, hFont);
+                            DrawTextW(hdc, L"\x25CF", 1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
+                        }
+                        else
+                        {
+                            FillRect(hdc, &rect, GetSysColorBrush(COLOR_WINDOW));
+                        }
+
+                        SetRect(&rect, width / 2, 0, width, height);
+
+                        SetBkColor(hdc, GetSysColor(COLOR_HIGHLIGHT));
+                        SetTextColor(hdc, GetSysColor(COLOR_HIGHLIGHTTEXT));
 
-            hBmpOld = SelectObject(hdc, hBitmap);
-            rect.right = GetSystemMetrics(SM_CXSMICON);
-            rect.left = 0;
-            rect.bottom = GetSystemMetrics(SM_CYSMICON);
-            rect.top = 0;
+                        ExtTextOutW(hdc, rect.left, rect.top, ETO_OPAQUE, &rect, L"", 0, NULL);
 
-            SetBkColor(hdc, GetSysColor(COLOR_HIGHLIGHT));
-            SetTextColor(hdc, GetSysColor(COLOR_HIGHLIGHTTEXT));
+                        SelectObject(hdc, hFont);
+                        DrawTextW(hdc, szLayout, 2, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
 
-            ExtTextOut(hdc, rect.left, rect.top, ETO_OPAQUE, &rect, L"", 0, NULL);
+                        SelectObject(hdc, hBmpNew);
 
-            hFont = CreateFontW(-11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
-                                OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
-                                DEFAULT_QUALITY, FF_DONTCARE, L"Tahoma");
+                        PatBlt(hdc, 0, 0, width, height, BLACKNESS);
 
-            SelectObject(hdc, hFont);
-            DrawTextW(hdc, szLayout, 2, &rect, DT_SINGLELINE|DT_CENTER|DT_VCENTER);
-            SelectObject(hdc, hBmpNew);
+                        SelectObject(hdc, hBmpOld);
 
-            PatBlt(hdc, 0, 0,
-                   GetSystemMetrics(SM_CXSMICON),
-                   GetSystemMetrics(SM_CYSMICON),
-                   BLACKNESS);
+                        IconInfo.hbmColor = hBitmap;
+                        IconInfo.hbmMask = hBmpNew;
+                        IconInfo.fIcon = TRUE;
 
-            SelectObject(hdc, hBmpOld);
+                        hIcon = CreateIconIndirect(&IconInfo);
 
-            IconInfo.hbmColor = hBitmap;
-            IconInfo.hbmMask = hBmpNew;
-            IconInfo.fIcon = TRUE;
+                        DeleteObject(hBmpOld);
+                    }
 
-            hIcon = CreateIconIndirect(&IconInfo);
+                    DeleteObject(hFont);
+                }
+            }
 
             DeleteObject(hBmpNew);
-            DeleteObject(hBmpOld);
-            DeleteObject(hFont);
         }
     }
 
@@ -85,6 +110,15 @@ CreateLayoutIcon(LPWSTR szLayout)
 }
 
 
+static VOID
+SetControlsState(HWND hwndDlg, BOOL bIsEnabled)
+{
+    EnableWindow(GetDlgItem(hwndDlg, IDC_REMOVE_BUTTON), bIsEnabled);
+    EnableWindow(GetDlgItem(hwndDlg, IDC_PROP_BUTTON), bIsEnabled);
+    EnableWindow(GetDlgItem(hwndDlg, IDC_SET_DEFAULT), bIsEnabled);
+}
+
+
 static VOID
 AddToInputListView(HWND hwndList, INPUT_LIST_NODE *pInputNode)
 {
@@ -99,7 +133,8 @@ AddToInputListView(HWND hwndList, INPUT_LIST_NODE *pInputNode)
     {
         HICON hLayoutIcon;
 
-        hLayoutIcon = CreateLayoutIcon(pInputNode->pszIndicator);
+        hLayoutIcon = CreateLayoutIcon(pInputNode->pszIndicator,
+                                       (pInputNode->wFlags & INPUT_LIST_NODE_FLAG_DEFAULT));
 
         if (hLayoutIcon != NULL)
         {
@@ -110,9 +145,9 @@ AddToInputListView(HWND hwndList, INPUT_LIST_NODE *pInputNode)
 
     memset(&item, 0, sizeof(LV_ITEM));
 
-    item.mask    = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE;
+    item.mask    = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE;
     item.pszText = pInputNode->pLocale->pszName;
-    item.iItem   = -1;
+    item.iItem   = ListView_GetItemCount(hwndList) + 1;
     item.lParam  = (LPARAM)pInputNode;
     item.iImage  = ImageIndex;
 
@@ -140,7 +175,7 @@ UpdateInputListView(HWND hwndList)
          pCurrentInputNode != NULL;
          pCurrentInputNode = pCurrentInputNode->pNext)
     {
-        if (!(pCurrentInputNode->dwFlags & INPUT_LIST_NODE_FLAG_DELETED))
+        if (!(pCurrentInputNode->wFlags & INPUT_LIST_NODE_FLAG_DELETED))
         {
             AddToInputListView(hwndList, pCurrentInputNode);
         }
@@ -185,7 +220,7 @@ OnInitSettingsPage(HWND hwndDlg)
         column.pszText  = szBuffer;
         ListView_InsertColumn(hwndInputList, 1, &column);
 
-        hLayoutImageList = ImageList_Create(GetSystemMetrics(SM_CXSMICON),
+        hLayoutImageList = ImageList_Create(GetSystemMetrics(SM_CXSMICON) * 2,
                                             GetSystemMetrics(SM_CYSMICON),
                                             ILC_COLOR8 | ILC_MASK, 0, 0);
         if (hLayoutImageList != NULL)
@@ -195,6 +230,8 @@ OnInitSettingsPage(HWND hwndDlg)
 
         UpdateInputListView(hwndInputList);
     }
+
+    SetControlsState(hwndDlg, FALSE);
 }
 
 
@@ -236,7 +273,9 @@ OnCommandSettingsPage(HWND hwndDlg, WPARAM wParam)
 
         case IDC_REMOVE_BUTTON:
         {
-            HWND hwndList = GetDlgItem(hwndDlg, IDC_KEYLAYOUT_LIST);
+            HWND hwndList;
+            
+            hwndList = GetDlgItem(hwndDlg, IDC_KEYLAYOUT_LIST);
 
             if (hwndList != NULL)
             {
@@ -247,8 +286,8 @@ OnCommandSettingsPage(HWND hwndDlg, WPARAM wParam)
 
                 if (ListView_GetItem(hwndList, &item) != FALSE)
                 {
-                    InputList_Remove((INPUT_LIST_NODE*)item.lParam);
-                    UpdateInputListView(GetDlgItem(hwndDlg, IDC_KEYLAYOUT_LIST));
+                    InputList_Remove((INPUT_LIST_NODE*) item.lParam);
+                    UpdateInputListView(hwndList);
                     PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
                 }
             }
@@ -257,20 +296,38 @@ OnCommandSettingsPage(HWND hwndDlg, WPARAM wParam)
 
         case IDC_PROP_BUTTON:
         {
-            if (DialogBoxW(hApplet,
-                           MAKEINTRESOURCEW(IDD_INPUT_LANG_PROP),
-                           hwndDlg,
-                           EditDialogProc) == IDOK)
+            HWND hwndList;
+            
+            hwndList = GetDlgItem(hwndDlg, IDC_KEYLAYOUT_LIST);
+
+            if (hwndList != NULL)
             {
-                UpdateInputListView(GetDlgItem(hwndDlg, IDC_KEYLAYOUT_LIST));
-                PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
+                LVITEM item = { 0 };
+
+                item.mask = LVIF_PARAM;
+                item.iItem = ListView_GetNextItem(hwndList, -1, LVNI_SELECTED);
+
+                if (ListView_GetItem(hwndList, &item) != FALSE)
+                {
+                    if (DialogBoxParamW(hApplet,
+                                        MAKEINTRESOURCEW(IDD_INPUT_LANG_PROP),
+                                        hwndDlg,
+                                        EditDialogProc,
+                                        item.lParam) == IDOK)
+                    {
+                        UpdateInputListView(hwndList);
+                        PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
+                    }
+                }
             }
         }
         break;
 
         case IDC_SET_DEFAULT:
         {
-            HWND hwndList = GetDlgItem(hwndDlg, IDC_KEYLAYOUT_LIST);
+            HWND hwndList;
+            
+            hwndList = GetDlgItem(hwndDlg, IDC_KEYLAYOUT_LIST);
 
             if (hwndList != NULL)
             {
@@ -281,14 +338,8 @@ OnCommandSettingsPage(HWND hwndDlg, WPARAM wParam)
 
                 if (ListView_GetItem(hwndList, &item) != FALSE)
                 {
-                    INPUT_LIST_NODE *pSelected;
-
-                    pSelected = (INPUT_LIST_NODE*) item.lParam;
-                    if (pSelected != NULL)
-                    {
-                        InputList_SetDefault(pSelected);
-                    }
-
+                    InputList_SetDefault((INPUT_LIST_NODE*) item.lParam);
+                    UpdateInputListView(hwndList);
                     PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
                 }
             }
@@ -313,9 +364,33 @@ OnCommandSettingsPage(HWND hwndDlg, WPARAM wParam)
 static VOID
 OnNotifySettingsPage(HWND hwndDlg, LPARAM lParam)
 {
-    if (((LPPSHNOTIFY)lParam)->hdr.code == PSN_APPLY)
+    LPNMHDR header;
+
+    header = (LPNMHDR)lParam;
+
+    switch (header->code)
     {
-        InputList_Process();
+        case NM_CLICK:
+        {
+            if (header->idFrom == IDC_KEYLAYOUT_LIST)
+            {
+                if (ListView_GetNextItem(header->hwndFrom, -1, LVNI_SELECTED) != -1)
+                {
+                    SetControlsState(hwndDlg, TRUE);
+                }
+                else
+                {
+                    SetControlsState(hwndDlg, FALSE);
+                }
+            }
+        }
+        break;
+
+        case PSN_APPLY:
+        {
+            InputList_Process();
+        }
+        break;
     }
 }